From eed6460ad2d1e50dfd4d1600493a12c4287791b2 Mon Sep 17 00:00:00 2001 From: simonzhangsz Date: Wed, 13 Mar 2024 09:30:40 +0800 Subject: [PATCH] 2G ems initial --- include/Makefile.backup | 58 + include/Makefile.cov | 101 + include/Makefile.doxygen | 28 + include/Makefile.indent | 379 + include/Makefile.rules | 350 + include/Makefile.rules.bak | 352 + include/Makefile.splint | 288 + include/Makefile.usage | 36 + include/gtest/gtest-death-test.h | 343 + include/gtest/gtest-matchers.h | 750 + include/gtest/gtest-message.h | 218 + include/gtest/gtest-param-test.h | 503 + include/gtest/gtest-printers.h | 928 + include/gtest/gtest-spi.h | 238 + include/gtest/gtest-test-part.h | 184 + include/gtest/gtest-typed-test.h | 330 + include/gtest/gtest.h | 2478 ++ include/gtest/gtest_pred_impl.h | 359 + include/gtest/gtest_prod.h | 61 + include/gtest/internal/custom/README.md | 56 + include/gtest/internal/custom/gtest-port.h | 37 + .../gtest/internal/custom/gtest-printers.h | 42 + include/gtest/internal/custom/gtest.h | 37 + .../internal/gtest-death-test-internal.h | 304 + include/gtest/internal/gtest-filepath.h | 211 + include/gtest/internal/gtest-internal.h | 1380 + include/gtest/internal/gtest-param-util.h | 883 + include/gtest/internal/gtest-port-arch.h | 107 + include/gtest/internal/gtest-port.h | 2231 ++ include/gtest/internal/gtest-string.h | 171 + include/gtest/internal/gtest-type-util.h | 3335 ++ include/gtest/internal/gtest-type-util.h.pump | 302 + include/hiredis/adapters/ae.h | 130 + include/hiredis/adapters/glib.h | 156 + include/hiredis/adapters/ivykis.h | 84 + include/hiredis/adapters/libev.h | 179 + include/hiredis/adapters/libevent.h | 175 + include/hiredis/adapters/libuv.h | 117 + include/hiredis/adapters/macosx.h | 115 + include/hiredis/adapters/qt.h | 135 + include/hiredis/alloc.h | 91 + include/hiredis/async.h | 147 + include/hiredis/hiredis.h | 337 + include/hiredis/read.h | 129 + include/hiredis/sds.h | 278 + include/nettle/aes.h | 177 + include/nettle/arcfour.h | 79 + include/nettle/arctwo.h | 103 + include/nettle/asn1.h | 152 + include/nettle/base16.h | 110 + include/nettle/base64.h | 172 + include/nettle/bignum.h | 140 + include/nettle/blowfish.h | 89 + include/nettle/buffer.h | 106 + include/nettle/camellia.h | 143 + include/nettle/cast128.h | 86 + include/nettle/cbc.h | 86 + include/nettle/ccm.h | 302 + include/nettle/cfb.h | 87 + include/nettle/chacha-poly1305.h | 98 + include/nettle/chacha.h | 96 + include/nettle/ctr.h | 71 + include/nettle/curve25519.h | 60 + include/nettle/des-compat.h | 162 + include/nettle/des.h | 120 + include/nettle/dsa-compat.h | 183 + include/nettle/dsa.h | 216 + include/nettle/eax.h | 185 + include/nettle/ecc-curve.h | 71 + include/nettle/ecc.h | 159 + include/nettle/ecdsa.h | 103 + include/nettle/eddsa.h | 149 + include/nettle/gcm.h | 327 + include/nettle/gosthash94.h | 98 + include/nettle/hkdf.h | 67 + include/nettle/hmac.h | 210 + include/nettle/knuth-lfib.h | 80 + include/nettle/macros.h | 245 + include/nettle/md2.h | 79 + include/nettle/md4.h | 83 + include/nettle/md5-compat.h | 58 + include/nettle/md5.h | 86 + include/nettle/memops.h | 57 + include/nettle/memxor.h | 25 + include/nettle/nettle-meta.h | 277 + include/nettle/nettle-stdint.h | 286 + include/nettle/nettle-types.h | 110 + include/nettle/pbkdf2.h | 85 + include/nettle/pgp.h | 248 + include/nettle/pkcs1.h | 114 + include/nettle/poly1305.h | 128 + include/nettle/pss-mgf1.h | 58 + include/nettle/pss.h | 65 + include/nettle/realloc.h | 48 + include/nettle/ripemd160.h | 88 + include/nettle/rsa.h | 564 + include/nettle/salsa20.h | 114 + include/nettle/serpent.h | 102 + include/nettle/sexp.h | 213 + include/nettle/sha.h | 42 + include/nettle/sha1.h | 88 + include/nettle/sha2.h | 206 + include/nettle/sha3.h | 193 + include/nettle/twofish.h | 98 + include/nettle/umac.h | 253 + include/nettle/version.h | 64 + include/nettle/yarrow.h | 145 + include/zip.h | 479 + include/zipconf.h | 51 + omc/config/NR.conf | 45 + omc/config/cacert.pem | 21 + omc/config/chkDb.conf | 1 + omc/config/client.crt | 61 + omc/config/client.csr | 13 + omc/config/client.key | 18 + omc/config/conv_prefix.conf | Bin 0 -> 23616 bytes omc/config/hosts | 5 + omc/config/httpd-ssl.conf | 232 + omc/config/httpd.conf | 0 omc/config/httpd.conf_centos | 992 + omc/config/my.cnf | 90 + omc/config/my.cnf_omc-0 | 94 + omc/config/my.cnf_omc-0.ES | 98 + omc/config/my.cnf_omc-1 | 94 + omc/config/my.cnf_omc-1.ES | 98 + omc/config/my.cnf_single | 72 + omc/config/my.cnf_single.ES | 77 + omc/config/omc_db.conf | 50 + omc/config/omcd.conf | 20 + omc/config/omcd.conf_omc-0 | 19 + omc/config/omcd.conf_omc-1 | 19 + omc/config/omcd.conf_single | 19 + omc/config/php.ini | 1224 + omc/config/php.ini_old_plat | 1223 + omc/config/profile | 48 + omc/config/rsyncd.conf | 15 + omc/config/server.conf | 31 + omc/config/server.crt | 61 + omc/config/server.csr | 13 + omc/config/server.key | 15 + omc/config/snmp.conf | 19 + omc/plat/.copyarea.db | 29 + omc/plat/8ecp/.copyarea.db | 9 + omc/plat/8ecp/Makefile | 96 + omc/plat/8ecp/lib/lib8ecp.a | Bin 0 -> 38998 bytes omc/plat/8ecp/obj/8ecp.o | Bin 0 -> 20488 bytes omc/plat/8ecp/obj/8ecp_debug.o | Bin 0 -> 17816 bytes omc/plat/8ecp/src/.copyarea.db | 7 + omc/plat/8ecp/src/8ecp.c | 288 + omc/plat/8ecp/src/8ecp_debug.c | 352 + omc/plat/8ecp/src/include/.copyarea.db | 6 + omc/plat/8ecp/src/include/8ecp.h | 149 + omc/plat/8ecp/src/include/8ecp_debug.h | 33 + omc/plat/aif/.copyarea.db | 9 + omc/plat/aif/Makefile | 95 + omc/plat/aif/doc/.copyarea.db | 5 + omc/plat/aif/doc/release_note.txt | 21 + omc/plat/aif/lib/libaif.a | Bin 0 -> 900178 bytes omc/plat/aif/obj/aifg.o | Bin 0 -> 102720 bytes omc/plat/aif/obj/aifg_csta.o | Bin 0 -> 17896 bytes omc/plat/aif/obj/aifg_debug.o | Bin 0 -> 127864 bytes omc/plat/aif/obj/aifg_ie.o | Bin 0 -> 130312 bytes omc/plat/aif/obj/aifg_m.o | Bin 0 -> 147752 bytes omc/plat/aif/obj/aifg_mpp.o | Bin 0 -> 366840 bytes omc/plat/aif/src/.copyarea.db | 11 + omc/plat/aif/src/aifg.c | 265 + omc/plat/aif/src/aifg_csta.c | 310 + omc/plat/aif/src/aifg_debug.c | 1296 + omc/plat/aif/src/aifg_ie.c | 2227 ++ omc/plat/aif/src/aifg_m.c | 1689 + omc/plat/aif/src/aifg_mpp.c | 7614 +++++ omc/plat/aif/src/include/.copyarea.db | 11 + omc/plat/aif/src/include/aifg.h | 118 + omc/plat/aif/src/include/aifg_ie.h | 1006 + omc/plat/aif/src/include/aifg_if.h | 31 + omc/plat/aif/src/include/aifg_msg.h | 1636 + omc/plat/aif/src/include/aifg_public.h | 43 + omc/plat/aif/src/include/aifg_type_def.h | 445 + omc/plat/aif/src/include/aifg_var_ext.h | 68 + omc/plat/aif/ut/.copyarea.db | 7 + omc/plat/aif/ut/aifg_main.c | 23 + omc/plat/aif/ut/aifg_test.c | 7083 +++++ omc/plat/aif/ut/makefile | 40 + omc/plat/bicc/.copyarea.db | 10 + omc/plat/bicc/Makefile | 98 + omc/plat/bicc/lib/libbicc.a | Bin 0 -> 328886 bytes omc/plat/bicc/obj/bicc_apm.o | Bin 0 -> 14960 bytes omc/plat/bicc/obj/bicc_debug.o | Bin 0 -> 44552 bytes omc/plat/bicc/obj/bicc_fsm.o | Bin 0 -> 61856 bytes omc/plat/bicc/obj/bicc_ipbcp.o | Bin 0 -> 17448 bytes omc/plat/bicc/obj/bicc_msg.o | Bin 0 -> 78176 bytes omc/plat/bicc/obj/bicc_prm.o | Bin 0 -> 34960 bytes omc/plat/bicc/obj/biccif.o | Bin 0 -> 72600 bytes omc/plat/bicc/src.old/.copyarea.db | 13 + omc/plat/bicc/src.old/bicc_apm.c | 206 + omc/plat/bicc/src.old/bicc_debug.c | 882 + omc/plat/bicc/src.old/bicc_fsm.c | 2093 ++ omc/plat/bicc/src.old/bicc_fsm.c.old | 2093 ++ omc/plat/bicc/src.old/bicc_ipbcp.c | 362 + omc/plat/bicc/src.old/bicc_msg.c | 1285 + omc/plat/bicc/src.old/bicc_prm.c | 244 + omc/plat/bicc/src.old/biccif.c | 1080 + omc/plat/bicc/src.old/include/.copyarea.db | 12 + omc/plat/bicc/src.old/include/bicc_debug.h | 25 + omc/plat/bicc/src.old/include/biccif.h | 417 + omc/plat/bicc/src.old/include/define.h | 34 + omc/plat/bicc/src.old/include/inc.h | 162 + omc/plat/bicc/src.old/include/ipbcp.h | 60 + omc/plat/bicc/src.old/include/q1902_3e.h | 456 + omc/plat/bicc/src.old/include/q765_5e.h | 100 + omc/plat/bicc/src.old/include/var_ext.h | 14 + omc/plat/bicc/src/.copyarea.db | 12 + omc/plat/bicc/src/bicc_apm.c | 206 + omc/plat/bicc/src/bicc_debug.c | 882 + omc/plat/bicc/src/bicc_fsm.c | 2093 ++ omc/plat/bicc/src/bicc_ipbcp.c | 362 + omc/plat/bicc/src/bicc_msg.c | 1285 + omc/plat/bicc/src/bicc_prm.c | 244 + omc/plat/bicc/src/biccif.c | 1080 + omc/plat/bicc/src/include/.copyarea.db | 12 + omc/plat/bicc/src/include/bicc_debug.h | 25 + omc/plat/bicc/src/include/biccif.h | 417 + omc/plat/bicc/src/include/define.h | 34 + omc/plat/bicc/src/include/inc.h | 162 + omc/plat/bicc/src/include/ipbcp.h | 60 + omc/plat/bicc/src/include/q1902_3e.h | 456 + omc/plat/bicc/src/include/q765_5e.h | 100 + omc/plat/bicc/src/include/var_ext.h | 14 + omc/plat/debug/.copyarea.db | 9 + omc/plat/debug/Makefile | 98 + omc/plat/debug/lib/libdebug.a | Bin 0 -> 565778 bytes omc/plat/debug/obj/debug.o | Bin 0 -> 560432 bytes omc/plat/debug/src/.copyarea.db | 6 + omc/plat/debug/src/debug.c | 15649 ++++++++++ omc/plat/debug/src/include/.copyarea.db | 6 + omc/plat/debug/src/include/debug.h | 64 + omc/plat/debug/src/include/debug_struct.h | 375 + omc/plat/debug/ut/.copyarea.db | 5 + omc/plat/debug/ut/debug_test.c | 926 + omc/plat/haepub/.copyarea.db | 9 + omc/plat/haepub/Makefile | 98 + omc/plat/haepub/lib/libhaepub.a | Bin 0 -> 248900 bytes omc/plat/haepub/obj/hae_function.o | Bin 0 -> 153584 bytes omc/plat/haepub/obj/hae_param.o | Bin 0 -> 25952 bytes omc/plat/haepub/obj/hae_sync.o | Bin 0 -> 67872 bytes omc/plat/haepub/src/.copyarea.db | 8 + omc/plat/haepub/src/hae_function.c | 344 + omc/plat/haepub/src/hae_param.c | 51 + omc/plat/haepub/src/hae_sync.c | 895 + omc/plat/haepub/src/include/.copyarea.db | 6 + omc/plat/haepub/src/include/hae_function.h | 51 + omc/plat/haepub/src/include/hae_include.h | 37 + omc/plat/iptrans/.copyarea.db | 9 + omc/plat/iptrans/Makefile | 98 + omc/plat/iptrans/doc/iptrans_bak | Bin 0 -> 483915 bytes omc/plat/iptrans/generate_iptrans | 3 + omc/plat/iptrans/iptrans | Bin 0 -> 576328 bytes omc/plat/iptrans/iptrans_bak | Bin 0 -> 483915 bytes omc/plat/iptrans/lib/libiptrans.a | Bin 0 -> 220956 bytes omc/plat/iptrans/obj/comfunc.o | Bin 0 -> 9320 bytes omc/plat/iptrans/obj/daemon.o | Bin 0 -> 6656 bytes omc/plat/iptrans/obj/error.o | Bin 0 -> 11016 bytes omc/plat/iptrans/obj/errorlog.o | Bin 0 -> 12104 bytes omc/plat/iptrans/obj/ipcfunc.o | Bin 0 -> 8760 bytes omc/plat/iptrans/obj/ipmsgfun.o | Bin 0 -> 8344 bytes omc/plat/iptrans/obj/iptrans.o | Bin 0 -> 94536 bytes omc/plat/iptrans/obj/iptrmain.o | Bin 0 -> 15504 bytes omc/plat/iptrans/obj/mcast_join.o | Bin 0 -> 10592 bytes omc/plat/iptrans/obj/queuefunc.o | Bin 0 -> 9864 bytes omc/plat/iptrans/obj/readmsg.o | Bin 0 -> 22536 bytes omc/plat/iptrans/obj/signal.o | Bin 0 -> 4816 bytes omc/plat/iptrans/obj/simu_debug.o | Bin 0 -> 4416 bytes omc/plat/iptrans/src/.copyarea.db | 18 + omc/plat/iptrans/src/comfunc.c | 81 + omc/plat/iptrans/src/daemon.c | 65 + omc/plat/iptrans/src/error.c | 114 + omc/plat/iptrans/src/errorlog.c | 131 + omc/plat/iptrans/src/generate_iptrans | 3 + omc/plat/iptrans/src/include/.copyarea.db | 12 + omc/plat/iptrans/src/include/config.h | 23 + omc/plat/iptrans/src/include/dbsync.h | 37 + omc/plat/iptrans/src/include/debug.h | 53 + omc/plat/iptrans/src/include/errlog.h | 39 + omc/plat/iptrans/src/include/function.h | 127 + omc/plat/iptrans/src/include/includes.h | 47 + omc/plat/iptrans/src/include/iptrans.h | 201 + omc/plat/iptrans/src/include/iptrfunc.h | 9 + omc/plat/iptrans/src/ipcfunc.c | 93 + omc/plat/iptrans/src/ipmsgfun.c | 51 + omc/plat/iptrans/src/iptrans.c | 1864 ++ omc/plat/iptrans/src/iptrans_bak | Bin 0 -> 479967 bytes omc/plat/iptrans/src/iptrmain.c | 100 + omc/plat/iptrans/src/mcast_join.c | 59 + omc/plat/iptrans/src/queuefunc.c | 133 + omc/plat/iptrans/src/readmsg.c | 189 + omc/plat/iptrans/src/signal.c | 33 + omc/plat/iptrans/src/simu_debug.c | 21 + omc/plat/isdn/.copyarea.db | 9 + omc/plat/isdn/Makefile | 98 + omc/plat/isdn/doc/.copyarea.db | 5 + omc/plat/isdn/doc/D-500014-0-10.doc | Bin 0 -> 1364480 bytes omc/plat/isdn/lib/libisdn.a | Bin 0 -> 496930 bytes omc/plat/isdn/obj/isdn_debug.o | Bin 0 -> 70288 bytes omc/plat/isdn/obj/isdn_fsm.o | Bin 0 -> 114424 bytes omc/plat/isdn/obj/isdn_ie.o | Bin 0 -> 69272 bytes omc/plat/isdn/obj/isdn_msg.o | Bin 0 -> 142080 bytes omc/plat/isdn/obj/isdn_rm.o | Bin 0 -> 47504 bytes omc/plat/isdn/obj/isdn_uif.o | Bin 0 -> 48768 bytes omc/plat/isdn/src/.copyarea.db | 12 + omc/plat/isdn/src/Makefile | 35 + omc/plat/isdn/src/include/.copyarea.db | 13 + omc/plat/isdn/src/include/isdn_const.h | 275 + omc/plat/isdn/src/include/isdn_debug.h | 81 + omc/plat/isdn/src/include/isdn_ext.h | 33 + omc/plat/isdn/src/include/isdn_ie.h | 491 + omc/plat/isdn/src/include/isdn_if.h | 119 + omc/plat/isdn/src/include/isdn_inc.h | 27 + omc/plat/isdn/src/include/isdn_msg.h | 333 + omc/plat/isdn/src/include/isdn_public.h | 56 + omc/plat/isdn/src/include/isdn_rm.h | 151 + omc/plat/isdn/src/isdn_debug.c | 1373 + omc/plat/isdn/src/isdn_fsm.c | 3124 ++ omc/plat/isdn/src/isdn_ie.c | 1665 + omc/plat/isdn/src/isdn_msg.c | 3439 ++ omc/plat/isdn/src/isdn_rm.c | 515 + omc/plat/isdn/src/isdn_uif.c | 428 + omc/plat/isdn/ut/.copyarea.db | 12 + omc/plat/isdn/ut/Makefile | 45 + omc/plat/isdn/ut/code/.copyarea.db | 26 + omc/plat/isdn/ut/code/data.Text | 69 + omc/plat/isdn/ut/code/ds-service-01.Text | 33 + omc/plat/isdn/ut/code/ds-service-02.Text | 33 + omc/plat/isdn/ut/code/headfile.txt | 3 + omc/plat/isdn/ut/code/iua data.txt | 19 + omc/plat/isdn/ut/code/iua set up-bak.txt | 47 + omc/plat/isdn/ut/code/iua set up.Text | 82 + omc/plat/isdn/ut/code/iua set up.txt | 41 + omc/plat/isdn/ut/code/nt-2link-01.Text | 151 + omc/plat/isdn/ut/code/nt-incoming-01.Text | 82 + omc/plat/isdn/ut/code/nt-incoming-02.Text | 82 + omc/plat/isdn/ut/code/nt-outgoing-01-.Text | 83 + omc/plat/isdn/ut/code/nt-outgoing-01.Text | 85 + omc/plat/isdn/ut/code/nt-outgoing-02.Text | 82 + omc/plat/isdn/ut/code/rest1-0.Text | 44 + omc/plat/isdn/ut/code/rest2-0.Text | 44 + omc/plat/isdn/ut/code/test-01.Text | 103 + omc/plat/isdn/ut/code/u01-01.Text | 47 + omc/plat/isdn/ut/code/u01-03.Text | 96 + omc/plat/isdn/ut/code/u01-05.Text | 36 + omc/plat/isdn/ut/code/u01-10.Text | 89 + omc/plat/isdn/ut/code/u03-13.Text | 97 + omc/plat/isdn/ut/isdn_main.c | 323 + omc/plat/isdn/ut/isdn_test.c | 325 + omc/plat/isdn/ut/test_main | Bin 0 -> 1120958 bytes omc/plat/isdn/ut/test_main_0526 | Bin 0 -> 1116128 bytes omc/plat/isup/.copyarea.db | 10 + omc/plat/isup/Makefile | 98 + omc/plat/isup/doc/.copyarea.db | 12 + omc/plat/isup/doc/ISUP_R9V0_01P07.doc | Bin 0 -> 59904 bytes omc/plat/isup/doc/ISUP_R9V0_01P08.doc | Bin 0 -> 60416 bytes omc/plat/isup/doc/ISUP_R9V0_01P8.doc | Bin 0 -> 60416 bytes omc/plat/isup/doc/ISUP_R9V0_02P01.doc | Bin 0 -> 58368 bytes omc/plat/isup/doc/ISUP_R9V0_02P02.doc | Bin 0 -> 58368 bytes omc/plat/isup/doc/ISUP_R9V0_02P03-6.doc | Bin 0 -> 58368 bytes omc/plat/isup/doc/ISUP_R9V0_02P07.doc | Bin 0 -> 58368 bytes omc/plat/isup/doc/ISUP_R9V0_02P1.doc | Bin 0 -> 58368 bytes omc/plat/isup/lib/libisup.a | Bin 0 -> 626636 bytes omc/plat/isup/obj/isup_debug.o | Bin 0 -> 63312 bytes omc/plat/isup/obj/isup_fsm.o | Bin 0 -> 121624 bytes omc/plat/isup/obj/isup_if.o | Bin 0 -> 89496 bytes omc/plat/isup/obj/isup_msg.o | Bin 0 -> 332808 bytes omc/plat/isup/obj/isup_transit.o | Bin 0 -> 12960 bytes omc/plat/isup/src/.copyarea.db | 11 + omc/plat/isup/src/include/.copyarea.db | 13 + omc/plat/isup/src/include/inc.h | 19 + omc/plat/isup/src/include/isup_const.h | 274 + omc/plat/isup/src/include/isup_debug.h | 45 + omc/plat/isup/src/include/isup_def.h | 62 + omc/plat/isup/src/include/isup_if.h | 111 + omc/plat/isup/src/include/isup_msg.h | 1699 + omc/plat/isup/src/include/isup_public.h | 49 + omc/plat/isup/src/include/isup_struct.h | 138 + omc/plat/isup/src/include/vssver2.scc | Bin 0 -> 270 bytes omc/plat/isup/src/isup_debug.c | 1586 + omc/plat/isup/src/isup_fsm.c | 2602 ++ omc/plat/isup/src/isup_if.c | 700 + omc/plat/isup/src/isup_msg.c | 7879 +++++ omc/plat/isup/src/isup_transit.c | 402 + omc/plat/isup/src/vssver2.scc | Bin 0 -> 179 bytes omc/plat/isup/ut/.copyarea.db | 7 + omc/plat/isup/ut/isup_main.c | 187 + omc/plat/isup/ut/isup_msg_rv.txt | 87 + omc/plat/isup/ut/isup_msg_send.txt | 62 + omc/plat/m2ua/.copyarea.db | 10 + omc/plat/m2ua/Makefile | 98 + omc/plat/m2ua/doc/.copyarea.db | 5 + omc/plat/m2ua/doc/M2UA_R9V0_04P01.doc | Bin 0 -> 58368 bytes omc/plat/m2ua/lib/libm2ua.a | Bin 0 -> 248904 bytes omc/plat/m2ua/obj/m2ua.o | Bin 0 -> 28632 bytes omc/plat/m2ua/obj/m2ua_debug.o | Bin 0 -> 32048 bytes omc/plat/m2ua/obj/m2ua_fsm.o | Bin 0 -> 60976 bytes omc/plat/m2ua/obj/m2ua_msg.o | Bin 0 -> 125056 bytes omc/plat/m2ua/src/.copyarea.db | 9 + omc/plat/m2ua/src/include/.copyarea.db | 14 + omc/plat/m2ua/src/include/m2ua.h | 140 + omc/plat/m2ua/src/include/m2ua_const.h | 381 + omc/plat/m2ua/src/include/m2ua_debug.h | 10 + omc/plat/m2ua/src/include/m2ua_def.h | 69 + omc/plat/m2ua/src/include/m2ua_ext.h | 67 + omc/plat/m2ua/src/include/m2ua_fsm.h | 9 + omc/plat/m2ua/src/include/m2ua_msg.h | 58 + omc/plat/m2ua/src/include/m2ua_pub.h | 65 + omc/plat/m2ua/src/include/m2ua_struct.h | 255 + omc/plat/m2ua/src/include/sctp.h | 656 + omc/plat/m2ua/src/m2ua.c | 409 + omc/plat/m2ua/src/m2ua_debug.c | 518 + omc/plat/m2ua/src/m2ua_fsm.c | 1571 + omc/plat/m2ua/src/m2ua_msg.c | 3481 +++ omc/plat/m2ua/src_old/.copyarea.db | 9 + omc/plat/m2ua/src_old/include/.copyarea.db | 14 + omc/plat/m2ua/src_old/include/m2ua.h | 88 + omc/plat/m2ua/src_old/include/m2ua_const.h | 330 + omc/plat/m2ua/src_old/include/m2ua_debug.h | 10 + omc/plat/m2ua/src_old/include/m2ua_def.h | 64 + omc/plat/m2ua/src_old/include/m2ua_ext.h | 64 + omc/plat/m2ua/src_old/include/m2ua_fsm.h | 9 + omc/plat/m2ua/src_old/include/m2ua_msg.h | 53 + omc/plat/m2ua/src_old/include/m2ua_pub.h | 63 + omc/plat/m2ua/src_old/include/m2ua_struct.h | 240 + omc/plat/m2ua/src_old/include/sctp.h | 655 + omc/plat/m2ua/src_old/m2ua.c | 362 + omc/plat/m2ua/src_old/m2ua_debug.c | 510 + omc/plat/m2ua/src_old/m2ua_fsm.c | 1505 + omc/plat/m2ua/src_old/m2ua_msg.c | 2749 ++ omc/plat/m2ua/ut/.copyarea.db | 6 + omc/plat/m2ua/ut/testcate/.copyarea.db | 13 + omc/plat/m2ua/ut/testcate/MGC(IUA)_Client.txt | 32 + omc/plat/m2ua/ut/testcate/MGC(IUA)_Server.txt | 52 + .../m2ua/ut/testcate/MGC(M2UA)_Client.txt | 33 + .../m2ua/ut/testcate/MGC(M2UA)_Server.txt | 61 + omc/plat/m2ua/ut/testcate/SG(IUA)_Client.txt | 80 + omc/plat/m2ua/ut/testcate/SG(IUA)_Server.txt | 16 + omc/plat/m2ua/ut/testcate/SG(M2UA)_Client.txt | 79 + omc/plat/m2ua/ut/testcate/SG(M2UA)_Server.txt | 15 + omc/plat/m2ua/ut/testcate/headfile.txt | 6 + omc/plat/m2ua/ut/xua_test/.copyarea.db | 7 + omc/plat/m2ua/ut/xua_test/Makefile | 21 + omc/plat/m2ua/ut/xua_test/conf/.copyarea.db | 35 + omc/plat/m2ua/ut/xua_test/conf/AucSysPara | Bin 0 -> 56 bytes omc/plat/m2ua/ut/xua_test/conf/EirSysPara | Bin 0 -> 17476 bytes omc/plat/m2ua/ut/xua_test/conf/HlrSysPara | Bin 0 -> 7244 bytes omc/plat/m2ua/ut/xua_test/conf/cap_acn.conf | 7 + .../m2ua/ut/xua_test/conf/cap_operation.conf | 34 + omc/plat/m2ua/ut/xua_test/conf/cc_table.conf | 215 + .../m2ua/ut/xua_test/conf/conv_prefix.conf | Bin 0 -> 4096 bytes omc/plat/m2ua/ut/xua_test/conf/help_page | 20 + .../m2ua/ut/xua_test/conf/hlr_parambit.conf | Bin 0 -> 20740 bytes omc/plat/m2ua/ut/xua_test/conf/iptrans.conf | 16 + omc/plat/m2ua/ut/xua_test/conf/map_acn.conf | 40 + .../m2ua/ut/xua_test/conf/map_operation.conf | 67 + omc/plat/m2ua/ut/xua_test/conf/menu_page | 13 + omc/plat/m2ua/ut/xua_test/conf/mnpf.conf | Bin 0 -> 718 bytes omc/plat/m2ua/ut/xua_test/conf/msc_conf | Bin 0 -> 220944 bytes omc/plat/m2ua/ut/xua_test/conf/mtp3.conf | 1408 + omc/plat/m2ua/ut/xua_test/conf/ppsConf.txt | Bin 0 -> 4524 bytes omc/plat/m2ua/ut/xua_test/conf/ppsCrdConf.txt | Bin 0 -> 10289 bytes omc/plat/m2ua/ut/xua_test/conf/profile | 37 + omc/plat/m2ua/ut/xua_test/conf/sccp.conf | 85 + omc/plat/m2ua/ut/xua_test/conf/sccp_omt.conf | 87 + omc/plat/m2ua/ut/xua_test/conf/sccp_sts.conf | 74 + omc/plat/m2ua/ut/xua_test/conf/smsc_csta.conf | 21 + .../m2ua/ut/xua_test/conf/smsc_parambit.conf | Bin 0 -> 5812 bytes omc/plat/m2ua/ut/xua_test/conf/smsc_sys.conf | 5 + omc/plat/m2ua/ut/xua_test/conf/system.ini | Bin 0 -> 212 bytes omc/plat/m2ua/ut/xua_test/conf/vlr.conf | Bin 0 -> 128 bytes omc/plat/m2ua/ut/xua_test/conf/wxc2_sys.conf | 3 + omc/plat/m2ua/ut/xua_test/conf/wxc2exit.txt | 4 + .../m2ua/ut/xua_test/conf/xap_sysparam.conf | Bin 0 -> 13 bytes omc/plat/m2ua/ut/xua_test/xuatest.c | 293 + omc/plat/make_plat | 19 + omc/plat/mgc/.copyarea.db | 9 + omc/plat/mgc/Makefile | 98 + omc/plat/mgc/lib/libmgc.a | Bin 0 -> 319040 bytes omc/plat/mgc/obj/mgc.o | Bin 0 -> 203840 bytes omc/plat/mgc/obj/mgc_debug.o | Bin 0 -> 33288 bytes omc/plat/mgc/obj/mgc_fsm.o | Bin 0 -> 61032 bytes omc/plat/mgc/obj/mgc_sess_ctl.o | Bin 0 -> 17496 bytes omc/plat/mgc/src/.copyarea.db | 12 + omc/plat/mgc/src/include/.copyarea.db | 13 + omc/plat/mgc/src/include/mgc.h | 251 + omc/plat/mgc/src/include/mgc_const.h | 75 + omc/plat/mgc/src/include/mgc_debug.h | 11 + omc/plat/mgc/src/include/mgc_def.h | 74 + omc/plat/mgc/src/include/mgc_ext.h | 39 + omc/plat/mgc/src/include/mgc_fsm.h | 11 + omc/plat/mgc/src/include/mgc_pub.h | 7 + omc/plat/mgc/src/include/mgc_sess_ctl.h | 40 + omc/plat/mgc/src/include/mgc_struct.h | 114 + omc/plat/mgc/src/mgc.c | 4697 +++ omc/plat/mgc/src/mgc.c.bak | 4016 +++ omc/plat/mgc/src/mgc_debug.c | 478 + omc/plat/mgc/src/mgc_fsm.c | 1456 + omc/plat/mgc/src/mgc_fsm.c.bak | 1052 + omc/plat/mgc/src/mgc_sess_ctl.c | 199 + omc/plat/mgc_v2/.copyarea.db | 9 + omc/plat/mgc_v2/Makefile | 98 + omc/plat/mgc_v2/lib/libmgc_v2.a | Bin 0 -> 714428 bytes omc/plat/mgc_v2/obj/mgc.o | Bin 0 -> 114504 bytes omc/plat/mgc_v2/obj/mgc_8ecp.o | Bin 0 -> 32160 bytes omc/plat/mgc_v2/obj/mgc_chnl_info.o | Bin 0 -> 38264 bytes omc/plat/mgc_v2/obj/mgc_conn_info.o | Bin 0 -> 69136 bytes omc/plat/mgc_v2/obj/mgc_ctl.o | Bin 0 -> 8440 bytes omc/plat/mgc_v2/obj/mgc_debug.o | Bin 0 -> 53240 bytes omc/plat/mgc_v2/obj/mgc_internal.o | Bin 0 -> 35344 bytes omc/plat/mgc_v2/obj/mgc_mg_info.o | Bin 0 -> 45464 bytes omc/plat/mgc_v2/obj/mgc_mgcp.o | Bin 0 -> 63104 bytes omc/plat/mgc_v2/obj/mgc_phy_port.o | Bin 0 -> 33888 bytes omc/plat/mgc_v2/obj/mgc_port_info.o | Bin 0 -> 68392 bytes omc/plat/mgc_v2/obj/mgc_port_list.o | Bin 0 -> 29312 bytes omc/plat/mgc_v2/obj/mgc_sur_info.o | Bin 0 -> 40488 bytes omc/plat/mgc_v2/obj/mgc_tandem_info.o | Bin 0 -> 71184 bytes omc/plat/mgc_v2/src/.copyarea.db | 19 + omc/plat/mgc_v2/src/include/.copyarea.db | 21 + omc/plat/mgc_v2/src/include/mgc.h | 449 + omc/plat/mgc_v2/src/include/mgc_8ecp.h | 17 + omc/plat/mgc_v2/src/include/mgc_chnl_info.h | 32 + omc/plat/mgc_v2/src/include/mgc_conn_info.h | 71 + omc/plat/mgc_v2/src/include/mgc_ctl.h | 16 + omc/plat/mgc_v2/src/include/mgc_debug.h | 67 + omc/plat/mgc_v2/src/include/mgc_internal.h | 32 + omc/plat/mgc_v2/src/include/mgc_mg_info.h | 30 + omc/plat/mgc_v2/src/include/mgc_mgcp.h | 41 + omc/plat/mgc_v2/src/include/mgc_phy_port.h | 24 + omc/plat/mgc_v2/src/include/mgc_port_info.h | 38 + omc/plat/mgc_v2/src/include/mgc_port_list.h | 10 + omc/plat/mgc_v2/src/include/mgc_pub.h | 8 + omc/plat/mgc_v2/src/include/mgc_snmp.h | 17 + omc/plat/mgc_v2/src/include/mgc_struct.h | 196 + omc/plat/mgc_v2/src/include/mgc_sur_info.h | 19 + omc/plat/mgc_v2/src/include/mgc_tandem_info.h | 37 + omc/plat/mgc_v2/src/mgc.c | 2633 ++ omc/plat/mgc_v2/src/mgc_8ecp.c | 326 + omc/plat/mgc_v2/src/mgc_chnl_info.c | 613 + omc/plat/mgc_v2/src/mgc_conn_info.c | 1724 + omc/plat/mgc_v2/src/mgc_ctl.c | 146 + omc/plat/mgc_v2/src/mgc_debug.c | 779 + omc/plat/mgc_v2/src/mgc_internal.c | 377 + omc/plat/mgc_v2/src/mgc_mg_info.c | 937 + omc/plat/mgc_v2/src/mgc_mgcp.c | 1398 + omc/plat/mgc_v2/src/mgc_phy_port.c | 482 + omc/plat/mgc_v2/src/mgc_port_info.c | 1627 + omc/plat/mgc_v2/src/mgc_port_list.c | 291 + omc/plat/mgc_v2/src/mgc_sur_info.c | 562 + omc/plat/mgc_v2/src/mgc_tandem_info.c | 1374 + omc/plat/mgc_v2/ut/.copyarea.db | 14 + omc/plat/mgc_v2/ut/CUnit-List.dtd | 26 + omc/plat/mgc_v2/ut/CUnit-List.xsl | 119 + omc/plat/mgc_v2/ut/CUnit-Run.dtd | 35 + omc/plat/mgc_v2/ut/CUnit-Run.xsl | 131 + omc/plat/mgc_v2/ut/Makefile | 100 + omc/plat/mgc_v2/ut/conf/.copyarea.db | 6 + omc/plat/mgc_v2/ut/conf/iptrans.conf | 43 + omc/plat/mgc_v2/ut/conf/menu_page | 17 + omc/plat/mgc_v2/ut/include/.copyarea.db | 14 + omc/plat/mgc_v2/ut/include/Automated.h | 63 + omc/plat/mgc_v2/ut/include/Basic.h | 61 + omc/plat/mgc_v2/ut/include/CUCurses.h | 61 + omc/plat/mgc_v2/ut/include/CUError.h | 134 + omc/plat/mgc_v2/ut/include/CUnit.h | 372 + omc/plat/mgc_v2/ut/include/Console.h | 59 + omc/plat/mgc_v2/ut/include/MyMem.h | 104 + omc/plat/mgc_v2/ut/include/TestDB.h | 357 + omc/plat/mgc_v2/ut/include/TestRun.h | 193 + omc/plat/mgc_v2/ut/include/Util.h | 87 + omc/plat/mgc_v2/ut/mgc_v2_test | Bin 0 -> 937577 bytes omc/plat/mgc_v2/ut/mgc_v2_test.c | 1786 ++ omc/plat/mgcp/.copyarea.db | 9 + omc/plat/mgcp/Makefile | 98 + omc/plat/mgcp/lib/libmgcp.a | Bin 0 -> 188092 bytes omc/plat/mgcp/obj/mgcp.o | Bin 0 -> 28976 bytes omc/plat/mgcp/obj/mgcp_debug.o | Bin 0 -> 31504 bytes omc/plat/mgcp/obj/mgcp_msg.o | Bin 0 -> 105664 bytes omc/plat/mgcp/obj/mgcp_trans.o | Bin 0 -> 19272 bytes omc/plat/mgcp/src/.copyarea.db | 10 + omc/plat/mgcp/src/include/.copyarea.db | 13 + omc/plat/mgcp/src/include/mgcp.h | 311 + omc/plat/mgcp/src/include/mgcp_const.h | 47 + omc/plat/mgcp/src/include/mgcp_debug.h | 10 + omc/plat/mgcp/src/include/mgcp_def.h | 62 + omc/plat/mgcp/src/include/mgcp_ext.h | 42 + omc/plat/mgcp/src/include/mgcp_msg.h | 10 + omc/plat/mgcp/src/include/mgcp_pub.h | 55 + omc/plat/mgcp/src/include/mgcp_struct.h | 31 + omc/plat/mgcp/src/include/mgcp_trans.h | 8 + omc/plat/mgcp/src/mgcp.c | 249 + omc/plat/mgcp/src/mgcp_debug.c | 585 + omc/plat/mgcp/src/mgcp_msg.c | 2740 ++ omc/plat/mgcp/src/mgcp_msg.c.bak | 2612 ++ omc/plat/mgcp/src/mgcp_trans.c | 300 + omc/plat/mtp3/.copyarea.db | 9 + omc/plat/mtp3/Makefile | 98 + omc/plat/mtp3/lib/libmtp3.a | Bin 0 -> 731062 bytes omc/plat/mtp3/obj/mtp3lite.o | Bin 0 -> 42472 bytes omc/plat/mtp3/obj/mtpinit.o | Bin 0 -> 121784 bytes omc/plat/mtp3/obj/mtpm.o | Bin 0 -> 119608 bytes omc/plat/mtp3/obj/mtpmib.o | Bin 0 -> 126712 bytes omc/plat/mtp3/obj/mtpslm.o | Bin 0 -> 23304 bytes omc/plat/mtp3/obj/mtpsmh.o | Bin 0 -> 174032 bytes omc/plat/mtp3/obj/mtpsrm.o | Bin 0 -> 21952 bytes omc/plat/mtp3/obj/mtpstm.o | Bin 0 -> 91176 bytes omc/plat/mtp3/src/.copyarea.db | 13 + omc/plat/mtp3/src/include/.copyarea.db | 12 + omc/plat/mtp3/src/include/mtp3.h | 171 + omc/plat/mtp3/src/include/mtp3lite.h | 28 + omc/plat/mtp3/src/include/mtp3lite_pub.h | 53 + omc/plat/mtp3/src/include/mtpconst.h | 575 + omc/plat/mtp3/src/include/mtpdef.h | 155 + omc/plat/mtp3/src/include/mtpext.h | 140 + omc/plat/mtp3/src/include/mtpfunc.h | 102 + omc/plat/mtp3/src/include/mtpstm.h | 261 + omc/plat/mtp3/src/mtp3lite.c | 742 + omc/plat/mtp3/src/mtpinit.c | 2025 ++ omc/plat/mtp3/src/mtpm.c | 2492 ++ omc/plat/mtp3/src/mtpmib.c | 2598 ++ omc/plat/mtp3/src/mtpslm.c | 405 + omc/plat/mtp3/src/mtpsmh.c | 4369 +++ omc/plat/mtp3/src/mtpsrm.c | 336 + omc/plat/mtp3/src/mtpstm.c | 2204 ++ omc/plat/mtp3_old/.copyarea.db | 9 + omc/plat/mtp3_old/Makefile | 98 + omc/plat/mtp3_old/src/.copyarea.db | 13 + omc/plat/mtp3_old/src/include/.copyarea.db | 12 + omc/plat/mtp3_old/src/include/mtp3.h | 171 + omc/plat/mtp3_old/src/include/mtp3lite.h | 28 + omc/plat/mtp3_old/src/include/mtp3lite_pub.h | 53 + omc/plat/mtp3_old/src/include/mtpconst.h | 574 + omc/plat/mtp3_old/src/include/mtpdef.h | 155 + omc/plat/mtp3_old/src/include/mtpext.h | 140 + omc/plat/mtp3_old/src/include/mtpfunc.h | 102 + omc/plat/mtp3_old/src/include/mtpstm.h | 259 + omc/plat/mtp3_old/src/mtp3lite.c | 742 + omc/plat/mtp3_old/src/mtpinit.c | 2018 ++ omc/plat/mtp3_old/src/mtpm.c | 2483 ++ omc/plat/mtp3_old/src/mtpmib.c | 2544 ++ omc/plat/mtp3_old/src/mtpslm.c | 405 + omc/plat/mtp3_old/src/mtpsmh.c | 4260 +++ omc/plat/mtp3_old/src/mtpsrm.c | 336 + omc/plat/mtp3_old/src/mtpstm.c | 2203 ++ omc/plat/pal/.copyarea.db | 8 + omc/plat/pal/Makefile | 13 + .../lib/Just for creating lib directory.txt | 0 omc/plat/pal/lib/libpal.a | Bin 0 -> 19994 bytes omc/plat/pal/pal.h | 123 + omc/plat/pal/rm.c | 339 + omc/plat/pal/rm.o | Bin 0 -> 19456 bytes omc/plat/public/.copyarea.db | 9 + omc/plat/public/Makefile | 98 + omc/plat/public/lib/libpublic.a | Bin 0 -> 570844 bytes omc/plat/public/obj/apiKey.o | Bin 0 -> 4776 bytes omc/plat/public/obj/asn1.o | Bin 0 -> 40544 bytes omc/plat/public/obj/bisearch.o | Bin 0 -> 11304 bytes omc/plat/public/obj/cJSON.o | Bin 0 -> 77544 bytes omc/plat/public/obj/cdr.o | Bin 0 -> 30456 bytes omc/plat/public/obj/crypt.o | Bin 0 -> 19304 bytes omc/plat/public/obj/list.o | Bin 0 -> 9832 bytes omc/plat/public/obj/memwatch.o | Bin 0 -> 92936 bytes omc/plat/public/obj/number.o | Bin 0 -> 14880 bytes omc/plat/public/obj/numgrp.o | Bin 0 -> 11872 bytes omc/plat/public/obj/pub_conf.o | Bin 0 -> 1352 bytes omc/plat/public/obj/pub_debug.o | Bin 0 -> 9088 bytes omc/plat/public/obj/pub_file.o | Bin 0 -> 7160 bytes omc/plat/public/obj/pub_fmt.o | Bin 0 -> 39680 bytes omc/plat/public/obj/pub_inet.o | Bin 0 -> 29576 bytes omc/plat/public/obj/pub_log.o | Bin 0 -> 10792 bytes omc/plat/public/obj/pub_malloc.o | Bin 0 -> 2864 bytes omc/plat/public/obj/pub_netcap.o | Bin 0 -> 20968 bytes omc/plat/public/obj/pub_sdp.o | Bin 0 -> 51920 bytes omc/plat/public/obj/pub_str.o | Bin 0 -> 10320 bytes omc/plat/public/obj/pub_sys.o | Bin 0 -> 20496 bytes omc/plat/public/obj/pub_time.o | Bin 0 -> 9104 bytes omc/plat/public/obj/pub_timer.o | Bin 0 -> 11416 bytes omc/plat/public/obj/pub_wnet.o | Bin 0 -> 15648 bytes omc/plat/public/obj/shm.o | Bin 0 -> 8648 bytes omc/plat/public/src/.copyarea.db | 26 + omc/plat/public/src/apiKey.c | 14 + omc/plat/public/src/asn1.c | 943 + omc/plat/public/src/bisearch.c | 199 + omc/plat/public/src/cJSON.c | 2932 ++ omc/plat/public/src/cdr.c | 448 + omc/plat/public/src/crypt.c | 493 + omc/plat/public/src/include/.copyarea.db | 30 + omc/plat/public/src/include/asn1.h | 76 + omc/plat/public/src/include/bisearch.h | 123 + omc/plat/public/src/include/cJSON.h | 277 + omc/plat/public/src/include/cdr.h | 60 + omc/plat/public/src/include/crypt.h | 28 + omc/plat/public/src/include/includes.h | 47 + omc/plat/public/src/include/keyValuePair.h | 15 + omc/plat/public/src/include/license_id.h | 37 + omc/plat/public/src/include/list.h | 38 + omc/plat/public/src/include/memwatch.h | 707 + omc/plat/public/src/include/omc_public.h | 643 + omc/plat/public/src/include/pub_base.h | 127 + omc/plat/public/src/include/pub_debug.h | 43 + omc/plat/public/src/include/pub_file.h | 22 + omc/plat/public/src/include/pub_fmt.h | 132 + omc/plat/public/src/include/pub_include.h | 39 + omc/plat/public/src/include/pub_inet.h | 77 + omc/plat/public/src/include/pub_list.h | 501 + omc/plat/public/src/include/pub_log.h | 68 + omc/plat/public/src/include/pub_malloc.h | 26 + omc/plat/public/src/include/pub_netcap.h | 35 + omc/plat/public/src/include/pub_sdp.h | 200 + omc/plat/public/src/include/pub_str.h | 26 + omc/plat/public/src/include/pub_sys.h | 53 + omc/plat/public/src/include/pub_time.h | 29 + omc/plat/public/src/include/pub_timer.h | 97 + omc/plat/public/src/include/pub_wnet.h | 41 + omc/plat/public/src/include/public.h | 102 + omc/plat/public/src/include/svrstat.h | 100 + omc/plat/public/src/list.c | 166 + omc/plat/public/src/memwatch.c | 2669 ++ omc/plat/public/src/pub_conf.c | 12 + omc/plat/public/src/pub_debug.c | 52 + omc/plat/public/src/pub_file.c | 44 + omc/plat/public/src/pub_fmt.c | 1264 + omc/plat/public/src/pub_inet.c | 407 + omc/plat/public/src/pub_log.c | 135 + omc/plat/public/src/pub_malloc.c | 23 + omc/plat/public/src/pub_netcap.c | 370 + omc/plat/public/src/pub_sdp.c | 1802 ++ omc/plat/public/src/pub_str.c | 977 + omc/plat/public/src/pub_sys.c | 557 + omc/plat/public/src/pub_time.c | 130 + omc/plat/public/src/pub_timer.c | 182 + omc/plat/public/src/pub_wnet.c | 425 + omc/plat/public/src/shm.c | 67 + omc/plat/public/src/uwav/.copyarea.db | 8 + omc/plat/public/src/uwav/number.c | 379 + omc/plat/public/src/uwav/number.h | 80 + omc/plat/public/src/uwav/numgrp.c | 176 + omc/plat/public/src/uwav/numgrp.h | 29 + omc/plat/public/ut/.copyarea.db | 12 + omc/plat/public/ut/asn.1/.copyarea.db | 5 + omc/plat/public/ut/asn.1/asntest.c | 429 + omc/plat/public/ut/bisearch/.copyarea.db | 5 + omc/plat/public/ut/bisearch/bisearch_test.c | 149 + omc/plat/public/ut/debug_api/.copyarea.db | 6 + omc/plat/public/ut/debug_api/debug | Bin 0 -> 11872 bytes omc/plat/public/ut/debug_api/wxc_debug_test.c | 125 + omc/plat/public/ut/function.c | 87 + omc/plat/public/ut/inet/.copyarea.db | 5 + omc/plat/public/ut/inet/pub_inet_test.c | 646 + omc/plat/public/ut/main/.copyarea.db | 8 + omc/plat/public/ut/main/Makefile | 98 + omc/plat/public/ut/main/src/.copyarea.db | 5 + omc/plat/public/ut/main/src/main.c | 19 + omc/plat/public/ut/public_test/.copyarea.db | 5 + omc/plat/public/ut/public_test/public_test.c | 15 + omc/plat/public/ut/timer/.copyarea.db | 9 + omc/plat/public/ut/timer/Makefile | 72 + omc/plat/public/ut/timer/wxc_tmtest.c | 155 + omc/plat/public_bak/.copyarea.db | 9 + omc/plat/public_bak/Makefile | 98 + omc/plat/public_bak/src/.copyarea.db | 24 + omc/plat/public_bak/src/asn1.c | 941 + omc/plat/public_bak/src/bisearch.c | 199 + omc/plat/public_bak/src/crypt.c | 493 + omc/plat/public_bak/src/include/.copyarea.db | 29 + omc/plat/public_bak/src/include/asn1.h | 76 + omc/plat/public_bak/src/include/bisearch.h | 123 + omc/plat/public_bak/src/include/crypt.h | 28 + omc/plat/public_bak/src/include/includes.h | 47 + omc/plat/public_bak/src/include/license_id.h | 31 + omc/plat/public_bak/src/include/memwatch.h | 707 + omc/plat/public_bak/src/include/omc_public.h | 643 + omc/plat/public_bak/src/include/pub_base.h | 127 + omc/plat/public_bak/src/include/pub_debug.h | 43 + omc/plat/public_bak/src/include/pub_file.h | 22 + omc/plat/public_bak/src/include/pub_fmt.h | 132 + omc/plat/public_bak/src/include/pub_include.h | 39 + omc/plat/public_bak/src/include/pub_inet.h | 75 + omc/plat/public_bak/src/include/pub_list.h | 501 + omc/plat/public_bak/src/include/pub_log.h | 68 + omc/plat/public_bak/src/include/pub_malloc.h | 26 + omc/plat/public_bak/src/include/pub_netcap.h | 35 + omc/plat/public_bak/src/include/pub_sdp.h | 196 + omc/plat/public_bak/src/include/pub_str.h | 26 + omc/plat/public_bak/src/include/pub_sys.h | 53 + omc/plat/public_bak/src/include/pub_time.h | 29 + omc/plat/public_bak/src/include/pub_timer.h | 96 + omc/plat/public_bak/src/include/pub_wnet.h | 41 + omc/plat/public_bak/src/include/public.h | 102 + omc/plat/public_bak/src/include/svrstat.h | 100 + omc/plat/public_bak/src/memwatch.c | 2669 ++ omc/plat/public_bak/src/pub_conf.c | 12 + omc/plat/public_bak/src/pub_debug.c | 52 + omc/plat/public_bak/src/pub_file.c | 44 + omc/plat/public_bak/src/pub_fmt.c | 1242 + omc/plat/public_bak/src/pub_inet.c | 342 + omc/plat/public_bak/src/pub_log.c | 135 + omc/plat/public_bak/src/pub_malloc.c | 23 + omc/plat/public_bak/src/pub_netcap.c | 370 + omc/plat/public_bak/src/pub_sdp.c | 1563 + omc/plat/public_bak/src/pub_str.c | 977 + omc/plat/public_bak/src/pub_sys.c | 553 + omc/plat/public_bak/src/pub_time.c | 130 + omc/plat/public_bak/src/pub_timer.c | 176 + omc/plat/public_bak/src/pub_wnet.c | 425 + omc/plat/public_bak/src/uwav/.copyarea.db | 8 + omc/plat/public_bak/src/uwav/number.c | 362 + omc/plat/public_bak/src/uwav/number.h | 79 + omc/plat/public_bak/src/uwav/numgrp.c | 176 + omc/plat/public_bak/src/uwav/numgrp.h | 29 + omc/plat/public_bak/ut/.copyarea.db | 12 + omc/plat/public_bak/ut/asn.1/.copyarea.db | 5 + omc/plat/public_bak/ut/asn.1/asntest.c | 429 + omc/plat/public_bak/ut/bisearch/.copyarea.db | 5 + .../public_bak/ut/bisearch/bisearch_test.c | 149 + omc/plat/public_bak/ut/debug_api/.copyarea.db | 6 + omc/plat/public_bak/ut/debug_api/debug | Bin 0 -> 11872 bytes .../public_bak/ut/debug_api/wxc_debug_test.c | 125 + omc/plat/public_bak/ut/function.c | 87 + omc/plat/public_bak/ut/inet/.copyarea.db | 5 + omc/plat/public_bak/ut/inet/pub_inet_test.c | 646 + omc/plat/public_bak/ut/main/.copyarea.db | 8 + omc/plat/public_bak/ut/main/Makefile | 98 + omc/plat/public_bak/ut/main/src/.copyarea.db | 5 + omc/plat/public_bak/ut/main/src/main.c | 19 + .../public_bak/ut/public_test/.copyarea.db | 5 + .../public_bak/ut/public_test/public_test.c | 15 + omc/plat/public_bak/ut/timer/.copyarea.db | 9 + omc/plat/public_bak/ut/timer/Makefile | 72 + omc/plat/public_bak/ut/timer/wxc_tmtest.c | 155 + omc/plat/rtp/.copyarea.db | 9 + omc/plat/rtp/Makefile | 98 + omc/plat/rtp/lib/librtp.a | Bin 0 -> 41822 bytes omc/plat/rtp/obj/rtp.o | Bin 0 -> 25816 bytes omc/plat/rtp/obj/rtp_msg.o | Bin 0 -> 15048 bytes omc/plat/rtp/src/.copyarea.db | 7 + omc/plat/rtp/src/include/.copyarea.db | 11 + omc/plat/rtp/src/include/rtp.h | 56 + omc/plat/rtp/src/include/rtp_const.h | 9 + omc/plat/rtp/src/include/rtp_def.h | 26 + omc/plat/rtp/src/include/rtp_ext.h | 22 + omc/plat/rtp/src/include/rtp_msg.h | 6 + omc/plat/rtp/src/include/rtp_pub.h | 55 + omc/plat/rtp/src/include/rtp_struct.h | 33 + omc/plat/rtp/src/rtp.c | 358 + omc/plat/rtp/src/rtp_msg.c | 148 + omc/plat/sccp/.copyarea.db | 9 + omc/plat/sccp/Makefile | 98 + omc/plat/sccp/lib/libsccp.a | Bin 0 -> 779150 bytes omc/plat/sccp/obj/sccp.o | Bin 0 -> 42256 bytes omc/plat/sccp/obj/sccp_debug.o | Bin 0 -> 66496 bytes omc/plat/sccp/obj/sccp_func.o | Bin 0 -> 28904 bytes omc/plat/sccp/obj/sccp_gtt.o | Bin 0 -> 38136 bytes omc/plat/sccp/obj/sccp_log.o | Bin 0 -> 55640 bytes omc/plat/sccp/obj/sccp_mib.o | Bin 0 -> 31664 bytes omc/plat/sccp/obj/sccp_msg.o | Bin 0 -> 45224 bytes omc/plat/sccp/obj/sccp_param.o | Bin 0 -> 55512 bytes omc/plat/sccp/obj/sclc.o | Bin 0 -> 48304 bytes omc/plat/sccp/obj/scmg.o | Bin 0 -> 46504 bytes omc/plat/sccp/obj/scoc.o | Bin 0 -> 19128 bytes omc/plat/sccp/obj/scoc_fsm.o | Bin 0 -> 70640 bytes omc/plat/sccp/obj/scoc_func.o | Bin 0 -> 69992 bytes omc/plat/sccp/obj/scoc_if.o | Bin 0 -> 36992 bytes omc/plat/sccp/obj/scoc_pool.o | Bin 0 -> 39024 bytes omc/plat/sccp/obj/scoc_pri.o | Bin 0 -> 19144 bytes omc/plat/sccp/obj/scrc.o | Bin 0 -> 61608 bytes omc/plat/sccp/src/.copyarea.db | 22 + omc/plat/sccp/src/include/.copyarea.db | 10 + omc/plat/sccp/src/include/sccp.h | 324 + omc/plat/sccp/src/include/sccp_func.h | 165 + omc/plat/sccp/src/include/sccp_pub.h | 27 + omc/plat/sccp/src/include/sccpconst.h | 510 + omc/plat/sccp/src/include/scoc.h | 274 + omc/plat/sccp/src/include/scoc_if.h | 559 + omc/plat/sccp/src/sccp.c | 390 + omc/plat/sccp/src/sccp_debug.c | 684 + omc/plat/sccp/src/sccp_func.c | 113 + omc/plat/sccp/src/sccp_gtt.c | 417 + omc/plat/sccp/src/sccp_log.c | 415 + omc/plat/sccp/src/sccp_mib.c | 241 + omc/plat/sccp/src/sccp_msg.c | 777 + omc/plat/sccp/src/sccp_param.c | 705 + omc/plat/sccp/src/sclc.c | 615 + omc/plat/sccp/src/scmg.c | 560 + omc/plat/sccp/src/scoc.c | 126 + omc/plat/sccp/src/scoc_fsm.c | 1068 + omc/plat/sccp/src/scoc_func.c | 931 + omc/plat/sccp/src/scoc_if.c | 307 + omc/plat/sccp/src/scoc_pool.c | 227 + omc/plat/sccp/src/scoc_pri.c | 283 + omc/plat/sccp/src/scrc.c | 1007 + omc/plat/sccp/ut/.copyarea.db | 7 + omc/plat/sccp/ut/fsmtest/.copyarea.db | 9 + omc/plat/sccp/ut/fsmtest/Makefile | 98 + omc/plat/sccp/ut/fsmtest/bin/.copyarea.db | 5 + .../sccp/ut/fsmtest/bin/conf/.copyarea.db | 28 + omc/plat/sccp/ut/fsmtest/bin/conf/HlrSysPara | Bin 0 -> 7244 bytes .../sccp/ut/fsmtest/bin/conf/cap_acn.conf | 8 + .../ut/fsmtest/bin/conf/cap_operation.conf | 36 + .../sccp/ut/fsmtest/bin/conf/cc_table.conf | 215 + .../sccp/ut/fsmtest/bin/conf/conv_prefix.conf | Bin 0 -> 4608 bytes .../sccp/ut/fsmtest/bin/conf/hae_sys.conf | 6 + omc/plat/sccp/ut/fsmtest/bin/conf/help_page | 20 + .../ut/fsmtest/bin/conf/hlr_parambit.conf | Bin 0 -> 20740 bytes .../sccp/ut/fsmtest/bin/conf/iptrans.conf | 25 + .../sccp/ut/fsmtest/bin/conf/map_acn.conf | 42 + .../ut/fsmtest/bin/conf/map_operation.conf | 76 + omc/plat/sccp/ut/fsmtest/bin/conf/menu_page | 17 + omc/plat/sccp/ut/fsmtest/bin/conf/mtp3.conf | 1408 + omc/plat/sccp/ut/fsmtest/bin/conf/ppsConf.txt | Bin 0 -> 28340 bytes omc/plat/sccp/ut/fsmtest/bin/conf/profile | 37 + omc/plat/sccp/ut/fsmtest/bin/conf/sccp.conf | 26 + .../sccp/ut/fsmtest/bin/conf/sccp_test.conf | 2 + .../sccp/ut/fsmtest/bin/conf/smsc_csta.conf | 21 + .../ut/fsmtest/bin/conf/smsc_parambit.conf | Bin 0 -> 2836 bytes .../sccp/ut/fsmtest/bin/conf/smsc_sys.conf | 5 + omc/plat/sccp/ut/fsmtest/bin/conf/system.ini | Bin 0 -> 212 bytes .../sccp/ut/fsmtest/bin/conf/wxc2_sys.conf | 1 + .../sccp/ut/fsmtest/bin/conf/wxc2exit.txt | 4 + .../ut/fsmtest/bin/conf/xap_sysparam.conf | Bin 0 -> 13 bytes omc/plat/sccp/ut/fsmtest/obj/.copyarea.db | 8 + omc/plat/sccp/ut/fsmtest/obj/sccp_test.gcno | Bin 0 -> 5000 bytes omc/plat/sccp/ut/fsmtest/obj/scoc_test.gcno | Bin 0 -> 13992 bytes omc/plat/sccp/ut/fsmtest/sccp_test.c | 192 + omc/plat/sccp/ut/fsmtest/scoc_test.c | 616 + omc/plat/scf/.copyarea.db | 9 + omc/plat/scf/Makefile | 92 + omc/plat/scf/lib/libscf.a | Bin 0 -> 84412 bytes omc/plat/scf/obj/scfmsg.o | Bin 0 -> 11528 bytes omc/plat/scf/obj/scsm.o | Bin 0 -> 71968 bytes omc/plat/scf/src/.copyarea.db | 10 + omc/plat/scf/src/include/.copyarea.db | 7 + omc/plat/scf/src/include/scfdef.h | 12 + omc/plat/scf/src/include/scfmsg.h | 105 + omc/plat/scf/src/include/scfpub.h | 5 + omc/plat/scf/src/scfdef.h | 12 + omc/plat/scf/src/scfmsg.c | 169 + omc/plat/scf/src/scfmsg.h | 105 + omc/plat/scf/src/scfpub.h | 5 + omc/plat/scf/src/scsm.c | 970 + omc/plat/sip/.copyarea.db | 9 + omc/plat/sip/Makefile | 98 + omc/plat/sip/lib/libsip.a | Bin 0 -> 632608 bytes omc/plat/sip/obj/sip.o | Bin 0 -> 40776 bytes omc/plat/sip/obj/sip_debug.o | Bin 0 -> 22168 bytes omc/plat/sip/obj/sip_msg.o | Bin 0 -> 69040 bytes omc/plat/sip/obj/sip_msg_encode.o | Bin 0 -> 91592 bytes omc/plat/sip/obj/sip_msg_parse.o | Bin 0 -> 153920 bytes omc/plat/sip/obj/sip_transaction.o | Bin 0 -> 44448 bytes omc/plat/sip/obj/sip_transport.o | Bin 0 -> 29920 bytes omc/plat/sip/obj/sip_ua.o | Bin 0 -> 46408 bytes omc/plat/sip/obj/sip_ua_dialog.o | Bin 0 -> 33392 bytes omc/plat/sip/obj/sip_ua_fsm.o | Bin 0 -> 34728 bytes omc/plat/sip/obj/sip_ua_msg.o | Bin 0 -> 57408 bytes omc/plat/sip/src/.copyarea.db | 16 + omc/plat/sip/src/include/.copyarea.db | 24 + omc/plat/sip/src/include/sip.h | 720 + omc/plat/sip/src/include/sip_const.h | 154 + omc/plat/sip/src/include/sip_debug.h | 10 + omc/plat/sip/src/include/sip_def.h | 49 + omc/plat/sip/src/include/sip_ext.h | 48 + omc/plat/sip/src/include/sip_msg.h | 36 + omc/plat/sip/src/include/sip_msg_encode.h | 24 + omc/plat/sip/src/include/sip_msg_parse.h | 12 + omc/plat/sip/src/include/sip_pub.h | 55 + omc/plat/sip/src/include/sip_struct.h | 62 + omc/plat/sip/src/include/sip_transaction.h | 11 + omc/plat/sip/src/include/sip_transport.h | 9 + omc/plat/sip/src/include/sip_ua.h | 39 + omc/plat/sip/src/include/sip_ua_const.h | 57 + omc/plat/sip/src/include/sip_ua_def.h | 28 + omc/plat/sip/src/include/sip_ua_dialog.h | 72 + omc/plat/sip/src/include/sip_ua_ext.h | 29 + omc/plat/sip/src/include/sip_ua_msg.h | 31 + omc/plat/sip/src/include/sip_ua_pub.h | 56 + omc/plat/sip/src/include/sip_ua_struct.h | 47 + omc/plat/sip/src/sip.c | 280 + omc/plat/sip/src/sip_debug.c | 272 + omc/plat/sip/src/sip_msg.c | 1508 + omc/plat/sip/src/sip_msg_encode.c | 1676 + omc/plat/sip/src/sip_msg_parse.c | 4027 +++ omc/plat/sip/src/sip_transaction.c | 1002 + omc/plat/sip/src/sip_transport.c | 192 + omc/plat/sip/src/sip_ua.c | 678 + omc/plat/sip/src/sip_ua_dialog.c | 336 + omc/plat/sip/src/sip_ua_fsm.c | 628 + omc/plat/sip/src/sip_ua_msg.c | 1022 + omc/plat/smpp/.copyarea.db | 9 + omc/plat/smpp/Makefile | 98 + omc/plat/smpp/doc/.copyarea.db | 8 + omc/plat/smpp/doc/SMPP_R9V0_01P12.doc | Bin 0 -> 59904 bytes omc/plat/smpp/doc/SMPP_R9V0_01P13.doc | Bin 0 -> 60928 bytes omc/plat/smpp/doc/SMPP_R9V0_01P14.doc | Bin 0 -> 60416 bytes omc/plat/smpp/doc/SMPP_R9V0_01P15.doc | Bin 0 -> 57856 bytes omc/plat/smpp/lib/libsmpp.a | Bin 0 -> 543914 bytes omc/plat/smpp/obj/smpp_debug.o | Bin 0 -> 44016 bytes omc/plat/smpp/obj/smpp_fsm.o | Bin 0 -> 69296 bytes omc/plat/smpp/obj/smpp_func.o | Bin 0 -> 101960 bytes omc/plat/smpp/obj/smpp_mib.o | Bin 0 -> 61328 bytes omc/plat/smpp/obj/smpp_msg.o | Bin 0 -> 265112 bytes omc/plat/smpp/src/.copyarea.db | 10 + omc/plat/smpp/src/include/.copyarea.db | 10 + omc/plat/smpp/src/include/smpp.h | 189 + omc/plat/smpp/src/include/smpp_const.h | 240 + omc/plat/smpp/src/include/smpp_def.h | 39 + omc/plat/smpp/src/include/smpp_ext.h | 38 + omc/plat/smpp/src/include/smpp_msg.h | 466 + omc/plat/smpp/src/include/smpp_public.h | 62 + omc/plat/smpp/src/smpp_debug.c | 471 + omc/plat/smpp/src/smpp_fsm.c | 673 + omc/plat/smpp/src/smpp_func.c | 1167 + omc/plat/smpp/src/smpp_mib.c | 819 + omc/plat/smpp/src/smpp_msg.c | 5896 ++++ omc/plat/smpp/ut/.copyarea.db | 7 + omc/plat/smpp/ut/conf/.copyarea.db | 14 + omc/plat/smpp/ut/conf/MIB_files/.copyarea.db | 19 + omc/plat/smpp/ut/conf/MIB_files/IWV-SMI.txt | 40 + .../ut/conf/MIB_files/Special_App-SMI.txt | 43 + .../smpp/ut/conf/MIB_files/System_IP_List.txt | 26 + .../smpp/ut/conf/MIB_files/WXC2-AUC-MIB.txt | 437 + .../smpp/ut/conf/MIB_files/WXC2-HLR-MIB.txt | 2431 ++ .../smpp/ut/conf/MIB_files/WXC2-MSC-MIB.txt | 4084 +++ .../smpp/ut/conf/MIB_files/WXC2-MSS-MIB.txt | 54 + .../smpp/ut/conf/MIB_files/WXC2-PPS-MIB.txt | 13090 ++++++++ omc/plat/smpp/ut/conf/MIB_files/WXC2-SMI.txt | 57 + .../smpp/ut/conf/MIB_files/WXC2-SMSC-MIB.txt | 259 + .../smpp/ut/conf/MIB_files/WXC2-SS7-MIB.txt | 3729 +++ omc/plat/smpp/ut/conf/MIB_files/menu_page | 13 + omc/plat/smpp/ut/conf/MIB_files/menu_tree.txt | 908 + .../smpp/ut/conf/MIB_files/mib_list_file.txt | 14 + .../smpp/ut/conf/MIB_files/mib_write_tree.txt | 25897 ++++++++++++++++ omc/plat/smpp/ut/conf/guess_number_test.conf | 1 + omc/plat/smpp/ut/conf/help_page | 16 + omc/plat/smpp/ut/conf/iptrans.conf | 25 + omc/plat/smpp/ut/conf/menu_page | 22 + omc/plat/smpp/ut/conf/mtp3.conf | 1408 + omc/plat/smpp/ut/conf/sccp.conf | 22 + omc/plat/smpp/ut/conf/smpp.conf | 35 + omc/plat/smpp/ut/smpp_test/.copyarea.db | 5 + omc/plat/smpp/ut/smpp_test/smpp_test.c | 688 + omc/plat/smpp/ut/smpp_ussd_test/.copyarea.db | 6 + .../smpp/ut/smpp_ussd_test/guess_number.c | 948 + omc/plat/smpp/ut/smpp_ussd_test/pppchat.c | 704 + omc/plat/snmp/.copyarea.db | 9 + omc/plat/snmp/Makefile | 98 + omc/plat/snmp/lib/libsnmp.a | Bin 0 -> 372044 bytes omc/plat/snmp/obj/heartbeat.o | Bin 0 -> 23096 bytes omc/plat/snmp/obj/snmp.o | Bin 0 -> 75024 bytes omc/plat/snmp/obj/snmp_mib.o | Bin 0 -> 135656 bytes omc/plat/snmp/obj/snmp_mib_api.o | Bin 0 -> 14736 bytes omc/plat/snmp/obj/snmpdebug.o | Bin 0 -> 38352 bytes omc/plat/snmp/obj/snmpmib.o | Bin 0 -> 23920 bytes omc/plat/snmp/obj/snmptable.o | Bin 0 -> 13984 bytes omc/plat/snmp/obj/snmptest.o | Bin 0 -> 23024 bytes omc/plat/snmp/obj/sysctrl.o | Bin 0 -> 22216 bytes omc/plat/snmp/src/.copyarea.db | 13 + omc/plat/snmp/src/heartbeat.c | 309 + omc/plat/snmp/src/include/.copyarea.db | 9 + omc/plat/snmp/src/include/heartbeat.h | 87 + omc/plat/snmp/src/include/macro.h | 100 + omc/plat/snmp/src/include/snmp.h | 330 + omc/plat/snmp/src/include/sysctrl.h | 61 + omc/plat/snmp/src/include/table.h | 42 + omc/plat/snmp/src/mib_parser/.copyarea.db | 8 + omc/plat/snmp/src/mib_parser/snmp_mib.c | 4152 +++ omc/plat/snmp/src/mib_parser/snmp_mib.h | 171 + omc/plat/snmp/src/mib_parser/snmp_mib_api.c | 122 + omc/plat/snmp/src/mib_parser/snmp_mib_api.h | 49 + omc/plat/snmp/src/snmp.c | 2022 ++ omc/plat/snmp/src/snmpdebug.c | 496 + omc/plat/snmp/src/snmpmib.c | 270 + omc/plat/snmp/src/snmptable.c | 269 + omc/plat/snmp/src/snmptest.c | 254 + omc/plat/snmp/src/sysctrl.c | 235 + omc/plat/tcap/.copyarea.db | 9 + omc/plat/tcap/Makefile | 98 + omc/plat/tcap/lib/libtcap.a | Bin 0 -> 415422 bytes omc/plat/tcap/obj/idmanage.o | Bin 0 -> 41440 bytes omc/plat/tcap/obj/itcap.o | Bin 0 -> 65520 bytes omc/plat/tcap/obj/tcap_coding.o | Bin 0 -> 115696 bytes omc/plat/tcap/obj/tcap_fsm.o | Bin 0 -> 130400 bytes omc/plat/tcap/obj/tcap_m.o | Bin 0 -> 60272 bytes omc/plat/tcap/src/.copyarea.db | 10 + omc/plat/tcap/src/idmanage.c | 269 + omc/plat/tcap/src/include/.copyarea.db | 11 + omc/plat/tcap/src/include/idmanage.h | 16 + omc/plat/tcap/src/include/itcap.h | 18 + omc/plat/tcap/src/include/tcap_head.h | 256 + omc/plat/tcap/src/include/tcap_m.h | 21 + omc/plat/tcap/src/include/tcap_proc.h | 3 + omc/plat/tcap/src/include/tcap_public.h | 68 + omc/plat/tcap/src/include/tcap_struct.h | 391 + omc/plat/tcap/src/itcap.c | 758 + omc/plat/tcap/src/tcap_coding.c | 2265 ++ omc/plat/tcap/src/tcap_fsm.c | 3003 ++ omc/plat/tcap/src/tcap_m.c | 603 + omc/plat/xapp/.copyarea.db | 10 + omc/plat/xapp/Makefile | 95 + omc/plat/xapp/conf/.copyarea.db | 8 + omc/plat/xapp/conf/cap_acn.conf | 8 + omc/plat/xapp/conf/cap_operation.conf | 36 + omc/plat/xapp/conf/map_acn.conf | 42 + omc/plat/xapp/conf/map_operation.conf | 76 + omc/plat/xapp/lib/libxapp.a | Bin 0 -> 5755102 bytes omc/plat/xapp/obj/Map_opr.o | Bin 0 -> 58568 bytes omc/plat/xapp/obj/cap_msg.o | Bin 0 -> 104136 bytes omc/plat/xapp/obj/cap_msgtype.o | Bin 0 -> 57944 bytes omc/plat/xapp/obj/cap_public.o | Bin 0 -> 36616 bytes omc/plat/xapp/obj/conv_prefix.o | Bin 0 -> 50400 bytes omc/plat/xapp/obj/is41_code_auc.o | Bin 0 -> 191912 bytes omc/plat/xapp/obj/is41_code_ms.o | Bin 0 -> 296320 bytes omc/plat/xapp/obj/is41_code_sms.o | Bin 0 -> 183440 bytes omc/plat/xapp/obj/is41_code_win.o | Bin 0 -> 250824 bytes omc/plat/xapp/obj/is41_coding.o | Bin 0 -> 176672 bytes omc/plat/xapp/obj/is41_debug.o | Bin 0 -> 181672 bytes omc/plat/xapp/obj/is41_init.o | Bin 0 -> 3720 bytes omc/plat/xapp/obj/map_LCSCode.o | Bin 0 -> 32720 bytes omc/plat/xapp/obj/map_code_auc.o | Bin 0 -> 35064 bytes omc/plat/xapp/obj/map_code_ch.o | Bin 0 -> 106504 bytes omc/plat/xapp/obj/map_code_dlgpdu.o | Bin 0 -> 42568 bytes omc/plat/xapp/obj/map_code_ms.o | Bin 0 -> 231224 bytes omc/plat/xapp/obj/map_code_om.o | Bin 0 -> 33008 bytes omc/plat/xapp/obj/map_code_sms.o | Bin 0 -> 74872 bytes omc/plat/xapp/obj/map_code_ss.o | Bin 0 -> 93744 bytes omc/plat/xapp/obj/map_coding.o | Bin 0 -> 241216 bytes omc/plat/xapp/obj/map_public.o | Bin 0 -> 57872 bytes omc/plat/xapp/obj/xap_cdmacdr.o | Bin 0 -> 118032 bytes omc/plat/xapp/obj/xap_interface.o | Bin 0 -> 212384 bytes omc/plat/xapp/obj/xap_monitor.o | Bin 0 -> 103160 bytes omc/plat/xapp/obj/xap_provider.o | Bin 0 -> 250664 bytes omc/plat/xapp/src/.copyarea.db | 18 + omc/plat/xapp/src/capp/.copyarea.db | 12 + omc/plat/xapp/src/capp/cap_coding.h | 39 + omc/plat/xapp/src/capp/cap_head.h | 151 + omc/plat/xapp/src/capp/cap_msg.c | 1513 + omc/plat/xapp/src/capp/cap_msg.h | 873 + omc/plat/xapp/src/capp/cap_msgtype.c | 1064 + omc/plat/xapp/src/capp/cap_public.c | 497 + omc/plat/xapp/src/capp/cap_public.h | 14 + omc/plat/xapp/src/capp/icap.h | 20 + omc/plat/xapp/src/conv_prefix.c | 1054 + omc/plat/xapp/src/conv_prefix.h | 72 + omc/plat/xapp/src/include.bak/.copyarea.db | 10 + omc/plat/xapp/src/include.bak/conv_prefix.h | 60 + omc/plat/xapp/src/include.bak/ixap.h | 59 + omc/plat/xapp/src/include.bak/xap_cdmacdr.h | 898 + omc/plat/xapp/src/include.bak/xap_interfunc.h | 11 + omc/plat/xapp/src/include.bak/xap_monitor.h | 19 + omc/plat/xapp/src/include.bak/xap_provider.h | 182 + omc/plat/xapp/src/ixap.h | 66 + omc/plat/xapp/src/mapp/.copyarea.db | 35 + omc/plat/xapp/src/mapp/Map_opr.c | 942 + omc/plat/xapp/src/mapp/imap.h | 22 + omc/plat/xapp/src/mapp/is41_code.h | 110 + omc/plat/xapp/src/mapp/is41_code_auc.c | 1345 + omc/plat/xapp/src/mapp/is41_code_ms.c | 3968 +++ omc/plat/xapp/src/mapp/is41_code_sms.c | 1134 + omc/plat/xapp/src/mapp/is41_code_win.c | 1871 ++ omc/plat/xapp/src/mapp/is41_coding.c | 490 + omc/plat/xapp/src/mapp/is41_debug.c | 3650 +++ omc/plat/xapp/src/mapp/is41_init.c | 23 + omc/plat/xapp/src/mapp/map_LCSCode.c | 211 + omc/plat/xapp/src/mapp/map_LCSCode.h | 130 + omc/plat/xapp/src/mapp/map_acn.h | 68 + omc/plat/xapp/src/mapp/map_code.h | 333 + omc/plat/xapp/src/mapp/map_code_auc.c | 266 + omc/plat/xapp/src/mapp/map_code_ch.c | 1775 ++ omc/plat/xapp/src/mapp/map_code_dlgpdu.c | 209 + omc/plat/xapp/src/mapp/map_code_ms.c | 4697 +++ omc/plat/xapp/src/mapp/map_code_om.c | 231 + omc/plat/xapp/src/mapp/map_code_sms.c | 1325 + omc/plat/xapp/src/mapp/map_code_ss.c | 1647 + omc/plat/xapp/src/mapp/map_coding.c | 1813 ++ omc/plat/xapp/src/mapp/map_coding.h | 513 + omc/plat/xapp/src/mapp/map_const.h | 671 + omc/plat/xapp/src/mapp/map_dlgpdu.h | 104 + omc/plat/xapp/src/mapp/map_includes.h | 24 + omc/plat/xapp/src/mapp/map_opr_func.h | 34 + omc/plat/xapp/src/mapp/map_public.c | 1108 + omc/plat/xapp/src/mapp/map_public.h | 26 + omc/plat/xapp/src/mapp/map_struct.h | 3643 +++ omc/plat/xapp/src/mapp/win_struct.h | 477 + omc/plat/xapp/src/xap_cdmacdr.c | 1755 ++ omc/plat/xapp/src/xap_cdmacdr.h | 898 + omc/plat/xapp/src/xap_interface.c | 930 + omc/plat/xapp/src/xap_interfunc.h | 11 + omc/plat/xapp/src/xap_monitor.c | 1239 + omc/plat/xapp/src/xap_monitor.h | 19 + omc/plat/xapp/src/xap_provider.c | 3421 ++ omc/plat/xapp/src/xap_provider.h | 182 + omc/plat/xapp/ut/.copyarea.db | 5 + omc/plat/xapp/ut/xapp_test/.copyarea.db | 12 + omc/plat/xapp/ut/xapp_test/Makefile | 42 + omc/plat/xapp/ut/xapp_test/conf/.copyarea.db | 34 + .../xapp/ut/xapp_test/conf/.sccp.conf.swo | Bin 0 -> 12288 bytes omc/plat/xapp/ut/xapp_test/conf/HlrSysPara | Bin 0 -> 7244 bytes omc/plat/xapp/ut/xapp_test/conf/cap_acn.conf | 8 + .../xapp/ut/xapp_test/conf/cap_operation.conf | 36 + omc/plat/xapp/ut/xapp_test/conf/cc_table.conf | 215 + omc/plat/xapp/ut/xapp_test/conf/conf.rar | Bin 0 -> 2638 bytes .../xapp/ut/xapp_test/conf/conv_prefix.conf | Bin 0 -> 4608 bytes omc/plat/xapp/ut/xapp_test/conf/hae_sys.conf | 6 + omc/plat/xapp/ut/xapp_test/conf/help_page | 20 + .../xapp/ut/xapp_test/conf/hlr_parambit.conf | Bin 0 -> 20740 bytes omc/plat/xapp/ut/xapp_test/conf/iptrans.conf | 17 + omc/plat/xapp/ut/xapp_test/conf/map_acn.conf | 42 + .../xapp/ut/xapp_test/conf/map_operation.conf | 76 + omc/plat/xapp/ut/xapp_test/conf/menu_page | 13 + omc/plat/xapp/ut/xapp_test/conf/mtp3.conf | 1408 + omc/plat/xapp/ut/xapp_test/conf/ppsConf.txt | Bin 0 -> 28340 bytes omc/plat/xapp/ut/xapp_test/conf/profile | 37 + omc/plat/xapp/ut/xapp_test/conf/sccp.conf | 26 + .../xapp/ut/xapp_test/conf/smsc_csta.conf | 21 + .../xapp/ut/xapp_test/conf/smsc_parambit.conf | Bin 0 -> 2836 bytes omc/plat/xapp/ut/xapp_test/conf/smsc_sys.conf | 5 + omc/plat/xapp/ut/xapp_test/conf/system.ini | Bin 0 -> 212 bytes .../xapp/ut/xapp_test/conf/system.ini.100k | Bin 0 -> 212 bytes .../xapp/ut/xapp_test/conf/system.ini.30K | Bin 0 -> 212 bytes .../ut/xapp_test/conf/system.inimscvlrhlr | Bin 0 -> 212 bytes omc/plat/xapp/ut/xapp_test/conf/wxc2_sys.conf | 1 + omc/plat/xapp/ut/xapp_test/conf/wxc2exit.txt | 4 + .../xapp/ut/xapp_test/conf/xap_sysparam.conf | Bin 0 -> 13 bytes .../xapp/ut/xapp_test/conf/xapp_test.conf | 2 + omc/plat/xapp/ut/xapp_test/xapp_coding_test.c | 652 + omc/plat/xapp/ut/xapp_test/xapp_coding_test.h | 105 + omc/plat/xapp/ut/xapp_test/xapp_main.c | 372 + omc/plat/xapp/ut/xapp_test/xapp_main.h | 32 + omc/plat/xapp/ut/xapp_test/xapp_op_test.c | 2067 ++ omc/plat/xapp/ut/xapp_test/xapp_op_test.h | 39 + omc/src | 1 + 1234 files changed, 419571 insertions(+) create mode 100644 include/Makefile.backup create mode 100644 include/Makefile.cov create mode 100644 include/Makefile.doxygen create mode 100644 include/Makefile.indent create mode 100644 include/Makefile.rules create mode 100644 include/Makefile.rules.bak create mode 100644 include/Makefile.splint create mode 100644 include/Makefile.usage create mode 100644 include/gtest/gtest-death-test.h create mode 100644 include/gtest/gtest-matchers.h create mode 100644 include/gtest/gtest-message.h create mode 100644 include/gtest/gtest-param-test.h create mode 100644 include/gtest/gtest-printers.h create mode 100644 include/gtest/gtest-spi.h create mode 100644 include/gtest/gtest-test-part.h create mode 100644 include/gtest/gtest-typed-test.h create mode 100644 include/gtest/gtest.h create mode 100644 include/gtest/gtest_pred_impl.h create mode 100644 include/gtest/gtest_prod.h create mode 100644 include/gtest/internal/custom/README.md create mode 100644 include/gtest/internal/custom/gtest-port.h create mode 100644 include/gtest/internal/custom/gtest-printers.h create mode 100644 include/gtest/internal/custom/gtest.h create mode 100644 include/gtest/internal/gtest-death-test-internal.h create mode 100644 include/gtest/internal/gtest-filepath.h create mode 100644 include/gtest/internal/gtest-internal.h create mode 100644 include/gtest/internal/gtest-param-util.h create mode 100644 include/gtest/internal/gtest-port-arch.h create mode 100644 include/gtest/internal/gtest-port.h create mode 100644 include/gtest/internal/gtest-string.h create mode 100644 include/gtest/internal/gtest-type-util.h create mode 100644 include/gtest/internal/gtest-type-util.h.pump create mode 100644 include/hiredis/adapters/ae.h create mode 100644 include/hiredis/adapters/glib.h create mode 100644 include/hiredis/adapters/ivykis.h create mode 100644 include/hiredis/adapters/libev.h create mode 100644 include/hiredis/adapters/libevent.h create mode 100644 include/hiredis/adapters/libuv.h create mode 100644 include/hiredis/adapters/macosx.h create mode 100644 include/hiredis/adapters/qt.h create mode 100644 include/hiredis/alloc.h create mode 100644 include/hiredis/async.h create mode 100644 include/hiredis/hiredis.h create mode 100644 include/hiredis/read.h create mode 100644 include/hiredis/sds.h create mode 100644 include/nettle/aes.h create mode 100644 include/nettle/arcfour.h create mode 100644 include/nettle/arctwo.h create mode 100644 include/nettle/asn1.h create mode 100644 include/nettle/base16.h create mode 100644 include/nettle/base64.h create mode 100644 include/nettle/bignum.h create mode 100644 include/nettle/blowfish.h create mode 100644 include/nettle/buffer.h create mode 100644 include/nettle/camellia.h create mode 100644 include/nettle/cast128.h create mode 100644 include/nettle/cbc.h create mode 100644 include/nettle/ccm.h create mode 100644 include/nettle/cfb.h create mode 100644 include/nettle/chacha-poly1305.h create mode 100644 include/nettle/chacha.h create mode 100644 include/nettle/ctr.h create mode 100644 include/nettle/curve25519.h create mode 100644 include/nettle/des-compat.h create mode 100644 include/nettle/des.h create mode 100644 include/nettle/dsa-compat.h create mode 100644 include/nettle/dsa.h create mode 100644 include/nettle/eax.h create mode 100644 include/nettle/ecc-curve.h create mode 100644 include/nettle/ecc.h create mode 100644 include/nettle/ecdsa.h create mode 100644 include/nettle/eddsa.h create mode 100644 include/nettle/gcm.h create mode 100644 include/nettle/gosthash94.h create mode 100644 include/nettle/hkdf.h create mode 100644 include/nettle/hmac.h create mode 100644 include/nettle/knuth-lfib.h create mode 100644 include/nettle/macros.h create mode 100644 include/nettle/md2.h create mode 100644 include/nettle/md4.h create mode 100644 include/nettle/md5-compat.h create mode 100644 include/nettle/md5.h create mode 100644 include/nettle/memops.h create mode 100644 include/nettle/memxor.h create mode 100644 include/nettle/nettle-meta.h create mode 100644 include/nettle/nettle-stdint.h create mode 100644 include/nettle/nettle-types.h create mode 100644 include/nettle/pbkdf2.h create mode 100644 include/nettle/pgp.h create mode 100644 include/nettle/pkcs1.h create mode 100644 include/nettle/poly1305.h create mode 100644 include/nettle/pss-mgf1.h create mode 100644 include/nettle/pss.h create mode 100644 include/nettle/realloc.h create mode 100644 include/nettle/ripemd160.h create mode 100644 include/nettle/rsa.h create mode 100644 include/nettle/salsa20.h create mode 100644 include/nettle/serpent.h create mode 100644 include/nettle/sexp.h create mode 100644 include/nettle/sha.h create mode 100644 include/nettle/sha1.h create mode 100644 include/nettle/sha2.h create mode 100644 include/nettle/sha3.h create mode 100644 include/nettle/twofish.h create mode 100644 include/nettle/umac.h create mode 100644 include/nettle/version.h create mode 100644 include/nettle/yarrow.h create mode 100644 include/zip.h create mode 100644 include/zipconf.h create mode 100644 omc/config/NR.conf create mode 100644 omc/config/cacert.pem create mode 100644 omc/config/chkDb.conf create mode 100644 omc/config/client.crt create mode 100644 omc/config/client.csr create mode 100644 omc/config/client.key create mode 100644 omc/config/conv_prefix.conf create mode 100644 omc/config/hosts create mode 100644 omc/config/httpd-ssl.conf create mode 100644 omc/config/httpd.conf create mode 100644 omc/config/httpd.conf_centos create mode 100644 omc/config/my.cnf create mode 100644 omc/config/my.cnf_omc-0 create mode 100644 omc/config/my.cnf_omc-0.ES create mode 100644 omc/config/my.cnf_omc-1 create mode 100644 omc/config/my.cnf_omc-1.ES create mode 100644 omc/config/my.cnf_single create mode 100644 omc/config/my.cnf_single.ES create mode 100644 omc/config/omc_db.conf create mode 100644 omc/config/omcd.conf create mode 100644 omc/config/omcd.conf_omc-0 create mode 100644 omc/config/omcd.conf_omc-1 create mode 100644 omc/config/omcd.conf_single create mode 100644 omc/config/php.ini create mode 100644 omc/config/php.ini_old_plat create mode 100644 omc/config/profile create mode 100644 omc/config/rsyncd.conf create mode 100644 omc/config/server.conf create mode 100644 omc/config/server.crt create mode 100644 omc/config/server.csr create mode 100644 omc/config/server.key create mode 100644 omc/config/snmp.conf create mode 100644 omc/plat/.copyarea.db create mode 100644 omc/plat/8ecp/.copyarea.db create mode 100644 omc/plat/8ecp/Makefile create mode 100644 omc/plat/8ecp/lib/lib8ecp.a create mode 100644 omc/plat/8ecp/obj/8ecp.o create mode 100644 omc/plat/8ecp/obj/8ecp_debug.o create mode 100644 omc/plat/8ecp/src/.copyarea.db create mode 100644 omc/plat/8ecp/src/8ecp.c create mode 100644 omc/plat/8ecp/src/8ecp_debug.c create mode 100644 omc/plat/8ecp/src/include/.copyarea.db create mode 100644 omc/plat/8ecp/src/include/8ecp.h create mode 100644 omc/plat/8ecp/src/include/8ecp_debug.h create mode 100644 omc/plat/aif/.copyarea.db create mode 100644 omc/plat/aif/Makefile create mode 100644 omc/plat/aif/doc/.copyarea.db create mode 100644 omc/plat/aif/doc/release_note.txt create mode 100644 omc/plat/aif/lib/libaif.a create mode 100644 omc/plat/aif/obj/aifg.o create mode 100644 omc/plat/aif/obj/aifg_csta.o create mode 100644 omc/plat/aif/obj/aifg_debug.o create mode 100644 omc/plat/aif/obj/aifg_ie.o create mode 100644 omc/plat/aif/obj/aifg_m.o create mode 100644 omc/plat/aif/obj/aifg_mpp.o create mode 100644 omc/plat/aif/src/.copyarea.db create mode 100644 omc/plat/aif/src/aifg.c create mode 100644 omc/plat/aif/src/aifg_csta.c create mode 100644 omc/plat/aif/src/aifg_debug.c create mode 100644 omc/plat/aif/src/aifg_ie.c create mode 100644 omc/plat/aif/src/aifg_m.c create mode 100644 omc/plat/aif/src/aifg_mpp.c create mode 100644 omc/plat/aif/src/include/.copyarea.db create mode 100644 omc/plat/aif/src/include/aifg.h create mode 100644 omc/plat/aif/src/include/aifg_ie.h create mode 100644 omc/plat/aif/src/include/aifg_if.h create mode 100644 omc/plat/aif/src/include/aifg_msg.h create mode 100644 omc/plat/aif/src/include/aifg_public.h create mode 100644 omc/plat/aif/src/include/aifg_type_def.h create mode 100644 omc/plat/aif/src/include/aifg_var_ext.h create mode 100644 omc/plat/aif/ut/.copyarea.db create mode 100644 omc/plat/aif/ut/aifg_main.c create mode 100644 omc/plat/aif/ut/aifg_test.c create mode 100644 omc/plat/aif/ut/makefile create mode 100644 omc/plat/bicc/.copyarea.db create mode 100644 omc/plat/bicc/Makefile create mode 100644 omc/plat/bicc/lib/libbicc.a create mode 100644 omc/plat/bicc/obj/bicc_apm.o create mode 100644 omc/plat/bicc/obj/bicc_debug.o create mode 100644 omc/plat/bicc/obj/bicc_fsm.o create mode 100644 omc/plat/bicc/obj/bicc_ipbcp.o create mode 100644 omc/plat/bicc/obj/bicc_msg.o create mode 100644 omc/plat/bicc/obj/bicc_prm.o create mode 100644 omc/plat/bicc/obj/biccif.o create mode 100644 omc/plat/bicc/src.old/.copyarea.db create mode 100644 omc/plat/bicc/src.old/bicc_apm.c create mode 100644 omc/plat/bicc/src.old/bicc_debug.c create mode 100644 omc/plat/bicc/src.old/bicc_fsm.c create mode 100644 omc/plat/bicc/src.old/bicc_fsm.c.old create mode 100644 omc/plat/bicc/src.old/bicc_ipbcp.c create mode 100644 omc/plat/bicc/src.old/bicc_msg.c create mode 100644 omc/plat/bicc/src.old/bicc_prm.c create mode 100644 omc/plat/bicc/src.old/biccif.c create mode 100644 omc/plat/bicc/src.old/include/.copyarea.db create mode 100644 omc/plat/bicc/src.old/include/bicc_debug.h create mode 100644 omc/plat/bicc/src.old/include/biccif.h create mode 100644 omc/plat/bicc/src.old/include/define.h create mode 100644 omc/plat/bicc/src.old/include/inc.h create mode 100644 omc/plat/bicc/src.old/include/ipbcp.h create mode 100644 omc/plat/bicc/src.old/include/q1902_3e.h create mode 100644 omc/plat/bicc/src.old/include/q765_5e.h create mode 100644 omc/plat/bicc/src.old/include/var_ext.h create mode 100644 omc/plat/bicc/src/.copyarea.db create mode 100644 omc/plat/bicc/src/bicc_apm.c create mode 100644 omc/plat/bicc/src/bicc_debug.c create mode 100644 omc/plat/bicc/src/bicc_fsm.c create mode 100644 omc/plat/bicc/src/bicc_ipbcp.c create mode 100644 omc/plat/bicc/src/bicc_msg.c create mode 100644 omc/plat/bicc/src/bicc_prm.c create mode 100644 omc/plat/bicc/src/biccif.c create mode 100644 omc/plat/bicc/src/include/.copyarea.db create mode 100644 omc/plat/bicc/src/include/bicc_debug.h create mode 100644 omc/plat/bicc/src/include/biccif.h create mode 100644 omc/plat/bicc/src/include/define.h create mode 100644 omc/plat/bicc/src/include/inc.h create mode 100644 omc/plat/bicc/src/include/ipbcp.h create mode 100644 omc/plat/bicc/src/include/q1902_3e.h create mode 100644 omc/plat/bicc/src/include/q765_5e.h create mode 100644 omc/plat/bicc/src/include/var_ext.h create mode 100644 omc/plat/debug/.copyarea.db create mode 100644 omc/plat/debug/Makefile create mode 100644 omc/plat/debug/lib/libdebug.a create mode 100644 omc/plat/debug/obj/debug.o create mode 100644 omc/plat/debug/src/.copyarea.db create mode 100644 omc/plat/debug/src/debug.c create mode 100644 omc/plat/debug/src/include/.copyarea.db create mode 100644 omc/plat/debug/src/include/debug.h create mode 100644 omc/plat/debug/src/include/debug_struct.h create mode 100644 omc/plat/debug/ut/.copyarea.db create mode 100644 omc/plat/debug/ut/debug_test.c create mode 100644 omc/plat/haepub/.copyarea.db create mode 100644 omc/plat/haepub/Makefile create mode 100644 omc/plat/haepub/lib/libhaepub.a create mode 100644 omc/plat/haepub/obj/hae_function.o create mode 100644 omc/plat/haepub/obj/hae_param.o create mode 100644 omc/plat/haepub/obj/hae_sync.o create mode 100644 omc/plat/haepub/src/.copyarea.db create mode 100644 omc/plat/haepub/src/hae_function.c create mode 100644 omc/plat/haepub/src/hae_param.c create mode 100644 omc/plat/haepub/src/hae_sync.c create mode 100644 omc/plat/haepub/src/include/.copyarea.db create mode 100644 omc/plat/haepub/src/include/hae_function.h create mode 100644 omc/plat/haepub/src/include/hae_include.h create mode 100644 omc/plat/iptrans/.copyarea.db create mode 100644 omc/plat/iptrans/Makefile create mode 100644 omc/plat/iptrans/doc/iptrans_bak create mode 100644 omc/plat/iptrans/generate_iptrans create mode 100644 omc/plat/iptrans/iptrans create mode 100644 omc/plat/iptrans/iptrans_bak create mode 100644 omc/plat/iptrans/lib/libiptrans.a create mode 100644 omc/plat/iptrans/obj/comfunc.o create mode 100644 omc/plat/iptrans/obj/daemon.o create mode 100644 omc/plat/iptrans/obj/error.o create mode 100644 omc/plat/iptrans/obj/errorlog.o create mode 100644 omc/plat/iptrans/obj/ipcfunc.o create mode 100644 omc/plat/iptrans/obj/ipmsgfun.o create mode 100644 omc/plat/iptrans/obj/iptrans.o create mode 100644 omc/plat/iptrans/obj/iptrmain.o create mode 100644 omc/plat/iptrans/obj/mcast_join.o create mode 100644 omc/plat/iptrans/obj/queuefunc.o create mode 100644 omc/plat/iptrans/obj/readmsg.o create mode 100644 omc/plat/iptrans/obj/signal.o create mode 100644 omc/plat/iptrans/obj/simu_debug.o create mode 100644 omc/plat/iptrans/src/.copyarea.db create mode 100644 omc/plat/iptrans/src/comfunc.c create mode 100644 omc/plat/iptrans/src/daemon.c create mode 100644 omc/plat/iptrans/src/error.c create mode 100644 omc/plat/iptrans/src/errorlog.c create mode 100644 omc/plat/iptrans/src/generate_iptrans create mode 100644 omc/plat/iptrans/src/include/.copyarea.db create mode 100644 omc/plat/iptrans/src/include/config.h create mode 100644 omc/plat/iptrans/src/include/dbsync.h create mode 100644 omc/plat/iptrans/src/include/debug.h create mode 100644 omc/plat/iptrans/src/include/errlog.h create mode 100644 omc/plat/iptrans/src/include/function.h create mode 100644 omc/plat/iptrans/src/include/includes.h create mode 100644 omc/plat/iptrans/src/include/iptrans.h create mode 100644 omc/plat/iptrans/src/include/iptrfunc.h create mode 100644 omc/plat/iptrans/src/ipcfunc.c create mode 100644 omc/plat/iptrans/src/ipmsgfun.c create mode 100644 omc/plat/iptrans/src/iptrans.c create mode 100644 omc/plat/iptrans/src/iptrans_bak create mode 100644 omc/plat/iptrans/src/iptrmain.c create mode 100644 omc/plat/iptrans/src/mcast_join.c create mode 100644 omc/plat/iptrans/src/queuefunc.c create mode 100644 omc/plat/iptrans/src/readmsg.c create mode 100644 omc/plat/iptrans/src/signal.c create mode 100644 omc/plat/iptrans/src/simu_debug.c create mode 100644 omc/plat/isdn/.copyarea.db create mode 100644 omc/plat/isdn/Makefile create mode 100644 omc/plat/isdn/doc/.copyarea.db create mode 100644 omc/plat/isdn/doc/D-500014-0-10.doc create mode 100644 omc/plat/isdn/lib/libisdn.a create mode 100644 omc/plat/isdn/obj/isdn_debug.o create mode 100644 omc/plat/isdn/obj/isdn_fsm.o create mode 100644 omc/plat/isdn/obj/isdn_ie.o create mode 100644 omc/plat/isdn/obj/isdn_msg.o create mode 100644 omc/plat/isdn/obj/isdn_rm.o create mode 100644 omc/plat/isdn/obj/isdn_uif.o create mode 100644 omc/plat/isdn/src/.copyarea.db create mode 100644 omc/plat/isdn/src/Makefile create mode 100644 omc/plat/isdn/src/include/.copyarea.db create mode 100644 omc/plat/isdn/src/include/isdn_const.h create mode 100644 omc/plat/isdn/src/include/isdn_debug.h create mode 100644 omc/plat/isdn/src/include/isdn_ext.h create mode 100644 omc/plat/isdn/src/include/isdn_ie.h create mode 100644 omc/plat/isdn/src/include/isdn_if.h create mode 100644 omc/plat/isdn/src/include/isdn_inc.h create mode 100644 omc/plat/isdn/src/include/isdn_msg.h create mode 100644 omc/plat/isdn/src/include/isdn_public.h create mode 100644 omc/plat/isdn/src/include/isdn_rm.h create mode 100644 omc/plat/isdn/src/isdn_debug.c create mode 100644 omc/plat/isdn/src/isdn_fsm.c create mode 100644 omc/plat/isdn/src/isdn_ie.c create mode 100644 omc/plat/isdn/src/isdn_msg.c create mode 100644 omc/plat/isdn/src/isdn_rm.c create mode 100644 omc/plat/isdn/src/isdn_uif.c create mode 100644 omc/plat/isdn/ut/.copyarea.db create mode 100644 omc/plat/isdn/ut/Makefile create mode 100644 omc/plat/isdn/ut/code/.copyarea.db create mode 100644 omc/plat/isdn/ut/code/data.Text create mode 100644 omc/plat/isdn/ut/code/ds-service-01.Text create mode 100644 omc/plat/isdn/ut/code/ds-service-02.Text create mode 100644 omc/plat/isdn/ut/code/headfile.txt create mode 100644 omc/plat/isdn/ut/code/iua data.txt create mode 100644 omc/plat/isdn/ut/code/iua set up-bak.txt create mode 100644 omc/plat/isdn/ut/code/iua set up.Text create mode 100644 omc/plat/isdn/ut/code/iua set up.txt create mode 100644 omc/plat/isdn/ut/code/nt-2link-01.Text create mode 100644 omc/plat/isdn/ut/code/nt-incoming-01.Text create mode 100644 omc/plat/isdn/ut/code/nt-incoming-02.Text create mode 100644 omc/plat/isdn/ut/code/nt-outgoing-01-.Text create mode 100644 omc/plat/isdn/ut/code/nt-outgoing-01.Text create mode 100644 omc/plat/isdn/ut/code/nt-outgoing-02.Text create mode 100644 omc/plat/isdn/ut/code/rest1-0.Text create mode 100644 omc/plat/isdn/ut/code/rest2-0.Text create mode 100644 omc/plat/isdn/ut/code/test-01.Text create mode 100644 omc/plat/isdn/ut/code/u01-01.Text create mode 100644 omc/plat/isdn/ut/code/u01-03.Text create mode 100644 omc/plat/isdn/ut/code/u01-05.Text create mode 100644 omc/plat/isdn/ut/code/u01-10.Text create mode 100644 omc/plat/isdn/ut/code/u03-13.Text create mode 100644 omc/plat/isdn/ut/isdn_main.c create mode 100644 omc/plat/isdn/ut/isdn_test.c create mode 100644 omc/plat/isdn/ut/test_main create mode 100644 omc/plat/isdn/ut/test_main_0526 create mode 100644 omc/plat/isup/.copyarea.db create mode 100644 omc/plat/isup/Makefile create mode 100644 omc/plat/isup/doc/.copyarea.db create mode 100644 omc/plat/isup/doc/ISUP_R9V0_01P07.doc create mode 100644 omc/plat/isup/doc/ISUP_R9V0_01P08.doc create mode 100644 omc/plat/isup/doc/ISUP_R9V0_01P8.doc create mode 100644 omc/plat/isup/doc/ISUP_R9V0_02P01.doc create mode 100644 omc/plat/isup/doc/ISUP_R9V0_02P02.doc create mode 100644 omc/plat/isup/doc/ISUP_R9V0_02P03-6.doc create mode 100644 omc/plat/isup/doc/ISUP_R9V0_02P07.doc create mode 100644 omc/plat/isup/doc/ISUP_R9V0_02P1.doc create mode 100644 omc/plat/isup/lib/libisup.a create mode 100644 omc/plat/isup/obj/isup_debug.o create mode 100644 omc/plat/isup/obj/isup_fsm.o create mode 100644 omc/plat/isup/obj/isup_if.o create mode 100644 omc/plat/isup/obj/isup_msg.o create mode 100644 omc/plat/isup/obj/isup_transit.o create mode 100644 omc/plat/isup/src/.copyarea.db create mode 100644 omc/plat/isup/src/include/.copyarea.db create mode 100644 omc/plat/isup/src/include/inc.h create mode 100644 omc/plat/isup/src/include/isup_const.h create mode 100644 omc/plat/isup/src/include/isup_debug.h create mode 100644 omc/plat/isup/src/include/isup_def.h create mode 100644 omc/plat/isup/src/include/isup_if.h create mode 100644 omc/plat/isup/src/include/isup_msg.h create mode 100644 omc/plat/isup/src/include/isup_public.h create mode 100644 omc/plat/isup/src/include/isup_struct.h create mode 100644 omc/plat/isup/src/include/vssver2.scc create mode 100644 omc/plat/isup/src/isup_debug.c create mode 100644 omc/plat/isup/src/isup_fsm.c create mode 100644 omc/plat/isup/src/isup_if.c create mode 100644 omc/plat/isup/src/isup_msg.c create mode 100644 omc/plat/isup/src/isup_transit.c create mode 100644 omc/plat/isup/src/vssver2.scc create mode 100644 omc/plat/isup/ut/.copyarea.db create mode 100644 omc/plat/isup/ut/isup_main.c create mode 100644 omc/plat/isup/ut/isup_msg_rv.txt create mode 100644 omc/plat/isup/ut/isup_msg_send.txt create mode 100644 omc/plat/m2ua/.copyarea.db create mode 100644 omc/plat/m2ua/Makefile create mode 100644 omc/plat/m2ua/doc/.copyarea.db create mode 100644 omc/plat/m2ua/doc/M2UA_R9V0_04P01.doc create mode 100644 omc/plat/m2ua/lib/libm2ua.a create mode 100644 omc/plat/m2ua/obj/m2ua.o create mode 100644 omc/plat/m2ua/obj/m2ua_debug.o create mode 100644 omc/plat/m2ua/obj/m2ua_fsm.o create mode 100644 omc/plat/m2ua/obj/m2ua_msg.o create mode 100644 omc/plat/m2ua/src/.copyarea.db create mode 100644 omc/plat/m2ua/src/include/.copyarea.db create mode 100644 omc/plat/m2ua/src/include/m2ua.h create mode 100644 omc/plat/m2ua/src/include/m2ua_const.h create mode 100644 omc/plat/m2ua/src/include/m2ua_debug.h create mode 100644 omc/plat/m2ua/src/include/m2ua_def.h create mode 100644 omc/plat/m2ua/src/include/m2ua_ext.h create mode 100644 omc/plat/m2ua/src/include/m2ua_fsm.h create mode 100644 omc/plat/m2ua/src/include/m2ua_msg.h create mode 100644 omc/plat/m2ua/src/include/m2ua_pub.h create mode 100644 omc/plat/m2ua/src/include/m2ua_struct.h create mode 100644 omc/plat/m2ua/src/include/sctp.h create mode 100644 omc/plat/m2ua/src/m2ua.c create mode 100644 omc/plat/m2ua/src/m2ua_debug.c create mode 100644 omc/plat/m2ua/src/m2ua_fsm.c create mode 100644 omc/plat/m2ua/src/m2ua_msg.c create mode 100644 omc/plat/m2ua/src_old/.copyarea.db create mode 100644 omc/plat/m2ua/src_old/include/.copyarea.db create mode 100644 omc/plat/m2ua/src_old/include/m2ua.h create mode 100644 omc/plat/m2ua/src_old/include/m2ua_const.h create mode 100644 omc/plat/m2ua/src_old/include/m2ua_debug.h create mode 100644 omc/plat/m2ua/src_old/include/m2ua_def.h create mode 100644 omc/plat/m2ua/src_old/include/m2ua_ext.h create mode 100644 omc/plat/m2ua/src_old/include/m2ua_fsm.h create mode 100644 omc/plat/m2ua/src_old/include/m2ua_msg.h create mode 100644 omc/plat/m2ua/src_old/include/m2ua_pub.h create mode 100644 omc/plat/m2ua/src_old/include/m2ua_struct.h create mode 100644 omc/plat/m2ua/src_old/include/sctp.h create mode 100644 omc/plat/m2ua/src_old/m2ua.c create mode 100644 omc/plat/m2ua/src_old/m2ua_debug.c create mode 100644 omc/plat/m2ua/src_old/m2ua_fsm.c create mode 100644 omc/plat/m2ua/src_old/m2ua_msg.c create mode 100644 omc/plat/m2ua/ut/.copyarea.db create mode 100644 omc/plat/m2ua/ut/testcate/.copyarea.db create mode 100644 omc/plat/m2ua/ut/testcate/MGC(IUA)_Client.txt create mode 100644 omc/plat/m2ua/ut/testcate/MGC(IUA)_Server.txt create mode 100644 omc/plat/m2ua/ut/testcate/MGC(M2UA)_Client.txt create mode 100644 omc/plat/m2ua/ut/testcate/MGC(M2UA)_Server.txt create mode 100644 omc/plat/m2ua/ut/testcate/SG(IUA)_Client.txt create mode 100644 omc/plat/m2ua/ut/testcate/SG(IUA)_Server.txt create mode 100644 omc/plat/m2ua/ut/testcate/SG(M2UA)_Client.txt create mode 100644 omc/plat/m2ua/ut/testcate/SG(M2UA)_Server.txt create mode 100644 omc/plat/m2ua/ut/testcate/headfile.txt create mode 100644 omc/plat/m2ua/ut/xua_test/.copyarea.db create mode 100644 omc/plat/m2ua/ut/xua_test/Makefile create mode 100644 omc/plat/m2ua/ut/xua_test/conf/.copyarea.db create mode 100644 omc/plat/m2ua/ut/xua_test/conf/AucSysPara create mode 100644 omc/plat/m2ua/ut/xua_test/conf/EirSysPara create mode 100644 omc/plat/m2ua/ut/xua_test/conf/HlrSysPara create mode 100644 omc/plat/m2ua/ut/xua_test/conf/cap_acn.conf create mode 100644 omc/plat/m2ua/ut/xua_test/conf/cap_operation.conf create mode 100644 omc/plat/m2ua/ut/xua_test/conf/cc_table.conf create mode 100644 omc/plat/m2ua/ut/xua_test/conf/conv_prefix.conf create mode 100644 omc/plat/m2ua/ut/xua_test/conf/help_page create mode 100644 omc/plat/m2ua/ut/xua_test/conf/hlr_parambit.conf create mode 100644 omc/plat/m2ua/ut/xua_test/conf/iptrans.conf create mode 100644 omc/plat/m2ua/ut/xua_test/conf/map_acn.conf create mode 100644 omc/plat/m2ua/ut/xua_test/conf/map_operation.conf create mode 100644 omc/plat/m2ua/ut/xua_test/conf/menu_page create mode 100644 omc/plat/m2ua/ut/xua_test/conf/mnpf.conf create mode 100644 omc/plat/m2ua/ut/xua_test/conf/msc_conf create mode 100644 omc/plat/m2ua/ut/xua_test/conf/mtp3.conf create mode 100644 omc/plat/m2ua/ut/xua_test/conf/ppsConf.txt create mode 100644 omc/plat/m2ua/ut/xua_test/conf/ppsCrdConf.txt create mode 100644 omc/plat/m2ua/ut/xua_test/conf/profile create mode 100644 omc/plat/m2ua/ut/xua_test/conf/sccp.conf create mode 100644 omc/plat/m2ua/ut/xua_test/conf/sccp_omt.conf create mode 100644 omc/plat/m2ua/ut/xua_test/conf/sccp_sts.conf create mode 100644 omc/plat/m2ua/ut/xua_test/conf/smsc_csta.conf create mode 100644 omc/plat/m2ua/ut/xua_test/conf/smsc_parambit.conf create mode 100644 omc/plat/m2ua/ut/xua_test/conf/smsc_sys.conf create mode 100644 omc/plat/m2ua/ut/xua_test/conf/system.ini create mode 100644 omc/plat/m2ua/ut/xua_test/conf/vlr.conf create mode 100644 omc/plat/m2ua/ut/xua_test/conf/wxc2_sys.conf create mode 100644 omc/plat/m2ua/ut/xua_test/conf/wxc2exit.txt create mode 100644 omc/plat/m2ua/ut/xua_test/conf/xap_sysparam.conf create mode 100644 omc/plat/m2ua/ut/xua_test/xuatest.c create mode 100644 omc/plat/make_plat create mode 100644 omc/plat/mgc/.copyarea.db create mode 100644 omc/plat/mgc/Makefile create mode 100644 omc/plat/mgc/lib/libmgc.a create mode 100644 omc/plat/mgc/obj/mgc.o create mode 100644 omc/plat/mgc/obj/mgc_debug.o create mode 100644 omc/plat/mgc/obj/mgc_fsm.o create mode 100644 omc/plat/mgc/obj/mgc_sess_ctl.o create mode 100644 omc/plat/mgc/src/.copyarea.db create mode 100644 omc/plat/mgc/src/include/.copyarea.db create mode 100644 omc/plat/mgc/src/include/mgc.h create mode 100644 omc/plat/mgc/src/include/mgc_const.h create mode 100644 omc/plat/mgc/src/include/mgc_debug.h create mode 100644 omc/plat/mgc/src/include/mgc_def.h create mode 100644 omc/plat/mgc/src/include/mgc_ext.h create mode 100644 omc/plat/mgc/src/include/mgc_fsm.h create mode 100644 omc/plat/mgc/src/include/mgc_pub.h create mode 100644 omc/plat/mgc/src/include/mgc_sess_ctl.h create mode 100644 omc/plat/mgc/src/include/mgc_struct.h create mode 100644 omc/plat/mgc/src/mgc.c create mode 100644 omc/plat/mgc/src/mgc.c.bak create mode 100644 omc/plat/mgc/src/mgc_debug.c create mode 100644 omc/plat/mgc/src/mgc_fsm.c create mode 100644 omc/plat/mgc/src/mgc_fsm.c.bak create mode 100644 omc/plat/mgc/src/mgc_sess_ctl.c create mode 100644 omc/plat/mgc_v2/.copyarea.db create mode 100644 omc/plat/mgc_v2/Makefile create mode 100644 omc/plat/mgc_v2/lib/libmgc_v2.a create mode 100644 omc/plat/mgc_v2/obj/mgc.o create mode 100644 omc/plat/mgc_v2/obj/mgc_8ecp.o create mode 100644 omc/plat/mgc_v2/obj/mgc_chnl_info.o create mode 100644 omc/plat/mgc_v2/obj/mgc_conn_info.o create mode 100644 omc/plat/mgc_v2/obj/mgc_ctl.o create mode 100644 omc/plat/mgc_v2/obj/mgc_debug.o create mode 100644 omc/plat/mgc_v2/obj/mgc_internal.o create mode 100644 omc/plat/mgc_v2/obj/mgc_mg_info.o create mode 100644 omc/plat/mgc_v2/obj/mgc_mgcp.o create mode 100644 omc/plat/mgc_v2/obj/mgc_phy_port.o create mode 100644 omc/plat/mgc_v2/obj/mgc_port_info.o create mode 100644 omc/plat/mgc_v2/obj/mgc_port_list.o create mode 100644 omc/plat/mgc_v2/obj/mgc_sur_info.o create mode 100644 omc/plat/mgc_v2/obj/mgc_tandem_info.o create mode 100644 omc/plat/mgc_v2/src/.copyarea.db create mode 100644 omc/plat/mgc_v2/src/include/.copyarea.db create mode 100644 omc/plat/mgc_v2/src/include/mgc.h create mode 100644 omc/plat/mgc_v2/src/include/mgc_8ecp.h create mode 100644 omc/plat/mgc_v2/src/include/mgc_chnl_info.h create mode 100644 omc/plat/mgc_v2/src/include/mgc_conn_info.h create mode 100644 omc/plat/mgc_v2/src/include/mgc_ctl.h create mode 100644 omc/plat/mgc_v2/src/include/mgc_debug.h create mode 100644 omc/plat/mgc_v2/src/include/mgc_internal.h create mode 100644 omc/plat/mgc_v2/src/include/mgc_mg_info.h create mode 100644 omc/plat/mgc_v2/src/include/mgc_mgcp.h create mode 100644 omc/plat/mgc_v2/src/include/mgc_phy_port.h create mode 100644 omc/plat/mgc_v2/src/include/mgc_port_info.h create mode 100644 omc/plat/mgc_v2/src/include/mgc_port_list.h create mode 100644 omc/plat/mgc_v2/src/include/mgc_pub.h create mode 100644 omc/plat/mgc_v2/src/include/mgc_snmp.h create mode 100644 omc/plat/mgc_v2/src/include/mgc_struct.h create mode 100644 omc/plat/mgc_v2/src/include/mgc_sur_info.h create mode 100644 omc/plat/mgc_v2/src/include/mgc_tandem_info.h create mode 100644 omc/plat/mgc_v2/src/mgc.c create mode 100644 omc/plat/mgc_v2/src/mgc_8ecp.c create mode 100644 omc/plat/mgc_v2/src/mgc_chnl_info.c create mode 100644 omc/plat/mgc_v2/src/mgc_conn_info.c create mode 100644 omc/plat/mgc_v2/src/mgc_ctl.c create mode 100644 omc/plat/mgc_v2/src/mgc_debug.c create mode 100644 omc/plat/mgc_v2/src/mgc_internal.c create mode 100644 omc/plat/mgc_v2/src/mgc_mg_info.c create mode 100644 omc/plat/mgc_v2/src/mgc_mgcp.c create mode 100644 omc/plat/mgc_v2/src/mgc_phy_port.c create mode 100644 omc/plat/mgc_v2/src/mgc_port_info.c create mode 100644 omc/plat/mgc_v2/src/mgc_port_list.c create mode 100644 omc/plat/mgc_v2/src/mgc_sur_info.c create mode 100644 omc/plat/mgc_v2/src/mgc_tandem_info.c create mode 100644 omc/plat/mgc_v2/ut/.copyarea.db create mode 100644 omc/plat/mgc_v2/ut/CUnit-List.dtd create mode 100644 omc/plat/mgc_v2/ut/CUnit-List.xsl create mode 100644 omc/plat/mgc_v2/ut/CUnit-Run.dtd create mode 100644 omc/plat/mgc_v2/ut/CUnit-Run.xsl create mode 100644 omc/plat/mgc_v2/ut/Makefile create mode 100644 omc/plat/mgc_v2/ut/conf/.copyarea.db create mode 100644 omc/plat/mgc_v2/ut/conf/iptrans.conf create mode 100644 omc/plat/mgc_v2/ut/conf/menu_page create mode 100644 omc/plat/mgc_v2/ut/include/.copyarea.db create mode 100644 omc/plat/mgc_v2/ut/include/Automated.h create mode 100644 omc/plat/mgc_v2/ut/include/Basic.h create mode 100644 omc/plat/mgc_v2/ut/include/CUCurses.h create mode 100644 omc/plat/mgc_v2/ut/include/CUError.h create mode 100644 omc/plat/mgc_v2/ut/include/CUnit.h create mode 100644 omc/plat/mgc_v2/ut/include/Console.h create mode 100644 omc/plat/mgc_v2/ut/include/MyMem.h create mode 100644 omc/plat/mgc_v2/ut/include/TestDB.h create mode 100644 omc/plat/mgc_v2/ut/include/TestRun.h create mode 100644 omc/plat/mgc_v2/ut/include/Util.h create mode 100644 omc/plat/mgc_v2/ut/mgc_v2_test create mode 100644 omc/plat/mgc_v2/ut/mgc_v2_test.c create mode 100644 omc/plat/mgcp/.copyarea.db create mode 100644 omc/plat/mgcp/Makefile create mode 100644 omc/plat/mgcp/lib/libmgcp.a create mode 100644 omc/plat/mgcp/obj/mgcp.o create mode 100644 omc/plat/mgcp/obj/mgcp_debug.o create mode 100644 omc/plat/mgcp/obj/mgcp_msg.o create mode 100644 omc/plat/mgcp/obj/mgcp_trans.o create mode 100644 omc/plat/mgcp/src/.copyarea.db create mode 100644 omc/plat/mgcp/src/include/.copyarea.db create mode 100644 omc/plat/mgcp/src/include/mgcp.h create mode 100644 omc/plat/mgcp/src/include/mgcp_const.h create mode 100644 omc/plat/mgcp/src/include/mgcp_debug.h create mode 100644 omc/plat/mgcp/src/include/mgcp_def.h create mode 100644 omc/plat/mgcp/src/include/mgcp_ext.h create mode 100644 omc/plat/mgcp/src/include/mgcp_msg.h create mode 100644 omc/plat/mgcp/src/include/mgcp_pub.h create mode 100644 omc/plat/mgcp/src/include/mgcp_struct.h create mode 100644 omc/plat/mgcp/src/include/mgcp_trans.h create mode 100644 omc/plat/mgcp/src/mgcp.c create mode 100644 omc/plat/mgcp/src/mgcp_debug.c create mode 100644 omc/plat/mgcp/src/mgcp_msg.c create mode 100644 omc/plat/mgcp/src/mgcp_msg.c.bak create mode 100644 omc/plat/mgcp/src/mgcp_trans.c create mode 100644 omc/plat/mtp3/.copyarea.db create mode 100644 omc/plat/mtp3/Makefile create mode 100644 omc/plat/mtp3/lib/libmtp3.a create mode 100644 omc/plat/mtp3/obj/mtp3lite.o create mode 100644 omc/plat/mtp3/obj/mtpinit.o create mode 100644 omc/plat/mtp3/obj/mtpm.o create mode 100644 omc/plat/mtp3/obj/mtpmib.o create mode 100644 omc/plat/mtp3/obj/mtpslm.o create mode 100644 omc/plat/mtp3/obj/mtpsmh.o create mode 100644 omc/plat/mtp3/obj/mtpsrm.o create mode 100644 omc/plat/mtp3/obj/mtpstm.o create mode 100644 omc/plat/mtp3/src/.copyarea.db create mode 100644 omc/plat/mtp3/src/include/.copyarea.db create mode 100644 omc/plat/mtp3/src/include/mtp3.h create mode 100644 omc/plat/mtp3/src/include/mtp3lite.h create mode 100644 omc/plat/mtp3/src/include/mtp3lite_pub.h create mode 100644 omc/plat/mtp3/src/include/mtpconst.h create mode 100644 omc/plat/mtp3/src/include/mtpdef.h create mode 100644 omc/plat/mtp3/src/include/mtpext.h create mode 100644 omc/plat/mtp3/src/include/mtpfunc.h create mode 100644 omc/plat/mtp3/src/include/mtpstm.h create mode 100644 omc/plat/mtp3/src/mtp3lite.c create mode 100644 omc/plat/mtp3/src/mtpinit.c create mode 100644 omc/plat/mtp3/src/mtpm.c create mode 100644 omc/plat/mtp3/src/mtpmib.c create mode 100644 omc/plat/mtp3/src/mtpslm.c create mode 100644 omc/plat/mtp3/src/mtpsmh.c create mode 100644 omc/plat/mtp3/src/mtpsrm.c create mode 100644 omc/plat/mtp3/src/mtpstm.c create mode 100644 omc/plat/mtp3_old/.copyarea.db create mode 100644 omc/plat/mtp3_old/Makefile create mode 100644 omc/plat/mtp3_old/src/.copyarea.db create mode 100644 omc/plat/mtp3_old/src/include/.copyarea.db create mode 100644 omc/plat/mtp3_old/src/include/mtp3.h create mode 100644 omc/plat/mtp3_old/src/include/mtp3lite.h create mode 100644 omc/plat/mtp3_old/src/include/mtp3lite_pub.h create mode 100644 omc/plat/mtp3_old/src/include/mtpconst.h create mode 100644 omc/plat/mtp3_old/src/include/mtpdef.h create mode 100644 omc/plat/mtp3_old/src/include/mtpext.h create mode 100644 omc/plat/mtp3_old/src/include/mtpfunc.h create mode 100644 omc/plat/mtp3_old/src/include/mtpstm.h create mode 100644 omc/plat/mtp3_old/src/mtp3lite.c create mode 100644 omc/plat/mtp3_old/src/mtpinit.c create mode 100644 omc/plat/mtp3_old/src/mtpm.c create mode 100644 omc/plat/mtp3_old/src/mtpmib.c create mode 100644 omc/plat/mtp3_old/src/mtpslm.c create mode 100644 omc/plat/mtp3_old/src/mtpsmh.c create mode 100644 omc/plat/mtp3_old/src/mtpsrm.c create mode 100644 omc/plat/mtp3_old/src/mtpstm.c create mode 100644 omc/plat/pal/.copyarea.db create mode 100644 omc/plat/pal/Makefile create mode 100644 omc/plat/pal/lib/Just for creating lib directory.txt create mode 100644 omc/plat/pal/lib/libpal.a create mode 100644 omc/plat/pal/pal.h create mode 100644 omc/plat/pal/rm.c create mode 100644 omc/plat/pal/rm.o create mode 100644 omc/plat/public/.copyarea.db create mode 100644 omc/plat/public/Makefile create mode 100644 omc/plat/public/lib/libpublic.a create mode 100644 omc/plat/public/obj/apiKey.o create mode 100644 omc/plat/public/obj/asn1.o create mode 100644 omc/plat/public/obj/bisearch.o create mode 100644 omc/plat/public/obj/cJSON.o create mode 100644 omc/plat/public/obj/cdr.o create mode 100644 omc/plat/public/obj/crypt.o create mode 100644 omc/plat/public/obj/list.o create mode 100644 omc/plat/public/obj/memwatch.o create mode 100644 omc/plat/public/obj/number.o create mode 100644 omc/plat/public/obj/numgrp.o create mode 100644 omc/plat/public/obj/pub_conf.o create mode 100644 omc/plat/public/obj/pub_debug.o create mode 100644 omc/plat/public/obj/pub_file.o create mode 100644 omc/plat/public/obj/pub_fmt.o create mode 100644 omc/plat/public/obj/pub_inet.o create mode 100644 omc/plat/public/obj/pub_log.o create mode 100644 omc/plat/public/obj/pub_malloc.o create mode 100644 omc/plat/public/obj/pub_netcap.o create mode 100644 omc/plat/public/obj/pub_sdp.o create mode 100644 omc/plat/public/obj/pub_str.o create mode 100644 omc/plat/public/obj/pub_sys.o create mode 100644 omc/plat/public/obj/pub_time.o create mode 100644 omc/plat/public/obj/pub_timer.o create mode 100644 omc/plat/public/obj/pub_wnet.o create mode 100644 omc/plat/public/obj/shm.o create mode 100644 omc/plat/public/src/.copyarea.db create mode 100644 omc/plat/public/src/apiKey.c create mode 100644 omc/plat/public/src/asn1.c create mode 100644 omc/plat/public/src/bisearch.c create mode 100644 omc/plat/public/src/cJSON.c create mode 100644 omc/plat/public/src/cdr.c create mode 100644 omc/plat/public/src/crypt.c create mode 100644 omc/plat/public/src/include/.copyarea.db create mode 100644 omc/plat/public/src/include/asn1.h create mode 100644 omc/plat/public/src/include/bisearch.h create mode 100644 omc/plat/public/src/include/cJSON.h create mode 100644 omc/plat/public/src/include/cdr.h create mode 100644 omc/plat/public/src/include/crypt.h create mode 100644 omc/plat/public/src/include/includes.h create mode 100644 omc/plat/public/src/include/keyValuePair.h create mode 100644 omc/plat/public/src/include/license_id.h create mode 100644 omc/plat/public/src/include/list.h create mode 100644 omc/plat/public/src/include/memwatch.h create mode 100644 omc/plat/public/src/include/omc_public.h create mode 100644 omc/plat/public/src/include/pub_base.h create mode 100644 omc/plat/public/src/include/pub_debug.h create mode 100644 omc/plat/public/src/include/pub_file.h create mode 100644 omc/plat/public/src/include/pub_fmt.h create mode 100644 omc/plat/public/src/include/pub_include.h create mode 100644 omc/plat/public/src/include/pub_inet.h create mode 100644 omc/plat/public/src/include/pub_list.h create mode 100644 omc/plat/public/src/include/pub_log.h create mode 100644 omc/plat/public/src/include/pub_malloc.h create mode 100644 omc/plat/public/src/include/pub_netcap.h create mode 100644 omc/plat/public/src/include/pub_sdp.h create mode 100644 omc/plat/public/src/include/pub_str.h create mode 100644 omc/plat/public/src/include/pub_sys.h create mode 100644 omc/plat/public/src/include/pub_time.h create mode 100644 omc/plat/public/src/include/pub_timer.h create mode 100644 omc/plat/public/src/include/pub_wnet.h create mode 100644 omc/plat/public/src/include/public.h create mode 100644 omc/plat/public/src/include/svrstat.h create mode 100644 omc/plat/public/src/list.c create mode 100644 omc/plat/public/src/memwatch.c create mode 100644 omc/plat/public/src/pub_conf.c create mode 100644 omc/plat/public/src/pub_debug.c create mode 100644 omc/plat/public/src/pub_file.c create mode 100644 omc/plat/public/src/pub_fmt.c create mode 100644 omc/plat/public/src/pub_inet.c create mode 100644 omc/plat/public/src/pub_log.c create mode 100644 omc/plat/public/src/pub_malloc.c create mode 100644 omc/plat/public/src/pub_netcap.c create mode 100644 omc/plat/public/src/pub_sdp.c create mode 100644 omc/plat/public/src/pub_str.c create mode 100644 omc/plat/public/src/pub_sys.c create mode 100644 omc/plat/public/src/pub_time.c create mode 100644 omc/plat/public/src/pub_timer.c create mode 100644 omc/plat/public/src/pub_wnet.c create mode 100644 omc/plat/public/src/shm.c create mode 100644 omc/plat/public/src/uwav/.copyarea.db create mode 100644 omc/plat/public/src/uwav/number.c create mode 100644 omc/plat/public/src/uwav/number.h create mode 100644 omc/plat/public/src/uwav/numgrp.c create mode 100644 omc/plat/public/src/uwav/numgrp.h create mode 100644 omc/plat/public/ut/.copyarea.db create mode 100644 omc/plat/public/ut/asn.1/.copyarea.db create mode 100644 omc/plat/public/ut/asn.1/asntest.c create mode 100644 omc/plat/public/ut/bisearch/.copyarea.db create mode 100644 omc/plat/public/ut/bisearch/bisearch_test.c create mode 100644 omc/plat/public/ut/debug_api/.copyarea.db create mode 100644 omc/plat/public/ut/debug_api/debug create mode 100644 omc/plat/public/ut/debug_api/wxc_debug_test.c create mode 100644 omc/plat/public/ut/function.c create mode 100644 omc/plat/public/ut/inet/.copyarea.db create mode 100644 omc/plat/public/ut/inet/pub_inet_test.c create mode 100644 omc/plat/public/ut/main/.copyarea.db create mode 100644 omc/plat/public/ut/main/Makefile create mode 100644 omc/plat/public/ut/main/src/.copyarea.db create mode 100644 omc/plat/public/ut/main/src/main.c create mode 100644 omc/plat/public/ut/public_test/.copyarea.db create mode 100644 omc/plat/public/ut/public_test/public_test.c create mode 100644 omc/plat/public/ut/timer/.copyarea.db create mode 100644 omc/plat/public/ut/timer/Makefile create mode 100644 omc/plat/public/ut/timer/wxc_tmtest.c create mode 100644 omc/plat/public_bak/.copyarea.db create mode 100644 omc/plat/public_bak/Makefile create mode 100644 omc/plat/public_bak/src/.copyarea.db create mode 100644 omc/plat/public_bak/src/asn1.c create mode 100644 omc/plat/public_bak/src/bisearch.c create mode 100644 omc/plat/public_bak/src/crypt.c create mode 100644 omc/plat/public_bak/src/include/.copyarea.db create mode 100644 omc/plat/public_bak/src/include/asn1.h create mode 100644 omc/plat/public_bak/src/include/bisearch.h create mode 100644 omc/plat/public_bak/src/include/crypt.h create mode 100644 omc/plat/public_bak/src/include/includes.h create mode 100644 omc/plat/public_bak/src/include/license_id.h create mode 100644 omc/plat/public_bak/src/include/memwatch.h create mode 100644 omc/plat/public_bak/src/include/omc_public.h create mode 100644 omc/plat/public_bak/src/include/pub_base.h create mode 100644 omc/plat/public_bak/src/include/pub_debug.h create mode 100644 omc/plat/public_bak/src/include/pub_file.h create mode 100644 omc/plat/public_bak/src/include/pub_fmt.h create mode 100644 omc/plat/public_bak/src/include/pub_include.h create mode 100644 omc/plat/public_bak/src/include/pub_inet.h create mode 100644 omc/plat/public_bak/src/include/pub_list.h create mode 100644 omc/plat/public_bak/src/include/pub_log.h create mode 100644 omc/plat/public_bak/src/include/pub_malloc.h create mode 100644 omc/plat/public_bak/src/include/pub_netcap.h create mode 100644 omc/plat/public_bak/src/include/pub_sdp.h create mode 100644 omc/plat/public_bak/src/include/pub_str.h create mode 100644 omc/plat/public_bak/src/include/pub_sys.h create mode 100644 omc/plat/public_bak/src/include/pub_time.h create mode 100644 omc/plat/public_bak/src/include/pub_timer.h create mode 100644 omc/plat/public_bak/src/include/pub_wnet.h create mode 100644 omc/plat/public_bak/src/include/public.h create mode 100644 omc/plat/public_bak/src/include/svrstat.h create mode 100644 omc/plat/public_bak/src/memwatch.c create mode 100644 omc/plat/public_bak/src/pub_conf.c create mode 100644 omc/plat/public_bak/src/pub_debug.c create mode 100644 omc/plat/public_bak/src/pub_file.c create mode 100644 omc/plat/public_bak/src/pub_fmt.c create mode 100644 omc/plat/public_bak/src/pub_inet.c create mode 100644 omc/plat/public_bak/src/pub_log.c create mode 100644 omc/plat/public_bak/src/pub_malloc.c create mode 100644 omc/plat/public_bak/src/pub_netcap.c create mode 100644 omc/plat/public_bak/src/pub_sdp.c create mode 100644 omc/plat/public_bak/src/pub_str.c create mode 100644 omc/plat/public_bak/src/pub_sys.c create mode 100644 omc/plat/public_bak/src/pub_time.c create mode 100644 omc/plat/public_bak/src/pub_timer.c create mode 100644 omc/plat/public_bak/src/pub_wnet.c create mode 100644 omc/plat/public_bak/src/uwav/.copyarea.db create mode 100644 omc/plat/public_bak/src/uwav/number.c create mode 100644 omc/plat/public_bak/src/uwav/number.h create mode 100644 omc/plat/public_bak/src/uwav/numgrp.c create mode 100644 omc/plat/public_bak/src/uwav/numgrp.h create mode 100644 omc/plat/public_bak/ut/.copyarea.db create mode 100644 omc/plat/public_bak/ut/asn.1/.copyarea.db create mode 100644 omc/plat/public_bak/ut/asn.1/asntest.c create mode 100644 omc/plat/public_bak/ut/bisearch/.copyarea.db create mode 100644 omc/plat/public_bak/ut/bisearch/bisearch_test.c create mode 100644 omc/plat/public_bak/ut/debug_api/.copyarea.db create mode 100644 omc/plat/public_bak/ut/debug_api/debug create mode 100644 omc/plat/public_bak/ut/debug_api/wxc_debug_test.c create mode 100644 omc/plat/public_bak/ut/function.c create mode 100644 omc/plat/public_bak/ut/inet/.copyarea.db create mode 100644 omc/plat/public_bak/ut/inet/pub_inet_test.c create mode 100644 omc/plat/public_bak/ut/main/.copyarea.db create mode 100644 omc/plat/public_bak/ut/main/Makefile create mode 100644 omc/plat/public_bak/ut/main/src/.copyarea.db create mode 100644 omc/plat/public_bak/ut/main/src/main.c create mode 100644 omc/plat/public_bak/ut/public_test/.copyarea.db create mode 100644 omc/plat/public_bak/ut/public_test/public_test.c create mode 100644 omc/plat/public_bak/ut/timer/.copyarea.db create mode 100644 omc/plat/public_bak/ut/timer/Makefile create mode 100644 omc/plat/public_bak/ut/timer/wxc_tmtest.c create mode 100644 omc/plat/rtp/.copyarea.db create mode 100644 omc/plat/rtp/Makefile create mode 100644 omc/plat/rtp/lib/librtp.a create mode 100644 omc/plat/rtp/obj/rtp.o create mode 100644 omc/plat/rtp/obj/rtp_msg.o create mode 100644 omc/plat/rtp/src/.copyarea.db create mode 100644 omc/plat/rtp/src/include/.copyarea.db create mode 100644 omc/plat/rtp/src/include/rtp.h create mode 100644 omc/plat/rtp/src/include/rtp_const.h create mode 100644 omc/plat/rtp/src/include/rtp_def.h create mode 100644 omc/plat/rtp/src/include/rtp_ext.h create mode 100644 omc/plat/rtp/src/include/rtp_msg.h create mode 100644 omc/plat/rtp/src/include/rtp_pub.h create mode 100644 omc/plat/rtp/src/include/rtp_struct.h create mode 100644 omc/plat/rtp/src/rtp.c create mode 100644 omc/plat/rtp/src/rtp_msg.c create mode 100644 omc/plat/sccp/.copyarea.db create mode 100644 omc/plat/sccp/Makefile create mode 100644 omc/plat/sccp/lib/libsccp.a create mode 100644 omc/plat/sccp/obj/sccp.o create mode 100644 omc/plat/sccp/obj/sccp_debug.o create mode 100644 omc/plat/sccp/obj/sccp_func.o create mode 100644 omc/plat/sccp/obj/sccp_gtt.o create mode 100644 omc/plat/sccp/obj/sccp_log.o create mode 100644 omc/plat/sccp/obj/sccp_mib.o create mode 100644 omc/plat/sccp/obj/sccp_msg.o create mode 100644 omc/plat/sccp/obj/sccp_param.o create mode 100644 omc/plat/sccp/obj/sclc.o create mode 100644 omc/plat/sccp/obj/scmg.o create mode 100644 omc/plat/sccp/obj/scoc.o create mode 100644 omc/plat/sccp/obj/scoc_fsm.o create mode 100644 omc/plat/sccp/obj/scoc_func.o create mode 100644 omc/plat/sccp/obj/scoc_if.o create mode 100644 omc/plat/sccp/obj/scoc_pool.o create mode 100644 omc/plat/sccp/obj/scoc_pri.o create mode 100644 omc/plat/sccp/obj/scrc.o create mode 100644 omc/plat/sccp/src/.copyarea.db create mode 100644 omc/plat/sccp/src/include/.copyarea.db create mode 100644 omc/plat/sccp/src/include/sccp.h create mode 100644 omc/plat/sccp/src/include/sccp_func.h create mode 100644 omc/plat/sccp/src/include/sccp_pub.h create mode 100644 omc/plat/sccp/src/include/sccpconst.h create mode 100644 omc/plat/sccp/src/include/scoc.h create mode 100644 omc/plat/sccp/src/include/scoc_if.h create mode 100644 omc/plat/sccp/src/sccp.c create mode 100644 omc/plat/sccp/src/sccp_debug.c create mode 100644 omc/plat/sccp/src/sccp_func.c create mode 100644 omc/plat/sccp/src/sccp_gtt.c create mode 100644 omc/plat/sccp/src/sccp_log.c create mode 100644 omc/plat/sccp/src/sccp_mib.c create mode 100644 omc/plat/sccp/src/sccp_msg.c create mode 100644 omc/plat/sccp/src/sccp_param.c create mode 100644 omc/plat/sccp/src/sclc.c create mode 100644 omc/plat/sccp/src/scmg.c create mode 100644 omc/plat/sccp/src/scoc.c create mode 100644 omc/plat/sccp/src/scoc_fsm.c create mode 100644 omc/plat/sccp/src/scoc_func.c create mode 100644 omc/plat/sccp/src/scoc_if.c create mode 100644 omc/plat/sccp/src/scoc_pool.c create mode 100644 omc/plat/sccp/src/scoc_pri.c create mode 100644 omc/plat/sccp/src/scrc.c create mode 100644 omc/plat/sccp/ut/.copyarea.db create mode 100644 omc/plat/sccp/ut/fsmtest/.copyarea.db create mode 100644 omc/plat/sccp/ut/fsmtest/Makefile create mode 100644 omc/plat/sccp/ut/fsmtest/bin/.copyarea.db create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/.copyarea.db create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/HlrSysPara create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/cap_acn.conf create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/cap_operation.conf create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/cc_table.conf create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/conv_prefix.conf create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/hae_sys.conf create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/help_page create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/hlr_parambit.conf create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/iptrans.conf create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/map_acn.conf create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/map_operation.conf create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/menu_page create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/mtp3.conf create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/ppsConf.txt create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/profile create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/sccp.conf create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/sccp_test.conf create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/smsc_csta.conf create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/smsc_parambit.conf create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/smsc_sys.conf create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/system.ini create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/wxc2_sys.conf create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/wxc2exit.txt create mode 100644 omc/plat/sccp/ut/fsmtest/bin/conf/xap_sysparam.conf create mode 100644 omc/plat/sccp/ut/fsmtest/obj/.copyarea.db create mode 100644 omc/plat/sccp/ut/fsmtest/obj/sccp_test.gcno create mode 100644 omc/plat/sccp/ut/fsmtest/obj/scoc_test.gcno create mode 100644 omc/plat/sccp/ut/fsmtest/sccp_test.c create mode 100644 omc/plat/sccp/ut/fsmtest/scoc_test.c create mode 100644 omc/plat/scf/.copyarea.db create mode 100644 omc/plat/scf/Makefile create mode 100644 omc/plat/scf/lib/libscf.a create mode 100644 omc/plat/scf/obj/scfmsg.o create mode 100644 omc/plat/scf/obj/scsm.o create mode 100644 omc/plat/scf/src/.copyarea.db create mode 100644 omc/plat/scf/src/include/.copyarea.db create mode 100644 omc/plat/scf/src/include/scfdef.h create mode 100644 omc/plat/scf/src/include/scfmsg.h create mode 100644 omc/plat/scf/src/include/scfpub.h create mode 100644 omc/plat/scf/src/scfdef.h create mode 100644 omc/plat/scf/src/scfmsg.c create mode 100644 omc/plat/scf/src/scfmsg.h create mode 100644 omc/plat/scf/src/scfpub.h create mode 100644 omc/plat/scf/src/scsm.c create mode 100644 omc/plat/sip/.copyarea.db create mode 100644 omc/plat/sip/Makefile create mode 100644 omc/plat/sip/lib/libsip.a create mode 100644 omc/plat/sip/obj/sip.o create mode 100644 omc/plat/sip/obj/sip_debug.o create mode 100644 omc/plat/sip/obj/sip_msg.o create mode 100644 omc/plat/sip/obj/sip_msg_encode.o create mode 100644 omc/plat/sip/obj/sip_msg_parse.o create mode 100644 omc/plat/sip/obj/sip_transaction.o create mode 100644 omc/plat/sip/obj/sip_transport.o create mode 100644 omc/plat/sip/obj/sip_ua.o create mode 100644 omc/plat/sip/obj/sip_ua_dialog.o create mode 100644 omc/plat/sip/obj/sip_ua_fsm.o create mode 100644 omc/plat/sip/obj/sip_ua_msg.o create mode 100644 omc/plat/sip/src/.copyarea.db create mode 100644 omc/plat/sip/src/include/.copyarea.db create mode 100644 omc/plat/sip/src/include/sip.h create mode 100644 omc/plat/sip/src/include/sip_const.h create mode 100644 omc/plat/sip/src/include/sip_debug.h create mode 100644 omc/plat/sip/src/include/sip_def.h create mode 100644 omc/plat/sip/src/include/sip_ext.h create mode 100644 omc/plat/sip/src/include/sip_msg.h create mode 100644 omc/plat/sip/src/include/sip_msg_encode.h create mode 100644 omc/plat/sip/src/include/sip_msg_parse.h create mode 100644 omc/plat/sip/src/include/sip_pub.h create mode 100644 omc/plat/sip/src/include/sip_struct.h create mode 100644 omc/plat/sip/src/include/sip_transaction.h create mode 100644 omc/plat/sip/src/include/sip_transport.h create mode 100644 omc/plat/sip/src/include/sip_ua.h create mode 100644 omc/plat/sip/src/include/sip_ua_const.h create mode 100644 omc/plat/sip/src/include/sip_ua_def.h create mode 100644 omc/plat/sip/src/include/sip_ua_dialog.h create mode 100644 omc/plat/sip/src/include/sip_ua_ext.h create mode 100644 omc/plat/sip/src/include/sip_ua_msg.h create mode 100644 omc/plat/sip/src/include/sip_ua_pub.h create mode 100644 omc/plat/sip/src/include/sip_ua_struct.h create mode 100644 omc/plat/sip/src/sip.c create mode 100644 omc/plat/sip/src/sip_debug.c create mode 100644 omc/plat/sip/src/sip_msg.c create mode 100644 omc/plat/sip/src/sip_msg_encode.c create mode 100644 omc/plat/sip/src/sip_msg_parse.c create mode 100644 omc/plat/sip/src/sip_transaction.c create mode 100644 omc/plat/sip/src/sip_transport.c create mode 100644 omc/plat/sip/src/sip_ua.c create mode 100644 omc/plat/sip/src/sip_ua_dialog.c create mode 100644 omc/plat/sip/src/sip_ua_fsm.c create mode 100644 omc/plat/sip/src/sip_ua_msg.c create mode 100644 omc/plat/smpp/.copyarea.db create mode 100644 omc/plat/smpp/Makefile create mode 100644 omc/plat/smpp/doc/.copyarea.db create mode 100644 omc/plat/smpp/doc/SMPP_R9V0_01P12.doc create mode 100644 omc/plat/smpp/doc/SMPP_R9V0_01P13.doc create mode 100644 omc/plat/smpp/doc/SMPP_R9V0_01P14.doc create mode 100644 omc/plat/smpp/doc/SMPP_R9V0_01P15.doc create mode 100644 omc/plat/smpp/lib/libsmpp.a create mode 100644 omc/plat/smpp/obj/smpp_debug.o create mode 100644 omc/plat/smpp/obj/smpp_fsm.o create mode 100644 omc/plat/smpp/obj/smpp_func.o create mode 100644 omc/plat/smpp/obj/smpp_mib.o create mode 100644 omc/plat/smpp/obj/smpp_msg.o create mode 100644 omc/plat/smpp/src/.copyarea.db create mode 100644 omc/plat/smpp/src/include/.copyarea.db create mode 100644 omc/plat/smpp/src/include/smpp.h create mode 100644 omc/plat/smpp/src/include/smpp_const.h create mode 100644 omc/plat/smpp/src/include/smpp_def.h create mode 100644 omc/plat/smpp/src/include/smpp_ext.h create mode 100644 omc/plat/smpp/src/include/smpp_msg.h create mode 100644 omc/plat/smpp/src/include/smpp_public.h create mode 100644 omc/plat/smpp/src/smpp_debug.c create mode 100644 omc/plat/smpp/src/smpp_fsm.c create mode 100644 omc/plat/smpp/src/smpp_func.c create mode 100644 omc/plat/smpp/src/smpp_mib.c create mode 100644 omc/plat/smpp/src/smpp_msg.c create mode 100644 omc/plat/smpp/ut/.copyarea.db create mode 100644 omc/plat/smpp/ut/conf/.copyarea.db create mode 100644 omc/plat/smpp/ut/conf/MIB_files/.copyarea.db create mode 100644 omc/plat/smpp/ut/conf/MIB_files/IWV-SMI.txt create mode 100644 omc/plat/smpp/ut/conf/MIB_files/Special_App-SMI.txt create mode 100644 omc/plat/smpp/ut/conf/MIB_files/System_IP_List.txt create mode 100644 omc/plat/smpp/ut/conf/MIB_files/WXC2-AUC-MIB.txt create mode 100644 omc/plat/smpp/ut/conf/MIB_files/WXC2-HLR-MIB.txt create mode 100644 omc/plat/smpp/ut/conf/MIB_files/WXC2-MSC-MIB.txt create mode 100644 omc/plat/smpp/ut/conf/MIB_files/WXC2-MSS-MIB.txt create mode 100644 omc/plat/smpp/ut/conf/MIB_files/WXC2-PPS-MIB.txt create mode 100644 omc/plat/smpp/ut/conf/MIB_files/WXC2-SMI.txt create mode 100644 omc/plat/smpp/ut/conf/MIB_files/WXC2-SMSC-MIB.txt create mode 100644 omc/plat/smpp/ut/conf/MIB_files/WXC2-SS7-MIB.txt create mode 100644 omc/plat/smpp/ut/conf/MIB_files/menu_page create mode 100644 omc/plat/smpp/ut/conf/MIB_files/menu_tree.txt create mode 100644 omc/plat/smpp/ut/conf/MIB_files/mib_list_file.txt create mode 100644 omc/plat/smpp/ut/conf/MIB_files/mib_write_tree.txt create mode 100644 omc/plat/smpp/ut/conf/guess_number_test.conf create mode 100644 omc/plat/smpp/ut/conf/help_page create mode 100644 omc/plat/smpp/ut/conf/iptrans.conf create mode 100644 omc/plat/smpp/ut/conf/menu_page create mode 100644 omc/plat/smpp/ut/conf/mtp3.conf create mode 100644 omc/plat/smpp/ut/conf/sccp.conf create mode 100644 omc/plat/smpp/ut/conf/smpp.conf create mode 100644 omc/plat/smpp/ut/smpp_test/.copyarea.db create mode 100644 omc/plat/smpp/ut/smpp_test/smpp_test.c create mode 100644 omc/plat/smpp/ut/smpp_ussd_test/.copyarea.db create mode 100644 omc/plat/smpp/ut/smpp_ussd_test/guess_number.c create mode 100644 omc/plat/smpp/ut/smpp_ussd_test/pppchat.c create mode 100644 omc/plat/snmp/.copyarea.db create mode 100644 omc/plat/snmp/Makefile create mode 100644 omc/plat/snmp/lib/libsnmp.a create mode 100644 omc/plat/snmp/obj/heartbeat.o create mode 100644 omc/plat/snmp/obj/snmp.o create mode 100644 omc/plat/snmp/obj/snmp_mib.o create mode 100644 omc/plat/snmp/obj/snmp_mib_api.o create mode 100644 omc/plat/snmp/obj/snmpdebug.o create mode 100644 omc/plat/snmp/obj/snmpmib.o create mode 100644 omc/plat/snmp/obj/snmptable.o create mode 100644 omc/plat/snmp/obj/snmptest.o create mode 100644 omc/plat/snmp/obj/sysctrl.o create mode 100644 omc/plat/snmp/src/.copyarea.db create mode 100644 omc/plat/snmp/src/heartbeat.c create mode 100644 omc/plat/snmp/src/include/.copyarea.db create mode 100644 omc/plat/snmp/src/include/heartbeat.h create mode 100644 omc/plat/snmp/src/include/macro.h create mode 100644 omc/plat/snmp/src/include/snmp.h create mode 100644 omc/plat/snmp/src/include/sysctrl.h create mode 100644 omc/plat/snmp/src/include/table.h create mode 100644 omc/plat/snmp/src/mib_parser/.copyarea.db create mode 100644 omc/plat/snmp/src/mib_parser/snmp_mib.c create mode 100644 omc/plat/snmp/src/mib_parser/snmp_mib.h create mode 100644 omc/plat/snmp/src/mib_parser/snmp_mib_api.c create mode 100644 omc/plat/snmp/src/mib_parser/snmp_mib_api.h create mode 100644 omc/plat/snmp/src/snmp.c create mode 100644 omc/plat/snmp/src/snmpdebug.c create mode 100644 omc/plat/snmp/src/snmpmib.c create mode 100644 omc/plat/snmp/src/snmptable.c create mode 100644 omc/plat/snmp/src/snmptest.c create mode 100644 omc/plat/snmp/src/sysctrl.c create mode 100644 omc/plat/tcap/.copyarea.db create mode 100644 omc/plat/tcap/Makefile create mode 100644 omc/plat/tcap/lib/libtcap.a create mode 100644 omc/plat/tcap/obj/idmanage.o create mode 100644 omc/plat/tcap/obj/itcap.o create mode 100644 omc/plat/tcap/obj/tcap_coding.o create mode 100644 omc/plat/tcap/obj/tcap_fsm.o create mode 100644 omc/plat/tcap/obj/tcap_m.o create mode 100644 omc/plat/tcap/src/.copyarea.db create mode 100644 omc/plat/tcap/src/idmanage.c create mode 100644 omc/plat/tcap/src/include/.copyarea.db create mode 100644 omc/plat/tcap/src/include/idmanage.h create mode 100644 omc/plat/tcap/src/include/itcap.h create mode 100644 omc/plat/tcap/src/include/tcap_head.h create mode 100644 omc/plat/tcap/src/include/tcap_m.h create mode 100644 omc/plat/tcap/src/include/tcap_proc.h create mode 100644 omc/plat/tcap/src/include/tcap_public.h create mode 100644 omc/plat/tcap/src/include/tcap_struct.h create mode 100644 omc/plat/tcap/src/itcap.c create mode 100644 omc/plat/tcap/src/tcap_coding.c create mode 100644 omc/plat/tcap/src/tcap_fsm.c create mode 100644 omc/plat/tcap/src/tcap_m.c create mode 100644 omc/plat/xapp/.copyarea.db create mode 100644 omc/plat/xapp/Makefile create mode 100644 omc/plat/xapp/conf/.copyarea.db create mode 100644 omc/plat/xapp/conf/cap_acn.conf create mode 100644 omc/plat/xapp/conf/cap_operation.conf create mode 100644 omc/plat/xapp/conf/map_acn.conf create mode 100644 omc/plat/xapp/conf/map_operation.conf create mode 100644 omc/plat/xapp/lib/libxapp.a create mode 100644 omc/plat/xapp/obj/Map_opr.o create mode 100644 omc/plat/xapp/obj/cap_msg.o create mode 100644 omc/plat/xapp/obj/cap_msgtype.o create mode 100644 omc/plat/xapp/obj/cap_public.o create mode 100644 omc/plat/xapp/obj/conv_prefix.o create mode 100644 omc/plat/xapp/obj/is41_code_auc.o create mode 100644 omc/plat/xapp/obj/is41_code_ms.o create mode 100644 omc/plat/xapp/obj/is41_code_sms.o create mode 100644 omc/plat/xapp/obj/is41_code_win.o create mode 100644 omc/plat/xapp/obj/is41_coding.o create mode 100644 omc/plat/xapp/obj/is41_debug.o create mode 100644 omc/plat/xapp/obj/is41_init.o create mode 100644 omc/plat/xapp/obj/map_LCSCode.o create mode 100644 omc/plat/xapp/obj/map_code_auc.o create mode 100644 omc/plat/xapp/obj/map_code_ch.o create mode 100644 omc/plat/xapp/obj/map_code_dlgpdu.o create mode 100644 omc/plat/xapp/obj/map_code_ms.o create mode 100644 omc/plat/xapp/obj/map_code_om.o create mode 100644 omc/plat/xapp/obj/map_code_sms.o create mode 100644 omc/plat/xapp/obj/map_code_ss.o create mode 100644 omc/plat/xapp/obj/map_coding.o create mode 100644 omc/plat/xapp/obj/map_public.o create mode 100644 omc/plat/xapp/obj/xap_cdmacdr.o create mode 100644 omc/plat/xapp/obj/xap_interface.o create mode 100644 omc/plat/xapp/obj/xap_monitor.o create mode 100644 omc/plat/xapp/obj/xap_provider.o create mode 100644 omc/plat/xapp/src/.copyarea.db create mode 100644 omc/plat/xapp/src/capp/.copyarea.db create mode 100644 omc/plat/xapp/src/capp/cap_coding.h create mode 100644 omc/plat/xapp/src/capp/cap_head.h create mode 100644 omc/plat/xapp/src/capp/cap_msg.c create mode 100644 omc/plat/xapp/src/capp/cap_msg.h create mode 100644 omc/plat/xapp/src/capp/cap_msgtype.c create mode 100644 omc/plat/xapp/src/capp/cap_public.c create mode 100644 omc/plat/xapp/src/capp/cap_public.h create mode 100644 omc/plat/xapp/src/capp/icap.h create mode 100644 omc/plat/xapp/src/conv_prefix.c create mode 100644 omc/plat/xapp/src/conv_prefix.h create mode 100644 omc/plat/xapp/src/include.bak/.copyarea.db create mode 100644 omc/plat/xapp/src/include.bak/conv_prefix.h create mode 100644 omc/plat/xapp/src/include.bak/ixap.h create mode 100644 omc/plat/xapp/src/include.bak/xap_cdmacdr.h create mode 100644 omc/plat/xapp/src/include.bak/xap_interfunc.h create mode 100644 omc/plat/xapp/src/include.bak/xap_monitor.h create mode 100644 omc/plat/xapp/src/include.bak/xap_provider.h create mode 100644 omc/plat/xapp/src/ixap.h create mode 100644 omc/plat/xapp/src/mapp/.copyarea.db create mode 100644 omc/plat/xapp/src/mapp/Map_opr.c create mode 100644 omc/plat/xapp/src/mapp/imap.h create mode 100644 omc/plat/xapp/src/mapp/is41_code.h create mode 100644 omc/plat/xapp/src/mapp/is41_code_auc.c create mode 100644 omc/plat/xapp/src/mapp/is41_code_ms.c create mode 100644 omc/plat/xapp/src/mapp/is41_code_sms.c create mode 100644 omc/plat/xapp/src/mapp/is41_code_win.c create mode 100644 omc/plat/xapp/src/mapp/is41_coding.c create mode 100644 omc/plat/xapp/src/mapp/is41_debug.c create mode 100644 omc/plat/xapp/src/mapp/is41_init.c create mode 100644 omc/plat/xapp/src/mapp/map_LCSCode.c create mode 100644 omc/plat/xapp/src/mapp/map_LCSCode.h create mode 100644 omc/plat/xapp/src/mapp/map_acn.h create mode 100644 omc/plat/xapp/src/mapp/map_code.h create mode 100644 omc/plat/xapp/src/mapp/map_code_auc.c create mode 100644 omc/plat/xapp/src/mapp/map_code_ch.c create mode 100644 omc/plat/xapp/src/mapp/map_code_dlgpdu.c create mode 100644 omc/plat/xapp/src/mapp/map_code_ms.c create mode 100644 omc/plat/xapp/src/mapp/map_code_om.c create mode 100644 omc/plat/xapp/src/mapp/map_code_sms.c create mode 100644 omc/plat/xapp/src/mapp/map_code_ss.c create mode 100644 omc/plat/xapp/src/mapp/map_coding.c create mode 100644 omc/plat/xapp/src/mapp/map_coding.h create mode 100644 omc/plat/xapp/src/mapp/map_const.h create mode 100644 omc/plat/xapp/src/mapp/map_dlgpdu.h create mode 100644 omc/plat/xapp/src/mapp/map_includes.h create mode 100644 omc/plat/xapp/src/mapp/map_opr_func.h create mode 100644 omc/plat/xapp/src/mapp/map_public.c create mode 100644 omc/plat/xapp/src/mapp/map_public.h create mode 100644 omc/plat/xapp/src/mapp/map_struct.h create mode 100644 omc/plat/xapp/src/mapp/win_struct.h create mode 100644 omc/plat/xapp/src/xap_cdmacdr.c create mode 100644 omc/plat/xapp/src/xap_cdmacdr.h create mode 100644 omc/plat/xapp/src/xap_interface.c create mode 100644 omc/plat/xapp/src/xap_interfunc.h create mode 100644 omc/plat/xapp/src/xap_monitor.c create mode 100644 omc/plat/xapp/src/xap_monitor.h create mode 100644 omc/plat/xapp/src/xap_provider.c create mode 100644 omc/plat/xapp/src/xap_provider.h create mode 100644 omc/plat/xapp/ut/.copyarea.db create mode 100644 omc/plat/xapp/ut/xapp_test/.copyarea.db create mode 100644 omc/plat/xapp/ut/xapp_test/Makefile create mode 100644 omc/plat/xapp/ut/xapp_test/conf/.copyarea.db create mode 100644 omc/plat/xapp/ut/xapp_test/conf/.sccp.conf.swo create mode 100644 omc/plat/xapp/ut/xapp_test/conf/HlrSysPara create mode 100644 omc/plat/xapp/ut/xapp_test/conf/cap_acn.conf create mode 100644 omc/plat/xapp/ut/xapp_test/conf/cap_operation.conf create mode 100644 omc/plat/xapp/ut/xapp_test/conf/cc_table.conf create mode 100644 omc/plat/xapp/ut/xapp_test/conf/conf.rar create mode 100644 omc/plat/xapp/ut/xapp_test/conf/conv_prefix.conf create mode 100644 omc/plat/xapp/ut/xapp_test/conf/hae_sys.conf create mode 100644 omc/plat/xapp/ut/xapp_test/conf/help_page create mode 100644 omc/plat/xapp/ut/xapp_test/conf/hlr_parambit.conf create mode 100644 omc/plat/xapp/ut/xapp_test/conf/iptrans.conf create mode 100644 omc/plat/xapp/ut/xapp_test/conf/map_acn.conf create mode 100644 omc/plat/xapp/ut/xapp_test/conf/map_operation.conf create mode 100644 omc/plat/xapp/ut/xapp_test/conf/menu_page create mode 100644 omc/plat/xapp/ut/xapp_test/conf/mtp3.conf create mode 100644 omc/plat/xapp/ut/xapp_test/conf/ppsConf.txt create mode 100644 omc/plat/xapp/ut/xapp_test/conf/profile create mode 100644 omc/plat/xapp/ut/xapp_test/conf/sccp.conf create mode 100644 omc/plat/xapp/ut/xapp_test/conf/smsc_csta.conf create mode 100644 omc/plat/xapp/ut/xapp_test/conf/smsc_parambit.conf create mode 100644 omc/plat/xapp/ut/xapp_test/conf/smsc_sys.conf create mode 100644 omc/plat/xapp/ut/xapp_test/conf/system.ini create mode 100644 omc/plat/xapp/ut/xapp_test/conf/system.ini.100k create mode 100644 omc/plat/xapp/ut/xapp_test/conf/system.ini.30K create mode 100644 omc/plat/xapp/ut/xapp_test/conf/system.inimscvlrhlr create mode 100644 omc/plat/xapp/ut/xapp_test/conf/wxc2_sys.conf create mode 100644 omc/plat/xapp/ut/xapp_test/conf/wxc2exit.txt create mode 100644 omc/plat/xapp/ut/xapp_test/conf/xap_sysparam.conf create mode 100644 omc/plat/xapp/ut/xapp_test/conf/xapp_test.conf create mode 100644 omc/plat/xapp/ut/xapp_test/xapp_coding_test.c create mode 100644 omc/plat/xapp/ut/xapp_test/xapp_coding_test.h create mode 100644 omc/plat/xapp/ut/xapp_test/xapp_main.c create mode 100644 omc/plat/xapp/ut/xapp_test/xapp_main.h create mode 100644 omc/plat/xapp/ut/xapp_test/xapp_op_test.c create mode 100644 omc/plat/xapp/ut/xapp_test/xapp_op_test.h create mode 160000 omc/src diff --git a/include/Makefile.backup b/include/Makefile.backup new file mode 100644 index 0000000..d0f07c4 --- /dev/null +++ b/include/Makefile.backup @@ -0,0 +1,58 @@ + +##----------------------------------------------------------## +## ## +## Universal Makefile Backup Function ## +## ## +## Created : Wei Liu 07/06/20 ## +## Revision: [Last]Wei Liu 07/07/07 ## +## ## +##----------------------------------------------------------## + + +##-------------------------------------- +## +## Make backup +## +##-------------------------------------- +# backup +TIME_STR = ${shell date +%y%m%d_%H%M%S} +VER_STR = $(sed -n '/$(MODULE)_VERSION/'p ./src/include/$(MODULE).h | \ + awk -F '[{,}]' $(print $2 $3 $4 ) ) +BACK_PATH := ../../../r9_bak +BACK_PATH := $(BACK_PATH)/$(TYPE)/$(MODULE) +BACK_NAME = $(MODULE)_$(VER_STR)_$(TIME_STR).tgz +LS = ls -tl + +version: + @echo $(VER_STR) + +backfile ?= * + +ifeq "$(backfile)" "*" + backfile =$(wildcard $(BACK_PATH)/*.tgz) + CHECK_BACK_FILE =$(backfile) +else + CHECK_BACK_FILE =$(shell find $(BACK_PATH) -name $(backfile)) +endif + +bk: clean + @$(MKDIR) -p $(BACK_PATH) --mode=0777 + @echo Backuping $(MODULE)... $(BACK_PATH)/$(BACK_NAME) + @tar czvf $(BACK_PATH)/$(BACK_NAME) ./src ./ut ./doc ./Makefile + +lsbk: + @$(LS) $(BACK_PATH) + +rmbk: +ifneq "$(CHECK_BACK_FILE)" "" + @rm -rf $(BACK_PATH)/$(backfile) + @$(LS) $(BACK_PATH) +endif + +unzip: +ifneq "$(CHECK_BACK_FILE)" "" + @tar czvf $(BACK_PATH)/$(BACK_NAME) ./src ./ut ./doc ./Makefile + @tar zxvf $(BACK_PATH)/$(backfile) + @ls $(BACK_PATH) +endif + diff --git a/include/Makefile.cov b/include/Makefile.cov new file mode 100644 index 0000000..278a959 --- /dev/null +++ b/include/Makefile.cov @@ -0,0 +1,101 @@ + +##----------------------------------------------------------## +## ## +## Universal Makefile Lcov Function ## +## ## +## Created : Wei Liu 07/04/11 ## +## Revision: [Last]Wei Liu 07/07/09 ## +## ## +##----------------------------------------------------------## + +##-------------------------------------- +## +## COVER define +## +##-------------------------------------- + +ifeq "$(COVER_NEED)" "yes" + +COVER := /usr/bin/lcov +GENHTML := /usr/bin/genhtml +GENDESC := /usr/bin/gendesc +GENPNG := /usr/bin/genpng + +##Depending on the presence of the GD.pm perl module, we can use the +##special option '--frames' for genhtml +USE_GENPNG := $(shell $(GENPNG) --help >/dev/null 2>/dev/null; echo $$?) + +ifeq ($(USE_GENPNG),0) + FRAMES := --frames +else + FRAMES := +endif + +##COV_SETFLAG := --zerocounters --path . -q --directory . +COV_SETFLAG := --zerocounters -q --directory ../obj +COV_SET := $(COVER) $(COV_SETFLAG) + +COVER_REPORT_PATH ?= $(UTDIR)/output + +INFO_FILE = $(COVER_REPORT_PATH)/$(MODULE).info +DSP_FILE = $(MODULE)_test_descriptions.txt + +COV_OUTSET = --capture --directory ../obj \ + --output-file $(INFO_FILE)\ + --test-name $(MODULE) -q \ + --base-directory ../ + +COV_HTMLSET= $(INFO_FILE) \ + --output-directory $(COVER_REPORT_PATH)\ + --title $(MODULE) \ + --show-details $(FRAMES) \ + --legend -q --num-spaces 4 +COV_OUTPUT = $(COVER) $(COV_OUTSET) + + +COV_DOC_PATH := /usr/local/include/cov + +endif + +##-------------------------------------- +## +## Make Test +## +##-------------------------------------- + +test: + @echo -e "\n================================Test start======================================\n" +ifeq "$(BUILD)" "exef" +ifeq "$(COVER_NEED)" "yes" + @$(MKDIR) -p $(COVER_REPORT_PATH) --mode=0777 + @cp -rf $(COV_DOC_PATH)/lcovrc $(COV_DOC_PATH)/lcov_html_header\ + $(COV_DOC_PATH)/lcov_html_foot /etc/ + @cp -rf /usr/local/include/cgprof/cgprof /usr/local/bin/cgprof + @$(COV_SET) + $(OUTFILE) + gprof $(OUTFILE) gmon.out -p | cgprof -Tps + @$(COV_OUTPUT) + @LANG=C $(GENHTML) $(COV_HTMLSET) + @echo + @echo -e "||---------------------------------------------------------------" + @echo -e "|| Test cover report generated on the paht $(COVER_REPORT_PATH). " + @echo -e "|| Point a web browser at index.html to see results. " + @echo -e "||---------------------------------------------------------------" +else + @echo "COVER_NEED: $(COVER_NEED)BUILD: $(BUILD) " + $(OUTFILE) +endif + @echo -e "\n================================Test End========================================\n" +else + @echo -e "||---------------------------------------------------------------" + @echo -e "|| This is not exef project! " + @echo -e "||---------------------------------------------------------------" + @echo "This is not exef project!" +endif + +cleanlcov: + @$(COV_SET) --reset + +retest: cleanlcov test + + diff --git a/include/Makefile.doxygen b/include/Makefile.doxygen new file mode 100644 index 0000000..7c4dd55 --- /dev/null +++ b/include/Makefile.doxygen @@ -0,0 +1,28 @@ + +##----------------------------------------------------------## +## ## +## Universal Makefile Documentation Function ## +## ## +## Created : Wei Liu 07/06/30 ## +## Revision: [Last]Wei Liu 07/07/07 ## +## ## +##----------------------------------------------------------## + +VER_STR ?= 9.0 +DOXYGEN_DOC_PATH := /usr/local/include/doc + + +define PREPARE_DOXYGEN +sed 's/MODULE/$(MODULE)/g' $(1) | sed 's/VER_STR/$(VER_STR)/g' >> ./doc/doxygen.conf +endef + +define MAKE_DOC +@echo +@echo -e "Generate documnet of $(MODULE)\t\t\t Please Waiting..." +@$(call PREPARE_DOXYGEN, $(DOXYGEN_DOC_PATH)/doxygen.conf) +@doxygen ./doc/doxygen.conf +@cp -rf $(DOXYGEN_DOC_PATH)/view_chm.bat ./doc/html +@echo +@echo ==================================Doxygen End=================================== +endef + diff --git a/include/Makefile.indent b/include/Makefile.indent new file mode 100644 index 0000000..adf0a6a --- /dev/null +++ b/include/Makefile.indent @@ -0,0 +1,379 @@ + +##----------------------------------------------------------## +## ## +## Universal Makefile Indenting fuction ## +## ## +## Created : Wei Liu 07/04/30 ## +## Revision: [Last]Wei Liu 07/07/07 ## +## ## +##----------------------------------------------------------## + +##-------------------------------------- +## +## Make indenting program flags +## +##-------------------------------------- + +##-bad»ò--blank-lines-after-declarations ¡¡ÔÚÉùÃ÷Çø¶Îºó¼ÓÉϿհ×ÐС£ +BAD_FLAG := +##-bad + +##-bap»ò--blank-lines-after-procedures ¡¡ÔÚ³ÌÐòºó¼ÓÉϿհ×ÐС£ +BAP_FLAG := +##-bap + +##-bbb»ò--blank-lines-after-block-comments ¡¡ÔÚ×¢ÊÍÇø¶Îáá¼ÓÉϿհ×ÐС£ +BBB_FLAG := +##-bbb + +##--break-before-boolean-operator bbo ½Ï³¤µÄÐУ¬ÔÚÂß¼­ÔËËã·ûǰ·ÖÐÐ +BBO_FLAG := + +##-bc»ò--blank-lines-after-commas ¡¡ÔÚÉùÃ÷Çø¶ÎÖУ¬Èô³öÏÖ¶ººÅ¼´»»ÐС£ +BC_FLAG := + +##-bl»ò--braces-after-if-line ¡¡if(»òÊÇelse,forµÈµÈ)ÓëááÃæÖ´ÐÐÇø¶ÎµÄ"{"×Ô³ÉÒ»ÐС£ +BL_FLAG := -bl + +##-bli<ËõÅŸñÊý>»ò--brace-indent<ËõÅŸñÊý> ¡¡ÉèÖÃ{}ËõÅŵĸñÊý¡£ +BLI_FLAG := -bli4 + +##--braces-after-struct-decl-line bls ¶¨Òå½á¹¹£¬"struct"ºÍ"{"·ÖÐÐ +BLS_FLAG := -bls + +##-br»ò--braces-on-if-line ¡¡if(»òÊÇelse,forµÈµÈ)ÓëááÃæÖ´ÐÐõ˶εÄ"{"×Ô³ÉÒ»ÐС£ +BR_FLAG := + +##-bs»ò--blank-before-sizeof ¡¡ÔÚsizeofÖ®áá¿ÕÒ»¸ñ¡£ +BS_FLAG := + +##`-cbin' +##`--case-brace-indentationn' +##Indent braces after a case label N spaces. +CBI_FLAG := -cbi5 + +##-c<À¸Êý>»ò--comment-indentation<À¸Êý> ¡¡½«×¢ÊÍÖÃÓÚ³ÌÐòÂëÓÒ²àÖ¸¶¨µÄÀ¸Î»¡£ +CW_FLAG := -c33 + +##-cd<À¸Êý>»ò--declaration-comment-column<À¸Êý> ¡¡½«×¢ÊÍÖÃÓÚÉùÃ÷ÓÒ²àÖ¸¶¨µÄÀ¸Î»¡£ +CD_FLAG := -cd33 + +##-cdb»ò--comment-delimiters-on-blank-lines ¡¡×¢ÊÍ·ûºÅ×Ô³ÉÒ»ÐС£ +CDB_FLAG := + +##-ce»ò--cuddle-else ¡¡½«elseÖÃÓÚ"}"(ifÖ´ÐÐÇø¶ÎµÄ½áβ)Ö®áá¡£ +CE_FLAG := + +##-ci<ËõÅŸñÊý>»ò--continuation-indentation<ËõÅŸñÊý> ¡¡ÐðÊö¹ý³¤¶ø»»ÐÐʱ£¬Ö¸¶¨»»ÐÐááËõÅŵĸñÊý¡£ +CI_FLAG := +##-ci4 + +##-cli<ËõÅŸñÊý>»ò--case-indentation-<ËõÅŸñÊý> ¡¡Ê¹ÓÃcaseʱ£¬switchËõÅŵĸñÊý¡£ +CLI_FLAG := -cli0 + +##-cp<À¸Êý>»ò-else-endif-column<À¸Êý> ¡¡½«×¢ÊÍÖÃÓÚelseÓëelseifÐðÊöÓҲඨµÄÀ¸Î»¡£ +CP_FLAG := -cp33 + +##-cs»ò--space-after-cast ¡¡ÔÚcastÖ®áá¿ÕÒ»¸ñ¡£ +CS_FLAG := -cs + +##-d<ËõÅŸñÊý>»ò-line-comments-indentation<ËõÅŸñÊý> ¡¡Õë¶Ô²»ÊÇ·ÅÔÚ³ÌÐòÂëÓÒ²àµÄ×¢ÊÍ£¬ÉèÖÃÆäËõÅŸñÊý¡£ +D_FLAG := +##-d0 + +##-di<À¸Êý>»ò--declaration-indentation<À¸Êý> ¡¡½«ÉùÃ÷Çø¶ÎµÄ±äÁ¿ÖÃÓÚÖ¸¶¨µÄÀ¸Î»¡£ +DI_FLAG := +##-di4 + +##-fc1»ò--format-first-column-comments ¡¡Õë¶Ô·ÅÔÚÿÐÐ×îǰ¶ËµÄ×¢ÊÍ£¬ÉèÖÃÆä¸ñʽ¡£ +FC1_FLAG := -fc1 + + +##-fca»ò--format-all-comments ¡¡ÉèÖÃËùÓÐ×¢Ê͵ĸñʽ¡£ +FCA_FLAG := + +##-gnu»ò--gnu-style ¡¡Ö¸¶¨Ê¹ÓÃGNUµÄ¸ñʽ£¬´ËΪԤÉèÖµ¡£ +GNU_FLAG := + +##-kr»ò--k-and-r-style ¡¡Ö¸¶¨Ê¹ÓÃKernighan&RitchieµÄ¸ñʽ¡£ +KR_FLAG := + +##-orig»ò--original ¡¡Ê¹ÓÃBerkeleyµÄ¸ñʽ¡£ +ORG_STYLE := + +##-i<¸ñÊý>»ò--indent-level<¸ñÊý> ¡¡ÉèÖÃËõÅŵĸñÊý¡£ +I_FLAG := -i4 + +##-ip<¸ñÊý>»ò--parameter-indentation<¸ñÊý> ¡¡ÉèÖòÎÊýµÄËõÅŸñÊý¡£ +IP_FLAG := -ip4 + +##--line-length 75 l75 ·Ç×¢ÊÍÐÐ×75 +LINE_FLAG := + +##`-lcn' +##`--comment-line-lengthn' +##Set maximum line length for comment formatting to n. +LCN_FLAG := + +##`-lps' +##`--leave-preprocessor-space' +##Leave space between `#' and preprocessor directive. +LPS_FLAG := + +##-lp»ò--continue-at-parentheses ¡¡ÐðÊö¹ý³¤¶ø»»ÐУ¬ÇÒÐðÊöÖаüº¬ÁËÀ¨ºÅʱ£¬½«À¨ºÅÖеÄÿÐÐÆðʼÀ¸Î»ÄÚÈÝ´¹Ö±¶ÔÆäÅÅÁС£ +LP_FLAG := + +##--break-function-decl-args nbfda ¹Ø±Õ£ºº¯ÊýµÄ²ÎÊýÒ»¸öÒ»ÐÐ +NBFDA_FLAG := -nbfda + +##-nbad»ò--no-blank-lines-after-declarations ¡¡ÔÚÉùÃ÷Çø¶Îáá²»Òª¼ÓÉϿհ×ÐС£ +NBAD_FLAG := + +##-nbap»ò--no-blank-lines-after-procedures ¡¡ÔÚ³ÌÐòáá²»Òª¼ÓÉϿհ×ÐС£ +NBAP_FLAG := + +##-nbbb»ò--no-blank-lines-after-block-comments ¡¡ÔÚ×¢ÊÍÇø¶Îáá²»Òª¼ÓÉϿհ×ÐС£ +NBBB_FLAG := + +##-nbc»ò--no-blank-lines-after-commas ¡¡ÔÚÉùÃ÷Çø¶ÎÖУ¬¼´Ê¹³öÏÖ¶ººÅ£¬ÈԾɲ»Òª»»ÐС£ +NBC_FLAG := -nbc + +##-ncdb»ò--no-comment-delimiters-on-blank-lines ¡¡×¢ÊÍ·ûºÅ²»Òª×Ô³ÉÒ»ÐС£ +NCBD_FLAG := -ncdb + +##--cuddle-do-while ncdw "do --- while"µÄ"while"ºÍÆäÇ°ÃæµÄ"}"ÁíÆðÒ»ÐÐ +NCDW_FLAG := -ncdw + +##-nce»ò--dont-cuddle-else ¡¡²»Òª½«elseÖÃÓÚ"}"Ö®áá¡£ +NCE_FLAG := +##-nce + +##-ncs»ò--no-space-after-casts ¡¡²»ÒªÔÚcastÖ®áá¿ÕÒ»¸ñ¡£ +NCS_FLAG := + +##-nfc1»ò--dont-format-first-column-comments ¡¡²»Òª¸ñʽ»¯·ÅÔÚÿÐÐ×îǰ¶ËµÄ×¢ÊÍ¡£ +NFC1_FLAG := + +##-nfca»ò--dont-format-comments ¡¡²»Òª¸ñʽ»¯ÈκεÄ×¢ÊÍ¡£ +NFCA_FLAG := -nfca + +##--honour-newlines hnl Prefer to break long lines at the position of newlines in the input +HNL_FLAG := -hnl + +##-nip»ò--no-parameter-indentation ¡¡²ÎÊý²»ÒªËõÅÅ¡£ +NIP_FLAG := + +##-nlp»ò--dont-line-up-parentheses ¡¡ÐðÊö¹ý³¤¶ø»»ÐУ¬ÇÒÐðÊöÖаüº¬ÁËÀ¨ºÅʱ£¬²»Óý«À¨ºÅÖеÄÿÐÐÆðʼÀ¸Î»´¹Ö±¶ÔÆäÅÅÁС£ +NLP_FLAG := + +##-npcs»ò--no-space-after-function-call-names ¡¡ÔÚµ÷Óõĺ¯ÊýÃû³ÆÖ®áᣬ²»Òª¼ÓÉϿոñ¡£ +NPCS_FLAG := + +##-npro»ò--ignore-profile ¡¡²»Òª¶ÁÈ¡indentµÄÅäÖÃÎļþ.indent.pro¡£ +NPRO_FLAG := -npro + +##-nprs»ò--space-after-procedure-calls ¡¡ÔÚ"£¨"ºó"£©"ǰ²»²åÈë¿Õ¸ñ ¡£ +NPRS_FLAG := -nprs + +##-npsl»ò--dont-break-procedure-type ¡¡³ÌÐòÀàÐÍÓë³ÌÐòÃû³Æ·ÅÔÚͬһÐС£ +NPSL_FLAG := -npsl + +##--space-after-for saf forºóÃæÓпոñ +SAF_FLAG := -saf + +##--space-after-if sai ifºóÃæÓпոñ +SAI_FLAG := -sai + +##--space-after-while saw whileºóÃæÓпոñ +SAW_FLAG := -saw + +##-nsc»ò--dont-star-comments ¡¡×¢½â×ó²à²»Òª¼ÓÉÏÐǺÅ(*)¡£ +NSC_FLAG := -nsc + +##-nsob»ò--leave-optional-semicolon ¡¡²»Óô¦Àí¶àâŵĿհ×ÐС£ +NSOB_FLAG := + +##-nss»ò--dont-space-special-semicolon ¡¡Èôfor»òwhileÇø¶Î½öÓÐÒ»ÐÐʱ£¬ÔÚ·ÖºÅǰ²»¼ÓÉϿոñ¡£ +NSS_FLAG := -nss + +##-nv»ò--no-verbosity ¡¡²»ÏÔʾÏêϸµÄÐÅÏ¢¡£ +NV_FLAG := -nv + +##`-nut' +##`--no-tabs' +##Use spaces instead of tabs. +NUT_FLAG := +##-nut + +##-pcs»ò--space-after-procedure-calls ¡¡ÔÚµ÷Óõĺ¯ÊýÃû³ÆÓë"("Ö®¼ä¼ÓÉϿոñ¡£ +PCS_FLAG := -pcs + +##`-prs' +##`--space-after-parentheses' +##Put a space after every '(' and before every ')'. +PRS_FLAG := + +##`-pin' +##`--paren-indentationn' +##Specify the extra indentation per open parentheses '(' when a statement is broken. +PI_FLAG := +##-pi4 + +##-psl»ò--procnames-start-lines ¡¡³ÌÐòÀàÐÍÖÃÓÚ³ÌÐòÃû³ÆµÄǰһÐС£ +PSL_FLAG := + +##-sc»ò--start-left-side-of-comments ¡¡ÔÚÿÐÐ×¢ÊÍ×ó²à¼ÓÉÏÐǺÅ(*)¡£ +SC_FLAG := + +##-sob»ò--swallow-optional-blank-lines ¡¡É¾³ý¶àâŵĿհ×ÐС£ +SOB_FLAG := -sob + +## -sbin, --struct-brace-indentationn +## Indent braces of a struct, union or enum N spaces. +SBI_FLAGE := -sbi4 + +##-ss»ò--space-special-semicolon ¡¡Èôfor»òswileÇø¶Î½ñÓÐÒ»ÐÐʱ£¬ÔÚ·ÖºÅǰ¼ÓÉϿոñ¡£ +SS_FLAG := -ss + +##-st»ò--standard-output ¡¡½«½á¹ûÏÔʾÔÚ±ê×¼Êä³öÉ豸¡£ +ST_FLAG := + +##-T ¡¡Êý¾ÝÀàÐÍÃû³ÆËõÅÅ¡£ +T_FLAG := -T + +##-ts<¸ñÊý>»ò--tab-size<¸ñÊý> ¡¡ÉèÖÃtabµÄ³¤¶È¡£ +TS_FLAG := -ts4 +##-ts4 + +##--use-tabs ut ʹÓÃtabÀ´Ëõ½ø +UT_FLAG := -ut +##-ut + +##-v»ò--verbose ¡¡Ö´ÐÐʱÏÔʾÏêϸµÄÐÅÏ¢¡£ +V_FLAG := -v + + +##-version ¡¡ÏÔʾ°æ±¾ÐÅÏ¢¡£ +VER_FLAG := + + + + + +##δʵÏֵķç¸ñ£º +##1,£¨£©Óë±äÁ¿¼ä¼Ó¿Õ¸ñ (ÒÔʵÏÖ) +##2, else ¶ÀÁ¢³ÉÐÐ +##3, ×¢ÊÍËõ½ø +##4£¬Ã¿¸öº¯Êýǰ¼Ó×¢ÊͶΠ+ +## indent flags +## -bad -bap -bbb -bbo -bl -bli4 -bls -bs -c33 -cd33 -ce -ci4 -cli0 +## -cp33 -cs -d0 -di4 -fc1 -hnl -i4 -ip4 -lp -nbc -ncdb -nbfda -ncdw +## -nfc1 -nfca -npro -npsl -nsc -nv -pcs -saf -sai -saw -sob -ss -T -ts4 -ut + +INDENT_FLAGS1 := $(GNU_FLAG) \ + $(KR_FLAG) \ + $(ORG_STYLE) \ + $(BAD_FLAG) \ + $(BAP_FLAG) \ + $(BBB_FLAG) \ + $(BBO_FLAG) \ + $(BC_FLAG) \ + $(BL_FLAG) \ + $(BLI_FLAG) \ + $(BLS_FLAG) \ + $(BR_FLAG) \ + $(BS_FLAG) \ + $(CBI_FLAG) \ + $(CW_FLAG) \ + $(CD_FLAG) \ + $(CDB_FLAG) \ + $(CE_FLAG) \ + $(CI_FLAG) \ + $(CLI_FLAG) \ + $(CP_FLAG) \ + $(CS_FLAG) \ + $(D_FLAG) \ + $(DI_FLAG) \ + $(FC1_FLAG) \ + $(FCA_FLAG) \ + $(HNL_FLAG) \ + $(I_FLAG) \ + $(IP_FLAG) \ + $(LINE_FLAG ) \ + $(LP_FLAG) \ + $(NBAD_FLAG) \ + $(NBAP_FLAG) \ + $(NBBB_FLAG) \ + $(NBC_FLAG) \ + $(NCBD_FLAG) \ + $(NBFDA_FLAG) \ + $(NCDW_FLAG) \ + $(NCE_FLAG) \ + $(NCS_FLAG) \ + $(NFC1_FLAG) \ + $(NFCA_FLAG) \ + $(NIP_FLAG) \ + $(NLP_FLAG) \ + $(NPCS_FLAG) \ + $(NPRO_FLAG) \ + $(NPRS_FLAG) \ + $(NPSL_FLAG) \ + $(NSC_FLAG) \ + $(NSOB_FLAG) \ + $(NSS_FLAG) \ + $(NV_FLAG) \ + $(PCS_FLAG) \ + $(PI_FLAG) \ + $(PSL_FLAG) \ + $(PRS_FLAG) \ + $(SAF_FLAG) \ + $(SAI_FLAG) \ + $(SAW_FLAG) \ + $(SBI_FLAGE) \ + $(SC_FLAG) \ + $(SOB_FLAG) \ + $(SS_FLAG) \ + $(ST_FLAG) \ + $(T_FLAG) \ + $(TS_FLAG) \ + $(UT_FLAG) \ + $(V_FLAG) \ + $(VER_FLAG) \ + $(NUT_FLAG) + +INDENT_FLAGS = -kr -i4 + + +##$(warning $(INDENT_FLAGS) $(1)) +##-------------------------------------- +## +## MAKE_INDENT template +## +##------------------------------------ + +define INDENT_FILE + +indent $(INDENT_FLAGS) $(1) + +endef + +define MAKE_INDENT +@echo +@echo "[Indent flags ]: $(INDENT_FLAGS)" +@echo "" +$(foreach file,$(1),$(call INDENT_FILE, $(file))) +@echo +@echo ===================================Indent End=================================== +endef + + + + + + + + + + + diff --git a/include/Makefile.rules b/include/Makefile.rules new file mode 100644 index 0000000..5f652cc --- /dev/null +++ b/include/Makefile.rules @@ -0,0 +1,350 @@ + +##----------------------------------------------------------## +## ## +## Universal Makefile Rules ## +## ## +## Created : Wei Liu 07/03/07 ## +## Revision: [Last]Wei Liu 07/07/07 ## +## ## +##----------------------------------------------------------## + + +UMAKE_VERSION := V2.0 + +##------------------------------------- +## +## Work Directory : /usr/local/include +## Default Target : all +## +##------------------------------------- +default: all +.PHONY: all clean rebuild test indent splint doc \ + dir config check bk lsbk rmbk unzip umakever usage\ + FORCE +.SUFFIXES: + +umakever: + @echo "Universal Makefile (UMake) Version: $(UMAKE_VERSION)" + +##-------------------------------------- +## +## Makefile CFG defination check +## +##-------------------------------------- + +ifeq "$(MODULE)" "" +$(error Please input the module name (MODULE = )in makefile. ) +endif + +ifeq "$(CFG)" "" +CFG=debug +$(warnning No configuration specified for CFG. Defaulting to $(MODULE) - debug. ) +endif + +ifeq "$(BUILD)" "" +BUILD=lib +$(warnning No configuration specified for BUILD. Defaulting to create lib$(MODULE).a. ) +endif + +ifeq "$(SRC_PATH)" "" +SRC_PATH=. +$(warnning No configuration specified for SRC_PATH. Defaulting to ./. ) +endif + +COVER_NEED ?= no +PLT_PATH ?= ../../plat +APP_PATH ?= ../../app +TYPE ?= plat + +##-------------------------------------- +## +## Gcc Flag for debug or release +## +##-------------------------------------- +CC := gcc +GCC_CFLAGS := -Wall -MM +AR_LINK := ar -r + +RELS_FLAGS_ADD += -DNDEBUG +RELEASE_CFLAGS += -g -Wall -I. $(RELS_FLAGS_ADD) +RELEASE_LINK_CFLAGS = -g $(RELS_FLAGS_ADD) -o +DEBUG_CFLAGS += -g -Wall -rdynamic -DDEBUG -I. $(DBUG_FLAGS_ADD) +DEBUG_LINK_CFLAGS = -g -rdynamic -DDEBUG -o + +ifeq "$(COVER_NEED)" "yes" +DEBUG_CFLAGS += -fprofile-arcs -ftest-coverage -pg +endif + +GCC_CFLAGS=$(DEBUG_CFLAGS) +GCC_LINK_CFLAGS=$(DEBUG_LINK_CFLAGS) + +##-------------------------------------- +## +## Project setting +## +##-------------------------------------- +OBJDIR:=./obj +LIBDIR:=./lib +UTDIR :=./ut +DOCDIR:=./doc +DIRBUILD=$(OBJDIR) + +ifeq "$(BUILD)" "lib" +BINDIR:=./bin +OUTFILE=$(LIBDIR)/lib$(MODULE).a +DIRNEED=$(UTDIR) $(DOCDIR) +DIRBUILD+=$(LIBDIR) +else +BINDIR:=. +OUTFILE=$(BINDIR)/$(MODULE) +DIRNEED= +DIRBUILD+=$(BINDIR) +endif + +##-------------------------------------- +## +## source , object and dependencies files +## +##-------------------------------------- + +SRC_SUBDIR := $(shell find $(SRC_PATH) -type d) + +vpath %.c $(SRC_SUBDIR) +vpath %.o $(OBJDIR) +vpath %.d $(OBJDIR) + +SRC_FULL_PATH = $(foreach dir,$(SRC_SUBDIR),$(wildcard $(dir)/*.c)) +SRC_FILES = $(foreach file, $(notdir $(SRC_FULL_PATH)) ,$(OBJDIR)/$(file)) +COMMON_OBJ = $(SRC_FILES:%.c=%.o) + +TEST_OBJ_PATH ?= ../../obj + +TEST_OBJ = $(foreach dir,$(TEST_OBJ_PATH),$(wildcard $(dir)/*.o)) + +OBJ=$(COMMON_OBJ) $(OBJ_ADD) +ALL_OBJ := $(OBJ) $(TEST_OBJ) + +##-------------------------------------- +## +## Lib setting +## +##-------------------------------------- + +ifeq "$(COVER_NEED)" "yes" +LIBCOVER=-lgcov +endif + +MODULE_PLT_LIB=$(foreach lib,$(PLT_LIB), -L$(PLT_PATH)/$(lib)/lib/ -l$(lib) ) +MODULE_PLT_LIB+=-lm + + +MODULE_APP_LIB=$(foreach lib,$(APP_LIB),-L$(APP_PATH)/$(lib)/lib -l$(lib)) + +ifneq (,$(findstring hlr,$(PLT_LIB))) +MODULE_APP_LIB= +##-L../app/ae/src/lib -lpubfunc +endif + +ifneq (,$(findstring auceir,$(PLT_LIB))) +MODULE_APP_LIB= +##-L../app/ae/src/lib -lpubfunc -L../usr/lib -la3a8 -ldl -lpopt +endif + +##-------------------------------------- +## +## Rules +## +##-------------------------------------- +CCFLAG_SWITCH ?= off +CC_COMPILE =$(CC) $(GCC_CFLAGS) -c $< -o $@ +CC_PRG_LINK=$(CC) $(GCC_LINK_CFLAGS) $(OUTFILE) $(ALL_OBJ) $(LIBCOVER) $(MODULE_APP_LIB) $(MODULE_PLT_LIB) $(LIB_ADD) +CC_LIB_LINK=$(AR_LINK) $(OUTFILE) $(ALL_OBJ) + +COMPILE=$(CC_COMPILE) +PRG_LINK=$(CC_PRG_LINK) +LIB_LINK=$(CC_LIB_LINK) + +ifeq "$(BUILD)" "exef" +LINK=$(PRG_LINK) +else +LINK=$(LIB_LINK) +endif + +# Build rules + +all: preproc start dir $(ALL_OBJ) #prtdebug + @echo Linking :$(OUTFILE) +ifeq "$(CCFLAG_SWITCH)" "off" + @$(LINK) +else + $(LINK) +endif + @$(POSTPROC_CMD) + @echo -e "\n================================================================================\n" + +sinclude $(DEPENDS) + +release : CC_COMPILE =$(CC) $(RELEASE_CFLAGS) -c $< -o $@ +release : CC_PRG_LINK=$(CC) $(RELEASE_LINK_CFLAGS) $(OUTFILE) $(ALL_OBJ) $(MODULE_APP_LIB) $(MODULE_PLT_LIB) $(LIB_ADD) +release : all + +##-------------------------------------- +## +## Make command to use for dependencies +## +##-------------------------------------- + +MAKE :=make +RM :=rm +MKDIR :=mkdir + +preproc: + @$(PREPROC_CMD) + +start: + @echo -e "\n================================================================================\n" + @echo "[Building Project]: $(notdir $(MODULE))" +ifeq "$(CCFLAG_SWITCH)" "off" + @echo "Show Gcc Flags switch = OFF" +endif + +prtdebug: + @echo "$(MODULE)-$(BUILD)[$(CFG)] build source file:" "$(SRC_FULL_PATH)" + @echo SRC_SUBDIR: $(SRC_SUBDIR) + @echo SRC_FULL_PATH : $(SRC_FULL_PATH) + @echo SRC_FILES : $(SRC_FILES) + @echo ALL_OBJ : $(ALL_OBJ) + @echo LIB:$(MODULE_PLT_LIB) + @echo PLT_LIB: $(PLT_LIB) + @echo CCFLAG_SWITCH :$(CCFLAG_SWITCH) + +config: dir + +dir: + @$(foreach dir,$(DIRNEED),$(MKDIR) -p $(DIRNEED) --mode=0777; ) + @$(foreach dir,$(DIRBUILD),$(MKDIR) -p $(dir) --mode=0777; ) + +##-------------------------------------- +## +## Make Rebuild and clean +## +##-------------------------------------- + +ifneq "$(PROJ)" "" +FRIEND_PROJ := $(shell ) +endif + +jumprebuild: +ifneq "$(PROJ)" "" + @cd $(FRIEND_PROJ); mak rebuild ; cd - +endif + +# Rebuild this project +rebuild: jumprebuild cleanall all + +# Clean this project and all dependencies +cleanall: clean + +# Clean this project +clean: + @echo -e "||--------------------------------------------------------------- " + @echo -e "|| Umake clean gcc , lcov, doxygen generated and temporary files. " + @echo -e "||--------------------------------------------------------------- " + @$(RM) -rf $(OBJDIR) $(OUTFILE) $(COVER_REPORT_PATH) ./doc/doxygen.conf ./doc/html ./doc/latex ./doc/rtf $(foreach dir,$(SRC_SUBDIR),$(dir)/*~) + + +##-------------------------------------- +## +## indent Makefile.indent +## +##-------------------------------------- +include Makefile.indent + +indent: + @chmod 777 $(SRC_FULL_PATH) + @echo ===================================Indent START================================= + @echo + @echo "[Indent source file ]: $(SRC_FULL_PATH)" + $(call MAKE_INDENT , $(SRC_FULL_PATH)) + +##-------------------------------------- +## +## splint makefile.splint +## +##-------------------------------------- +include Makefile.splint + +SPLINT_FLAG_SWITCH ?= off + +splint: + @chmod 777 $(SRC_FULL_PATH) + @echo =================================Splint START================================== + @echo +ifeq "$(SPLINT_FLAG_SWITCH)" "on" + @echo "[Splint flags ]: $(SPLINT_FLAGS)" +endif + @echo "[Lint Clean Project]: $(notdir $(MODULE))" + $(call MAKE_SPLINT, $(SRC_FULL_PATH)) + +##-------------------------------------- +## +## doc Makefile.doxygen +## +##-------------------------------------- +include Makefile.doxygen + +doc: + @chmod 777 $(SRC_FULL_PATH) + @echo ==================================Doxygen START================================= + @echo + $(call MAKE_DOC, $(SRC_FULL_PATH)) + + +##-------------------------------------- +## +## backup Makefile.backup +## +##-------------------------------------- +include Makefile.backup + +##-------------------------------------- +## +## cov Makefile.cov +## +##-------------------------------------- +include Makefile.cov + +##-------------------------------------- +## +## usage Makefile.usage +## +##-------------------------------------- +include Makefile.usage + +##-------------------------------------- +## +## Make dependencies +## +##-------------------------------------- + +$(OBJDIR)/%.d:%.c + @$(CC) $< -MM -MD -o $@ + +$(OBJDIR)/%.o:%.c + +ifeq "$(CCFLAG_SWITCH)" "off" + @echo -e "building: $(notdir $@) \t\t\t\t please wait ..." + @$(COMPILE) +else + $(COMPILE) +endif + +DEPENDS=$(COMMON_OBJ:.o=.d) + +##-------------------------------------- +## +## Make force +## +##-------------------------------------- +FORCE: + diff --git a/include/Makefile.rules.bak b/include/Makefile.rules.bak new file mode 100644 index 0000000..8774bc9 --- /dev/null +++ b/include/Makefile.rules.bak @@ -0,0 +1,352 @@ + +##----------------------------------------------------------## +## ## +## Universal Makefile Rules ## +## ## +## Created : Wei Liu 07/03/07 ## +## Revision: [Last]Wei Liu 07/07/07 ## +## ## +##----------------------------------------------------------## + + +UMAKE_VERSION := V2.0 + +##------------------------------------- +## +## Work Directory : /usr/local/include +## Default Target : all +## +##------------------------------------- +default: all +.PHONY: all clean rebuild test indent splint doc \ + dir config check bk lsbk rmbk unzip umakever usage\ + FORCE +.SUFFIXES: + +umakever: + @echo "Universal Makefile (UMake) Version: $(UMAKE_VERSION)" + +##-------------------------------------- +## +## Makefile CFG defination check +## +##-------------------------------------- + +ifeq "$(MODULE)" "" +$(error Please input the module name (MODULE = )in makefile. ) +endif + +ifeq "$(CFG)" "" +CFG=debug +$(warnning No configuration specified for CFG. Defaulting to $(MODULE) - debug. ) +endif + +ifeq "$(BUILD)" "" +BUILD=lib +$(warnning No configuration specified for BUILD. Defaulting to create lib$(MODULE).a. ) +endif + +ifeq "$(SRC_PATH)" "" +SRC_PATH=. +$(warnning No configuration specified for SRC_PATH. Defaulting to ./. ) +endif + +COVER_NEED ?= no +PLT_PATH ?= ../../plat +APP_PATH ?= ../../app +TYPE ?= plat + +##-------------------------------------- +## +## Gcc Flag for debug or release +## +##-------------------------------------- +#CC := arm-linux-gnueabi-gcc +CC := gcc +GCC_CFLAGS := -Wall -MM +#AR_LINK := arm-linux-gnueabi-ar -r +AR_LINK := ar -r +ARM_INCLUDE := /opt/gcc-linaro-5.4.1-2017.01-x86_64_arm-linux-gnueabi/usr/include +RELS_FLAGS_ADD += -DNDEBUG +RELEASE_CFLAGS += -g -I. -I$(ARM_INCLUDE) $(RELS_FLAGS_ADD) +RELEASE_LINK_CFLAGS = -g $(RELS_FLAGS_ADD) -o +DEBUG_CFLAGS += -g -rdynamic -finline-functions -DDEBUG -I. -I$(ARM_INCLUDE) $(DBUG_FLAGS_ADD) +DEBUG_LINK_CFLAGS = -g -rdynamic -DDEBUG -o + +ifeq "$(COVER_NEED)" "yes" +DEBUG_CFLAGS += -fprofile-arcs -ftest-coverage -pg +endif + +GCC_CFLAGS=$(DEBUG_CFLAGS) +GCC_LINK_CFLAGS=$(DEBUG_LINK_CFLAGS) + +##-------------------------------------- +## +## Project setting +## +##-------------------------------------- +OBJDIR:=./obj +LIBDIR:=./lib +UTDIR :=./ut +DOCDIR:=./doc +DIRBUILD=$(OBJDIR) + +ifeq "$(BUILD)" "lib" +BINDIR:=./bin +OUTFILE=$(LIBDIR)/lib$(MODULE).a +DIRNEED=$(UTDIR) $(DOCDIR) +DIRBUILD+=$(LIBDIR) +else +BINDIR:=. +OUTFILE=$(BINDIR)/$(MODULE) +DIRNEED= +DIRBUILD+=$(BINDIR) +endif + +##-------------------------------------- +## +## source , object and dependencies files +## +##-------------------------------------- + +SRC_SUBDIR := $(shell find $(SRC_PATH) -type d) + +vpath %.c $(SRC_SUBDIR) +vpath %.o $(OBJDIR) +vpath %.d $(OBJDIR) + +SRC_FULL_PATH = $(foreach dir,$(SRC_SUBDIR),$(wildcard $(dir)/*.c)) +SRC_FILES = $(foreach file, $(notdir $(SRC_FULL_PATH)) ,$(OBJDIR)/$(file)) +COMMON_OBJ = $(SRC_FILES:%.c=%.o) + +TEST_OBJ_PATH ?= ../../obj + +TEST_OBJ = $(foreach dir,$(TEST_OBJ_PATH),$(wildcard $(dir)/*.o)) + +OBJ=$(COMMON_OBJ) $(OBJ_ADD) +ALL_OBJ := $(OBJ) $(TEST_OBJ) + +##-------------------------------------- +## +## Lib setting +## +##-------------------------------------- + +ifeq "$(COVER_NEED)" "yes" +LIBCOVER=-lgcov +endif + +MODULE_PLT_LIB=$(foreach lib,$(PLT_LIB), -L$(PLT_PATH)/$(lib)/lib/ -l$(lib) ) +MODULE_PLT_LIB+=-lm + + +MODULE_APP_LIB=$(foreach lib,$(APP_LIB),-L$(APP_PATH)/$(lib)/lib -l$(lib)) + +ifneq (,$(findstring hlr,$(PLT_LIB))) +MODULE_APP_LIB= +##-L../app/ae/src/lib -lpubfunc +endif + +ifneq (,$(findstring auceir,$(PLT_LIB))) +MODULE_APP_LIB= +##-L../app/ae/src/lib -lpubfunc -L../usr/lib -la3a8 -ldl -lpopt +endif + +##-------------------------------------- +## +## Rules +## +##-------------------------------------- +CCFLAG_SWITCH ?= off +CC_COMPILE =$(CC) $(GCC_CFLAGS) -c $< -o $@ +CC_PRG_LINK=$(CC) $(GCC_LINK_CFLAGS) $(OUTFILE) $(ALL_OBJ) $(LIBCOVER) $(MODULE_APP_LIB) $(MODULE_PLT_LIB) $(LIB_ADD) +CC_LIB_LINK=$(AR_LINK) $(OUTFILE) $(ALL_OBJ) + +COMPILE=$(CC_COMPILE) +PRG_LINK=$(CC_PRG_LINK) +LIB_LINK=$(CC_LIB_LINK) + +ifeq "$(BUILD)" "exef" +LINK=$(PRG_LINK) +else +LINK=$(LIB_LINK) +endif + +# Build rules + +all: preproc start dir $(ALL_OBJ) #prtdebug + @echo Linking :$(OUTFILE) +ifeq "$(CCFLAG_SWITCH)" "off" + @$(LINK) +else + $(LINK) +endif + @$(POSTPROC_CMD) + @echo -e "\n================================================================================\n" + +sinclude $(DEPENDS) + +release : CC_COMPILE =$(CC) $(RELEASE_CFLAGS) -c $< -o $@ +release : CC_PRG_LINK=$(CC) $(RELEASE_LINK_CFLAGS) $(OUTFILE) $(ALL_OBJ) $(MODULE_APP_LIB) $(MODULE_PLT_LIB) $(LIB_ADD) +release : all + +##-------------------------------------- +## +## Make command to use for dependencies +## +##-------------------------------------- + +MAKE :=make +RM :=rm +MKDIR :=mkdir + +preproc: + @$(PREPROC_CMD) + +start: + @echo -e "\n================================================================================\n" + @echo "[Building Project]: $(notdir $(MODULE))" +ifeq "$(CCFLAG_SWITCH)" "off" + @echo "Show Gcc Flags switch = OFF" +endif + +prtdebug: + @echo "$(MODULE)-$(BUILD)[$(CFG)] build source file:" "$(SRC_FULL_PATH)" + @echo SRC_SUBDIR: $(SRC_SUBDIR) + @echo SRC_FULL_PATH : $(SRC_FULL_PATH) + @echo SRC_FILES : $(SRC_FILES) + @echo ALL_OBJ : $(ALL_OBJ) + @echo LIB:$(MODULE_PLT_LIB) + @echo PLT_LIB: $(PLT_LIB) + @echo CCFLAG_SWITCH :$(CCFLAG_SWITCH) + +config: dir + +dir: + @$(foreach dir,$(DIRNEED),$(MKDIR) -p $(DIRNEED) --mode=0777; ) + @$(foreach dir,$(DIRBUILD),$(MKDIR) -p $(dir) --mode=0777; ) + +##-------------------------------------- +## +## Make Rebuild and clean +## +##-------------------------------------- + +ifneq "$(PROJ)" "" +FRIEND_PROJ := $(shell ) +endif + +jumprebuild: +ifneq "$(PROJ)" "" + @cd $(FRIEND_PROJ); mak rebuild ; cd - +endif + +# Rebuild this project +rebuild: jumprebuild cleanall all + +# Clean this project and all dependencies +cleanall: clean + +# Clean this project +clean: + @echo -e "||--------------------------------------------------------------- " + @echo -e "|| Umake clean gcc , lcov, doxygen generated and temporary files. " + @echo -e "||--------------------------------------------------------------- " + @$(RM) -rf $(OBJDIR) $(OUTFILE) $(COVER_REPORT_PATH) ./doc/doxygen.conf ./doc/html ./doc/latex ./doc/rtf $(foreach dir,$(SRC_SUBDIR),$(dir)/*~) + + +##-------------------------------------- +## +## indent Makefile.indent +## +##-------------------------------------- +include Makefile.indent + +indent: + @chmod 777 $(SRC_FULL_PATH) + @echo ===================================Indent START================================= + @echo + @echo "[Indent source file ]: $(SRC_FULL_PATH)" + $(call MAKE_INDENT , $(SRC_FULL_PATH)) + +##-------------------------------------- +## +## splint makefile.splint +## +##-------------------------------------- +include Makefile.splint + +SPLINT_FLAG_SWITCH ?= off + +splint: + @chmod 777 $(SRC_FULL_PATH) + @echo =================================Splint START================================== + @echo +ifeq "$(SPLINT_FLAG_SWITCH)" "on" + @echo "[Splint flags ]: $(SPLINT_FLAGS)" +endif + @echo "[Lint Clean Project]: $(notdir $(MODULE))" + $(call MAKE_SPLINT, $(SRC_FULL_PATH)) + +##-------------------------------------- +## +## doc Makefile.doxygen +## +##-------------------------------------- +include Makefile.doxygen + +doc: + @chmod 777 $(SRC_FULL_PATH) + @echo ==================================Doxygen START================================= + @echo + $(call MAKE_DOC, $(SRC_FULL_PATH)) + + +##-------------------------------------- +## +## backup Makefile.backup +## +##-------------------------------------- +include Makefile.backup + +##-------------------------------------- +## +## cov Makefile.cov +## +##-------------------------------------- +include Makefile.cov + +##-------------------------------------- +## +## usage Makefile.usage +## +##-------------------------------------- +include Makefile.usage + +##-------------------------------------- +## +## Make dependencies +## +##-------------------------------------- + +$(OBJDIR)/%.d:%.c + @$(CC) $< -MM -MD -o $@ + +$(OBJDIR)/%.o:%.c + +ifeq "$(CCFLAG_SWITCH)" "off" + @echo -e "building: $(notdir $@) \t\t\t\t please wait ..." + @$(COMPILE) +else + $(COMPILE) +endif + +DEPENDS=$(COMMON_OBJ:.o=.d) + +##-------------------------------------- +## +## Make force +## +##-------------------------------------- +FORCE: + diff --git a/include/Makefile.splint b/include/Makefile.splint new file mode 100644 index 0000000..3c50c5c --- /dev/null +++ b/include/Makefile.splint @@ -0,0 +1,288 @@ + +##----------------------------------------------------------## +## ## +## Universal Makefile Splint Function ## +## ## +## Created : Wei Liu 07/05/20 ## +## Revision: [Last]Wei Liu 07/07/07 ## +## ## +##----------------------------------------------------------## + +##-------------------------------------- +## +## Make splinting program flags +## +##-------------------------------------- + +##ÊÇ·ñÓÐÌáʾÐÅÏ¢ +SFLAG_HINTS := #-hints + +##ÊÇ·ñÓÿâÐÅÏ¢´úÌæÍ·Îļþ +SFLAG_INCLUDE := +single-include +#+never-include + +##°üº¬Ê²Ã´¿â +SFLAG_LIB := +posixlib +##+nolib +nof -warnposix +##+unixlib +##+posixlib +#+nolib +nof -warnposix +##+nof +##+unixlib +##+which_lib + +## +SFLAG_DUMP := +##dump ./include/public.h ./include/pub_base.h ./include/includes.h +SFLAG_LOAD := +##+load /usr/share/splint/lib/unixstrict.lcd +##load ./include/public.h ./include/pub_base.h ./include/includes.h + +SFLAG_DIR := +##-I/work/r9/plat/public/src/include/splint +##-I/work/r9/plat/public/src/include/splint +##-I /usr/local/work/r9/plat/public/src/include/ + +##¼ì²éģʽ +SFLAG_TYPE := -strict + +##ÂÔ¹ýµÄÍ·Îļþ +SFLAG_SYS_HEADERS := +skip_sys_headers +SFLAG_ISO_HEADERS := +#+skip_iso_headers +SFLAG_POSIX_HEADERS := +##+skip_posix_headers + +##ÿ¸öÍ·ÎļþÖ»¼ì²éÒ»´Î +SFLAG_SINGLE_INCLUDE := +singleinclude + +##ϵͳÎļþĿ¼ +SFLAG_SYS_DIR := +##+sys-dirs /work/r9/plat/public/src/include/splint + +##º¯Êý²ÎÊýÓÐÔ­ÐÍ +SFLAG_PROTO_PARAMNAME := -protoparamname + +##±äÁ¿ÃûÊÇ·ñΪ±£ÁôÃû +SFLAG_UNDERSCORE := -isoreserved -isoreservedinternal + +## ÔÚ"/*"ºÍ"*/"ÖÐÔÙ´ÎʹÓÃ"/*"ºÍ"*/" +SFLAG_NESTCOMMENT := -nestcomment + +##ÔÊÐíδ˵Ã÷µ¼³ö±äÁ¿¡¢º¯ÊýºÍÀàÐÍ +SFLAG_EXPORT_VAR := -exportvar +SFLAG_EXPORT_FCN := -exportfcn +SFLAG_EXPORT_TYPE := -exporttype +SFLAG_EXPORT_CONST := -exportconst + +##ÔÊÐíÆäËûÀàÐͶ¨ÒåΪBOOLÐÍ +SFLAG_LIKELY_BOOL := -likelybool + +##Á½ÖÖÀàÐÍÏàµÈ +SFLAG_CHAR_INT := +charint +SFLAG_BOOL_INT := +boolint + +##Report memory transfer errors for initializations to read-only string literals +SFLAG_READONLY_TRANS := -readonlytrans + +##A string literal is assigned to a char array that smaller than the string literal needs +SFLAG_STRING_SMALLER := -stringliteralsmaller + +##A variable declared outside a macro body starts with the macro-var-prefix +SFLAG_MACRO_PREFIX := -macrovarprefixexclude + +##Initializer does not define all elements of a declared array +SFLAG_INITAL_ELEMENT := -initallelements + +##ÀàÐÍÆ¥Åä +SFLAG_PARAM_TYPE := -type + +##Report modification errors in functions declared without a modifies clause +SFLAG_MODIFY := -modnomods + +##Use of a checked global in a function with no globals list +SFLAG_GLOBAL := -glob-noglobs + +##Use of internal state in function with no globals list +SFLAG_INTERNAL_GLOBS := -internal-globs-noglobs + +##Implicit checked qualifier on global variables and qualifier file static scope variables with no checking annotation +SFLAG_CHECK_GLOBAL := -imp-checkedstrict-globs -imp-checkedstrict_statics + +##Undocumented modification of a checked global variable in a function with no modifies clause +SFLAG_CHECK_GLOBAL_MODIFY := -mod-globs-nomods + +##Storage declared with observer may be modified through a call to an unconstrained function +SFLAG_OBSERVER_MODIFY := -mod-observer-uncon + +##ºöÂÔ·µ»ØÖµ +SFLAG_IGNORE_RETVAL := -retval + +##while,if and for statement is not a block +SFLAG_WHILE_BLOCK := -whileblock +SFLAG_IF_BLOCK := -ifblock +SFLAG_FOR_BLOCK := -forblock + +##There is no finals else following an else if construct +SFLAG_ELSEIF_COMPLETE := -elseifcomplete + +##ÔÊÐíÖ¸Õë½øÐÐÊýѧÔËËã +SFLAG_POINT_ARITH := -ptrarith -nullptrarith + +##An unconstrained function is called in a function body where modifications are checked. +SFLAG_UNCONSTRAIN_MODIFY := -mod-uncon-nomods + +##NO effect of unconstrained functions +SFLAG_EFFECT_UNCONSTRAIN := -no-effect-uncon + +##Type-mismatch in parameter corresponding to format code in a printflike or scanflike function +SFLAG_FORMAT-TYPE := -format-type + +##An actual parameter that is passed as a unique formal parameter is aliased by another parameter or global variable +SFLAG_ALIASING := -alias-unique -ret-alias#-may-alias-unique + +##Transfer Errors flag +SFLAG_STORAGE_TRANSFER := -onlytrans -temptrans -unqualified-trans -immediatetrans + +##Report errors for break statements inside a nested while, for or switch +SFLAG_DEEP_BREAK := -deep-break #-switch-switch-break -loop-loop-break + +##Storage has inconsistent states of alternate paths through a branch +SFLAG_INCONSISTENT_BRANCH := -branch-state + +##There is a non-empty case in a switch not followed by a break. +##Likely infinite loop is detected +##Likely infinite loop is detected. Loop test or body calls an unconstrained function that may produce an undetected modification +SFLAG_PROBLEMATIC_CTR := -case-break -infloops -infloopsuncon + +##An expression may be undefined because a sub-expression contains a call to an unconstrained function (no modifies clause) +##that may modify something that may be modified or used by another sub-expression +SFLAG_UNDEFINED_EVALORDER := -eval-order-uncon + +##Only storage transferred to an unqualified global or static reference. +##This may lead to a memory leak, since the new reference is not necessarily released +SFLAG_INITIALIZERS := -only-unq-global-trans + +##Primitive operation does not type check strictly +SFLAG_PRIMITIVE_OPERA := -strict-ops -bitwise-signed + +##Unused Declarations £¨Î´Ê¹ÓõÄÉùÃ÷£© +SFLAG_DECLARARIONS := -field-use -fcnuse -param-use -typeuse -varuse -enummemuse + +##Function, variable, iterator or constant declared but never defined (δ³õʼ»¯) +SFLAG_COMPLETE_PRG := -decl-undef + +##A declaration is exported but not used outside this module or not appear in a header file +SFLAG_EXPORTS := -export-local -export-header + +##°ÑwarningÊä³öµ½Îļþsplint_warnÖÐ +SFLAG_WARN_FILE := #+warning-stream splint_warn + +##°ÑÖÂÃü´íÎóÊä³öµ½Îļþsplint_errorÖÐ +SFLAG_ERROR_FILE := #+error-stream splint_error + +##Îļþ¸²¸Ç +SFLAG_STREAM_OVERWRITE := -streamoverwrite + +##An abstract type defined in M.h (or specified in M.lcl) is accessible in M.c +SFLAG_ACCESS := -access-module + +##Function definition is in old style syntax. Standard prototype syntax is preferred. +SFLAG_ISO_CONFORMANCE := #-old-style + +##Use of function that may lead to buffer overflow +SFLAG_BUFFER := -bufferoverflowhigh + +##A function is declared without a parameter list prototype +SFLAG_FUNC_NOPARAM := -noparams + +##Operand of sizeof operator is a type +SFLAG_SIZEOF_TYPE := -sizeoftype + +##Storage derivable from a parameter, return value or global variable is not completely defined +SFLAG_COMP_DEF := -compdef + +##Behavior of an expression is unspecified or implementation-dependent +##because sub-expressions contain interfering side effects that may be evaluated in any order +SFLAG_EVAL_ORDER := -eval-order + +##try to recover code +SFLAG_TRY_TO_RECOVER := #+trytorecover + +##·µ»ØÒ»¸öNULLÖ¸Õë +SFLAG_NULL_RET := -nullret + +##A possibly null pointer is reachable from a parameter or global variable that is not declared using a /*@null@*/ annotation +SFLAG_NULL_STATE := -nullstate + +##The value of a location that may not be initialized on some execution path is used +SFLAG_USE_BEFORE_DEF := -usedef + +##±àÒëʱ²»ÖªµÀ²ÎÊýÀàÐÍ Format parameter is not known at compile-time ÀýÈç:sprintf(mgcpAsciTempBuf, msg) +SFLAG_FORMAT_CONST := -format-const + +##Argument to exit has implementation defined behavior. The only valid arguments to exit are EXIT_SUCCESS, EXIT_FAILURE and 0. +##An error is reported if Splint can determine statically that the argument to exit is not one of these +SFLAG_EXIT_ARG := -exitarg + +##An extern declaration is used inside a function body +SFLAG_EXTERN := -nested-extern + + + +SFLAG_OLD_STTLE := -oldstyle + + +SFLAG_SHIFT_NEG := -shiftnegative + + +SFLAG_PREPROC := -preproc + +##all splint flags + +SPLINT_FLAGS := $(SFLAG_LIB) $(SFLAG_TYPE) $(SFLAG_SYS_HEADERS) $(SFLAG_ISO_HEADERS)\ + $(SFLAG_POSIX_HEADERS) $(SFLAG_SINGLEINCLUDE) $(SFLAG_WARN)\ + $(SFLAG_UNDERSCORE) $(SFLAG_NESTCOMMENT) $(SFLAG_EVAL_ORDER)\ + $(SFLAG_PROTO_PARAMNAME) $(SFLAG_EXPORT_VAR) $(SFLAG_EXPORT_FCN)\ + $(SFLAG_EXPORT_TYPE) $(SFLAG_LIKELY_BOOL) $(SFLAG_CHAR_INT)\ + $(SFLAG_READONLY_TRANS) $(SFLAG_STRING_SMALLER) $(SFLAG_MACRO_PREFIX)\ + $(SFLAG_INITAL_ELEMENT) $(SFLAG_PARAM_TYPE) $(SFLAG_GLOBAL)\ + $(SFLAG_CHECK_GLOBAL) $(SFLAG_CHECK_GLOBAL_MODIFY) $(SFLAG_IGNORE_RETVAL)\ + $(SFLAG_INTERNAL_GLOBS) $(SFLAG_MODIFY) $(SFLAG_BOOL_INT)\ + $(SFLAG_WHILE_BLOCK) $(SFLAG_HINTS) $(SFLAG_IF_BLOCK) $(SFLAG_FOR_BLOCK)\ + $(SFLAG_POINT_ARITH) $(SFLAG_ELSEIF_COMPLETE) $(SFLAG_UNCONSTRAIN_MODIFY)\ + $(SFLAG_EFFECT_UNCONSTRAIN) $(SFLAG_OBSERVER_MODIFY)\ + $(SFLAG_FORMAT-TYPE) $(SFLAG_ALIASING) $(SFLAG_STORAGE_TRANSFER)\ + $(SFLAG_DEEP_BREAK) $(SFLAG_INCONSISTENT_BRANCH) $(SFLAG_PROBLEMATIC_CTR)\ + $(SFLAG_UNDEFINED_EVALORDER) $(SFLAG_INITIALIZERS) $(SFLAG_PRIMITIVE_OPERA)\ + $(SFLAG_DECLARARIONS) $(SFLAG_COMPLETE_PRG) $(SFLAG_EXPORTS) $(SFLAG_INCLUDE)\ + $(SFLAG_STREAM_OVERWRITE) $(SFLAG_WARN_FILE) $(SFLAG_ERROR_FILE)\ + $(SFLAG_ACCESS) $(SFLAG_ISO_CONFORMANCE) $(SFLAG_BUFFER) $(SFLAG_SIZEOF_TYPE)\ + $(SFLAG_COMP_DEF) $(SFLAG_FUNC_NOPARAM) $(SFLAG_TRY_TO_RECOVER)\ + $(SFLAG_EXPORT_CONST) $(SFLAG_DUMP) $(SFLAG_LOAD) $(SFLAG_NULL_RET)\ + $(SFLAG_NULL_STATE) $(SFLAG_USE_BEFORE_DEF) $(SFLAG_FORMAT_CONST)\ + $(SFLAG_EXIT_ARG) $(SFLAG_EXTERN) $(SFLAG_OLD_STTLE) $(SFLAG_DIR)\ + $(SFLAG_SHIFT_NEG) $(SFLAG_PREPROC) + +##-------------------------------------- +## +## MAKE_INDENT template +## +##------------------------------------ + +define SPLINT_FILE +@echo -e "Splinting: $(notdir $(1)) \t\t\t please wait ..." +@nohup splint $(SPLINT_FLAGS) $(1) | sed '$d' | sed '1,2d' |\ + sed '/Splint /d' | sed '/Finished /d' |\ + sed '/Cannot continue/d' + +endef + +##@echo $(SPLINT_FLAGS) +define MAKE_SPLINT +@echo + +$(foreach file,$(1),$(call SPLINT_FILE, $(file))) +@echo +@echo =======================================End====================================== +endef \ No newline at end of file diff --git a/include/Makefile.usage b/include/Makefile.usage new file mode 100644 index 0000000..579b49b --- /dev/null +++ b/include/Makefile.usage @@ -0,0 +1,36 @@ + +##----------------------------------------------------------## +## ## +## Universal Makefile usage ## +## ## +## Created : Wei Liu 07/04/11 ## +## Revision: [Last]Wei Liu 07/07/09 ## +## ## +##----------------------------------------------------------## + +##------------------------------------- +## +## Universal Makefile Usage +## +##------------------------------------- + +usage: + @echo "usage: [make ] = make all " + @echo "usage: [make all ] " + @echo "usage: [make clean ] " + @echo "usage: [make rebuild ] " + @echo "usage: [make test ] " + @echo "usage: [make indent ] " + @echo "usage: [make splint ] " + @echo "usage: [make prtdebug ] " + @echo "usage: [make dir ] " + @echo "usage: [make config ] = make dir now " + @echo "usage: [make check ] = not supported now " + @echo "usage: [make bk ] " + @echo "usage: [make lsbk ] " + @echo "usage: [make rmbk backfile=*/[filename]] " + @echo "usage: [make unzip backfile=[filename] ] " + @echo "usage: [make version ] " + @echo "usage: [make umakever ] " + + diff --git a/include/gtest/gtest-death-test.h b/include/gtest/gtest-death-test.h new file mode 100644 index 0000000..dc878ff --- /dev/null +++ b/include/gtest/gtest-death-test.h @@ -0,0 +1,343 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +// The Google C++ Testing and Mocking Framework (Google Test) +// +// This header file defines the public API for death tests. It is +// #included by gtest.h so a user doesn't need to include this +// directly. +// GOOGLETEST_CM0001 DO NOT DELETE + +#ifndef GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ +#define GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ + +#include "gtest/internal/gtest-death-test-internal.h" + +namespace testing { + +// This flag controls the style of death tests. Valid values are "threadsafe", +// meaning that the death test child process will re-execute the test binary +// from the start, running only a single death test, or "fast", +// meaning that the child process will execute the test logic immediately +// after forking. +GTEST_DECLARE_string_(death_test_style); + +#if GTEST_HAS_DEATH_TEST + +namespace internal { + +// Returns a Boolean value indicating whether the caller is currently +// executing in the context of the death test child process. Tools such as +// Valgrind heap checkers may need this to modify their behavior in death +// tests. IMPORTANT: This is an internal utility. Using it may break the +// implementation of death tests. User code MUST NOT use it. +GTEST_API_ bool InDeathTestChild(); + +} // namespace internal + +// The following macros are useful for writing death tests. + +// Here's what happens when an ASSERT_DEATH* or EXPECT_DEATH* is +// executed: +// +// 1. It generates a warning if there is more than one active +// thread. This is because it's safe to fork() or clone() only +// when there is a single thread. +// +// 2. The parent process clone()s a sub-process and runs the death +// test in it; the sub-process exits with code 0 at the end of the +// death test, if it hasn't exited already. +// +// 3. The parent process waits for the sub-process to terminate. +// +// 4. The parent process checks the exit code and error message of +// the sub-process. +// +// Examples: +// +// ASSERT_DEATH(server.SendMessage(56, "Hello"), "Invalid port number"); +// for (int i = 0; i < 5; i++) { +// EXPECT_DEATH(server.ProcessRequest(i), +// "Invalid request .* in ProcessRequest()") +// << "Failed to die on request " << i; +// } +// +// ASSERT_EXIT(server.ExitNow(), ::testing::ExitedWithCode(0), "Exiting"); +// +// bool KilledBySIGHUP(int exit_code) { +// return WIFSIGNALED(exit_code) && WTERMSIG(exit_code) == SIGHUP; +// } +// +// ASSERT_EXIT(client.HangUpServer(), KilledBySIGHUP, "Hanging up!"); +// +// On the regular expressions used in death tests: +// +// GOOGLETEST_CM0005 DO NOT DELETE +// On POSIX-compliant systems (*nix), we use the library, +// which uses the POSIX extended regex syntax. +// +// On other platforms (e.g. Windows or Mac), we only support a simple regex +// syntax implemented as part of Google Test. This limited +// implementation should be enough most of the time when writing +// death tests; though it lacks many features you can find in PCRE +// or POSIX extended regex syntax. For example, we don't support +// union ("x|y"), grouping ("(xy)"), brackets ("[xy]"), and +// repetition count ("x{5,7}"), among others. +// +// Below is the syntax that we do support. We chose it to be a +// subset of both PCRE and POSIX extended regex, so it's easy to +// learn wherever you come from. In the following: 'A' denotes a +// literal character, period (.), or a single \\ escape sequence; +// 'x' and 'y' denote regular expressions; 'm' and 'n' are for +// natural numbers. +// +// c matches any literal character c +// \\d matches any decimal digit +// \\D matches any character that's not a decimal digit +// \\f matches \f +// \\n matches \n +// \\r matches \r +// \\s matches any ASCII whitespace, including \n +// \\S matches any character that's not a whitespace +// \\t matches \t +// \\v matches \v +// \\w matches any letter, _, or decimal digit +// \\W matches any character that \\w doesn't match +// \\c matches any literal character c, which must be a punctuation +// . matches any single character except \n +// A? matches 0 or 1 occurrences of A +// A* matches 0 or many occurrences of A +// A+ matches 1 or many occurrences of A +// ^ matches the beginning of a string (not that of each line) +// $ matches the end of a string (not that of each line) +// xy matches x followed by y +// +// If you accidentally use PCRE or POSIX extended regex features +// not implemented by us, you will get a run-time failure. In that +// case, please try to rewrite your regular expression within the +// above syntax. +// +// This implementation is *not* meant to be as highly tuned or robust +// as a compiled regex library, but should perform well enough for a +// death test, which already incurs significant overhead by launching +// a child process. +// +// Known caveats: +// +// A "threadsafe" style death test obtains the path to the test +// program from argv[0] and re-executes it in the sub-process. For +// simplicity, the current implementation doesn't search the PATH +// when launching the sub-process. This means that the user must +// invoke the test program via a path that contains at least one +// path separator (e.g. path/to/foo_test and +// /absolute/path/to/bar_test are fine, but foo_test is not). This +// is rarely a problem as people usually don't put the test binary +// directory in PATH. +// + +// Asserts that a given statement causes the program to exit, with an +// integer exit status that satisfies predicate, and emitting error output +// that matches regex. +# define ASSERT_EXIT(statement, predicate, regex) \ + GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_FATAL_FAILURE_) + +// Like ASSERT_EXIT, but continues on to successive tests in the +// test suite, if any: +# define EXPECT_EXIT(statement, predicate, regex) \ + GTEST_DEATH_TEST_(statement, predicate, regex, GTEST_NONFATAL_FAILURE_) + +// Asserts that a given statement causes the program to exit, either by +// explicitly exiting with a nonzero exit code or being killed by a +// signal, and emitting error output that matches regex. +# define ASSERT_DEATH(statement, regex) \ + ASSERT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) + +// Like ASSERT_DEATH, but continues on to successive tests in the +// test suite, if any: +# define EXPECT_DEATH(statement, regex) \ + EXPECT_EXIT(statement, ::testing::internal::ExitedUnsuccessfully, regex) + +// Two predicate classes that can be used in {ASSERT,EXPECT}_EXIT*: + +// Tests that an exit code describes a normal exit with a given exit code. +class GTEST_API_ ExitedWithCode { + public: + explicit ExitedWithCode(int exit_code); + bool operator()(int exit_status) const; + private: + // No implementation - assignment is unsupported. + void operator=(const ExitedWithCode& other); + + const int exit_code_; +}; + +# if !GTEST_OS_WINDOWS && !GTEST_OS_FUCHSIA +// Tests that an exit code describes an exit due to termination by a +// given signal. +// GOOGLETEST_CM0006 DO NOT DELETE +class GTEST_API_ KilledBySignal { + public: + explicit KilledBySignal(int signum); + bool operator()(int exit_status) const; + private: + const int signum_; +}; +# endif // !GTEST_OS_WINDOWS + +// EXPECT_DEBUG_DEATH asserts that the given statements die in debug mode. +// The death testing framework causes this to have interesting semantics, +// since the sideeffects of the call are only visible in opt mode, and not +// in debug mode. +// +// In practice, this can be used to test functions that utilize the +// LOG(DFATAL) macro using the following style: +// +// int DieInDebugOr12(int* sideeffect) { +// if (sideeffect) { +// *sideeffect = 12; +// } +// LOG(DFATAL) << "death"; +// return 12; +// } +// +// TEST(TestSuite, TestDieOr12WorksInDgbAndOpt) { +// int sideeffect = 0; +// // Only asserts in dbg. +// EXPECT_DEBUG_DEATH(DieInDebugOr12(&sideeffect), "death"); +// +// #ifdef NDEBUG +// // opt-mode has sideeffect visible. +// EXPECT_EQ(12, sideeffect); +// #else +// // dbg-mode no visible sideeffect. +// EXPECT_EQ(0, sideeffect); +// #endif +// } +// +// This will assert that DieInDebugReturn12InOpt() crashes in debug +// mode, usually due to a DCHECK or LOG(DFATAL), but returns the +// appropriate fallback value (12 in this case) in opt mode. If you +// need to test that a function has appropriate side-effects in opt +// mode, include assertions against the side-effects. A general +// pattern for this is: +// +// EXPECT_DEBUG_DEATH({ +// // Side-effects here will have an effect after this statement in +// // opt mode, but none in debug mode. +// EXPECT_EQ(12, DieInDebugOr12(&sideeffect)); +// }, "death"); +// +# ifdef NDEBUG + +# define EXPECT_DEBUG_DEATH(statement, regex) \ + GTEST_EXECUTE_STATEMENT_(statement, regex) + +# define ASSERT_DEBUG_DEATH(statement, regex) \ + GTEST_EXECUTE_STATEMENT_(statement, regex) + +# else + +# define EXPECT_DEBUG_DEATH(statement, regex) \ + EXPECT_DEATH(statement, regex) + +# define ASSERT_DEBUG_DEATH(statement, regex) \ + ASSERT_DEATH(statement, regex) + +# endif // NDEBUG for EXPECT_DEBUG_DEATH +#endif // GTEST_HAS_DEATH_TEST + +// This macro is used for implementing macros such as +// EXPECT_DEATH_IF_SUPPORTED and ASSERT_DEATH_IF_SUPPORTED on systems where +// death tests are not supported. Those macros must compile on such systems +// if and only if EXPECT_DEATH and ASSERT_DEATH compile with the same parameters +// on systems that support death tests. This allows one to write such a macro on +// a system that does not support death tests and be sure that it will compile +// on a death-test supporting system. It is exposed publicly so that systems +// that have death-tests with stricter requirements than GTEST_HAS_DEATH_TEST +// can write their own equivalent of EXPECT_DEATH_IF_SUPPORTED and +// ASSERT_DEATH_IF_SUPPORTED. +// +// Parameters: +// statement - A statement that a macro such as EXPECT_DEATH would test +// for program termination. This macro has to make sure this +// statement is compiled but not executed, to ensure that +// EXPECT_DEATH_IF_SUPPORTED compiles with a certain +// parameter if and only if EXPECT_DEATH compiles with it. +// regex - A regex that a macro such as EXPECT_DEATH would use to test +// the output of statement. This parameter has to be +// compiled but not evaluated by this macro, to ensure that +// this macro only accepts expressions that a macro such as +// EXPECT_DEATH would accept. +// terminator - Must be an empty statement for EXPECT_DEATH_IF_SUPPORTED +// and a return statement for ASSERT_DEATH_IF_SUPPORTED. +// This ensures that ASSERT_DEATH_IF_SUPPORTED will not +// compile inside functions where ASSERT_DEATH doesn't +// compile. +// +// The branch that has an always false condition is used to ensure that +// statement and regex are compiled (and thus syntactically correct) but +// never executed. The unreachable code macro protects the terminator +// statement from generating an 'unreachable code' warning in case +// statement unconditionally returns or throws. The Message constructor at +// the end allows the syntax of streaming additional messages into the +// macro, for compilational compatibility with EXPECT_DEATH/ASSERT_DEATH. +# define GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, terminator) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (::testing::internal::AlwaysTrue()) { \ + GTEST_LOG_(WARNING) \ + << "Death tests are not supported on this platform.\n" \ + << "Statement '" #statement "' cannot be verified."; \ + } else if (::testing::internal::AlwaysFalse()) { \ + ::testing::internal::RE::PartialMatch(".*", (regex)); \ + GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ + terminator; \ + } else \ + ::testing::Message() + +// EXPECT_DEATH_IF_SUPPORTED(statement, regex) and +// ASSERT_DEATH_IF_SUPPORTED(statement, regex) expand to real death tests if +// death tests are supported; otherwise they just issue a warning. This is +// useful when you are combining death test assertions with normal test +// assertions in one test. +#if GTEST_HAS_DEATH_TEST +# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ + EXPECT_DEATH(statement, regex) +# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ + ASSERT_DEATH(statement, regex) +#else +# define EXPECT_DEATH_IF_SUPPORTED(statement, regex) \ + GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, ) +# define ASSERT_DEATH_IF_SUPPORTED(statement, regex) \ + GTEST_UNSUPPORTED_DEATH_TEST(statement, regex, return) +#endif + +} // namespace testing + +#endif // GTEST_INCLUDE_GTEST_GTEST_DEATH_TEST_H_ diff --git a/include/gtest/gtest-matchers.h b/include/gtest/gtest-matchers.h new file mode 100644 index 0000000..9de6c2e --- /dev/null +++ b/include/gtest/gtest-matchers.h @@ -0,0 +1,750 @@ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// The Google C++ Testing and Mocking Framework (Google Test) +// +// This file implements just enough of the matcher interface to allow +// EXPECT_DEATH and friends to accept a matcher argument. + +// IWYU pragma: private, include "testing/base/public/gunit.h" +// IWYU pragma: friend third_party/googletest/googlemock/.* +// IWYU pragma: friend third_party/googletest/googletest/.* + +#ifndef GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_ +#define GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_ + +#include +#include +#include +#include + +#include "gtest/gtest-printers.h" +#include "gtest/internal/gtest-internal.h" +#include "gtest/internal/gtest-port.h" + +// MSVC warning C5046 is new as of VS2017 version 15.8. +#if defined(_MSC_VER) && _MSC_VER >= 1915 +#define GTEST_MAYBE_5046_ 5046 +#else +#define GTEST_MAYBE_5046_ +#endif + +GTEST_DISABLE_MSC_WARNINGS_PUSH_( + 4251 GTEST_MAYBE_5046_ /* class A needs to have dll-interface to be used by + clients of class B */ + /* Symbol involving type with internal linkage not defined */) + +namespace testing { + +// To implement a matcher Foo for type T, define: +// 1. a class FooMatcherImpl that implements the +// MatcherInterface interface, and +// 2. a factory function that creates a Matcher object from a +// FooMatcherImpl*. +// +// The two-level delegation design makes it possible to allow a user +// to write "v" instead of "Eq(v)" where a Matcher is expected, which +// is impossible if we pass matchers by pointers. It also eases +// ownership management as Matcher objects can now be copied like +// plain values. + +// MatchResultListener is an abstract class. Its << operator can be +// used by a matcher to explain why a value matches or doesn't match. +// +class MatchResultListener { + public: + // Creates a listener object with the given underlying ostream. The + // listener does not own the ostream, and does not dereference it + // in the constructor or destructor. + explicit MatchResultListener(::std::ostream* os) : stream_(os) {} + virtual ~MatchResultListener() = 0; // Makes this class abstract. + + // Streams x to the underlying ostream; does nothing if the ostream + // is NULL. + template + MatchResultListener& operator<<(const T& x) { + if (stream_ != nullptr) *stream_ << x; + return *this; + } + + // Returns the underlying ostream. + ::std::ostream* stream() { return stream_; } + + // Returns true if and only if the listener is interested in an explanation + // of the match result. A matcher's MatchAndExplain() method can use + // this information to avoid generating the explanation when no one + // intends to hear it. + bool IsInterested() const { return stream_ != nullptr; } + + private: + ::std::ostream* const stream_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(MatchResultListener); +}; + +inline MatchResultListener::~MatchResultListener() { +} + +// An instance of a subclass of this knows how to describe itself as a +// matcher. +class MatcherDescriberInterface { + public: + virtual ~MatcherDescriberInterface() {} + + // Describes this matcher to an ostream. The function should print + // a verb phrase that describes the property a value matching this + // matcher should have. The subject of the verb phrase is the value + // being matched. For example, the DescribeTo() method of the Gt(7) + // matcher prints "is greater than 7". + virtual void DescribeTo(::std::ostream* os) const = 0; + + // Describes the negation of this matcher to an ostream. For + // example, if the description of this matcher is "is greater than + // 7", the negated description could be "is not greater than 7". + // You are not required to override this when implementing + // MatcherInterface, but it is highly advised so that your matcher + // can produce good error messages. + virtual void DescribeNegationTo(::std::ostream* os) const { + *os << "not ("; + DescribeTo(os); + *os << ")"; + } +}; + +// The implementation of a matcher. +template +class MatcherInterface : public MatcherDescriberInterface { + public: + // Returns true if and only if the matcher matches x; also explains the + // match result to 'listener' if necessary (see the next paragraph), in + // the form of a non-restrictive relative clause ("which ...", + // "whose ...", etc) that describes x. For example, the + // MatchAndExplain() method of the Pointee(...) matcher should + // generate an explanation like "which points to ...". + // + // Implementations of MatchAndExplain() should add an explanation of + // the match result *if and only if* they can provide additional + // information that's not already present (or not obvious) in the + // print-out of x and the matcher's description. Whether the match + // succeeds is not a factor in deciding whether an explanation is + // needed, as sometimes the caller needs to print a failure message + // when the match succeeds (e.g. when the matcher is used inside + // Not()). + // + // For example, a "has at least 10 elements" matcher should explain + // what the actual element count is, regardless of the match result, + // as it is useful information to the reader; on the other hand, an + // "is empty" matcher probably only needs to explain what the actual + // size is when the match fails, as it's redundant to say that the + // size is 0 when the value is already known to be empty. + // + // You should override this method when defining a new matcher. + // + // It's the responsibility of the caller (Google Test) to guarantee + // that 'listener' is not NULL. This helps to simplify a matcher's + // implementation when it doesn't care about the performance, as it + // can talk to 'listener' without checking its validity first. + // However, in order to implement dummy listeners efficiently, + // listener->stream() may be NULL. + virtual bool MatchAndExplain(T x, MatchResultListener* listener) const = 0; + + // Inherits these methods from MatcherDescriberInterface: + // virtual void DescribeTo(::std::ostream* os) const = 0; + // virtual void DescribeNegationTo(::std::ostream* os) const; +}; + +namespace internal { + +// Converts a MatcherInterface to a MatcherInterface. +template +class MatcherInterfaceAdapter : public MatcherInterface { + public: + explicit MatcherInterfaceAdapter(const MatcherInterface* impl) + : impl_(impl) {} + ~MatcherInterfaceAdapter() override { delete impl_; } + + void DescribeTo(::std::ostream* os) const override { impl_->DescribeTo(os); } + + void DescribeNegationTo(::std::ostream* os) const override { + impl_->DescribeNegationTo(os); + } + + bool MatchAndExplain(const T& x, + MatchResultListener* listener) const override { + return impl_->MatchAndExplain(x, listener); + } + + private: + const MatcherInterface* const impl_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(MatcherInterfaceAdapter); +}; + +struct AnyEq { + template + bool operator()(const A& a, const B& b) const { return a == b; } +}; +struct AnyNe { + template + bool operator()(const A& a, const B& b) const { return a != b; } +}; +struct AnyLt { + template + bool operator()(const A& a, const B& b) const { return a < b; } +}; +struct AnyGt { + template + bool operator()(const A& a, const B& b) const { return a > b; } +}; +struct AnyLe { + template + bool operator()(const A& a, const B& b) const { return a <= b; } +}; +struct AnyGe { + template + bool operator()(const A& a, const B& b) const { return a >= b; } +}; + +// A match result listener that ignores the explanation. +class DummyMatchResultListener : public MatchResultListener { + public: + DummyMatchResultListener() : MatchResultListener(nullptr) {} + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(DummyMatchResultListener); +}; + +// A match result listener that forwards the explanation to a given +// ostream. The difference between this and MatchResultListener is +// that the former is concrete. +class StreamMatchResultListener : public MatchResultListener { + public: + explicit StreamMatchResultListener(::std::ostream* os) + : MatchResultListener(os) {} + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(StreamMatchResultListener); +}; + +// An internal class for implementing Matcher, which will derive +// from it. We put functionalities common to all Matcher +// specializations here to avoid code duplication. +template +class MatcherBase { + public: + // Returns true if and only if the matcher matches x; also explains the + // match result to 'listener'. + bool MatchAndExplain(const T& x, MatchResultListener* listener) const { + return impl_->MatchAndExplain(x, listener); + } + + // Returns true if and only if this matcher matches x. + bool Matches(const T& x) const { + DummyMatchResultListener dummy; + return MatchAndExplain(x, &dummy); + } + + // Describes this matcher to an ostream. + void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } + + // Describes the negation of this matcher to an ostream. + void DescribeNegationTo(::std::ostream* os) const { + impl_->DescribeNegationTo(os); + } + + // Explains why x matches, or doesn't match, the matcher. + void ExplainMatchResultTo(const T& x, ::std::ostream* os) const { + StreamMatchResultListener listener(os); + MatchAndExplain(x, &listener); + } + + // Returns the describer for this matcher object; retains ownership + // of the describer, which is only guaranteed to be alive when + // this matcher object is alive. + const MatcherDescriberInterface* GetDescriber() const { + return impl_.get(); + } + + protected: + MatcherBase() {} + + // Constructs a matcher from its implementation. + explicit MatcherBase(const MatcherInterface* impl) : impl_(impl) {} + + template + explicit MatcherBase( + const MatcherInterface* impl, + typename std::enable_if::value>::type* = + nullptr) + : impl_(new internal::MatcherInterfaceAdapter(impl)) {} + + MatcherBase(const MatcherBase&) = default; + MatcherBase& operator=(const MatcherBase&) = default; + MatcherBase(MatcherBase&&) = default; + MatcherBase& operator=(MatcherBase&&) = default; + + virtual ~MatcherBase() {} + + private: + std::shared_ptr> impl_; +}; + +} // namespace internal + +// A Matcher is a copyable and IMMUTABLE (except by assignment) +// object that can check whether a value of type T matches. The +// implementation of Matcher is just a std::shared_ptr to const +// MatcherInterface. Don't inherit from Matcher! +template +class Matcher : public internal::MatcherBase { + public: + // Constructs a null matcher. Needed for storing Matcher objects in STL + // containers. A default-constructed matcher is not yet initialized. You + // cannot use it until a valid value has been assigned to it. + explicit Matcher() {} // NOLINT + + // Constructs a matcher from its implementation. + explicit Matcher(const MatcherInterface* impl) + : internal::MatcherBase(impl) {} + + template + explicit Matcher( + const MatcherInterface* impl, + typename std::enable_if::value>::type* = + nullptr) + : internal::MatcherBase(impl) {} + + // Implicit constructor here allows people to write + // EXPECT_CALL(foo, Bar(5)) instead of EXPECT_CALL(foo, Bar(Eq(5))) sometimes + Matcher(T value); // NOLINT +}; + +// The following two specializations allow the user to write str +// instead of Eq(str) and "foo" instead of Eq("foo") when a std::string +// matcher is expected. +template <> +class GTEST_API_ Matcher + : public internal::MatcherBase { + public: + Matcher() {} + + explicit Matcher(const MatcherInterface* impl) + : internal::MatcherBase(impl) {} + + // Allows the user to write str instead of Eq(str) sometimes, where + // str is a std::string object. + Matcher(const std::string& s); // NOLINT + + // Allows the user to write "foo" instead of Eq("foo") sometimes. + Matcher(const char* s); // NOLINT +}; + +template <> +class GTEST_API_ Matcher + : public internal::MatcherBase { + public: + Matcher() {} + + explicit Matcher(const MatcherInterface* impl) + : internal::MatcherBase(impl) {} + explicit Matcher(const MatcherInterface* impl) + : internal::MatcherBase(impl) {} + + // Allows the user to write str instead of Eq(str) sometimes, where + // str is a string object. + Matcher(const std::string& s); // NOLINT + + // Allows the user to write "foo" instead of Eq("foo") sometimes. + Matcher(const char* s); // NOLINT +}; + +#if GTEST_HAS_ABSL +// The following two specializations allow the user to write str +// instead of Eq(str) and "foo" instead of Eq("foo") when a absl::string_view +// matcher is expected. +template <> +class GTEST_API_ Matcher + : public internal::MatcherBase { + public: + Matcher() {} + + explicit Matcher(const MatcherInterface* impl) + : internal::MatcherBase(impl) {} + + // Allows the user to write str instead of Eq(str) sometimes, where + // str is a std::string object. + Matcher(const std::string& s); // NOLINT + + // Allows the user to write "foo" instead of Eq("foo") sometimes. + Matcher(const char* s); // NOLINT + + // Allows the user to pass absl::string_views directly. + Matcher(absl::string_view s); // NOLINT +}; + +template <> +class GTEST_API_ Matcher + : public internal::MatcherBase { + public: + Matcher() {} + + explicit Matcher(const MatcherInterface* impl) + : internal::MatcherBase(impl) {} + explicit Matcher(const MatcherInterface* impl) + : internal::MatcherBase(impl) {} + + // Allows the user to write str instead of Eq(str) sometimes, where + // str is a std::string object. + Matcher(const std::string& s); // NOLINT + + // Allows the user to write "foo" instead of Eq("foo") sometimes. + Matcher(const char* s); // NOLINT + + // Allows the user to pass absl::string_views directly. + Matcher(absl::string_view s); // NOLINT +}; +#endif // GTEST_HAS_ABSL + +// Prints a matcher in a human-readable format. +template +std::ostream& operator<<(std::ostream& os, const Matcher& matcher) { + matcher.DescribeTo(&os); + return os; +} + +// The PolymorphicMatcher class template makes it easy to implement a +// polymorphic matcher (i.e. a matcher that can match values of more +// than one type, e.g. Eq(n) and NotNull()). +// +// To define a polymorphic matcher, a user should provide an Impl +// class that has a DescribeTo() method and a DescribeNegationTo() +// method, and define a member function (or member function template) +// +// bool MatchAndExplain(const Value& value, +// MatchResultListener* listener) const; +// +// See the definition of NotNull() for a complete example. +template +class PolymorphicMatcher { + public: + explicit PolymorphicMatcher(const Impl& an_impl) : impl_(an_impl) {} + + // Returns a mutable reference to the underlying matcher + // implementation object. + Impl& mutable_impl() { return impl_; } + + // Returns an immutable reference to the underlying matcher + // implementation object. + const Impl& impl() const { return impl_; } + + template + operator Matcher() const { + return Matcher(new MonomorphicImpl(impl_)); + } + + private: + template + class MonomorphicImpl : public MatcherInterface { + public: + explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {} + + virtual void DescribeTo(::std::ostream* os) const { impl_.DescribeTo(os); } + + virtual void DescribeNegationTo(::std::ostream* os) const { + impl_.DescribeNegationTo(os); + } + + virtual bool MatchAndExplain(T x, MatchResultListener* listener) const { + return impl_.MatchAndExplain(x, listener); + } + + private: + const Impl impl_; + }; + + Impl impl_; +}; + +// Creates a matcher from its implementation. +// DEPRECATED: Especially in the generic code, prefer: +// Matcher(new MyMatcherImpl(...)); +// +// MakeMatcher may create a Matcher that accepts its argument by value, which +// leads to unnecessary copies & lack of support for non-copyable types. +template +inline Matcher MakeMatcher(const MatcherInterface* impl) { + return Matcher(impl); +} + +// Creates a polymorphic matcher from its implementation. This is +// easier to use than the PolymorphicMatcher constructor as it +// doesn't require you to explicitly write the template argument, e.g. +// +// MakePolymorphicMatcher(foo); +// vs +// PolymorphicMatcher(foo); +template +inline PolymorphicMatcher MakePolymorphicMatcher(const Impl& impl) { + return PolymorphicMatcher(impl); +} + +namespace internal { +// Implements a matcher that compares a given value with a +// pre-supplied value using one of the ==, <=, <, etc, operators. The +// two values being compared don't have to have the same type. +// +// The matcher defined here is polymorphic (for example, Eq(5) can be +// used to match an int, a short, a double, etc). Therefore we use +// a template type conversion operator in the implementation. +// +// The following template definition assumes that the Rhs parameter is +// a "bare" type (i.e. neither 'const T' nor 'T&'). +template +class ComparisonBase { + public: + explicit ComparisonBase(const Rhs& rhs) : rhs_(rhs) {} + template + operator Matcher() const { + return Matcher(new Impl(rhs_)); + } + + private: + template + static const T& Unwrap(const T& v) { return v; } + template + static const T& Unwrap(std::reference_wrapper v) { return v; } + + template + class Impl : public MatcherInterface { + public: + explicit Impl(const Rhs& rhs) : rhs_(rhs) {} + bool MatchAndExplain(Lhs lhs, + MatchResultListener* /* listener */) const override { + return Op()(lhs, Unwrap(rhs_)); + } + void DescribeTo(::std::ostream* os) const override { + *os << D::Desc() << " "; + UniversalPrint(Unwrap(rhs_), os); + } + void DescribeNegationTo(::std::ostream* os) const override { + *os << D::NegatedDesc() << " "; + UniversalPrint(Unwrap(rhs_), os); + } + + private: + Rhs rhs_; + }; + Rhs rhs_; +}; + +template +class EqMatcher : public ComparisonBase, Rhs, AnyEq> { + public: + explicit EqMatcher(const Rhs& rhs) + : ComparisonBase, Rhs, AnyEq>(rhs) { } + static const char* Desc() { return "is equal to"; } + static const char* NegatedDesc() { return "isn't equal to"; } +}; +template +class NeMatcher : public ComparisonBase, Rhs, AnyNe> { + public: + explicit NeMatcher(const Rhs& rhs) + : ComparisonBase, Rhs, AnyNe>(rhs) { } + static const char* Desc() { return "isn't equal to"; } + static const char* NegatedDesc() { return "is equal to"; } +}; +template +class LtMatcher : public ComparisonBase, Rhs, AnyLt> { + public: + explicit LtMatcher(const Rhs& rhs) + : ComparisonBase, Rhs, AnyLt>(rhs) { } + static const char* Desc() { return "is <"; } + static const char* NegatedDesc() { return "isn't <"; } +}; +template +class GtMatcher : public ComparisonBase, Rhs, AnyGt> { + public: + explicit GtMatcher(const Rhs& rhs) + : ComparisonBase, Rhs, AnyGt>(rhs) { } + static const char* Desc() { return "is >"; } + static const char* NegatedDesc() { return "isn't >"; } +}; +template +class LeMatcher : public ComparisonBase, Rhs, AnyLe> { + public: + explicit LeMatcher(const Rhs& rhs) + : ComparisonBase, Rhs, AnyLe>(rhs) { } + static const char* Desc() { return "is <="; } + static const char* NegatedDesc() { return "isn't <="; } +}; +template +class GeMatcher : public ComparisonBase, Rhs, AnyGe> { + public: + explicit GeMatcher(const Rhs& rhs) + : ComparisonBase, Rhs, AnyGe>(rhs) { } + static const char* Desc() { return "is >="; } + static const char* NegatedDesc() { return "isn't >="; } +}; + +// Implements polymorphic matchers MatchesRegex(regex) and +// ContainsRegex(regex), which can be used as a Matcher as long as +// T can be converted to a string. +class MatchesRegexMatcher { + public: + MatchesRegexMatcher(const RE* regex, bool full_match) + : regex_(regex), full_match_(full_match) {} + +#if GTEST_HAS_ABSL + bool MatchAndExplain(const absl::string_view& s, + MatchResultListener* listener) const { + return MatchAndExplain(std::string(s), listener); + } +#endif // GTEST_HAS_ABSL + + // Accepts pointer types, particularly: + // const char* + // char* + // const wchar_t* + // wchar_t* + template + bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { + return s != nullptr && MatchAndExplain(std::string(s), listener); + } + + // Matches anything that can convert to std::string. + // + // This is a template, not just a plain function with const std::string&, + // because absl::string_view has some interfering non-explicit constructors. + template + bool MatchAndExplain(const MatcheeStringType& s, + MatchResultListener* /* listener */) const { + const std::string& s2(s); + return full_match_ ? RE::FullMatch(s2, *regex_) + : RE::PartialMatch(s2, *regex_); + } + + void DescribeTo(::std::ostream* os) const { + *os << (full_match_ ? "matches" : "contains") << " regular expression "; + UniversalPrinter::Print(regex_->pattern(), os); + } + + void DescribeNegationTo(::std::ostream* os) const { + *os << "doesn't " << (full_match_ ? "match" : "contain") + << " regular expression "; + UniversalPrinter::Print(regex_->pattern(), os); + } + + private: + const std::shared_ptr regex_; + const bool full_match_; +}; +} // namespace internal + +// Matches a string that fully matches regular expression 'regex'. +// The matcher takes ownership of 'regex'. +inline PolymorphicMatcher MatchesRegex( + const internal::RE* regex) { + return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, true)); +} +inline PolymorphicMatcher MatchesRegex( + const std::string& regex) { + return MatchesRegex(new internal::RE(regex)); +} + +// Matches a string that contains regular expression 'regex'. +// The matcher takes ownership of 'regex'. +inline PolymorphicMatcher ContainsRegex( + const internal::RE* regex) { + return MakePolymorphicMatcher(internal::MatchesRegexMatcher(regex, false)); +} +inline PolymorphicMatcher ContainsRegex( + const std::string& regex) { + return ContainsRegex(new internal::RE(regex)); +} + +// Creates a polymorphic matcher that matches anything equal to x. +// Note: if the parameter of Eq() were declared as const T&, Eq("foo") +// wouldn't compile. +template +inline internal::EqMatcher Eq(T x) { return internal::EqMatcher(x); } + +// Constructs a Matcher from a 'value' of type T. The constructed +// matcher matches any value that's equal to 'value'. +template +Matcher::Matcher(T value) { *this = Eq(value); } + +// Creates a monomorphic matcher that matches anything with type Lhs +// and equal to rhs. A user may need to use this instead of Eq(...) +// in order to resolve an overloading ambiguity. +// +// TypedEq(x) is just a convenient short-hand for Matcher(Eq(x)) +// or Matcher(x), but more readable than the latter. +// +// We could define similar monomorphic matchers for other comparison +// operations (e.g. TypedLt, TypedGe, and etc), but decided not to do +// it yet as those are used much less than Eq() in practice. A user +// can always write Matcher(Lt(5)) to be explicit about the type, +// for example. +template +inline Matcher TypedEq(const Rhs& rhs) { return Eq(rhs); } + +// Creates a polymorphic matcher that matches anything >= x. +template +inline internal::GeMatcher Ge(Rhs x) { + return internal::GeMatcher(x); +} + +// Creates a polymorphic matcher that matches anything > x. +template +inline internal::GtMatcher Gt(Rhs x) { + return internal::GtMatcher(x); +} + +// Creates a polymorphic matcher that matches anything <= x. +template +inline internal::LeMatcher Le(Rhs x) { + return internal::LeMatcher(x); +} + +// Creates a polymorphic matcher that matches anything < x. +template +inline internal::LtMatcher Lt(Rhs x) { + return internal::LtMatcher(x); +} + +// Creates a polymorphic matcher that matches anything != x. +template +inline internal::NeMatcher Ne(Rhs x) { + return internal::NeMatcher(x); +} +} // namespace testing + +GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 5046 + +#endif // GTEST_INCLUDE_GTEST_GTEST_MATCHERS_H_ diff --git a/include/gtest/gtest-message.h b/include/gtest/gtest-message.h new file mode 100644 index 0000000..4a80e11 --- /dev/null +++ b/include/gtest/gtest-message.h @@ -0,0 +1,218 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +// The Google C++ Testing and Mocking Framework (Google Test) +// +// This header file defines the Message class. +// +// IMPORTANT NOTE: Due to limitation of the C++ language, we have to +// leave some internal implementation details in this header file. +// They are clearly marked by comments like this: +// +// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +// +// Such code is NOT meant to be used by a user directly, and is subject +// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user +// program! + +// GOOGLETEST_CM0001 DO NOT DELETE + +#ifndef GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ +#define GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ + +#include +#include + +#include "gtest/internal/gtest-port.h" + +GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ +/* class A needs to have dll-interface to be used by clients of class B */) + +// Ensures that there is at least one operator<< in the global namespace. +// See Message& operator<<(...) below for why. +void operator<<(const testing::internal::Secret&, int); + +namespace testing { + +// The Message class works like an ostream repeater. +// +// Typical usage: +// +// 1. You stream a bunch of values to a Message object. +// It will remember the text in a stringstream. +// 2. Then you stream the Message object to an ostream. +// This causes the text in the Message to be streamed +// to the ostream. +// +// For example; +// +// testing::Message foo; +// foo << 1 << " != " << 2; +// std::cout << foo; +// +// will print "1 != 2". +// +// Message is not intended to be inherited from. In particular, its +// destructor is not virtual. +// +// Note that stringstream behaves differently in gcc and in MSVC. You +// can stream a NULL char pointer to it in the former, but not in the +// latter (it causes an access violation if you do). The Message +// class hides this difference by treating a NULL char pointer as +// "(null)". +class GTEST_API_ Message { + private: + // The type of basic IO manipulators (endl, ends, and flush) for + // narrow streams. + typedef std::ostream& (*BasicNarrowIoManip)(std::ostream&); + + public: + // Constructs an empty Message. + Message(); + + // Copy constructor. + Message(const Message& msg) : ss_(new ::std::stringstream) { // NOLINT + *ss_ << msg.GetString(); + } + + // Constructs a Message from a C-string. + explicit Message(const char* str) : ss_(new ::std::stringstream) { + *ss_ << str; + } + + // Streams a non-pointer value to this object. + template + inline Message& operator <<(const T& val) { + // Some libraries overload << for STL containers. These + // overloads are defined in the global namespace instead of ::std. + // + // C++'s symbol lookup rule (i.e. Koenig lookup) says that these + // overloads are visible in either the std namespace or the global + // namespace, but not other namespaces, including the testing + // namespace which Google Test's Message class is in. + // + // To allow STL containers (and other types that has a << operator + // defined in the global namespace) to be used in Google Test + // assertions, testing::Message must access the custom << operator + // from the global namespace. With this using declaration, + // overloads of << defined in the global namespace and those + // visible via Koenig lookup are both exposed in this function. + using ::operator <<; + *ss_ << val; + return *this; + } + + // Streams a pointer value to this object. + // + // This function is an overload of the previous one. When you + // stream a pointer to a Message, this definition will be used as it + // is more specialized. (The C++ Standard, section + // [temp.func.order].) If you stream a non-pointer, then the + // previous definition will be used. + // + // The reason for this overload is that streaming a NULL pointer to + // ostream is undefined behavior. Depending on the compiler, you + // may get "0", "(nil)", "(null)", or an access violation. To + // ensure consistent result across compilers, we always treat NULL + // as "(null)". + template + inline Message& operator <<(T* const& pointer) { // NOLINT + if (pointer == nullptr) { + *ss_ << "(null)"; + } else { + *ss_ << pointer; + } + return *this; + } + + // Since the basic IO manipulators are overloaded for both narrow + // and wide streams, we have to provide this specialized definition + // of operator <<, even though its body is the same as the + // templatized version above. Without this definition, streaming + // endl or other basic IO manipulators to Message will confuse the + // compiler. + Message& operator <<(BasicNarrowIoManip val) { + *ss_ << val; + return *this; + } + + // Instead of 1/0, we want to see true/false for bool values. + Message& operator <<(bool b) { + return *this << (b ? "true" : "false"); + } + + // These two overloads allow streaming a wide C string to a Message + // using the UTF-8 encoding. + Message& operator <<(const wchar_t* wide_c_str); + Message& operator <<(wchar_t* wide_c_str); + +#if GTEST_HAS_STD_WSTRING + // Converts the given wide string to a narrow string using the UTF-8 + // encoding, and streams the result to this Message object. + Message& operator <<(const ::std::wstring& wstr); +#endif // GTEST_HAS_STD_WSTRING + + // Gets the text streamed to this object so far as an std::string. + // Each '\0' character in the buffer is replaced with "\\0". + // + // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. + std::string GetString() const; + + private: + // We'll hold the text streamed to this object here. + const std::unique_ptr< ::std::stringstream> ss_; + + // We declare (but don't implement) this to prevent the compiler + // from implementing the assignment operator. + void operator=(const Message&); +}; + +// Streams a Message to an ostream. +inline std::ostream& operator <<(std::ostream& os, const Message& sb) { + return os << sb.GetString(); +} + +namespace internal { + +// Converts a streamable value to an std::string. A NULL pointer is +// converted to "(null)". When the input value is a ::string, +// ::std::string, ::wstring, or ::std::wstring object, each NUL +// character in it is replaced with "\\0". +template +std::string StreamableToString(const T& streamable) { + return (Message() << streamable).GetString(); +} + +} // namespace internal +} // namespace testing + +GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 + +#endif // GTEST_INCLUDE_GTEST_GTEST_MESSAGE_H_ diff --git a/include/gtest/gtest-param-test.h b/include/gtest/gtest-param-test.h new file mode 100644 index 0000000..c2e6eae --- /dev/null +++ b/include/gtest/gtest-param-test.h @@ -0,0 +1,503 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Macros and functions for implementing parameterized tests +// in Google C++ Testing and Mocking Framework (Google Test) +// +// This file is generated by a SCRIPT. DO NOT EDIT BY HAND! +// +// GOOGLETEST_CM0001 DO NOT DELETE +#ifndef GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ +#define GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ + + +// Value-parameterized tests allow you to test your code with different +// parameters without writing multiple copies of the same test. +// +// Here is how you use value-parameterized tests: + +#if 0 + +// To write value-parameterized tests, first you should define a fixture +// class. It is usually derived from testing::TestWithParam (see below for +// another inheritance scheme that's sometimes useful in more complicated +// class hierarchies), where the type of your parameter values. +// TestWithParam is itself derived from testing::Test. T can be any +// copyable type. If it's a raw pointer, you are responsible for managing the +// lifespan of the pointed values. + +class FooTest : public ::testing::TestWithParam { + // You can implement all the usual class fixture members here. +}; + +// Then, use the TEST_P macro to define as many parameterized tests +// for this fixture as you want. The _P suffix is for "parameterized" +// or "pattern", whichever you prefer to think. + +TEST_P(FooTest, DoesBlah) { + // Inside a test, access the test parameter with the GetParam() method + // of the TestWithParam class: + EXPECT_TRUE(foo.Blah(GetParam())); + ... +} + +TEST_P(FooTest, HasBlahBlah) { + ... +} + +// Finally, you can use INSTANTIATE_TEST_SUITE_P to instantiate the test +// case with any set of parameters you want. Google Test defines a number +// of functions for generating test parameters. They return what we call +// (surprise!) parameter generators. Here is a summary of them, which +// are all in the testing namespace: +// +// +// Range(begin, end [, step]) - Yields values {begin, begin+step, +// begin+step+step, ...}. The values do not +// include end. step defaults to 1. +// Values(v1, v2, ..., vN) - Yields values {v1, v2, ..., vN}. +// ValuesIn(container) - Yields values from a C-style array, an STL +// ValuesIn(begin,end) container, or an iterator range [begin, end). +// Bool() - Yields sequence {false, true}. +// Combine(g1, g2, ..., gN) - Yields all combinations (the Cartesian product +// for the math savvy) of the values generated +// by the N generators. +// +// For more details, see comments at the definitions of these functions below +// in this file. +// +// The following statement will instantiate tests from the FooTest test suite +// each with parameter values "meeny", "miny", and "moe". + +INSTANTIATE_TEST_SUITE_P(InstantiationName, + FooTest, + Values("meeny", "miny", "moe")); + +// To distinguish different instances of the pattern, (yes, you +// can instantiate it more than once) the first argument to the +// INSTANTIATE_TEST_SUITE_P macro is a prefix that will be added to the +// actual test suite name. Remember to pick unique prefixes for different +// instantiations. The tests from the instantiation above will have +// these names: +// +// * InstantiationName/FooTest.DoesBlah/0 for "meeny" +// * InstantiationName/FooTest.DoesBlah/1 for "miny" +// * InstantiationName/FooTest.DoesBlah/2 for "moe" +// * InstantiationName/FooTest.HasBlahBlah/0 for "meeny" +// * InstantiationName/FooTest.HasBlahBlah/1 for "miny" +// * InstantiationName/FooTest.HasBlahBlah/2 for "moe" +// +// You can use these names in --gtest_filter. +// +// This statement will instantiate all tests from FooTest again, each +// with parameter values "cat" and "dog": + +const char* pets[] = {"cat", "dog"}; +INSTANTIATE_TEST_SUITE_P(AnotherInstantiationName, FooTest, ValuesIn(pets)); + +// The tests from the instantiation above will have these names: +// +// * AnotherInstantiationName/FooTest.DoesBlah/0 for "cat" +// * AnotherInstantiationName/FooTest.DoesBlah/1 for "dog" +// * AnotherInstantiationName/FooTest.HasBlahBlah/0 for "cat" +// * AnotherInstantiationName/FooTest.HasBlahBlah/1 for "dog" +// +// Please note that INSTANTIATE_TEST_SUITE_P will instantiate all tests +// in the given test suite, whether their definitions come before or +// AFTER the INSTANTIATE_TEST_SUITE_P statement. +// +// Please also note that generator expressions (including parameters to the +// generators) are evaluated in InitGoogleTest(), after main() has started. +// This allows the user on one hand, to adjust generator parameters in order +// to dynamically determine a set of tests to run and on the other hand, +// give the user a chance to inspect the generated tests with Google Test +// reflection API before RUN_ALL_TESTS() is executed. +// +// You can see samples/sample7_unittest.cc and samples/sample8_unittest.cc +// for more examples. +// +// In the future, we plan to publish the API for defining new parameter +// generators. But for now this interface remains part of the internal +// implementation and is subject to change. +// +// +// A parameterized test fixture must be derived from testing::Test and from +// testing::WithParamInterface, where T is the type of the parameter +// values. Inheriting from TestWithParam satisfies that requirement because +// TestWithParam inherits from both Test and WithParamInterface. In more +// complicated hierarchies, however, it is occasionally useful to inherit +// separately from Test and WithParamInterface. For example: + +class BaseTest : public ::testing::Test { + // You can inherit all the usual members for a non-parameterized test + // fixture here. +}; + +class DerivedTest : public BaseTest, public ::testing::WithParamInterface { + // The usual test fixture members go here too. +}; + +TEST_F(BaseTest, HasFoo) { + // This is an ordinary non-parameterized test. +} + +TEST_P(DerivedTest, DoesBlah) { + // GetParam works just the same here as if you inherit from TestWithParam. + EXPECT_TRUE(foo.Blah(GetParam())); +} + +#endif // 0 + +#include +#include + +#include "gtest/internal/gtest-internal.h" +#include "gtest/internal/gtest-param-util.h" +#include "gtest/internal/gtest-port.h" + +namespace testing { + +// Functions producing parameter generators. +// +// Google Test uses these generators to produce parameters for value- +// parameterized tests. When a parameterized test suite is instantiated +// with a particular generator, Google Test creates and runs tests +// for each element in the sequence produced by the generator. +// +// In the following sample, tests from test suite FooTest are instantiated +// each three times with parameter values 3, 5, and 8: +// +// class FooTest : public TestWithParam { ... }; +// +// TEST_P(FooTest, TestThis) { +// } +// TEST_P(FooTest, TestThat) { +// } +// INSTANTIATE_TEST_SUITE_P(TestSequence, FooTest, Values(3, 5, 8)); +// + +// Range() returns generators providing sequences of values in a range. +// +// Synopsis: +// Range(start, end) +// - returns a generator producing a sequence of values {start, start+1, +// start+2, ..., }. +// Range(start, end, step) +// - returns a generator producing a sequence of values {start, start+step, +// start+step+step, ..., }. +// Notes: +// * The generated sequences never include end. For example, Range(1, 5) +// returns a generator producing a sequence {1, 2, 3, 4}. Range(1, 9, 2) +// returns a generator producing {1, 3, 5, 7}. +// * start and end must have the same type. That type may be any integral or +// floating-point type or a user defined type satisfying these conditions: +// * It must be assignable (have operator=() defined). +// * It must have operator+() (operator+(int-compatible type) for +// two-operand version). +// * It must have operator<() defined. +// Elements in the resulting sequences will also have that type. +// * Condition start < end must be satisfied in order for resulting sequences +// to contain any elements. +// +template +internal::ParamGenerator Range(T start, T end, IncrementT step) { + return internal::ParamGenerator( + new internal::RangeGenerator(start, end, step)); +} + +template +internal::ParamGenerator Range(T start, T end) { + return Range(start, end, 1); +} + +// ValuesIn() function allows generation of tests with parameters coming from +// a container. +// +// Synopsis: +// ValuesIn(const T (&array)[N]) +// - returns a generator producing sequences with elements from +// a C-style array. +// ValuesIn(const Container& container) +// - returns a generator producing sequences with elements from +// an STL-style container. +// ValuesIn(Iterator begin, Iterator end) +// - returns a generator producing sequences with elements from +// a range [begin, end) defined by a pair of STL-style iterators. These +// iterators can also be plain C pointers. +// +// Please note that ValuesIn copies the values from the containers +// passed in and keeps them to generate tests in RUN_ALL_TESTS(). +// +// Examples: +// +// This instantiates tests from test suite StringTest +// each with C-string values of "foo", "bar", and "baz": +// +// const char* strings[] = {"foo", "bar", "baz"}; +// INSTANTIATE_TEST_SUITE_P(StringSequence, StringTest, ValuesIn(strings)); +// +// This instantiates tests from test suite StlStringTest +// each with STL strings with values "a" and "b": +// +// ::std::vector< ::std::string> GetParameterStrings() { +// ::std::vector< ::std::string> v; +// v.push_back("a"); +// v.push_back("b"); +// return v; +// } +// +// INSTANTIATE_TEST_SUITE_P(CharSequence, +// StlStringTest, +// ValuesIn(GetParameterStrings())); +// +// +// This will also instantiate tests from CharTest +// each with parameter values 'a' and 'b': +// +// ::std::list GetParameterChars() { +// ::std::list list; +// list.push_back('a'); +// list.push_back('b'); +// return list; +// } +// ::std::list l = GetParameterChars(); +// INSTANTIATE_TEST_SUITE_P(CharSequence2, +// CharTest, +// ValuesIn(l.begin(), l.end())); +// +template +internal::ParamGenerator< + typename std::iterator_traits::value_type> +ValuesIn(ForwardIterator begin, ForwardIterator end) { + typedef typename std::iterator_traits::value_type ParamType; + return internal::ParamGenerator( + new internal::ValuesInIteratorRangeGenerator(begin, end)); +} + +template +internal::ParamGenerator ValuesIn(const T (&array)[N]) { + return ValuesIn(array, array + N); +} + +template +internal::ParamGenerator ValuesIn( + const Container& container) { + return ValuesIn(container.begin(), container.end()); +} + +// Values() allows generating tests from explicitly specified list of +// parameters. +// +// Synopsis: +// Values(T v1, T v2, ..., T vN) +// - returns a generator producing sequences with elements v1, v2, ..., vN. +// +// For example, this instantiates tests from test suite BarTest each +// with values "one", "two", and "three": +// +// INSTANTIATE_TEST_SUITE_P(NumSequence, +// BarTest, +// Values("one", "two", "three")); +// +// This instantiates tests from test suite BazTest each with values 1, 2, 3.5. +// The exact type of values will depend on the type of parameter in BazTest. +// +// INSTANTIATE_TEST_SUITE_P(FloatingNumbers, BazTest, Values(1, 2, 3.5)); +// +// +template +internal::ValueArray Values(T... v) { + return internal::ValueArray(std::move(v)...); +} + +// Bool() allows generating tests with parameters in a set of (false, true). +// +// Synopsis: +// Bool() +// - returns a generator producing sequences with elements {false, true}. +// +// It is useful when testing code that depends on Boolean flags. Combinations +// of multiple flags can be tested when several Bool()'s are combined using +// Combine() function. +// +// In the following example all tests in the test suite FlagDependentTest +// will be instantiated twice with parameters false and true. +// +// class FlagDependentTest : public testing::TestWithParam { +// virtual void SetUp() { +// external_flag = GetParam(); +// } +// } +// INSTANTIATE_TEST_SUITE_P(BoolSequence, FlagDependentTest, Bool()); +// +inline internal::ParamGenerator Bool() { + return Values(false, true); +} + +// Combine() allows the user to combine two or more sequences to produce +// values of a Cartesian product of those sequences' elements. +// +// Synopsis: +// Combine(gen1, gen2, ..., genN) +// - returns a generator producing sequences with elements coming from +// the Cartesian product of elements from the sequences generated by +// gen1, gen2, ..., genN. The sequence elements will have a type of +// std::tuple where T1, T2, ..., TN are the types +// of elements from sequences produces by gen1, gen2, ..., genN. +// +// Combine can have up to 10 arguments. +// +// Example: +// +// This will instantiate tests in test suite AnimalTest each one with +// the parameter values tuple("cat", BLACK), tuple("cat", WHITE), +// tuple("dog", BLACK), and tuple("dog", WHITE): +// +// enum Color { BLACK, GRAY, WHITE }; +// class AnimalTest +// : public testing::TestWithParam > {...}; +// +// TEST_P(AnimalTest, AnimalLooksNice) {...} +// +// INSTANTIATE_TEST_SUITE_P(AnimalVariations, AnimalTest, +// Combine(Values("cat", "dog"), +// Values(BLACK, WHITE))); +// +// This will instantiate tests in FlagDependentTest with all variations of two +// Boolean flags: +// +// class FlagDependentTest +// : public testing::TestWithParam > { +// virtual void SetUp() { +// // Assigns external_flag_1 and external_flag_2 values from the tuple. +// std::tie(external_flag_1, external_flag_2) = GetParam(); +// } +// }; +// +// TEST_P(FlagDependentTest, TestFeature1) { +// // Test your code using external_flag_1 and external_flag_2 here. +// } +// INSTANTIATE_TEST_SUITE_P(TwoBoolSequence, FlagDependentTest, +// Combine(Bool(), Bool())); +// +template +internal::CartesianProductHolder Combine(const Generator&... g) { + return internal::CartesianProductHolder(g...); +} + +#define TEST_P(test_suite_name, test_name) \ + class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \ + : public test_suite_name { \ + public: \ + GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {} \ + virtual void TestBody(); \ + \ + private: \ + static int AddToRegistry() { \ + ::testing::UnitTest::GetInstance() \ + ->parameterized_test_registry() \ + .GetTestSuitePatternHolder( \ + #test_suite_name, \ + ::testing::internal::CodeLocation(__FILE__, __LINE__)) \ + ->AddTestPattern( \ + GTEST_STRINGIFY_(test_suite_name), GTEST_STRINGIFY_(test_name), \ + new ::testing::internal::TestMetaFactory()); \ + return 0; \ + } \ + static int gtest_registering_dummy_ GTEST_ATTRIBUTE_UNUSED_; \ + GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \ + test_name)); \ + }; \ + int GTEST_TEST_CLASS_NAME_(test_suite_name, \ + test_name)::gtest_registering_dummy_ = \ + GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::AddToRegistry(); \ + void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody() + +// The last argument to INSTANTIATE_TEST_SUITE_P allows the user to specify +// generator and an optional function or functor that generates custom test name +// suffixes based on the test parameters. Such a function or functor should +// accept one argument of type testing::TestParamInfo, and +// return std::string. +// +// testing::PrintToStringParamName is a builtin test suffix generator that +// returns the value of testing::PrintToString(GetParam()). +// +// Note: test names must be non-empty, unique, and may only contain ASCII +// alphanumeric characters or underscore. Because PrintToString adds quotes +// to std::string and C strings, it won't work for these types. + +#define GTEST_EXPAND_(arg) arg +#define GTEST_GET_FIRST_(first, ...) first +#define GTEST_GET_SECOND_(first, second, ...) second + +#define INSTANTIATE_TEST_SUITE_P(prefix, test_suite_name, ...) \ + static ::testing::internal::ParamGenerator \ + gtest_##prefix##test_suite_name##_EvalGenerator_() { \ + return GTEST_EXPAND_(GTEST_GET_FIRST_(__VA_ARGS__, DUMMY_PARAM_)); \ + } \ + static ::std::string gtest_##prefix##test_suite_name##_EvalGenerateName_( \ + const ::testing::TestParamInfo& info) { \ + if (::testing::internal::AlwaysFalse()) { \ + ::testing::internal::TestNotEmpty(GTEST_EXPAND_(GTEST_GET_SECOND_( \ + __VA_ARGS__, \ + ::testing::internal::DefaultParamName, \ + DUMMY_PARAM_))); \ + auto t = std::make_tuple(__VA_ARGS__); \ + static_assert(std::tuple_size::value <= 2, \ + "Too Many Args!"); \ + } \ + return ((GTEST_EXPAND_(GTEST_GET_SECOND_( \ + __VA_ARGS__, \ + ::testing::internal::DefaultParamName, \ + DUMMY_PARAM_))))(info); \ + } \ + static int gtest_##prefix##test_suite_name##_dummy_ \ + GTEST_ATTRIBUTE_UNUSED_ = \ + ::testing::UnitTest::GetInstance() \ + ->parameterized_test_registry() \ + .GetTestSuitePatternHolder( \ + #test_suite_name, \ + ::testing::internal::CodeLocation(__FILE__, __LINE__)) \ + ->AddTestSuiteInstantiation( \ + #prefix, >est_##prefix##test_suite_name##_EvalGenerator_, \ + >est_##prefix##test_suite_name##_EvalGenerateName_, \ + __FILE__, __LINE__) + +// Legacy API is deprecated but still available +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ +#define INSTANTIATE_TEST_CASE_P \ + static_assert(::testing::internal::InstantiateTestCase_P_IsDeprecated(), \ + ""); \ + INSTANTIATE_TEST_SUITE_P +#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + +} // namespace testing + +#endif // GTEST_INCLUDE_GTEST_GTEST_PARAM_TEST_H_ diff --git a/include/gtest/gtest-printers.h b/include/gtest/gtest-printers.h new file mode 100644 index 0000000..56a0545 --- /dev/null +++ b/include/gtest/gtest-printers.h @@ -0,0 +1,928 @@ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +// Google Test - The Google C++ Testing and Mocking Framework +// +// This file implements a universal value printer that can print a +// value of any type T: +// +// void ::testing::internal::UniversalPrinter::Print(value, ostream_ptr); +// +// A user can teach this function how to print a class type T by +// defining either operator<<() or PrintTo() in the namespace that +// defines T. More specifically, the FIRST defined function in the +// following list will be used (assuming T is defined in namespace +// foo): +// +// 1. foo::PrintTo(const T&, ostream*) +// 2. operator<<(ostream&, const T&) defined in either foo or the +// global namespace. +// +// However if T is an STL-style container then it is printed element-wise +// unless foo::PrintTo(const T&, ostream*) is defined. Note that +// operator<<() is ignored for container types. +// +// If none of the above is defined, it will print the debug string of +// the value if it is a protocol buffer, or print the raw bytes in the +// value otherwise. +// +// To aid debugging: when T is a reference type, the address of the +// value is also printed; when T is a (const) char pointer, both the +// pointer value and the NUL-terminated string it points to are +// printed. +// +// We also provide some convenient wrappers: +// +// // Prints a value to a string. For a (const or not) char +// // pointer, the NUL-terminated string (but not the pointer) is +// // printed. +// std::string ::testing::PrintToString(const T& value); +// +// // Prints a value tersely: for a reference type, the referenced +// // value (but not the address) is printed; for a (const or not) char +// // pointer, the NUL-terminated string (but not the pointer) is +// // printed. +// void ::testing::internal::UniversalTersePrint(const T& value, ostream*); +// +// // Prints value using the type inferred by the compiler. The difference +// // from UniversalTersePrint() is that this function prints both the +// // pointer and the NUL-terminated string for a (const or not) char pointer. +// void ::testing::internal::UniversalPrint(const T& value, ostream*); +// +// // Prints the fields of a tuple tersely to a string vector, one +// // element for each field. Tuple support must be enabled in +// // gtest-port.h. +// std::vector UniversalTersePrintTupleFieldsToStrings( +// const Tuple& value); +// +// Known limitation: +// +// The print primitives print the elements of an STL-style container +// using the compiler-inferred type of *iter where iter is a +// const_iterator of the container. When const_iterator is an input +// iterator but not a forward iterator, this inferred type may not +// match value_type, and the print output may be incorrect. In +// practice, this is rarely a problem as for most containers +// const_iterator is a forward iterator. We'll fix this if there's an +// actual need for it. Note that this fix cannot rely on value_type +// being defined as many user-defined container types don't have +// value_type. + +// GOOGLETEST_CM0001 DO NOT DELETE + +#ifndef GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ +#define GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ + +#include +#include // NOLINT +#include +#include +#include +#include +#include +#include +#include "gtest/internal/gtest-internal.h" +#include "gtest/internal/gtest-port.h" + +#if GTEST_HAS_ABSL +#include "absl/strings/string_view.h" +#include "absl/types/optional.h" +#include "absl/types/variant.h" +#endif // GTEST_HAS_ABSL + +namespace testing { + +// Definitions in the 'internal' and 'internal2' name spaces are +// subject to change without notice. DO NOT USE THEM IN USER CODE! +namespace internal2 { + +// Prints the given number of bytes in the given object to the given +// ostream. +GTEST_API_ void PrintBytesInObjectTo(const unsigned char* obj_bytes, + size_t count, + ::std::ostream* os); + +// For selecting which printer to use when a given type has neither << +// nor PrintTo(). +enum TypeKind { + kProtobuf, // a protobuf type + kConvertibleToInteger, // a type implicitly convertible to BiggestInt + // (e.g. a named or unnamed enum type) +#if GTEST_HAS_ABSL + kConvertibleToStringView, // a type implicitly convertible to + // absl::string_view +#endif + kOtherType // anything else +}; + +// TypeWithoutFormatter::PrintValue(value, os) is called +// by the universal printer to print a value of type T when neither +// operator<< nor PrintTo() is defined for T, where kTypeKind is the +// "kind" of T as defined by enum TypeKind. +template +class TypeWithoutFormatter { + public: + // This default version is called when kTypeKind is kOtherType. + static void PrintValue(const T& value, ::std::ostream* os) { + PrintBytesInObjectTo( + static_cast( + reinterpret_cast(std::addressof(value))), + sizeof(value), os); + } +}; + +// We print a protobuf using its ShortDebugString() when the string +// doesn't exceed this many characters; otherwise we print it using +// DebugString() for better readability. +const size_t kProtobufOneLinerMaxLength = 50; + +template +class TypeWithoutFormatter { + public: + static void PrintValue(const T& value, ::std::ostream* os) { + std::string pretty_str = value.ShortDebugString(); + if (pretty_str.length() > kProtobufOneLinerMaxLength) { + pretty_str = "\n" + value.DebugString(); + } + *os << ("<" + pretty_str + ">"); + } +}; + +template +class TypeWithoutFormatter { + public: + // Since T has no << operator or PrintTo() but can be implicitly + // converted to BiggestInt, we print it as a BiggestInt. + // + // Most likely T is an enum type (either named or unnamed), in which + // case printing it as an integer is the desired behavior. In case + // T is not an enum, printing it as an integer is the best we can do + // given that it has no user-defined printer. + static void PrintValue(const T& value, ::std::ostream* os) { + const internal::BiggestInt kBigInt = value; + *os << kBigInt; + } +}; + +#if GTEST_HAS_ABSL +template +class TypeWithoutFormatter { + public: + // Since T has neither operator<< nor PrintTo() but can be implicitly + // converted to absl::string_view, we print it as a absl::string_view. + // + // Note: the implementation is further below, as it depends on + // internal::PrintTo symbol which is defined later in the file. + static void PrintValue(const T& value, ::std::ostream* os); +}; +#endif + +// Prints the given value to the given ostream. If the value is a +// protocol message, its debug string is printed; if it's an enum or +// of a type implicitly convertible to BiggestInt, it's printed as an +// integer; otherwise the bytes in the value are printed. This is +// what UniversalPrinter::Print() does when it knows nothing about +// type T and T has neither << operator nor PrintTo(). +// +// A user can override this behavior for a class type Foo by defining +// a << operator in the namespace where Foo is defined. +// +// We put this operator in namespace 'internal2' instead of 'internal' +// to simplify the implementation, as much code in 'internal' needs to +// use << in STL, which would conflict with our own << were it defined +// in 'internal'. +// +// Note that this operator<< takes a generic std::basic_ostream type instead of the more restricted std::ostream. If +// we define it to take an std::ostream instead, we'll get an +// "ambiguous overloads" compiler error when trying to print a type +// Foo that supports streaming to std::basic_ostream, as the compiler cannot tell whether +// operator<<(std::ostream&, const T&) or +// operator<<(std::basic_stream, const Foo&) is more +// specific. +template +::std::basic_ostream& operator<<( + ::std::basic_ostream& os, const T& x) { + TypeWithoutFormatter::value + ? kProtobuf + : std::is_convertible< + const T&, internal::BiggestInt>::value + ? kConvertibleToInteger + : +#if GTEST_HAS_ABSL + std::is_convertible< + const T&, absl::string_view>::value + ? kConvertibleToStringView + : +#endif + kOtherType)>::PrintValue(x, &os); + return os; +} + +} // namespace internal2 +} // namespace testing + +// This namespace MUST NOT BE NESTED IN ::testing, or the name look-up +// magic needed for implementing UniversalPrinter won't work. +namespace testing_internal { + +// Used to print a value that is not an STL-style container when the +// user doesn't define PrintTo() for it. +template +void DefaultPrintNonContainerTo(const T& value, ::std::ostream* os) { + // With the following statement, during unqualified name lookup, + // testing::internal2::operator<< appears as if it was declared in + // the nearest enclosing namespace that contains both + // ::testing_internal and ::testing::internal2, i.e. the global + // namespace. For more details, refer to the C++ Standard section + // 7.3.4-1 [namespace.udir]. This allows us to fall back onto + // testing::internal2::operator<< in case T doesn't come with a << + // operator. + // + // We cannot write 'using ::testing::internal2::operator<<;', which + // gcc 3.3 fails to compile due to a compiler bug. + using namespace ::testing::internal2; // NOLINT + + // Assuming T is defined in namespace foo, in the next statement, + // the compiler will consider all of: + // + // 1. foo::operator<< (thanks to Koenig look-up), + // 2. ::operator<< (as the current namespace is enclosed in ::), + // 3. testing::internal2::operator<< (thanks to the using statement above). + // + // The operator<< whose type matches T best will be picked. + // + // We deliberately allow #2 to be a candidate, as sometimes it's + // impossible to define #1 (e.g. when foo is ::std, defining + // anything in it is undefined behavior unless you are a compiler + // vendor.). + *os << value; +} + +} // namespace testing_internal + +namespace testing { +namespace internal { + +// FormatForComparison::Format(value) formats a +// value of type ToPrint that is an operand of a comparison assertion +// (e.g. ASSERT_EQ). OtherOperand is the type of the other operand in +// the comparison, and is used to help determine the best way to +// format the value. In particular, when the value is a C string +// (char pointer) and the other operand is an STL string object, we +// want to format the C string as a string, since we know it is +// compared by value with the string object. If the value is a char +// pointer but the other operand is not an STL string object, we don't +// know whether the pointer is supposed to point to a NUL-terminated +// string, and thus want to print it as a pointer to be safe. +// +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. + +// The default case. +template +class FormatForComparison { + public: + static ::std::string Format(const ToPrint& value) { + return ::testing::PrintToString(value); + } +}; + +// Array. +template +class FormatForComparison { + public: + static ::std::string Format(const ToPrint* value) { + return FormatForComparison::Format(value); + } +}; + +// By default, print C string as pointers to be safe, as we don't know +// whether they actually point to a NUL-terminated string. + +#define GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(CharType) \ + template \ + class FormatForComparison { \ + public: \ + static ::std::string Format(CharType* value) { \ + return ::testing::PrintToString(static_cast(value)); \ + } \ + } + +GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(char); +GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const char); +GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(wchar_t); +GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_(const wchar_t); + +#undef GTEST_IMPL_FORMAT_C_STRING_AS_POINTER_ + +// If a C string is compared with an STL string object, we know it's meant +// to point to a NUL-terminated string, and thus can print it as a string. + +#define GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(CharType, OtherStringType) \ + template <> \ + class FormatForComparison { \ + public: \ + static ::std::string Format(CharType* value) { \ + return ::testing::PrintToString(value); \ + } \ + } + +GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(char, ::std::string); +GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const char, ::std::string); + +#if GTEST_HAS_STD_WSTRING +GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(wchar_t, ::std::wstring); +GTEST_IMPL_FORMAT_C_STRING_AS_STRING_(const wchar_t, ::std::wstring); +#endif + +#undef GTEST_IMPL_FORMAT_C_STRING_AS_STRING_ + +// Formats a comparison assertion (e.g. ASSERT_EQ, EXPECT_LT, and etc) +// operand to be used in a failure message. The type (but not value) +// of the other operand may affect the format. This allows us to +// print a char* as a raw pointer when it is compared against another +// char* or void*, and print it as a C string when it is compared +// against an std::string object, for example. +// +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +template +std::string FormatForComparisonFailureMessage( + const T1& value, const T2& /* other_operand */) { + return FormatForComparison::Format(value); +} + +// UniversalPrinter::Print(value, ostream_ptr) prints the given +// value to the given ostream. The caller must ensure that +// 'ostream_ptr' is not NULL, or the behavior is undefined. +// +// We define UniversalPrinter as a class template (as opposed to a +// function template), as we need to partially specialize it for +// reference types, which cannot be done with function templates. +template +class UniversalPrinter; + +template +void UniversalPrint(const T& value, ::std::ostream* os); + +enum DefaultPrinterType { + kPrintContainer, + kPrintPointer, + kPrintFunctionPointer, + kPrintOther, +}; +template struct WrapPrinterType {}; + +// Used to print an STL-style container when the user doesn't define +// a PrintTo() for it. +template +void DefaultPrintTo(WrapPrinterType /* dummy */, + const C& container, ::std::ostream* os) { + const size_t kMaxCount = 32; // The maximum number of elements to print. + *os << '{'; + size_t count = 0; + for (typename C::const_iterator it = container.begin(); + it != container.end(); ++it, ++count) { + if (count > 0) { + *os << ','; + if (count == kMaxCount) { // Enough has been printed. + *os << " ..."; + break; + } + } + *os << ' '; + // We cannot call PrintTo(*it, os) here as PrintTo() doesn't + // handle *it being a native array. + internal::UniversalPrint(*it, os); + } + + if (count > 0) { + *os << ' '; + } + *os << '}'; +} + +// Used to print a pointer that is neither a char pointer nor a member +// pointer, when the user doesn't define PrintTo() for it. (A member +// variable pointer or member function pointer doesn't really point to +// a location in the address space. Their representation is +// implementation-defined. Therefore they will be printed as raw +// bytes.) +template +void DefaultPrintTo(WrapPrinterType /* dummy */, + T* p, ::std::ostream* os) { + if (p == nullptr) { + *os << "NULL"; + } else { + // T is not a function type. We just call << to print p, + // relying on ADL to pick up user-defined << for their pointer + // types, if any. + *os << p; + } +} +template +void DefaultPrintTo(WrapPrinterType /* dummy */, + T* p, ::std::ostream* os) { + if (p == nullptr) { + *os << "NULL"; + } else { + // T is a function type, so '*os << p' doesn't do what we want + // (it just prints p as bool). We want to print p as a const + // void*. + *os << reinterpret_cast(p); + } +} + +// Used to print a non-container, non-pointer value when the user +// doesn't define PrintTo() for it. +template +void DefaultPrintTo(WrapPrinterType /* dummy */, + const T& value, ::std::ostream* os) { + ::testing_internal::DefaultPrintNonContainerTo(value, os); +} + +// Prints the given value using the << operator if it has one; +// otherwise prints the bytes in it. This is what +// UniversalPrinter::Print() does when PrintTo() is not specialized +// or overloaded for type T. +// +// A user can override this behavior for a class type Foo by defining +// an overload of PrintTo() in the namespace where Foo is defined. We +// give the user this option as sometimes defining a << operator for +// Foo is not desirable (e.g. the coding style may prevent doing it, +// or there is already a << operator but it doesn't do what the user +// wants). +template +void PrintTo(const T& value, ::std::ostream* os) { + // DefaultPrintTo() is overloaded. The type of its first argument + // determines which version will be picked. + // + // Note that we check for container types here, prior to we check + // for protocol message types in our operator<<. The rationale is: + // + // For protocol messages, we want to give people a chance to + // override Google Mock's format by defining a PrintTo() or + // operator<<. For STL containers, other formats can be + // incompatible with Google Mock's format for the container + // elements; therefore we check for container types here to ensure + // that our format is used. + // + // Note that MSVC and clang-cl do allow an implicit conversion from + // pointer-to-function to pointer-to-object, but clang-cl warns on it. + // So don't use ImplicitlyConvertible if it can be helped since it will + // cause this warning, and use a separate overload of DefaultPrintTo for + // function pointers so that the `*os << p` in the object pointer overload + // doesn't cause that warning either. + DefaultPrintTo( + WrapPrinterType < + (sizeof(IsContainerTest(0)) == sizeof(IsContainer)) && + !IsRecursiveContainer::value + ? kPrintContainer + : !std::is_pointer::value + ? kPrintOther + : std::is_function::type>::value + ? kPrintFunctionPointer + : kPrintPointer > (), + value, os); +} + +// The following list of PrintTo() overloads tells +// UniversalPrinter::Print() how to print standard types (built-in +// types, strings, plain arrays, and pointers). + +// Overloads for various char types. +GTEST_API_ void PrintTo(unsigned char c, ::std::ostream* os); +GTEST_API_ void PrintTo(signed char c, ::std::ostream* os); +inline void PrintTo(char c, ::std::ostream* os) { + // When printing a plain char, we always treat it as unsigned. This + // way, the output won't be affected by whether the compiler thinks + // char is signed or not. + PrintTo(static_cast(c), os); +} + +// Overloads for other simple built-in types. +inline void PrintTo(bool x, ::std::ostream* os) { + *os << (x ? "true" : "false"); +} + +// Overload for wchar_t type. +// Prints a wchar_t as a symbol if it is printable or as its internal +// code otherwise and also as its decimal code (except for L'\0'). +// The L'\0' char is printed as "L'\\0'". The decimal code is printed +// as signed integer when wchar_t is implemented by the compiler +// as a signed type and is printed as an unsigned integer when wchar_t +// is implemented as an unsigned type. +GTEST_API_ void PrintTo(wchar_t wc, ::std::ostream* os); + +// Overloads for C strings. +GTEST_API_ void PrintTo(const char* s, ::std::ostream* os); +inline void PrintTo(char* s, ::std::ostream* os) { + PrintTo(ImplicitCast_(s), os); +} + +// signed/unsigned char is often used for representing binary data, so +// we print pointers to it as void* to be safe. +inline void PrintTo(const signed char* s, ::std::ostream* os) { + PrintTo(ImplicitCast_(s), os); +} +inline void PrintTo(signed char* s, ::std::ostream* os) { + PrintTo(ImplicitCast_(s), os); +} +inline void PrintTo(const unsigned char* s, ::std::ostream* os) { + PrintTo(ImplicitCast_(s), os); +} +inline void PrintTo(unsigned char* s, ::std::ostream* os) { + PrintTo(ImplicitCast_(s), os); +} + +// MSVC can be configured to define wchar_t as a typedef of unsigned +// short. It defines _NATIVE_WCHAR_T_DEFINED when wchar_t is a native +// type. When wchar_t is a typedef, defining an overload for const +// wchar_t* would cause unsigned short* be printed as a wide string, +// possibly causing invalid memory accesses. +#if !defined(_MSC_VER) || defined(_NATIVE_WCHAR_T_DEFINED) +// Overloads for wide C strings +GTEST_API_ void PrintTo(const wchar_t* s, ::std::ostream* os); +inline void PrintTo(wchar_t* s, ::std::ostream* os) { + PrintTo(ImplicitCast_(s), os); +} +#endif + +// Overload for C arrays. Multi-dimensional arrays are printed +// properly. + +// Prints the given number of elements in an array, without printing +// the curly braces. +template +void PrintRawArrayTo(const T a[], size_t count, ::std::ostream* os) { + UniversalPrint(a[0], os); + for (size_t i = 1; i != count; i++) { + *os << ", "; + UniversalPrint(a[i], os); + } +} + +// Overloads for ::std::string. +GTEST_API_ void PrintStringTo(const ::std::string&s, ::std::ostream* os); +inline void PrintTo(const ::std::string& s, ::std::ostream* os) { + PrintStringTo(s, os); +} + +// Overloads for ::std::wstring. +#if GTEST_HAS_STD_WSTRING +GTEST_API_ void PrintWideStringTo(const ::std::wstring&s, ::std::ostream* os); +inline void PrintTo(const ::std::wstring& s, ::std::ostream* os) { + PrintWideStringTo(s, os); +} +#endif // GTEST_HAS_STD_WSTRING + +#if GTEST_HAS_ABSL +// Overload for absl::string_view. +inline void PrintTo(absl::string_view sp, ::std::ostream* os) { + PrintTo(::std::string(sp), os); +} +#endif // GTEST_HAS_ABSL + +inline void PrintTo(std::nullptr_t, ::std::ostream* os) { *os << "(nullptr)"; } + +template +void PrintTo(std::reference_wrapper ref, ::std::ostream* os) { + UniversalPrinter::Print(ref.get(), os); +} + +// Helper function for printing a tuple. T must be instantiated with +// a tuple type. +template +void PrintTupleTo(const T&, std::integral_constant, + ::std::ostream*) {} + +template +void PrintTupleTo(const T& t, std::integral_constant, + ::std::ostream* os) { + PrintTupleTo(t, std::integral_constant(), os); + GTEST_INTENTIONAL_CONST_COND_PUSH_() + if (I > 1) { + GTEST_INTENTIONAL_CONST_COND_POP_() + *os << ", "; + } + UniversalPrinter::type>::Print( + std::get(t), os); +} + +template +void PrintTo(const ::std::tuple& t, ::std::ostream* os) { + *os << "("; + PrintTupleTo(t, std::integral_constant(), os); + *os << ")"; +} + +// Overload for std::pair. +template +void PrintTo(const ::std::pair& value, ::std::ostream* os) { + *os << '('; + // We cannot use UniversalPrint(value.first, os) here, as T1 may be + // a reference type. The same for printing value.second. + UniversalPrinter::Print(value.first, os); + *os << ", "; + UniversalPrinter::Print(value.second, os); + *os << ')'; +} + +// Implements printing a non-reference type T by letting the compiler +// pick the right overload of PrintTo() for T. +template +class UniversalPrinter { + public: + // MSVC warns about adding const to a function type, so we want to + // disable the warning. + GTEST_DISABLE_MSC_WARNINGS_PUSH_(4180) + + // Note: we deliberately don't call this PrintTo(), as that name + // conflicts with ::testing::internal::PrintTo in the body of the + // function. + static void Print(const T& value, ::std::ostream* os) { + // By default, ::testing::internal::PrintTo() is used for printing + // the value. + // + // Thanks to Koenig look-up, if T is a class and has its own + // PrintTo() function defined in its namespace, that function will + // be visible here. Since it is more specific than the generic ones + // in ::testing::internal, it will be picked by the compiler in the + // following statement - exactly what we want. + PrintTo(value, os); + } + + GTEST_DISABLE_MSC_WARNINGS_POP_() +}; + +#if GTEST_HAS_ABSL + +// Printer for absl::optional + +template +class UniversalPrinter<::absl::optional> { + public: + static void Print(const ::absl::optional& value, ::std::ostream* os) { + *os << '('; + if (!value) { + *os << "nullopt"; + } else { + UniversalPrint(*value, os); + } + *os << ')'; + } +}; + +// Printer for absl::variant + +template +class UniversalPrinter<::absl::variant> { + public: + static void Print(const ::absl::variant& value, ::std::ostream* os) { + *os << '('; + absl::visit(Visitor{os}, value); + *os << ')'; + } + + private: + struct Visitor { + template + void operator()(const U& u) const { + *os << "'" << GetTypeName() << "' with value "; + UniversalPrint(u, os); + } + ::std::ostream* os; + }; +}; + +#endif // GTEST_HAS_ABSL + +// UniversalPrintArray(begin, len, os) prints an array of 'len' +// elements, starting at address 'begin'. +template +void UniversalPrintArray(const T* begin, size_t len, ::std::ostream* os) { + if (len == 0) { + *os << "{}"; + } else { + *os << "{ "; + const size_t kThreshold = 18; + const size_t kChunkSize = 8; + // If the array has more than kThreshold elements, we'll have to + // omit some details by printing only the first and the last + // kChunkSize elements. + if (len <= kThreshold) { + PrintRawArrayTo(begin, len, os); + } else { + PrintRawArrayTo(begin, kChunkSize, os); + *os << ", ..., "; + PrintRawArrayTo(begin + len - kChunkSize, kChunkSize, os); + } + *os << " }"; + } +} +// This overload prints a (const) char array compactly. +GTEST_API_ void UniversalPrintArray( + const char* begin, size_t len, ::std::ostream* os); + +// This overload prints a (const) wchar_t array compactly. +GTEST_API_ void UniversalPrintArray( + const wchar_t* begin, size_t len, ::std::ostream* os); + +// Implements printing an array type T[N]. +template +class UniversalPrinter { + public: + // Prints the given array, omitting some elements when there are too + // many. + static void Print(const T (&a)[N], ::std::ostream* os) { + UniversalPrintArray(a, N, os); + } +}; + +// Implements printing a reference type T&. +template +class UniversalPrinter { + public: + // MSVC warns about adding const to a function type, so we want to + // disable the warning. + GTEST_DISABLE_MSC_WARNINGS_PUSH_(4180) + + static void Print(const T& value, ::std::ostream* os) { + // Prints the address of the value. We use reinterpret_cast here + // as static_cast doesn't compile when T is a function type. + *os << "@" << reinterpret_cast(&value) << " "; + + // Then prints the value itself. + UniversalPrint(value, os); + } + + GTEST_DISABLE_MSC_WARNINGS_POP_() +}; + +// Prints a value tersely: for a reference type, the referenced value +// (but not the address) is printed; for a (const) char pointer, the +// NUL-terminated string (but not the pointer) is printed. + +template +class UniversalTersePrinter { + public: + static void Print(const T& value, ::std::ostream* os) { + UniversalPrint(value, os); + } +}; +template +class UniversalTersePrinter { + public: + static void Print(const T& value, ::std::ostream* os) { + UniversalPrint(value, os); + } +}; +template +class UniversalTersePrinter { + public: + static void Print(const T (&value)[N], ::std::ostream* os) { + UniversalPrinter::Print(value, os); + } +}; +template <> +class UniversalTersePrinter { + public: + static void Print(const char* str, ::std::ostream* os) { + if (str == nullptr) { + *os << "NULL"; + } else { + UniversalPrint(std::string(str), os); + } + } +}; +template <> +class UniversalTersePrinter { + public: + static void Print(char* str, ::std::ostream* os) { + UniversalTersePrinter::Print(str, os); + } +}; + +#if GTEST_HAS_STD_WSTRING +template <> +class UniversalTersePrinter { + public: + static void Print(const wchar_t* str, ::std::ostream* os) { + if (str == nullptr) { + *os << "NULL"; + } else { + UniversalPrint(::std::wstring(str), os); + } + } +}; +#endif + +template <> +class UniversalTersePrinter { + public: + static void Print(wchar_t* str, ::std::ostream* os) { + UniversalTersePrinter::Print(str, os); + } +}; + +template +void UniversalTersePrint(const T& value, ::std::ostream* os) { + UniversalTersePrinter::Print(value, os); +} + +// Prints a value using the type inferred by the compiler. The +// difference between this and UniversalTersePrint() is that for a +// (const) char pointer, this prints both the pointer and the +// NUL-terminated string. +template +void UniversalPrint(const T& value, ::std::ostream* os) { + // A workarond for the bug in VC++ 7.1 that prevents us from instantiating + // UniversalPrinter with T directly. + typedef T T1; + UniversalPrinter::Print(value, os); +} + +typedef ::std::vector< ::std::string> Strings; + + // Tersely prints the first N fields of a tuple to a string vector, + // one element for each field. +template +void TersePrintPrefixToStrings(const Tuple&, std::integral_constant, + Strings*) {} +template +void TersePrintPrefixToStrings(const Tuple& t, + std::integral_constant, + Strings* strings) { + TersePrintPrefixToStrings(t, std::integral_constant(), + strings); + ::std::stringstream ss; + UniversalTersePrint(std::get(t), &ss); + strings->push_back(ss.str()); +} + +// Prints the fields of a tuple tersely to a string vector, one +// element for each field. See the comment before +// UniversalTersePrint() for how we define "tersely". +template +Strings UniversalTersePrintTupleFieldsToStrings(const Tuple& value) { + Strings result; + TersePrintPrefixToStrings( + value, std::integral_constant::value>(), + &result); + return result; +} + +} // namespace internal + +#if GTEST_HAS_ABSL +namespace internal2 { +template +void TypeWithoutFormatter::PrintValue( + const T& value, ::std::ostream* os) { + internal::PrintTo(absl::string_view(value), os); +} +} // namespace internal2 +#endif + +template +::std::string PrintToString(const T& value) { + ::std::stringstream ss; + internal::UniversalTersePrinter::Print(value, &ss); + return ss.str(); +} + +} // namespace testing + +// Include any custom printer added by the local installation. +// We must include this header at the end to make sure it can use the +// declarations from this file. +#include "gtest/internal/custom/gtest-printers.h" + +#endif // GTEST_INCLUDE_GTEST_GTEST_PRINTERS_H_ diff --git a/include/gtest/gtest-spi.h b/include/gtest/gtest-spi.h new file mode 100644 index 0000000..aa38870 --- /dev/null +++ b/include/gtest/gtest-spi.h @@ -0,0 +1,238 @@ +// Copyright 2007, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +// Utilities for testing Google Test itself and code that uses Google Test +// (e.g. frameworks built on top of Google Test). + +// GOOGLETEST_CM0004 DO NOT DELETE + +#ifndef GTEST_INCLUDE_GTEST_GTEST_SPI_H_ +#define GTEST_INCLUDE_GTEST_GTEST_SPI_H_ + +#include "gtest/gtest.h" + +GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ +/* class A needs to have dll-interface to be used by clients of class B */) + +namespace testing { + +// This helper class can be used to mock out Google Test failure reporting +// so that we can test Google Test or code that builds on Google Test. +// +// An object of this class appends a TestPartResult object to the +// TestPartResultArray object given in the constructor whenever a Google Test +// failure is reported. It can either intercept only failures that are +// generated in the same thread that created this object or it can intercept +// all generated failures. The scope of this mock object can be controlled with +// the second argument to the two arguments constructor. +class GTEST_API_ ScopedFakeTestPartResultReporter + : public TestPartResultReporterInterface { + public: + // The two possible mocking modes of this object. + enum InterceptMode { + INTERCEPT_ONLY_CURRENT_THREAD, // Intercepts only thread local failures. + INTERCEPT_ALL_THREADS // Intercepts all failures. + }; + + // The c'tor sets this object as the test part result reporter used + // by Google Test. The 'result' parameter specifies where to report the + // results. This reporter will only catch failures generated in the current + // thread. DEPRECATED + explicit ScopedFakeTestPartResultReporter(TestPartResultArray* result); + + // Same as above, but you can choose the interception scope of this object. + ScopedFakeTestPartResultReporter(InterceptMode intercept_mode, + TestPartResultArray* result); + + // The d'tor restores the previous test part result reporter. + ~ScopedFakeTestPartResultReporter() override; + + // Appends the TestPartResult object to the TestPartResultArray + // received in the constructor. + // + // This method is from the TestPartResultReporterInterface + // interface. + void ReportTestPartResult(const TestPartResult& result) override; + + private: + void Init(); + + const InterceptMode intercept_mode_; + TestPartResultReporterInterface* old_reporter_; + TestPartResultArray* const result_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedFakeTestPartResultReporter); +}; + +namespace internal { + +// A helper class for implementing EXPECT_FATAL_FAILURE() and +// EXPECT_NONFATAL_FAILURE(). Its destructor verifies that the given +// TestPartResultArray contains exactly one failure that has the given +// type and contains the given substring. If that's not the case, a +// non-fatal failure will be generated. +class GTEST_API_ SingleFailureChecker { + public: + // The constructor remembers the arguments. + SingleFailureChecker(const TestPartResultArray* results, + TestPartResult::Type type, const std::string& substr); + ~SingleFailureChecker(); + private: + const TestPartResultArray* const results_; + const TestPartResult::Type type_; + const std::string substr_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(SingleFailureChecker); +}; + +} // namespace internal + +} // namespace testing + +GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 + +// A set of macros for testing Google Test assertions or code that's expected +// to generate Google Test fatal failures. It verifies that the given +// statement will cause exactly one fatal Google Test failure with 'substr' +// being part of the failure message. +// +// There are two different versions of this macro. EXPECT_FATAL_FAILURE only +// affects and considers failures generated in the current thread and +// EXPECT_FATAL_FAILURE_ON_ALL_THREADS does the same but for all threads. +// +// The verification of the assertion is done correctly even when the statement +// throws an exception or aborts the current function. +// +// Known restrictions: +// - 'statement' cannot reference local non-static variables or +// non-static members of the current object. +// - 'statement' cannot return a value. +// - You cannot stream a failure message to this macro. +// +// Note that even though the implementations of the following two +// macros are much alike, we cannot refactor them to use a common +// helper macro, due to some peculiarity in how the preprocessor +// works. The AcceptsMacroThatExpandsToUnprotectedComma test in +// gtest_unittest.cc will fail to compile if we do that. +#define EXPECT_FATAL_FAILURE(statement, substr) \ + do { \ + class GTestExpectFatalFailureHelper {\ + public:\ + static void Execute() { statement; }\ + };\ + ::testing::TestPartResultArray gtest_failures;\ + ::testing::internal::SingleFailureChecker gtest_checker(\ + >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ + {\ + ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ + ::testing::ScopedFakeTestPartResultReporter:: \ + INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ + GTestExpectFatalFailureHelper::Execute();\ + }\ + } while (::testing::internal::AlwaysFalse()) + +#define EXPECT_FATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ + do { \ + class GTestExpectFatalFailureHelper {\ + public:\ + static void Execute() { statement; }\ + };\ + ::testing::TestPartResultArray gtest_failures;\ + ::testing::internal::SingleFailureChecker gtest_checker(\ + >est_failures, ::testing::TestPartResult::kFatalFailure, (substr));\ + {\ + ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ + ::testing::ScopedFakeTestPartResultReporter:: \ + INTERCEPT_ALL_THREADS, >est_failures);\ + GTestExpectFatalFailureHelper::Execute();\ + }\ + } while (::testing::internal::AlwaysFalse()) + +// A macro for testing Google Test assertions or code that's expected to +// generate Google Test non-fatal failures. It asserts that the given +// statement will cause exactly one non-fatal Google Test failure with 'substr' +// being part of the failure message. +// +// There are two different versions of this macro. EXPECT_NONFATAL_FAILURE only +// affects and considers failures generated in the current thread and +// EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS does the same but for all threads. +// +// 'statement' is allowed to reference local variables and members of +// the current object. +// +// The verification of the assertion is done correctly even when the statement +// throws an exception or aborts the current function. +// +// Known restrictions: +// - You cannot stream a failure message to this macro. +// +// Note that even though the implementations of the following two +// macros are much alike, we cannot refactor them to use a common +// helper macro, due to some peculiarity in how the preprocessor +// works. If we do that, the code won't compile when the user gives +// EXPECT_NONFATAL_FAILURE() a statement that contains a macro that +// expands to code containing an unprotected comma. The +// AcceptsMacroThatExpandsToUnprotectedComma test in gtest_unittest.cc +// catches that. +// +// For the same reason, we have to write +// if (::testing::internal::AlwaysTrue()) { statement; } +// instead of +// GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) +// to avoid an MSVC warning on unreachable code. +#define EXPECT_NONFATAL_FAILURE(statement, substr) \ + do {\ + ::testing::TestPartResultArray gtest_failures;\ + ::testing::internal::SingleFailureChecker gtest_checker(\ + >est_failures, ::testing::TestPartResult::kNonFatalFailure, \ + (substr));\ + {\ + ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ + ::testing::ScopedFakeTestPartResultReporter:: \ + INTERCEPT_ONLY_CURRENT_THREAD, >est_failures);\ + if (::testing::internal::AlwaysTrue()) { statement; }\ + }\ + } while (::testing::internal::AlwaysFalse()) + +#define EXPECT_NONFATAL_FAILURE_ON_ALL_THREADS(statement, substr) \ + do {\ + ::testing::TestPartResultArray gtest_failures;\ + ::testing::internal::SingleFailureChecker gtest_checker(\ + >est_failures, ::testing::TestPartResult::kNonFatalFailure, \ + (substr));\ + {\ + ::testing::ScopedFakeTestPartResultReporter gtest_reporter(\ + ::testing::ScopedFakeTestPartResultReporter::INTERCEPT_ALL_THREADS, \ + >est_failures);\ + if (::testing::internal::AlwaysTrue()) { statement; }\ + }\ + } while (::testing::internal::AlwaysFalse()) + +#endif // GTEST_INCLUDE_GTEST_GTEST_SPI_H_ diff --git a/include/gtest/gtest-test-part.h b/include/gtest/gtest-test-part.h new file mode 100644 index 0000000..05a7985 --- /dev/null +++ b/include/gtest/gtest-test-part.h @@ -0,0 +1,184 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// GOOGLETEST_CM0001 DO NOT DELETE + +#ifndef GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ +#define GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ + +#include +#include +#include "gtest/internal/gtest-internal.h" +#include "gtest/internal/gtest-string.h" + +GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ +/* class A needs to have dll-interface to be used by clients of class B */) + +namespace testing { + +// A copyable object representing the result of a test part (i.e. an +// assertion or an explicit FAIL(), ADD_FAILURE(), or SUCCESS()). +// +// Don't inherit from TestPartResult as its destructor is not virtual. +class GTEST_API_ TestPartResult { + public: + // The possible outcomes of a test part (i.e. an assertion or an + // explicit SUCCEED(), FAIL(), or ADD_FAILURE()). + enum Type { + kSuccess, // Succeeded. + kNonFatalFailure, // Failed but the test can continue. + kFatalFailure, // Failed and the test should be terminated. + kSkip // Skipped. + }; + + // C'tor. TestPartResult does NOT have a default constructor. + // Always use this constructor (with parameters) to create a + // TestPartResult object. + TestPartResult(Type a_type, const char* a_file_name, int a_line_number, + const char* a_message) + : type_(a_type), + file_name_(a_file_name == nullptr ? "" : a_file_name), + line_number_(a_line_number), + summary_(ExtractSummary(a_message)), + message_(a_message) {} + + // Gets the outcome of the test part. + Type type() const { return type_; } + + // Gets the name of the source file where the test part took place, or + // NULL if it's unknown. + const char* file_name() const { + return file_name_.empty() ? nullptr : file_name_.c_str(); + } + + // Gets the line in the source file where the test part took place, + // or -1 if it's unknown. + int line_number() const { return line_number_; } + + // Gets the summary of the failure message. + const char* summary() const { return summary_.c_str(); } + + // Gets the message associated with the test part. + const char* message() const { return message_.c_str(); } + + // Returns true if and only if the test part was skipped. + bool skipped() const { return type_ == kSkip; } + + // Returns true if and only if the test part passed. + bool passed() const { return type_ == kSuccess; } + + // Returns true if and only if the test part non-fatally failed. + bool nonfatally_failed() const { return type_ == kNonFatalFailure; } + + // Returns true if and only if the test part fatally failed. + bool fatally_failed() const { return type_ == kFatalFailure; } + + // Returns true if and only if the test part failed. + bool failed() const { return fatally_failed() || nonfatally_failed(); } + + private: + Type type_; + + // Gets the summary of the failure message by omitting the stack + // trace in it. + static std::string ExtractSummary(const char* message); + + // The name of the source file where the test part took place, or + // "" if the source file is unknown. + std::string file_name_; + // The line in the source file where the test part took place, or -1 + // if the line number is unknown. + int line_number_; + std::string summary_; // The test failure summary. + std::string message_; // The test failure message. +}; + +// Prints a TestPartResult object. +std::ostream& operator<<(std::ostream& os, const TestPartResult& result); + +// An array of TestPartResult objects. +// +// Don't inherit from TestPartResultArray as its destructor is not +// virtual. +class GTEST_API_ TestPartResultArray { + public: + TestPartResultArray() {} + + // Appends the given TestPartResult to the array. + void Append(const TestPartResult& result); + + // Returns the TestPartResult at the given index (0-based). + const TestPartResult& GetTestPartResult(int index) const; + + // Returns the number of TestPartResult objects in the array. + int size() const; + + private: + std::vector array_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(TestPartResultArray); +}; + +// This interface knows how to report a test part result. +class GTEST_API_ TestPartResultReporterInterface { + public: + virtual ~TestPartResultReporterInterface() {} + + virtual void ReportTestPartResult(const TestPartResult& result) = 0; +}; + +namespace internal { + +// This helper class is used by {ASSERT|EXPECT}_NO_FATAL_FAILURE to check if a +// statement generates new fatal failures. To do so it registers itself as the +// current test part result reporter. Besides checking if fatal failures were +// reported, it only delegates the reporting to the former result reporter. +// The original result reporter is restored in the destructor. +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +class GTEST_API_ HasNewFatalFailureHelper + : public TestPartResultReporterInterface { + public: + HasNewFatalFailureHelper(); + ~HasNewFatalFailureHelper() override; + void ReportTestPartResult(const TestPartResult& result) override; + bool has_new_fatal_failure() const { return has_new_fatal_failure_; } + private: + bool has_new_fatal_failure_; + TestPartResultReporterInterface* original_reporter_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(HasNewFatalFailureHelper); +}; + +} // namespace internal + +} // namespace testing + +GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 + +#endif // GTEST_INCLUDE_GTEST_GTEST_TEST_PART_H_ diff --git a/include/gtest/gtest-typed-test.h b/include/gtest/gtest-typed-test.h new file mode 100644 index 0000000..095ce05 --- /dev/null +++ b/include/gtest/gtest-typed-test.h @@ -0,0 +1,330 @@ +// Copyright 2008 Google Inc. +// All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +// GOOGLETEST_CM0001 DO NOT DELETE + +#ifndef GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ +#define GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ + +// This header implements typed tests and type-parameterized tests. + +// Typed (aka type-driven) tests repeat the same test for types in a +// list. You must know which types you want to test with when writing +// typed tests. Here's how you do it: + +#if 0 + +// First, define a fixture class template. It should be parameterized +// by a type. Remember to derive it from testing::Test. +template +class FooTest : public testing::Test { + public: + ... + typedef std::list List; + static T shared_; + T value_; +}; + +// Next, associate a list of types with the test suite, which will be +// repeated for each type in the list. The typedef is necessary for +// the macro to parse correctly. +typedef testing::Types MyTypes; +TYPED_TEST_SUITE(FooTest, MyTypes); + +// If the type list contains only one type, you can write that type +// directly without Types<...>: +// TYPED_TEST_SUITE(FooTest, int); + +// Then, use TYPED_TEST() instead of TEST_F() to define as many typed +// tests for this test suite as you want. +TYPED_TEST(FooTest, DoesBlah) { + // Inside a test, refer to the special name TypeParam to get the type + // parameter. Since we are inside a derived class template, C++ requires + // us to visit the members of FooTest via 'this'. + TypeParam n = this->value_; + + // To visit static members of the fixture, add the TestFixture:: + // prefix. + n += TestFixture::shared_; + + // To refer to typedefs in the fixture, add the "typename + // TestFixture::" prefix. + typename TestFixture::List values; + values.push_back(n); + ... +} + +TYPED_TEST(FooTest, HasPropertyA) { ... } + +// TYPED_TEST_SUITE takes an optional third argument which allows to specify a +// class that generates custom test name suffixes based on the type. This should +// be a class which has a static template function GetName(int index) returning +// a string for each type. The provided integer index equals the index of the +// type in the provided type list. In many cases the index can be ignored. +// +// For example: +// class MyTypeNames { +// public: +// template +// static std::string GetName(int) { +// if (std::is_same()) return "char"; +// if (std::is_same()) return "int"; +// if (std::is_same()) return "unsignedInt"; +// } +// }; +// TYPED_TEST_SUITE(FooTest, MyTypes, MyTypeNames); + +#endif // 0 + +// Type-parameterized tests are abstract test patterns parameterized +// by a type. Compared with typed tests, type-parameterized tests +// allow you to define the test pattern without knowing what the type +// parameters are. The defined pattern can be instantiated with +// different types any number of times, in any number of translation +// units. +// +// If you are designing an interface or concept, you can define a +// suite of type-parameterized tests to verify properties that any +// valid implementation of the interface/concept should have. Then, +// each implementation can easily instantiate the test suite to verify +// that it conforms to the requirements, without having to write +// similar tests repeatedly. Here's an example: + +#if 0 + +// First, define a fixture class template. It should be parameterized +// by a type. Remember to derive it from testing::Test. +template +class FooTest : public testing::Test { + ... +}; + +// Next, declare that you will define a type-parameterized test suite +// (the _P suffix is for "parameterized" or "pattern", whichever you +// prefer): +TYPED_TEST_SUITE_P(FooTest); + +// Then, use TYPED_TEST_P() to define as many type-parameterized tests +// for this type-parameterized test suite as you want. +TYPED_TEST_P(FooTest, DoesBlah) { + // Inside a test, refer to TypeParam to get the type parameter. + TypeParam n = 0; + ... +} + +TYPED_TEST_P(FooTest, HasPropertyA) { ... } + +// Now the tricky part: you need to register all test patterns before +// you can instantiate them. The first argument of the macro is the +// test suite name; the rest are the names of the tests in this test +// case. +REGISTER_TYPED_TEST_SUITE_P(FooTest, + DoesBlah, HasPropertyA); + +// Finally, you are free to instantiate the pattern with the types you +// want. If you put the above code in a header file, you can #include +// it in multiple C++ source files and instantiate it multiple times. +// +// To distinguish different instances of the pattern, the first +// argument to the INSTANTIATE_* macro is a prefix that will be added +// to the actual test suite name. Remember to pick unique prefixes for +// different instances. +typedef testing::Types MyTypes; +INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes); + +// If the type list contains only one type, you can write that type +// directly without Types<...>: +// INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, int); +// +// Similar to the optional argument of TYPED_TEST_SUITE above, +// INSTANTIATE_TEST_SUITE_P takes an optional fourth argument which allows to +// generate custom names. +// INSTANTIATE_TYPED_TEST_SUITE_P(My, FooTest, MyTypes, MyTypeNames); + +#endif // 0 + +#include "gtest/internal/gtest-port.h" +#include "gtest/internal/gtest-type-util.h" + +// Implements typed tests. + +#if GTEST_HAS_TYPED_TEST + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// Expands to the name of the typedef for the type parameters of the +// given test suite. +#define GTEST_TYPE_PARAMS_(TestSuiteName) gtest_type_params_##TestSuiteName##_ + +// Expands to the name of the typedef for the NameGenerator, responsible for +// creating the suffixes of the name. +#define GTEST_NAME_GENERATOR_(TestSuiteName) \ + gtest_type_params_##TestSuiteName##_NameGenerator + +#define TYPED_TEST_SUITE(CaseName, Types, ...) \ + typedef ::testing::internal::TypeList::type GTEST_TYPE_PARAMS_( \ + CaseName); \ + typedef ::testing::internal::NameGeneratorSelector<__VA_ARGS__>::type \ + GTEST_NAME_GENERATOR_(CaseName) + +# define TYPED_TEST(CaseName, TestName) \ + template \ + class GTEST_TEST_CLASS_NAME_(CaseName, TestName) \ + : public CaseName { \ + private: \ + typedef CaseName TestFixture; \ + typedef gtest_TypeParam_ TypeParam; \ + virtual void TestBody(); \ + }; \ + static bool gtest_##CaseName##_##TestName##_registered_ \ + GTEST_ATTRIBUTE_UNUSED_ = \ + ::testing::internal::TypeParameterizedTest< \ + CaseName, \ + ::testing::internal::TemplateSel, \ + GTEST_TYPE_PARAMS_( \ + CaseName)>::Register("", \ + ::testing::internal::CodeLocation( \ + __FILE__, __LINE__), \ + #CaseName, #TestName, 0, \ + ::testing::internal::GenerateNames< \ + GTEST_NAME_GENERATOR_(CaseName), \ + GTEST_TYPE_PARAMS_(CaseName)>()); \ + template \ + void GTEST_TEST_CLASS_NAME_(CaseName, \ + TestName)::TestBody() + +// Legacy API is deprecated but still available +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ +#define TYPED_TEST_CASE \ + static_assert(::testing::internal::TypedTestCaseIsDeprecated(), ""); \ + TYPED_TEST_SUITE +#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + +#endif // GTEST_HAS_TYPED_TEST + +// Implements type-parameterized tests. + +#if GTEST_HAS_TYPED_TEST_P + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// Expands to the namespace name that the type-parameterized tests for +// the given type-parameterized test suite are defined in. The exact +// name of the namespace is subject to change without notice. +#define GTEST_SUITE_NAMESPACE_(TestSuiteName) gtest_suite_##TestSuiteName##_ + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// Expands to the name of the variable used to remember the names of +// the defined tests in the given test suite. +#define GTEST_TYPED_TEST_SUITE_P_STATE_(TestSuiteName) \ + gtest_typed_test_suite_p_state_##TestSuiteName##_ + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE DIRECTLY. +// +// Expands to the name of the variable used to remember the names of +// the registered tests in the given test suite. +#define GTEST_REGISTERED_TEST_NAMES_(TestSuiteName) \ + gtest_registered_test_names_##TestSuiteName##_ + +// The variables defined in the type-parameterized test macros are +// static as typically these macros are used in a .h file that can be +// #included in multiple translation units linked together. +#define TYPED_TEST_SUITE_P(SuiteName) \ + static ::testing::internal::TypedTestSuitePState \ + GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName) + +// Legacy API is deprecated but still available +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ +#define TYPED_TEST_CASE_P \ + static_assert(::testing::internal::TypedTestCase_P_IsDeprecated(), ""); \ + TYPED_TEST_SUITE_P +#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + +#define TYPED_TEST_P(SuiteName, TestName) \ + namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \ + template \ + class TestName : public SuiteName { \ + private: \ + typedef SuiteName TestFixture; \ + typedef gtest_TypeParam_ TypeParam; \ + virtual void TestBody(); \ + }; \ + static bool gtest_##TestName##_defined_ GTEST_ATTRIBUTE_UNUSED_ = \ + GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).AddTestName( \ + __FILE__, __LINE__, #SuiteName, #TestName); \ + } \ + template \ + void GTEST_SUITE_NAMESPACE_( \ + SuiteName)::TestName::TestBody() + +#define REGISTER_TYPED_TEST_SUITE_P(SuiteName, ...) \ + namespace GTEST_SUITE_NAMESPACE_(SuiteName) { \ + typedef ::testing::internal::Templates<__VA_ARGS__>::type gtest_AllTests_; \ + } \ + static const char* const GTEST_REGISTERED_TEST_NAMES_( \ + SuiteName) GTEST_ATTRIBUTE_UNUSED_ = \ + GTEST_TYPED_TEST_SUITE_P_STATE_(SuiteName).VerifyRegisteredTestNames( \ + __FILE__, __LINE__, #__VA_ARGS__) + +// Legacy API is deprecated but still available +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ +#define REGISTER_TYPED_TEST_CASE_P \ + static_assert(::testing::internal::RegisterTypedTestCase_P_IsDeprecated(), \ + ""); \ + REGISTER_TYPED_TEST_SUITE_P +#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + +#define INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, SuiteName, Types, ...) \ + static bool gtest_##Prefix##_##SuiteName GTEST_ATTRIBUTE_UNUSED_ = \ + ::testing::internal::TypeParameterizedTestSuite< \ + SuiteName, GTEST_SUITE_NAMESPACE_(SuiteName)::gtest_AllTests_, \ + ::testing::internal::TypeList::type>:: \ + Register(#Prefix, \ + ::testing::internal::CodeLocation(__FILE__, __LINE__), \ + >EST_TYPED_TEST_SUITE_P_STATE_(SuiteName), #SuiteName, \ + GTEST_REGISTERED_TEST_NAMES_(SuiteName), \ + ::testing::internal::GenerateNames< \ + ::testing::internal::NameGeneratorSelector< \ + __VA_ARGS__>::type, \ + ::testing::internal::TypeList::type>()) + +// Legacy API is deprecated but still available +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ +#define INSTANTIATE_TYPED_TEST_CASE_P \ + static_assert( \ + ::testing::internal::InstantiateTypedTestCase_P_IsDeprecated(), ""); \ + INSTANTIATE_TYPED_TEST_SUITE_P +#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + +#endif // GTEST_HAS_TYPED_TEST_P + +#endif // GTEST_INCLUDE_GTEST_GTEST_TYPED_TEST_H_ diff --git a/include/gtest/gtest.h b/include/gtest/gtest.h new file mode 100644 index 0000000..dbe5b1c --- /dev/null +++ b/include/gtest/gtest.h @@ -0,0 +1,2478 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +// The Google C++ Testing and Mocking Framework (Google Test) +// +// This header file defines the public API for Google Test. It should be +// included by any test program that uses Google Test. +// +// IMPORTANT NOTE: Due to limitation of the C++ language, we have to +// leave some internal implementation details in this header file. +// They are clearly marked by comments like this: +// +// // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +// +// Such code is NOT meant to be used by a user directly, and is subject +// to CHANGE WITHOUT NOTICE. Therefore DO NOT DEPEND ON IT in a user +// program! +// +// Acknowledgment: Google Test borrowed the idea of automatic test +// registration from Barthelemy Dagenais' (barthelemy@prologique.com) +// easyUnit framework. + +// GOOGLETEST_CM0001 DO NOT DELETE + +#ifndef GTEST_INCLUDE_GTEST_GTEST_H_ +#define GTEST_INCLUDE_GTEST_GTEST_H_ + +#include +#include +#include +#include +#include +#include + +#include "gtest/internal/gtest-internal.h" +#include "gtest/internal/gtest-string.h" +#include "gtest/gtest-death-test.h" +#include "gtest/gtest-matchers.h" +#include "gtest/gtest-message.h" +#include "gtest/gtest-param-test.h" +#include "gtest/gtest-printers.h" +#include "gtest/gtest_prod.h" +#include "gtest/gtest-test-part.h" +#include "gtest/gtest-typed-test.h" + +GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ +/* class A needs to have dll-interface to be used by clients of class B */) + +namespace testing { + +// Silence C4100 (unreferenced formal parameter) and 4805 +// unsafe mix of type 'const int' and type 'const bool' +#ifdef _MSC_VER +# pragma warning(push) +# pragma warning(disable:4805) +# pragma warning(disable:4100) +#endif + + +// Declares the flags. + +// This flag temporary enables the disabled tests. +GTEST_DECLARE_bool_(also_run_disabled_tests); + +// This flag brings the debugger on an assertion failure. +GTEST_DECLARE_bool_(break_on_failure); + +// This flag controls whether Google Test catches all test-thrown exceptions +// and logs them as failures. +GTEST_DECLARE_bool_(catch_exceptions); + +// This flag enables using colors in terminal output. Available values are +// "yes" to enable colors, "no" (disable colors), or "auto" (the default) +// to let Google Test decide. +GTEST_DECLARE_string_(color); + +// This flag sets up the filter to select by name using a glob pattern +// the tests to run. If the filter is not given all tests are executed. +GTEST_DECLARE_string_(filter); + +// This flag controls whether Google Test installs a signal handler that dumps +// debugging information when fatal signals are raised. +GTEST_DECLARE_bool_(install_failure_signal_handler); + +// This flag causes the Google Test to list tests. None of the tests listed +// are actually run if the flag is provided. +GTEST_DECLARE_bool_(list_tests); + +// This flag controls whether Google Test emits a detailed XML report to a file +// in addition to its normal textual output. +GTEST_DECLARE_string_(output); + +// This flags control whether Google Test prints the elapsed time for each +// test. +GTEST_DECLARE_bool_(print_time); + +// This flags control whether Google Test prints UTF8 characters as text. +GTEST_DECLARE_bool_(print_utf8); + +// This flag specifies the random number seed. +GTEST_DECLARE_int32_(random_seed); + +// This flag sets how many times the tests are repeated. The default value +// is 1. If the value is -1 the tests are repeating forever. +GTEST_DECLARE_int32_(repeat); + +// This flag controls whether Google Test includes Google Test internal +// stack frames in failure stack traces. +GTEST_DECLARE_bool_(show_internal_stack_frames); + +// When this flag is specified, tests' order is randomized on every iteration. +GTEST_DECLARE_bool_(shuffle); + +// This flag specifies the maximum number of stack frames to be +// printed in a failure message. +GTEST_DECLARE_int32_(stack_trace_depth); + +// When this flag is specified, a failed assertion will throw an +// exception if exceptions are enabled, or exit the program with a +// non-zero code otherwise. For use with an external test framework. +GTEST_DECLARE_bool_(throw_on_failure); + +// When this flag is set with a "host:port" string, on supported +// platforms test results are streamed to the specified port on +// the specified host machine. +GTEST_DECLARE_string_(stream_result_to); + +#if GTEST_USE_OWN_FLAGFILE_FLAG_ +GTEST_DECLARE_string_(flagfile); +#endif // GTEST_USE_OWN_FLAGFILE_FLAG_ + +// The upper limit for valid stack trace depths. +const int kMaxStackTraceDepth = 100; + +namespace internal { + +class AssertHelper; +class DefaultGlobalTestPartResultReporter; +class ExecDeathTest; +class NoExecDeathTest; +class FinalSuccessChecker; +class GTestFlagSaver; +class StreamingListenerTest; +class TestResultAccessor; +class TestEventListenersAccessor; +class TestEventRepeater; +class UnitTestRecordPropertyTestHelper; +class WindowsDeathTest; +class FuchsiaDeathTest; +class UnitTestImpl* GetUnitTestImpl(); +void ReportFailureInUnknownLocation(TestPartResult::Type result_type, + const std::string& message); + +} // namespace internal + +// The friend relationship of some of these classes is cyclic. +// If we don't forward declare them the compiler might confuse the classes +// in friendship clauses with same named classes on the scope. +class Test; +class TestSuite; + +// Old API is still available but deprecated +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ +using TestCase = TestSuite; +#endif +class TestInfo; +class UnitTest; + +// A class for indicating whether an assertion was successful. When +// the assertion wasn't successful, the AssertionResult object +// remembers a non-empty message that describes how it failed. +// +// To create an instance of this class, use one of the factory functions +// (AssertionSuccess() and AssertionFailure()). +// +// This class is useful for two purposes: +// 1. Defining predicate functions to be used with Boolean test assertions +// EXPECT_TRUE/EXPECT_FALSE and their ASSERT_ counterparts +// 2. Defining predicate-format functions to be +// used with predicate assertions (ASSERT_PRED_FORMAT*, etc). +// +// For example, if you define IsEven predicate: +// +// testing::AssertionResult IsEven(int n) { +// if ((n % 2) == 0) +// return testing::AssertionSuccess(); +// else +// return testing::AssertionFailure() << n << " is odd"; +// } +// +// Then the failed expectation EXPECT_TRUE(IsEven(Fib(5))) +// will print the message +// +// Value of: IsEven(Fib(5)) +// Actual: false (5 is odd) +// Expected: true +// +// instead of a more opaque +// +// Value of: IsEven(Fib(5)) +// Actual: false +// Expected: true +// +// in case IsEven is a simple Boolean predicate. +// +// If you expect your predicate to be reused and want to support informative +// messages in EXPECT_FALSE and ASSERT_FALSE (negative assertions show up +// about half as often as positive ones in our tests), supply messages for +// both success and failure cases: +// +// testing::AssertionResult IsEven(int n) { +// if ((n % 2) == 0) +// return testing::AssertionSuccess() << n << " is even"; +// else +// return testing::AssertionFailure() << n << " is odd"; +// } +// +// Then a statement EXPECT_FALSE(IsEven(Fib(6))) will print +// +// Value of: IsEven(Fib(6)) +// Actual: true (8 is even) +// Expected: false +// +// NB: Predicates that support negative Boolean assertions have reduced +// performance in positive ones so be careful not to use them in tests +// that have lots (tens of thousands) of positive Boolean assertions. +// +// To use this class with EXPECT_PRED_FORMAT assertions such as: +// +// // Verifies that Foo() returns an even number. +// EXPECT_PRED_FORMAT1(IsEven, Foo()); +// +// you need to define: +// +// testing::AssertionResult IsEven(const char* expr, int n) { +// if ((n % 2) == 0) +// return testing::AssertionSuccess(); +// else +// return testing::AssertionFailure() +// << "Expected: " << expr << " is even\n Actual: it's " << n; +// } +// +// If Foo() returns 5, you will see the following message: +// +// Expected: Foo() is even +// Actual: it's 5 +// +class GTEST_API_ AssertionResult { + public: + // Copy constructor. + // Used in EXPECT_TRUE/FALSE(assertion_result). + AssertionResult(const AssertionResult& other); + +#if defined(_MSC_VER) && _MSC_VER < 1910 + GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 /* forcing value to bool */) +#endif + + // Used in the EXPECT_TRUE/FALSE(bool_expression). + // + // T must be contextually convertible to bool. + // + // The second parameter prevents this overload from being considered if + // the argument is implicitly convertible to AssertionResult. In that case + // we want AssertionResult's copy constructor to be used. + template + explicit AssertionResult( + const T& success, + typename std::enable_if< + !std::is_convertible::value>::type* + /*enabler*/ + = nullptr) + : success_(success) {} + +#if defined(_MSC_VER) && _MSC_VER < 1910 + GTEST_DISABLE_MSC_WARNINGS_POP_() +#endif + + // Assignment operator. + AssertionResult& operator=(AssertionResult other) { + swap(other); + return *this; + } + + // Returns true if and only if the assertion succeeded. + operator bool() const { return success_; } // NOLINT + + // Returns the assertion's negation. Used with EXPECT/ASSERT_FALSE. + AssertionResult operator!() const; + + // Returns the text streamed into this AssertionResult. Test assertions + // use it when they fail (i.e., the predicate's outcome doesn't match the + // assertion's expectation). When nothing has been streamed into the + // object, returns an empty string. + const char* message() const { + return message_.get() != nullptr ? message_->c_str() : ""; + } + // Deprecated; please use message() instead. + const char* failure_message() const { return message(); } + + // Streams a custom failure message into this object. + template AssertionResult& operator<<(const T& value) { + AppendMessage(Message() << value); + return *this; + } + + // Allows streaming basic output manipulators such as endl or flush into + // this object. + AssertionResult& operator<<( + ::std::ostream& (*basic_manipulator)(::std::ostream& stream)) { + AppendMessage(Message() << basic_manipulator); + return *this; + } + + private: + // Appends the contents of message to message_. + void AppendMessage(const Message& a_message) { + if (message_.get() == nullptr) message_.reset(new ::std::string); + message_->append(a_message.GetString().c_str()); + } + + // Swap the contents of this AssertionResult with other. + void swap(AssertionResult& other); + + // Stores result of the assertion predicate. + bool success_; + // Stores the message describing the condition in case the expectation + // construct is not satisfied with the predicate's outcome. + // Referenced via a pointer to avoid taking too much stack frame space + // with test assertions. + std::unique_ptr< ::std::string> message_; +}; + +// Makes a successful assertion result. +GTEST_API_ AssertionResult AssertionSuccess(); + +// Makes a failed assertion result. +GTEST_API_ AssertionResult AssertionFailure(); + +// Makes a failed assertion result with the given failure message. +// Deprecated; use AssertionFailure() << msg. +GTEST_API_ AssertionResult AssertionFailure(const Message& msg); + +} // namespace testing + +// Includes the auto-generated header that implements a family of generic +// predicate assertion macros. This include comes late because it relies on +// APIs declared above. +#include "gtest/gtest_pred_impl.h" + +namespace testing { + +// The abstract class that all tests inherit from. +// +// In Google Test, a unit test program contains one or many TestSuites, and +// each TestSuite contains one or many Tests. +// +// When you define a test using the TEST macro, you don't need to +// explicitly derive from Test - the TEST macro automatically does +// this for you. +// +// The only time you derive from Test is when defining a test fixture +// to be used in a TEST_F. For example: +// +// class FooTest : public testing::Test { +// protected: +// void SetUp() override { ... } +// void TearDown() override { ... } +// ... +// }; +// +// TEST_F(FooTest, Bar) { ... } +// TEST_F(FooTest, Baz) { ... } +// +// Test is not copyable. +class GTEST_API_ Test { + public: + friend class TestInfo; + + // The d'tor is virtual as we intend to inherit from Test. + virtual ~Test(); + + // Sets up the stuff shared by all tests in this test case. + // + // Google Test will call Foo::SetUpTestSuite() before running the first + // test in test case Foo. Hence a sub-class can define its own + // SetUpTestSuite() method to shadow the one defined in the super + // class. + // Failures that happen during SetUpTestSuite are logged but otherwise + // ignored. + static void SetUpTestSuite() {} + + // Tears down the stuff shared by all tests in this test suite. + // + // Google Test will call Foo::TearDownTestSuite() after running the last + // test in test case Foo. Hence a sub-class can define its own + // TearDownTestSuite() method to shadow the one defined in the super + // class. + // Failures that happen during TearDownTestSuite are logged but otherwise + // ignored. + static void TearDownTestSuite() {} + + // Legacy API is deprecated but still available +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + static void TearDownTestCase() {} + static void SetUpTestCase() {} +#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + + // Returns true if and only if the current test has a fatal failure. + static bool HasFatalFailure(); + + // Returns true if and only if the current test has a non-fatal failure. + static bool HasNonfatalFailure(); + + // Returns true if and only if the current test was skipped. + static bool IsSkipped(); + + // Returns true if and only if the current test has a (either fatal or + // non-fatal) failure. + static bool HasFailure() { return HasFatalFailure() || HasNonfatalFailure(); } + + // Logs a property for the current test, test suite, or for the entire + // invocation of the test program when used outside of the context of a + // test suite. Only the last value for a given key is remembered. These + // are public static so they can be called from utility functions that are + // not members of the test fixture. Calls to RecordProperty made during + // lifespan of the test (from the moment its constructor starts to the + // moment its destructor finishes) will be output in XML as attributes of + // the element. Properties recorded from fixture's + // SetUpTestSuite or TearDownTestSuite are logged as attributes of the + // corresponding element. Calls to RecordProperty made in the + // global context (before or after invocation of RUN_ALL_TESTS and from + // SetUp/TearDown method of Environment objects registered with Google + // Test) will be output as attributes of the element. + static void RecordProperty(const std::string& key, const std::string& value); + static void RecordProperty(const std::string& key, int value); + + protected: + // Creates a Test object. + Test(); + + // Sets up the test fixture. + virtual void SetUp(); + + // Tears down the test fixture. + virtual void TearDown(); + + private: + // Returns true if and only if the current test has the same fixture class + // as the first test in the current test suite. + static bool HasSameFixtureClass(); + + // Runs the test after the test fixture has been set up. + // + // A sub-class must implement this to define the test logic. + // + // DO NOT OVERRIDE THIS FUNCTION DIRECTLY IN A USER PROGRAM. + // Instead, use the TEST or TEST_F macro. + virtual void TestBody() = 0; + + // Sets up, executes, and tears down the test. + void Run(); + + // Deletes self. We deliberately pick an unusual name for this + // internal method to avoid clashing with names used in user TESTs. + void DeleteSelf_() { delete this; } + + const std::unique_ptr gtest_flag_saver_; + + // Often a user misspells SetUp() as Setup() and spends a long time + // wondering why it is never called by Google Test. The declaration of + // the following method is solely for catching such an error at + // compile time: + // + // - The return type is deliberately chosen to be not void, so it + // will be a conflict if void Setup() is declared in the user's + // test fixture. + // + // - This method is private, so it will be another compiler error + // if the method is called from the user's test fixture. + // + // DO NOT OVERRIDE THIS FUNCTION. + // + // If you see an error about overriding the following function or + // about it being private, you have mis-spelled SetUp() as Setup(). + struct Setup_should_be_spelled_SetUp {}; + virtual Setup_should_be_spelled_SetUp* Setup() { return nullptr; } + + // We disallow copying Tests. + GTEST_DISALLOW_COPY_AND_ASSIGN_(Test); +}; + +typedef internal::TimeInMillis TimeInMillis; + +// A copyable object representing a user specified test property which can be +// output as a key/value string pair. +// +// Don't inherit from TestProperty as its destructor is not virtual. +class TestProperty { + public: + // C'tor. TestProperty does NOT have a default constructor. + // Always use this constructor (with parameters) to create a + // TestProperty object. + TestProperty(const std::string& a_key, const std::string& a_value) : + key_(a_key), value_(a_value) { + } + + // Gets the user supplied key. + const char* key() const { + return key_.c_str(); + } + + // Gets the user supplied value. + const char* value() const { + return value_.c_str(); + } + + // Sets a new value, overriding the one supplied in the constructor. + void SetValue(const std::string& new_value) { + value_ = new_value; + } + + private: + // The key supplied by the user. + std::string key_; + // The value supplied by the user. + std::string value_; +}; + +// The result of a single Test. This includes a list of +// TestPartResults, a list of TestProperties, a count of how many +// death tests there are in the Test, and how much time it took to run +// the Test. +// +// TestResult is not copyable. +class GTEST_API_ TestResult { + public: + // Creates an empty TestResult. + TestResult(); + + // D'tor. Do not inherit from TestResult. + ~TestResult(); + + // Gets the number of all test parts. This is the sum of the number + // of successful test parts and the number of failed test parts. + int total_part_count() const; + + // Returns the number of the test properties. + int test_property_count() const; + + // Returns true if and only if the test passed (i.e. no test part failed). + bool Passed() const { return !Skipped() && !Failed(); } + + // Returns true if and only if the test was skipped. + bool Skipped() const; + + // Returns true if and only if the test failed. + bool Failed() const; + + // Returns true if and only if the test fatally failed. + bool HasFatalFailure() const; + + // Returns true if and only if the test has a non-fatal failure. + bool HasNonfatalFailure() const; + + // Returns the elapsed time, in milliseconds. + TimeInMillis elapsed_time() const { return elapsed_time_; } + + // Gets the time of the test case start, in ms from the start of the + // UNIX epoch. + TimeInMillis start_timestamp() const { return start_timestamp_; } + + // Returns the i-th test part result among all the results. i can range from 0 + // to total_part_count() - 1. If i is not in that range, aborts the program. + const TestPartResult& GetTestPartResult(int i) const; + + // Returns the i-th test property. i can range from 0 to + // test_property_count() - 1. If i is not in that range, aborts the + // program. + const TestProperty& GetTestProperty(int i) const; + + private: + friend class TestInfo; + friend class TestSuite; + friend class UnitTest; + friend class internal::DefaultGlobalTestPartResultReporter; + friend class internal::ExecDeathTest; + friend class internal::TestResultAccessor; + friend class internal::UnitTestImpl; + friend class internal::WindowsDeathTest; + friend class internal::FuchsiaDeathTest; + + // Gets the vector of TestPartResults. + const std::vector& test_part_results() const { + return test_part_results_; + } + + // Gets the vector of TestProperties. + const std::vector& test_properties() const { + return test_properties_; + } + + // Sets the start time. + void set_start_timestamp(TimeInMillis start) { start_timestamp_ = start; } + + // Sets the elapsed time. + void set_elapsed_time(TimeInMillis elapsed) { elapsed_time_ = elapsed; } + + // Adds a test property to the list. The property is validated and may add + // a non-fatal failure if invalid (e.g., if it conflicts with reserved + // key names). If a property is already recorded for the same key, the + // value will be updated, rather than storing multiple values for the same + // key. xml_element specifies the element for which the property is being + // recorded and is used for validation. + void RecordProperty(const std::string& xml_element, + const TestProperty& test_property); + + // Adds a failure if the key is a reserved attribute of Google Test + // testsuite tags. Returns true if the property is valid. + // FIXME: Validate attribute names are legal and human readable. + static bool ValidateTestProperty(const std::string& xml_element, + const TestProperty& test_property); + + // Adds a test part result to the list. + void AddTestPartResult(const TestPartResult& test_part_result); + + // Returns the death test count. + int death_test_count() const { return death_test_count_; } + + // Increments the death test count, returning the new count. + int increment_death_test_count() { return ++death_test_count_; } + + // Clears the test part results. + void ClearTestPartResults(); + + // Clears the object. + void Clear(); + + // Protects mutable state of the property vector and of owned + // properties, whose values may be updated. + internal::Mutex test_properites_mutex_; + + // The vector of TestPartResults + std::vector test_part_results_; + // The vector of TestProperties + std::vector test_properties_; + // Running count of death tests. + int death_test_count_; + // The start time, in milliseconds since UNIX Epoch. + TimeInMillis start_timestamp_; + // The elapsed time, in milliseconds. + TimeInMillis elapsed_time_; + + // We disallow copying TestResult. + GTEST_DISALLOW_COPY_AND_ASSIGN_(TestResult); +}; // class TestResult + +// A TestInfo object stores the following information about a test: +// +// Test suite name +// Test name +// Whether the test should be run +// A function pointer that creates the test object when invoked +// Test result +// +// The constructor of TestInfo registers itself with the UnitTest +// singleton such that the RUN_ALL_TESTS() macro knows which tests to +// run. +class GTEST_API_ TestInfo { + public: + // Destructs a TestInfo object. This function is not virtual, so + // don't inherit from TestInfo. + ~TestInfo(); + + // Returns the test suite name. + const char* test_suite_name() const { return test_suite_name_.c_str(); } + +// Legacy API is deprecated but still available +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + const char* test_case_name() const { return test_suite_name(); } +#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + + // Returns the test name. + const char* name() const { return name_.c_str(); } + + // Returns the name of the parameter type, or NULL if this is not a typed + // or a type-parameterized test. + const char* type_param() const { + if (type_param_.get() != nullptr) return type_param_->c_str(); + return nullptr; + } + + // Returns the text representation of the value parameter, or NULL if this + // is not a value-parameterized test. + const char* value_param() const { + if (value_param_.get() != nullptr) return value_param_->c_str(); + return nullptr; + } + + // Returns the file name where this test is defined. + const char* file() const { return location_.file.c_str(); } + + // Returns the line where this test is defined. + int line() const { return location_.line; } + + // Return true if this test should not be run because it's in another shard. + bool is_in_another_shard() const { return is_in_another_shard_; } + + // Returns true if this test should run, that is if the test is not + // disabled (or it is disabled but the also_run_disabled_tests flag has + // been specified) and its full name matches the user-specified filter. + // + // Google Test allows the user to filter the tests by their full names. + // The full name of a test Bar in test suite Foo is defined as + // "Foo.Bar". Only the tests that match the filter will run. + // + // A filter is a colon-separated list of glob (not regex) patterns, + // optionally followed by a '-' and a colon-separated list of + // negative patterns (tests to exclude). A test is run if it + // matches one of the positive patterns and does not match any of + // the negative patterns. + // + // For example, *A*:Foo.* is a filter that matches any string that + // contains the character 'A' or starts with "Foo.". + bool should_run() const { return should_run_; } + + // Returns true if and only if this test will appear in the XML report. + bool is_reportable() const { + // The XML report includes tests matching the filter, excluding those + // run in other shards. + return matches_filter_ && !is_in_another_shard_; + } + + // Returns the result of the test. + const TestResult* result() const { return &result_; } + + private: +#if GTEST_HAS_DEATH_TEST + friend class internal::DefaultDeathTestFactory; +#endif // GTEST_HAS_DEATH_TEST + friend class Test; + friend class TestSuite; + friend class internal::UnitTestImpl; + friend class internal::StreamingListenerTest; + friend TestInfo* internal::MakeAndRegisterTestInfo( + const char* test_suite_name, const char* name, const char* type_param, + const char* value_param, internal::CodeLocation code_location, + internal::TypeId fixture_class_id, internal::SetUpTestSuiteFunc set_up_tc, + internal::TearDownTestSuiteFunc tear_down_tc, + internal::TestFactoryBase* factory); + + // Constructs a TestInfo object. The newly constructed instance assumes + // ownership of the factory object. + TestInfo(const std::string& test_suite_name, const std::string& name, + const char* a_type_param, // NULL if not a type-parameterized test + const char* a_value_param, // NULL if not a value-parameterized test + internal::CodeLocation a_code_location, + internal::TypeId fixture_class_id, + internal::TestFactoryBase* factory); + + // Increments the number of death tests encountered in this test so + // far. + int increment_death_test_count() { + return result_.increment_death_test_count(); + } + + // Creates the test object, runs it, records its result, and then + // deletes it. + void Run(); + + static void ClearTestResult(TestInfo* test_info) { + test_info->result_.Clear(); + } + + // These fields are immutable properties of the test. + const std::string test_suite_name_; // test suite name + const std::string name_; // Test name + // Name of the parameter type, or NULL if this is not a typed or a + // type-parameterized test. + const std::unique_ptr type_param_; + // Text representation of the value parameter, or NULL if this is not a + // value-parameterized test. + const std::unique_ptr value_param_; + internal::CodeLocation location_; + const internal::TypeId fixture_class_id_; // ID of the test fixture class + bool should_run_; // True if and only if this test should run + bool is_disabled_; // True if and only if this test is disabled + bool matches_filter_; // True if this test matches the + // user-specified filter. + bool is_in_another_shard_; // Will be run in another shard. + internal::TestFactoryBase* const factory_; // The factory that creates + // the test object + + // This field is mutable and needs to be reset before running the + // test for the second time. + TestResult result_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(TestInfo); +}; + +// A test suite, which consists of a vector of TestInfos. +// +// TestSuite is not copyable. +class GTEST_API_ TestSuite { + public: + // Creates a TestSuite with the given name. + // + // TestSuite does NOT have a default constructor. Always use this + // constructor to create a TestSuite object. + // + // Arguments: + // + // name: name of the test suite + // a_type_param: the name of the test's type parameter, or NULL if + // this is not a type-parameterized test. + // set_up_tc: pointer to the function that sets up the test suite + // tear_down_tc: pointer to the function that tears down the test suite + TestSuite(const char* name, const char* a_type_param, + internal::SetUpTestSuiteFunc set_up_tc, + internal::TearDownTestSuiteFunc tear_down_tc); + + // Destructor of TestSuite. + virtual ~TestSuite(); + + // Gets the name of the TestSuite. + const char* name() const { return name_.c_str(); } + + // Returns the name of the parameter type, or NULL if this is not a + // type-parameterized test suite. + const char* type_param() const { + if (type_param_.get() != nullptr) return type_param_->c_str(); + return nullptr; + } + + // Returns true if any test in this test suite should run. + bool should_run() const { return should_run_; } + + // Gets the number of successful tests in this test suite. + int successful_test_count() const; + + // Gets the number of skipped tests in this test suite. + int skipped_test_count() const; + + // Gets the number of failed tests in this test suite. + int failed_test_count() const; + + // Gets the number of disabled tests that will be reported in the XML report. + int reportable_disabled_test_count() const; + + // Gets the number of disabled tests in this test suite. + int disabled_test_count() const; + + // Gets the number of tests to be printed in the XML report. + int reportable_test_count() const; + + // Get the number of tests in this test suite that should run. + int test_to_run_count() const; + + // Gets the number of all tests in this test suite. + int total_test_count() const; + + // Returns true if and only if the test suite passed. + bool Passed() const { return !Failed(); } + + // Returns true if and only if the test suite failed. + bool Failed() const { return failed_test_count() > 0; } + + // Returns the elapsed time, in milliseconds. + TimeInMillis elapsed_time() const { return elapsed_time_; } + + // Gets the time of the test suite start, in ms from the start of the + // UNIX epoch. + TimeInMillis start_timestamp() const { return start_timestamp_; } + + // Returns the i-th test among all the tests. i can range from 0 to + // total_test_count() - 1. If i is not in that range, returns NULL. + const TestInfo* GetTestInfo(int i) const; + + // Returns the TestResult that holds test properties recorded during + // execution of SetUpTestSuite and TearDownTestSuite. + const TestResult& ad_hoc_test_result() const { return ad_hoc_test_result_; } + + private: + friend class Test; + friend class internal::UnitTestImpl; + + // Gets the (mutable) vector of TestInfos in this TestSuite. + std::vector& test_info_list() { return test_info_list_; } + + // Gets the (immutable) vector of TestInfos in this TestSuite. + const std::vector& test_info_list() const { + return test_info_list_; + } + + // Returns the i-th test among all the tests. i can range from 0 to + // total_test_count() - 1. If i is not in that range, returns NULL. + TestInfo* GetMutableTestInfo(int i); + + // Sets the should_run member. + void set_should_run(bool should) { should_run_ = should; } + + // Adds a TestInfo to this test suite. Will delete the TestInfo upon + // destruction of the TestSuite object. + void AddTestInfo(TestInfo * test_info); + + // Clears the results of all tests in this test suite. + void ClearResult(); + + // Clears the results of all tests in the given test suite. + static void ClearTestSuiteResult(TestSuite* test_suite) { + test_suite->ClearResult(); + } + + // Runs every test in this TestSuite. + void Run(); + + // Runs SetUpTestSuite() for this TestSuite. This wrapper is needed + // for catching exceptions thrown from SetUpTestSuite(). + void RunSetUpTestSuite() { + if (set_up_tc_ != nullptr) { + (*set_up_tc_)(); + } + } + + // Runs TearDownTestSuite() for this TestSuite. This wrapper is + // needed for catching exceptions thrown from TearDownTestSuite(). + void RunTearDownTestSuite() { + if (tear_down_tc_ != nullptr) { + (*tear_down_tc_)(); + } + } + + // Returns true if and only if test passed. + static bool TestPassed(const TestInfo* test_info) { + return test_info->should_run() && test_info->result()->Passed(); + } + + // Returns true if and only if test skipped. + static bool TestSkipped(const TestInfo* test_info) { + return test_info->should_run() && test_info->result()->Skipped(); + } + + // Returns true if and only if test failed. + static bool TestFailed(const TestInfo* test_info) { + return test_info->should_run() && test_info->result()->Failed(); + } + + // Returns true if and only if the test is disabled and will be reported in + // the XML report. + static bool TestReportableDisabled(const TestInfo* test_info) { + return test_info->is_reportable() && test_info->is_disabled_; + } + + // Returns true if and only if test is disabled. + static bool TestDisabled(const TestInfo* test_info) { + return test_info->is_disabled_; + } + + // Returns true if and only if this test will appear in the XML report. + static bool TestReportable(const TestInfo* test_info) { + return test_info->is_reportable(); + } + + // Returns true if the given test should run. + static bool ShouldRunTest(const TestInfo* test_info) { + return test_info->should_run(); + } + + // Shuffles the tests in this test suite. + void ShuffleTests(internal::Random* random); + + // Restores the test order to before the first shuffle. + void UnshuffleTests(); + + // Name of the test suite. + std::string name_; + // Name of the parameter type, or NULL if this is not a typed or a + // type-parameterized test. + const std::unique_ptr type_param_; + // The vector of TestInfos in their original order. It owns the + // elements in the vector. + std::vector test_info_list_; + // Provides a level of indirection for the test list to allow easy + // shuffling and restoring the test order. The i-th element in this + // vector is the index of the i-th test in the shuffled test list. + std::vector test_indices_; + // Pointer to the function that sets up the test suite. + internal::SetUpTestSuiteFunc set_up_tc_; + // Pointer to the function that tears down the test suite. + internal::TearDownTestSuiteFunc tear_down_tc_; + // True if and only if any test in this test suite should run. + bool should_run_; + // The start time, in milliseconds since UNIX Epoch. + TimeInMillis start_timestamp_; + // Elapsed time, in milliseconds. + TimeInMillis elapsed_time_; + // Holds test properties recorded during execution of SetUpTestSuite and + // TearDownTestSuite. + TestResult ad_hoc_test_result_; + + // We disallow copying TestSuites. + GTEST_DISALLOW_COPY_AND_ASSIGN_(TestSuite); +}; + +// An Environment object is capable of setting up and tearing down an +// environment. You should subclass this to define your own +// environment(s). +// +// An Environment object does the set-up and tear-down in virtual +// methods SetUp() and TearDown() instead of the constructor and the +// destructor, as: +// +// 1. You cannot safely throw from a destructor. This is a problem +// as in some cases Google Test is used where exceptions are enabled, and +// we may want to implement ASSERT_* using exceptions where they are +// available. +// 2. You cannot use ASSERT_* directly in a constructor or +// destructor. +class Environment { + public: + // The d'tor is virtual as we need to subclass Environment. + virtual ~Environment() {} + + // Override this to define how to set up the environment. + virtual void SetUp() {} + + // Override this to define how to tear down the environment. + virtual void TearDown() {} + private: + // If you see an error about overriding the following function or + // about it being private, you have mis-spelled SetUp() as Setup(). + struct Setup_should_be_spelled_SetUp {}; + virtual Setup_should_be_spelled_SetUp* Setup() { return nullptr; } +}; + +#if GTEST_HAS_EXCEPTIONS + +// Exception which can be thrown from TestEventListener::OnTestPartResult. +class GTEST_API_ AssertionException + : public internal::GoogleTestFailureException { + public: + explicit AssertionException(const TestPartResult& result) + : GoogleTestFailureException(result) {} +}; + +#endif // GTEST_HAS_EXCEPTIONS + +// The interface for tracing execution of tests. The methods are organized in +// the order the corresponding events are fired. +class TestEventListener { + public: + virtual ~TestEventListener() {} + + // Fired before any test activity starts. + virtual void OnTestProgramStart(const UnitTest& unit_test) = 0; + + // Fired before each iteration of tests starts. There may be more than + // one iteration if GTEST_FLAG(repeat) is set. iteration is the iteration + // index, starting from 0. + virtual void OnTestIterationStart(const UnitTest& unit_test, + int iteration) = 0; + + // Fired before environment set-up for each iteration of tests starts. + virtual void OnEnvironmentsSetUpStart(const UnitTest& unit_test) = 0; + + // Fired after environment set-up for each iteration of tests ends. + virtual void OnEnvironmentsSetUpEnd(const UnitTest& unit_test) = 0; + + // Fired before the test suite starts. + virtual void OnTestSuiteStart(const TestSuite& /*test_suite*/) {} + + // Legacy API is deprecated but still available +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + virtual void OnTestCaseStart(const TestCase& /*test_case*/) {} +#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + + // Fired before the test starts. + virtual void OnTestStart(const TestInfo& test_info) = 0; + + // Fired after a failed assertion or a SUCCEED() invocation. + // If you want to throw an exception from this function to skip to the next + // TEST, it must be AssertionException defined above, or inherited from it. + virtual void OnTestPartResult(const TestPartResult& test_part_result) = 0; + + // Fired after the test ends. + virtual void OnTestEnd(const TestInfo& test_info) = 0; + + // Fired after the test suite ends. + virtual void OnTestSuiteEnd(const TestSuite& /*test_suite*/) {} + +// Legacy API is deprecated but still available +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + virtual void OnTestCaseEnd(const TestCase& /*test_case*/) {} +#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + + // Fired before environment tear-down for each iteration of tests starts. + virtual void OnEnvironmentsTearDownStart(const UnitTest& unit_test) = 0; + + // Fired after environment tear-down for each iteration of tests ends. + virtual void OnEnvironmentsTearDownEnd(const UnitTest& unit_test) = 0; + + // Fired after each iteration of tests finishes. + virtual void OnTestIterationEnd(const UnitTest& unit_test, + int iteration) = 0; + + // Fired after all test activities have ended. + virtual void OnTestProgramEnd(const UnitTest& unit_test) = 0; +}; + +// The convenience class for users who need to override just one or two +// methods and are not concerned that a possible change to a signature of +// the methods they override will not be caught during the build. For +// comments about each method please see the definition of TestEventListener +// above. +class EmptyTestEventListener : public TestEventListener { + public: + void OnTestProgramStart(const UnitTest& /*unit_test*/) override {} + void OnTestIterationStart(const UnitTest& /*unit_test*/, + int /*iteration*/) override {} + void OnEnvironmentsSetUpStart(const UnitTest& /*unit_test*/) override {} + void OnEnvironmentsSetUpEnd(const UnitTest& /*unit_test*/) override {} + void OnTestSuiteStart(const TestSuite& /*test_suite*/) override {} +// Legacy API is deprecated but still available +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + void OnTestCaseStart(const TestCase& /*test_case*/) override {} +#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + + void OnTestStart(const TestInfo& /*test_info*/) override {} + void OnTestPartResult(const TestPartResult& /*test_part_result*/) override {} + void OnTestEnd(const TestInfo& /*test_info*/) override {} + void OnTestSuiteEnd(const TestSuite& /*test_suite*/) override {} +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + void OnTestCaseEnd(const TestCase& /*test_case*/) override {} +#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + + void OnEnvironmentsTearDownStart(const UnitTest& /*unit_test*/) override {} + void OnEnvironmentsTearDownEnd(const UnitTest& /*unit_test*/) override {} + void OnTestIterationEnd(const UnitTest& /*unit_test*/, + int /*iteration*/) override {} + void OnTestProgramEnd(const UnitTest& /*unit_test*/) override {} +}; + +// TestEventListeners lets users add listeners to track events in Google Test. +class GTEST_API_ TestEventListeners { + public: + TestEventListeners(); + ~TestEventListeners(); + + // Appends an event listener to the end of the list. Google Test assumes + // the ownership of the listener (i.e. it will delete the listener when + // the test program finishes). + void Append(TestEventListener* listener); + + // Removes the given event listener from the list and returns it. It then + // becomes the caller's responsibility to delete the listener. Returns + // NULL if the listener is not found in the list. + TestEventListener* Release(TestEventListener* listener); + + // Returns the standard listener responsible for the default console + // output. Can be removed from the listeners list to shut down default + // console output. Note that removing this object from the listener list + // with Release transfers its ownership to the caller and makes this + // function return NULL the next time. + TestEventListener* default_result_printer() const { + return default_result_printer_; + } + + // Returns the standard listener responsible for the default XML output + // controlled by the --gtest_output=xml flag. Can be removed from the + // listeners list by users who want to shut down the default XML output + // controlled by this flag and substitute it with custom one. Note that + // removing this object from the listener list with Release transfers its + // ownership to the caller and makes this function return NULL the next + // time. + TestEventListener* default_xml_generator() const { + return default_xml_generator_; + } + + private: + friend class TestSuite; + friend class TestInfo; + friend class internal::DefaultGlobalTestPartResultReporter; + friend class internal::NoExecDeathTest; + friend class internal::TestEventListenersAccessor; + friend class internal::UnitTestImpl; + + // Returns repeater that broadcasts the TestEventListener events to all + // subscribers. + TestEventListener* repeater(); + + // Sets the default_result_printer attribute to the provided listener. + // The listener is also added to the listener list and previous + // default_result_printer is removed from it and deleted. The listener can + // also be NULL in which case it will not be added to the list. Does + // nothing if the previous and the current listener objects are the same. + void SetDefaultResultPrinter(TestEventListener* listener); + + // Sets the default_xml_generator attribute to the provided listener. The + // listener is also added to the listener list and previous + // default_xml_generator is removed from it and deleted. The listener can + // also be NULL in which case it will not be added to the list. Does + // nothing if the previous and the current listener objects are the same. + void SetDefaultXmlGenerator(TestEventListener* listener); + + // Controls whether events will be forwarded by the repeater to the + // listeners in the list. + bool EventForwardingEnabled() const; + void SuppressEventForwarding(); + + // The actual list of listeners. + internal::TestEventRepeater* repeater_; + // Listener responsible for the standard result output. + TestEventListener* default_result_printer_; + // Listener responsible for the creation of the XML output file. + TestEventListener* default_xml_generator_; + + // We disallow copying TestEventListeners. + GTEST_DISALLOW_COPY_AND_ASSIGN_(TestEventListeners); +}; + +// A UnitTest consists of a vector of TestSuites. +// +// This is a singleton class. The only instance of UnitTest is +// created when UnitTest::GetInstance() is first called. This +// instance is never deleted. +// +// UnitTest is not copyable. +// +// This class is thread-safe as long as the methods are called +// according to their specification. +class GTEST_API_ UnitTest { + public: + // Gets the singleton UnitTest object. The first time this method + // is called, a UnitTest object is constructed and returned. + // Consecutive calls will return the same object. + static UnitTest* GetInstance(); + + // Runs all tests in this UnitTest object and prints the result. + // Returns 0 if successful, or 1 otherwise. + // + // This method can only be called from the main thread. + // + // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. + int Run() GTEST_MUST_USE_RESULT_; + + // Returns the working directory when the first TEST() or TEST_F() + // was executed. The UnitTest object owns the string. + const char* original_working_dir() const; + + // Returns the TestSuite object for the test that's currently running, + // or NULL if no test is running. + const TestSuite* current_test_suite() const GTEST_LOCK_EXCLUDED_(mutex_); + +// Legacy API is still available but deprecated +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + const TestCase* current_test_case() const GTEST_LOCK_EXCLUDED_(mutex_); +#endif + + // Returns the TestInfo object for the test that's currently running, + // or NULL if no test is running. + const TestInfo* current_test_info() const + GTEST_LOCK_EXCLUDED_(mutex_); + + // Returns the random seed used at the start of the current test run. + int random_seed() const; + + // Returns the ParameterizedTestSuiteRegistry object used to keep track of + // value-parameterized tests and instantiate and register them. + // + // INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. + internal::ParameterizedTestSuiteRegistry& parameterized_test_registry() + GTEST_LOCK_EXCLUDED_(mutex_); + + // Gets the number of successful test suites. + int successful_test_suite_count() const; + + // Gets the number of failed test suites. + int failed_test_suite_count() const; + + // Gets the number of all test suites. + int total_test_suite_count() const; + + // Gets the number of all test suites that contain at least one test + // that should run. + int test_suite_to_run_count() const; + + // Legacy API is deprecated but still available +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + int successful_test_case_count() const; + int failed_test_case_count() const; + int total_test_case_count() const; + int test_case_to_run_count() const; +#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + + // Gets the number of successful tests. + int successful_test_count() const; + + // Gets the number of skipped tests. + int skipped_test_count() const; + + // Gets the number of failed tests. + int failed_test_count() const; + + // Gets the number of disabled tests that will be reported in the XML report. + int reportable_disabled_test_count() const; + + // Gets the number of disabled tests. + int disabled_test_count() const; + + // Gets the number of tests to be printed in the XML report. + int reportable_test_count() const; + + // Gets the number of all tests. + int total_test_count() const; + + // Gets the number of tests that should run. + int test_to_run_count() const; + + // Gets the time of the test program start, in ms from the start of the + // UNIX epoch. + TimeInMillis start_timestamp() const; + + // Gets the elapsed time, in milliseconds. + TimeInMillis elapsed_time() const; + + // Returns true if and only if the unit test passed (i.e. all test suites + // passed). + bool Passed() const; + + // Returns true if and only if the unit test failed (i.e. some test suite + // failed or something outside of all tests failed). + bool Failed() const; + + // Gets the i-th test suite among all the test suites. i can range from 0 to + // total_test_suite_count() - 1. If i is not in that range, returns NULL. + const TestSuite* GetTestSuite(int i) const; + +// Legacy API is deprecated but still available +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + const TestCase* GetTestCase(int i) const; +#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + + // Returns the TestResult containing information on test failures and + // properties logged outside of individual test suites. + const TestResult& ad_hoc_test_result() const; + + // Returns the list of event listeners that can be used to track events + // inside Google Test. + TestEventListeners& listeners(); + + private: + // Registers and returns a global test environment. When a test + // program is run, all global test environments will be set-up in + // the order they were registered. After all tests in the program + // have finished, all global test environments will be torn-down in + // the *reverse* order they were registered. + // + // The UnitTest object takes ownership of the given environment. + // + // This method can only be called from the main thread. + Environment* AddEnvironment(Environment* env); + + // Adds a TestPartResult to the current TestResult object. All + // Google Test assertion macros (e.g. ASSERT_TRUE, EXPECT_EQ, etc) + // eventually call this to report their results. The user code + // should use the assertion macros instead of calling this directly. + void AddTestPartResult(TestPartResult::Type result_type, + const char* file_name, + int line_number, + const std::string& message, + const std::string& os_stack_trace) + GTEST_LOCK_EXCLUDED_(mutex_); + + // Adds a TestProperty to the current TestResult object when invoked from + // inside a test, to current TestSuite's ad_hoc_test_result_ when invoked + // from SetUpTestSuite or TearDownTestSuite, or to the global property set + // when invoked elsewhere. If the result already contains a property with + // the same key, the value will be updated. + void RecordProperty(const std::string& key, const std::string& value); + + // Gets the i-th test suite among all the test suites. i can range from 0 to + // total_test_suite_count() - 1. If i is not in that range, returns NULL. + TestSuite* GetMutableTestSuite(int i); + + // Accessors for the implementation object. + internal::UnitTestImpl* impl() { return impl_; } + const internal::UnitTestImpl* impl() const { return impl_; } + + // These classes and functions are friends as they need to access private + // members of UnitTest. + friend class ScopedTrace; + friend class Test; + friend class internal::AssertHelper; + friend class internal::StreamingListenerTest; + friend class internal::UnitTestRecordPropertyTestHelper; + friend Environment* AddGlobalTestEnvironment(Environment* env); + friend internal::UnitTestImpl* internal::GetUnitTestImpl(); + friend void internal::ReportFailureInUnknownLocation( + TestPartResult::Type result_type, + const std::string& message); + + // Creates an empty UnitTest. + UnitTest(); + + // D'tor + virtual ~UnitTest(); + + // Pushes a trace defined by SCOPED_TRACE() on to the per-thread + // Google Test trace stack. + void PushGTestTrace(const internal::TraceInfo& trace) + GTEST_LOCK_EXCLUDED_(mutex_); + + // Pops a trace from the per-thread Google Test trace stack. + void PopGTestTrace() + GTEST_LOCK_EXCLUDED_(mutex_); + + // Protects mutable state in *impl_. This is mutable as some const + // methods need to lock it too. + mutable internal::Mutex mutex_; + + // Opaque implementation object. This field is never changed once + // the object is constructed. We don't mark it as const here, as + // doing so will cause a warning in the constructor of UnitTest. + // Mutable state in *impl_ is protected by mutex_. + internal::UnitTestImpl* impl_; + + // We disallow copying UnitTest. + GTEST_DISALLOW_COPY_AND_ASSIGN_(UnitTest); +}; + +// A convenient wrapper for adding an environment for the test +// program. +// +// You should call this before RUN_ALL_TESTS() is called, probably in +// main(). If you use gtest_main, you need to call this before main() +// starts for it to take effect. For example, you can define a global +// variable like this: +// +// testing::Environment* const foo_env = +// testing::AddGlobalTestEnvironment(new FooEnvironment); +// +// However, we strongly recommend you to write your own main() and +// call AddGlobalTestEnvironment() there, as relying on initialization +// of global variables makes the code harder to read and may cause +// problems when you register multiple environments from different +// translation units and the environments have dependencies among them +// (remember that the compiler doesn't guarantee the order in which +// global variables from different translation units are initialized). +inline Environment* AddGlobalTestEnvironment(Environment* env) { + return UnitTest::GetInstance()->AddEnvironment(env); +} + +// Initializes Google Test. This must be called before calling +// RUN_ALL_TESTS(). In particular, it parses a command line for the +// flags that Google Test recognizes. Whenever a Google Test flag is +// seen, it is removed from argv, and *argc is decremented. +// +// No value is returned. Instead, the Google Test flag variables are +// updated. +// +// Calling the function for the second time has no user-visible effect. +GTEST_API_ void InitGoogleTest(int* argc, char** argv); + +// This overloaded version can be used in Windows programs compiled in +// UNICODE mode. +GTEST_API_ void InitGoogleTest(int* argc, wchar_t** argv); + +// This overloaded version can be used on Arduino/embedded platforms where +// there is no argc/argv. +GTEST_API_ void InitGoogleTest(); + +namespace internal { + +// Separate the error generating code from the code path to reduce the stack +// frame size of CmpHelperEQ. This helps reduce the overhead of some sanitizers +// when calling EXPECT_* in a tight loop. +template +AssertionResult CmpHelperEQFailure(const char* lhs_expression, + const char* rhs_expression, + const T1& lhs, const T2& rhs) { + return EqFailure(lhs_expression, + rhs_expression, + FormatForComparisonFailureMessage(lhs, rhs), + FormatForComparisonFailureMessage(rhs, lhs), + false); +} + +// This block of code defines operator==/!= +// to block lexical scope lookup. +// It prevents using invalid operator==/!= defined at namespace scope. +struct faketype {}; +inline bool operator==(faketype, faketype) { return true; } +inline bool operator!=(faketype, faketype) { return false; } + +// The helper function for {ASSERT|EXPECT}_EQ. +template +AssertionResult CmpHelperEQ(const char* lhs_expression, + const char* rhs_expression, + const T1& lhs, + const T2& rhs) { + if (lhs == rhs) { + return AssertionSuccess(); + } + + return CmpHelperEQFailure(lhs_expression, rhs_expression, lhs, rhs); +} + +// With this overloaded version, we allow anonymous enums to be used +// in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous enums +// can be implicitly cast to BiggestInt. +GTEST_API_ AssertionResult CmpHelperEQ(const char* lhs_expression, + const char* rhs_expression, + BiggestInt lhs, + BiggestInt rhs); + +class EqHelper { + public: + // This templatized version is for the general case. + template < + typename T1, typename T2, + // Disable this overload for cases where one argument is a pointer + // and the other is the null pointer constant. + typename std::enable_if::value || + !std::is_pointer::value>::type* = nullptr> + static AssertionResult Compare(const char* lhs_expression, + const char* rhs_expression, const T1& lhs, + const T2& rhs) { + return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs); + } + + // With this overloaded version, we allow anonymous enums to be used + // in {ASSERT|EXPECT}_EQ when compiled with gcc 4, as anonymous + // enums can be implicitly cast to BiggestInt. + // + // Even though its body looks the same as the above version, we + // cannot merge the two, as it will make anonymous enums unhappy. + static AssertionResult Compare(const char* lhs_expression, + const char* rhs_expression, + BiggestInt lhs, + BiggestInt rhs) { + return CmpHelperEQ(lhs_expression, rhs_expression, lhs, rhs); + } + + template + static AssertionResult Compare( + const char* lhs_expression, const char* rhs_expression, + // Handle cases where '0' is used as a null pointer literal. + std::nullptr_t /* lhs */, T* rhs) { + // We already know that 'lhs' is a null pointer. + return CmpHelperEQ(lhs_expression, rhs_expression, static_cast(nullptr), + rhs); + } +}; + +// Separate the error generating code from the code path to reduce the stack +// frame size of CmpHelperOP. This helps reduce the overhead of some sanitizers +// when calling EXPECT_OP in a tight loop. +template +AssertionResult CmpHelperOpFailure(const char* expr1, const char* expr2, + const T1& val1, const T2& val2, + const char* op) { + return AssertionFailure() + << "Expected: (" << expr1 << ") " << op << " (" << expr2 + << "), actual: " << FormatForComparisonFailureMessage(val1, val2) + << " vs " << FormatForComparisonFailureMessage(val2, val1); +} + +// A macro for implementing the helper functions needed to implement +// ASSERT_?? and EXPECT_??. It is here just to avoid copy-and-paste +// of similar code. +// +// For each templatized helper function, we also define an overloaded +// version for BiggestInt in order to reduce code bloat and allow +// anonymous enums to be used with {ASSERT|EXPECT}_?? when compiled +// with gcc 4. +// +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. + +#define GTEST_IMPL_CMP_HELPER_(op_name, op)\ +template \ +AssertionResult CmpHelper##op_name(const char* expr1, const char* expr2, \ + const T1& val1, const T2& val2) {\ + if (val1 op val2) {\ + return AssertionSuccess();\ + } else {\ + return CmpHelperOpFailure(expr1, expr2, val1, val2, #op);\ + }\ +}\ +GTEST_API_ AssertionResult CmpHelper##op_name(\ + const char* expr1, const char* expr2, BiggestInt val1, BiggestInt val2) + +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. + +// Implements the helper function for {ASSERT|EXPECT}_NE +GTEST_IMPL_CMP_HELPER_(NE, !=); +// Implements the helper function for {ASSERT|EXPECT}_LE +GTEST_IMPL_CMP_HELPER_(LE, <=); +// Implements the helper function for {ASSERT|EXPECT}_LT +GTEST_IMPL_CMP_HELPER_(LT, <); +// Implements the helper function for {ASSERT|EXPECT}_GE +GTEST_IMPL_CMP_HELPER_(GE, >=); +// Implements the helper function for {ASSERT|EXPECT}_GT +GTEST_IMPL_CMP_HELPER_(GT, >); + +#undef GTEST_IMPL_CMP_HELPER_ + +// The helper function for {ASSERT|EXPECT}_STREQ. +// +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +GTEST_API_ AssertionResult CmpHelperSTREQ(const char* s1_expression, + const char* s2_expression, + const char* s1, + const char* s2); + +// The helper function for {ASSERT|EXPECT}_STRCASEEQ. +// +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +GTEST_API_ AssertionResult CmpHelperSTRCASEEQ(const char* s1_expression, + const char* s2_expression, + const char* s1, + const char* s2); + +// The helper function for {ASSERT|EXPECT}_STRNE. +// +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression, + const char* s2_expression, + const char* s1, + const char* s2); + +// The helper function for {ASSERT|EXPECT}_STRCASENE. +// +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +GTEST_API_ AssertionResult CmpHelperSTRCASENE(const char* s1_expression, + const char* s2_expression, + const char* s1, + const char* s2); + + +// Helper function for *_STREQ on wide strings. +// +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +GTEST_API_ AssertionResult CmpHelperSTREQ(const char* s1_expression, + const char* s2_expression, + const wchar_t* s1, + const wchar_t* s2); + +// Helper function for *_STRNE on wide strings. +// +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +GTEST_API_ AssertionResult CmpHelperSTRNE(const char* s1_expression, + const char* s2_expression, + const wchar_t* s1, + const wchar_t* s2); + +} // namespace internal + +// IsSubstring() and IsNotSubstring() are intended to be used as the +// first argument to {EXPECT,ASSERT}_PRED_FORMAT2(), not by +// themselves. They check whether needle is a substring of haystack +// (NULL is considered a substring of itself only), and return an +// appropriate error message when they fail. +// +// The {needle,haystack}_expr arguments are the stringified +// expressions that generated the two real arguments. +GTEST_API_ AssertionResult IsSubstring( + const char* needle_expr, const char* haystack_expr, + const char* needle, const char* haystack); +GTEST_API_ AssertionResult IsSubstring( + const char* needle_expr, const char* haystack_expr, + const wchar_t* needle, const wchar_t* haystack); +GTEST_API_ AssertionResult IsNotSubstring( + const char* needle_expr, const char* haystack_expr, + const char* needle, const char* haystack); +GTEST_API_ AssertionResult IsNotSubstring( + const char* needle_expr, const char* haystack_expr, + const wchar_t* needle, const wchar_t* haystack); +GTEST_API_ AssertionResult IsSubstring( + const char* needle_expr, const char* haystack_expr, + const ::std::string& needle, const ::std::string& haystack); +GTEST_API_ AssertionResult IsNotSubstring( + const char* needle_expr, const char* haystack_expr, + const ::std::string& needle, const ::std::string& haystack); + +#if GTEST_HAS_STD_WSTRING +GTEST_API_ AssertionResult IsSubstring( + const char* needle_expr, const char* haystack_expr, + const ::std::wstring& needle, const ::std::wstring& haystack); +GTEST_API_ AssertionResult IsNotSubstring( + const char* needle_expr, const char* haystack_expr, + const ::std::wstring& needle, const ::std::wstring& haystack); +#endif // GTEST_HAS_STD_WSTRING + +namespace internal { + +// Helper template function for comparing floating-points. +// +// Template parameter: +// +// RawType: the raw floating-point type (either float or double) +// +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +template +AssertionResult CmpHelperFloatingPointEQ(const char* lhs_expression, + const char* rhs_expression, + RawType lhs_value, + RawType rhs_value) { + const FloatingPoint lhs(lhs_value), rhs(rhs_value); + + if (lhs.AlmostEquals(rhs)) { + return AssertionSuccess(); + } + + ::std::stringstream lhs_ss; + lhs_ss << std::setprecision(std::numeric_limits::digits10 + 2) + << lhs_value; + + ::std::stringstream rhs_ss; + rhs_ss << std::setprecision(std::numeric_limits::digits10 + 2) + << rhs_value; + + return EqFailure(lhs_expression, + rhs_expression, + StringStreamToString(&lhs_ss), + StringStreamToString(&rhs_ss), + false); +} + +// Helper function for implementing ASSERT_NEAR. +// +// INTERNAL IMPLEMENTATION - DO NOT USE IN A USER PROGRAM. +GTEST_API_ AssertionResult DoubleNearPredFormat(const char* expr1, + const char* expr2, + const char* abs_error_expr, + double val1, + double val2, + double abs_error); + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// A class that enables one to stream messages to assertion macros +class GTEST_API_ AssertHelper { + public: + // Constructor. + AssertHelper(TestPartResult::Type type, + const char* file, + int line, + const char* message); + ~AssertHelper(); + + // Message assignment is a semantic trick to enable assertion + // streaming; see the GTEST_MESSAGE_ macro below. + void operator=(const Message& message) const; + + private: + // We put our data in a struct so that the size of the AssertHelper class can + // be as small as possible. This is important because gcc is incapable of + // re-using stack space even for temporary variables, so every EXPECT_EQ + // reserves stack space for another AssertHelper. + struct AssertHelperData { + AssertHelperData(TestPartResult::Type t, + const char* srcfile, + int line_num, + const char* msg) + : type(t), file(srcfile), line(line_num), message(msg) { } + + TestPartResult::Type const type; + const char* const file; + int const line; + std::string const message; + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelperData); + }; + + AssertHelperData* const data_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(AssertHelper); +}; + +enum GTestColor { COLOR_DEFAULT, COLOR_RED, COLOR_GREEN, COLOR_YELLOW }; + +GTEST_API_ GTEST_ATTRIBUTE_PRINTF_(2, 3) void ColoredPrintf(GTestColor color, + const char* fmt, + ...); + +} // namespace internal + +// The pure interface class that all value-parameterized tests inherit from. +// A value-parameterized class must inherit from both ::testing::Test and +// ::testing::WithParamInterface. In most cases that just means inheriting +// from ::testing::TestWithParam, but more complicated test hierarchies +// may need to inherit from Test and WithParamInterface at different levels. +// +// This interface has support for accessing the test parameter value via +// the GetParam() method. +// +// Use it with one of the parameter generator defining functions, like Range(), +// Values(), ValuesIn(), Bool(), and Combine(). +// +// class FooTest : public ::testing::TestWithParam { +// protected: +// FooTest() { +// // Can use GetParam() here. +// } +// ~FooTest() override { +// // Can use GetParam() here. +// } +// void SetUp() override { +// // Can use GetParam() here. +// } +// void TearDown override { +// // Can use GetParam() here. +// } +// }; +// TEST_P(FooTest, DoesBar) { +// // Can use GetParam() method here. +// Foo foo; +// ASSERT_TRUE(foo.DoesBar(GetParam())); +// } +// INSTANTIATE_TEST_SUITE_P(OneToTenRange, FooTest, ::testing::Range(1, 10)); + +template +class WithParamInterface { + public: + typedef T ParamType; + virtual ~WithParamInterface() {} + + // The current parameter value. Is also available in the test fixture's + // constructor. + static const ParamType& GetParam() { + GTEST_CHECK_(parameter_ != nullptr) + << "GetParam() can only be called inside a value-parameterized test " + << "-- did you intend to write TEST_P instead of TEST_F?"; + return *parameter_; + } + + private: + // Sets parameter value. The caller is responsible for making sure the value + // remains alive and unchanged throughout the current test. + static void SetParam(const ParamType* parameter) { + parameter_ = parameter; + } + + // Static value used for accessing parameter during a test lifetime. + static const ParamType* parameter_; + + // TestClass must be a subclass of WithParamInterface and Test. + template friend class internal::ParameterizedTestFactory; +}; + +template +const T* WithParamInterface::parameter_ = nullptr; + +// Most value-parameterized classes can ignore the existence of +// WithParamInterface, and can just inherit from ::testing::TestWithParam. + +template +class TestWithParam : public Test, public WithParamInterface { +}; + +// Macros for indicating success/failure in test code. + +// Skips test in runtime. +// Skipping test aborts current function. +// Skipped tests are neither successful nor failed. +#define GTEST_SKIP() GTEST_SKIP_("Skipped") + +// ADD_FAILURE unconditionally adds a failure to the current test. +// SUCCEED generates a success - it doesn't automatically make the +// current test successful, as a test is only successful when it has +// no failure. +// +// EXPECT_* verifies that a certain condition is satisfied. If not, +// it behaves like ADD_FAILURE. In particular: +// +// EXPECT_TRUE verifies that a Boolean condition is true. +// EXPECT_FALSE verifies that a Boolean condition is false. +// +// FAIL and ASSERT_* are similar to ADD_FAILURE and EXPECT_*, except +// that they will also abort the current function on failure. People +// usually want the fail-fast behavior of FAIL and ASSERT_*, but those +// writing data-driven tests often find themselves using ADD_FAILURE +// and EXPECT_* more. + +// Generates a nonfatal failure with a generic message. +#define ADD_FAILURE() GTEST_NONFATAL_FAILURE_("Failed") + +// Generates a nonfatal failure at the given source file location with +// a generic message. +#define ADD_FAILURE_AT(file, line) \ + GTEST_MESSAGE_AT_(file, line, "Failed", \ + ::testing::TestPartResult::kNonFatalFailure) + +// Generates a fatal failure with a generic message. +#define GTEST_FAIL() GTEST_FATAL_FAILURE_("Failed") + +// Like GTEST_FAIL(), but at the given source file location. +#define GTEST_FAIL_AT(file, line) \ + GTEST_MESSAGE_AT_(file, line, "Failed", \ + ::testing::TestPartResult::kFatalFailure) + +// Define this macro to 1 to omit the definition of FAIL(), which is a +// generic name and clashes with some other libraries. +#if !GTEST_DONT_DEFINE_FAIL +# define FAIL() GTEST_FAIL() +#endif + +// Generates a success with a generic message. +#define GTEST_SUCCEED() GTEST_SUCCESS_("Succeeded") + +// Define this macro to 1 to omit the definition of SUCCEED(), which +// is a generic name and clashes with some other libraries. +#if !GTEST_DONT_DEFINE_SUCCEED +# define SUCCEED() GTEST_SUCCEED() +#endif + +// Macros for testing exceptions. +// +// * {ASSERT|EXPECT}_THROW(statement, expected_exception): +// Tests that the statement throws the expected exception. +// * {ASSERT|EXPECT}_NO_THROW(statement): +// Tests that the statement doesn't throw any exception. +// * {ASSERT|EXPECT}_ANY_THROW(statement): +// Tests that the statement throws an exception. + +#define EXPECT_THROW(statement, expected_exception) \ + GTEST_TEST_THROW_(statement, expected_exception, GTEST_NONFATAL_FAILURE_) +#define EXPECT_NO_THROW(statement) \ + GTEST_TEST_NO_THROW_(statement, GTEST_NONFATAL_FAILURE_) +#define EXPECT_ANY_THROW(statement) \ + GTEST_TEST_ANY_THROW_(statement, GTEST_NONFATAL_FAILURE_) +#define ASSERT_THROW(statement, expected_exception) \ + GTEST_TEST_THROW_(statement, expected_exception, GTEST_FATAL_FAILURE_) +#define ASSERT_NO_THROW(statement) \ + GTEST_TEST_NO_THROW_(statement, GTEST_FATAL_FAILURE_) +#define ASSERT_ANY_THROW(statement) \ + GTEST_TEST_ANY_THROW_(statement, GTEST_FATAL_FAILURE_) + +// Boolean assertions. Condition can be either a Boolean expression or an +// AssertionResult. For more information on how to use AssertionResult with +// these macros see comments on that class. +#define EXPECT_TRUE(condition) \ + GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \ + GTEST_NONFATAL_FAILURE_) +#define EXPECT_FALSE(condition) \ + GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \ + GTEST_NONFATAL_FAILURE_) +#define ASSERT_TRUE(condition) \ + GTEST_TEST_BOOLEAN_(condition, #condition, false, true, \ + GTEST_FATAL_FAILURE_) +#define ASSERT_FALSE(condition) \ + GTEST_TEST_BOOLEAN_(!(condition), #condition, true, false, \ + GTEST_FATAL_FAILURE_) + +// Macros for testing equalities and inequalities. +// +// * {ASSERT|EXPECT}_EQ(v1, v2): Tests that v1 == v2 +// * {ASSERT|EXPECT}_NE(v1, v2): Tests that v1 != v2 +// * {ASSERT|EXPECT}_LT(v1, v2): Tests that v1 < v2 +// * {ASSERT|EXPECT}_LE(v1, v2): Tests that v1 <= v2 +// * {ASSERT|EXPECT}_GT(v1, v2): Tests that v1 > v2 +// * {ASSERT|EXPECT}_GE(v1, v2): Tests that v1 >= v2 +// +// When they are not, Google Test prints both the tested expressions and +// their actual values. The values must be compatible built-in types, +// or you will get a compiler error. By "compatible" we mean that the +// values can be compared by the respective operator. +// +// Note: +// +// 1. It is possible to make a user-defined type work with +// {ASSERT|EXPECT}_??(), but that requires overloading the +// comparison operators and is thus discouraged by the Google C++ +// Usage Guide. Therefore, you are advised to use the +// {ASSERT|EXPECT}_TRUE() macro to assert that two objects are +// equal. +// +// 2. The {ASSERT|EXPECT}_??() macros do pointer comparisons on +// pointers (in particular, C strings). Therefore, if you use it +// with two C strings, you are testing how their locations in memory +// are related, not how their content is related. To compare two C +// strings by content, use {ASSERT|EXPECT}_STR*(). +// +// 3. {ASSERT|EXPECT}_EQ(v1, v2) is preferred to +// {ASSERT|EXPECT}_TRUE(v1 == v2), as the former tells you +// what the actual value is when it fails, and similarly for the +// other comparisons. +// +// 4. Do not depend on the order in which {ASSERT|EXPECT}_??() +// evaluate their arguments, which is undefined. +// +// 5. These macros evaluate their arguments exactly once. +// +// Examples: +// +// EXPECT_NE(Foo(), 5); +// EXPECT_EQ(a_pointer, NULL); +// ASSERT_LT(i, array_size); +// ASSERT_GT(records.size(), 0) << "There is no record left."; + +#define EXPECT_EQ(val1, val2) \ + EXPECT_PRED_FORMAT2(::testing::internal::EqHelper::Compare, val1, val2) +#define EXPECT_NE(val1, val2) \ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2) +#define EXPECT_LE(val1, val2) \ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2) +#define EXPECT_LT(val1, val2) \ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2) +#define EXPECT_GE(val1, val2) \ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2) +#define EXPECT_GT(val1, val2) \ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2) + +#define GTEST_ASSERT_EQ(val1, val2) \ + ASSERT_PRED_FORMAT2(::testing::internal::EqHelper::Compare, val1, val2) +#define GTEST_ASSERT_NE(val1, val2) \ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperNE, val1, val2) +#define GTEST_ASSERT_LE(val1, val2) \ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLE, val1, val2) +#define GTEST_ASSERT_LT(val1, val2) \ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperLT, val1, val2) +#define GTEST_ASSERT_GE(val1, val2) \ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGE, val1, val2) +#define GTEST_ASSERT_GT(val1, val2) \ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperGT, val1, val2) + +// Define macro GTEST_DONT_DEFINE_ASSERT_XY to 1 to omit the definition of +// ASSERT_XY(), which clashes with some users' own code. + +#if !GTEST_DONT_DEFINE_ASSERT_EQ +# define ASSERT_EQ(val1, val2) GTEST_ASSERT_EQ(val1, val2) +#endif + +#if !GTEST_DONT_DEFINE_ASSERT_NE +# define ASSERT_NE(val1, val2) GTEST_ASSERT_NE(val1, val2) +#endif + +#if !GTEST_DONT_DEFINE_ASSERT_LE +# define ASSERT_LE(val1, val2) GTEST_ASSERT_LE(val1, val2) +#endif + +#if !GTEST_DONT_DEFINE_ASSERT_LT +# define ASSERT_LT(val1, val2) GTEST_ASSERT_LT(val1, val2) +#endif + +#if !GTEST_DONT_DEFINE_ASSERT_GE +# define ASSERT_GE(val1, val2) GTEST_ASSERT_GE(val1, val2) +#endif + +#if !GTEST_DONT_DEFINE_ASSERT_GT +# define ASSERT_GT(val1, val2) GTEST_ASSERT_GT(val1, val2) +#endif + +// C-string Comparisons. All tests treat NULL and any non-NULL string +// as different. Two NULLs are equal. +// +// * {ASSERT|EXPECT}_STREQ(s1, s2): Tests that s1 == s2 +// * {ASSERT|EXPECT}_STRNE(s1, s2): Tests that s1 != s2 +// * {ASSERT|EXPECT}_STRCASEEQ(s1, s2): Tests that s1 == s2, ignoring case +// * {ASSERT|EXPECT}_STRCASENE(s1, s2): Tests that s1 != s2, ignoring case +// +// For wide or narrow string objects, you can use the +// {ASSERT|EXPECT}_??() macros. +// +// Don't depend on the order in which the arguments are evaluated, +// which is undefined. +// +// These macros evaluate their arguments exactly once. + +#define EXPECT_STREQ(s1, s2) \ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2) +#define EXPECT_STRNE(s1, s2) \ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2) +#define EXPECT_STRCASEEQ(s1, s2) \ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2) +#define EXPECT_STRCASENE(s1, s2)\ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2) + +#define ASSERT_STREQ(s1, s2) \ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTREQ, s1, s2) +#define ASSERT_STRNE(s1, s2) \ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRNE, s1, s2) +#define ASSERT_STRCASEEQ(s1, s2) \ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASEEQ, s1, s2) +#define ASSERT_STRCASENE(s1, s2)\ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperSTRCASENE, s1, s2) + +// Macros for comparing floating-point numbers. +// +// * {ASSERT|EXPECT}_FLOAT_EQ(val1, val2): +// Tests that two float values are almost equal. +// * {ASSERT|EXPECT}_DOUBLE_EQ(val1, val2): +// Tests that two double values are almost equal. +// * {ASSERT|EXPECT}_NEAR(v1, v2, abs_error): +// Tests that v1 and v2 are within the given distance to each other. +// +// Google Test uses ULP-based comparison to automatically pick a default +// error bound that is appropriate for the operands. See the +// FloatingPoint template class in gtest-internal.h if you are +// interested in the implementation details. + +#define EXPECT_FLOAT_EQ(val1, val2)\ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ + val1, val2) + +#define EXPECT_DOUBLE_EQ(val1, val2)\ + EXPECT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ + val1, val2) + +#define ASSERT_FLOAT_EQ(val1, val2)\ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ + val1, val2) + +#define ASSERT_DOUBLE_EQ(val1, val2)\ + ASSERT_PRED_FORMAT2(::testing::internal::CmpHelperFloatingPointEQ, \ + val1, val2) + +#define EXPECT_NEAR(val1, val2, abs_error)\ + EXPECT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \ + val1, val2, abs_error) + +#define ASSERT_NEAR(val1, val2, abs_error)\ + ASSERT_PRED_FORMAT3(::testing::internal::DoubleNearPredFormat, \ + val1, val2, abs_error) + +// These predicate format functions work on floating-point values, and +// can be used in {ASSERT|EXPECT}_PRED_FORMAT2*(), e.g. +// +// EXPECT_PRED_FORMAT2(testing::DoubleLE, Foo(), 5.0); + +// Asserts that val1 is less than, or almost equal to, val2. Fails +// otherwise. In particular, it fails if either val1 or val2 is NaN. +GTEST_API_ AssertionResult FloatLE(const char* expr1, const char* expr2, + float val1, float val2); +GTEST_API_ AssertionResult DoubleLE(const char* expr1, const char* expr2, + double val1, double val2); + + +#if GTEST_OS_WINDOWS + +// Macros that test for HRESULT failure and success, these are only useful +// on Windows, and rely on Windows SDK macros and APIs to compile. +// +// * {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED}(expr) +// +// When expr unexpectedly fails or succeeds, Google Test prints the +// expected result and the actual result with both a human-readable +// string representation of the error, if available, as well as the +// hex result code. +# define EXPECT_HRESULT_SUCCEEDED(expr) \ + EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr)) + +# define ASSERT_HRESULT_SUCCEEDED(expr) \ + ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTSuccess, (expr)) + +# define EXPECT_HRESULT_FAILED(expr) \ + EXPECT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr)) + +# define ASSERT_HRESULT_FAILED(expr) \ + ASSERT_PRED_FORMAT1(::testing::internal::IsHRESULTFailure, (expr)) + +#endif // GTEST_OS_WINDOWS + +// Macros that execute statement and check that it doesn't generate new fatal +// failures in the current thread. +// +// * {ASSERT|EXPECT}_NO_FATAL_FAILURE(statement); +// +// Examples: +// +// EXPECT_NO_FATAL_FAILURE(Process()); +// ASSERT_NO_FATAL_FAILURE(Process()) << "Process() failed"; +// +#define ASSERT_NO_FATAL_FAILURE(statement) \ + GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_FATAL_FAILURE_) +#define EXPECT_NO_FATAL_FAILURE(statement) \ + GTEST_TEST_NO_FATAL_FAILURE_(statement, GTEST_NONFATAL_FAILURE_) + +// Causes a trace (including the given source file path and line number, +// and the given message) to be included in every test failure message generated +// by code in the scope of the lifetime of an instance of this class. The effect +// is undone with the destruction of the instance. +// +// The message argument can be anything streamable to std::ostream. +// +// Example: +// testing::ScopedTrace trace("file.cc", 123, "message"); +// +class GTEST_API_ ScopedTrace { + public: + // The c'tor pushes the given source file location and message onto + // a trace stack maintained by Google Test. + + // Template version. Uses Message() to convert the values into strings. + // Slow, but flexible. + template + ScopedTrace(const char* file, int line, const T& message) { + PushTrace(file, line, (Message() << message).GetString()); + } + + // Optimize for some known types. + ScopedTrace(const char* file, int line, const char* message) { + PushTrace(file, line, message ? message : "(null)"); + } + + ScopedTrace(const char* file, int line, const std::string& message) { + PushTrace(file, line, message); + } + + // The d'tor pops the info pushed by the c'tor. + // + // Note that the d'tor is not virtual in order to be efficient. + // Don't inherit from ScopedTrace! + ~ScopedTrace(); + + private: + void PushTrace(const char* file, int line, std::string message); + + GTEST_DISALLOW_COPY_AND_ASSIGN_(ScopedTrace); +} GTEST_ATTRIBUTE_UNUSED_; // A ScopedTrace object does its job in its + // c'tor and d'tor. Therefore it doesn't + // need to be used otherwise. + +// Causes a trace (including the source file path, the current line +// number, and the given message) to be included in every test failure +// message generated by code in the current scope. The effect is +// undone when the control leaves the current scope. +// +// The message argument can be anything streamable to std::ostream. +// +// In the implementation, we include the current line number as part +// of the dummy variable name, thus allowing multiple SCOPED_TRACE()s +// to appear in the same block - as long as they are on different +// lines. +// +// Assuming that each thread maintains its own stack of traces. +// Therefore, a SCOPED_TRACE() would (correctly) only affect the +// assertions in its own thread. +#define SCOPED_TRACE(message) \ + ::testing::ScopedTrace GTEST_CONCAT_TOKEN_(gtest_trace_, __LINE__)(\ + __FILE__, __LINE__, (message)) + +// Compile-time assertion for type equality. +// StaticAssertTypeEq() compiles if and only if type1 and type2 +// are the same type. The value it returns is not interesting. +// +// Instead of making StaticAssertTypeEq a class template, we make it a +// function template that invokes a helper class template. This +// prevents a user from misusing StaticAssertTypeEq by +// defining objects of that type. +// +// CAVEAT: +// +// When used inside a method of a class template, +// StaticAssertTypeEq() is effective ONLY IF the method is +// instantiated. For example, given: +// +// template class Foo { +// public: +// void Bar() { testing::StaticAssertTypeEq(); } +// }; +// +// the code: +// +// void Test1() { Foo foo; } +// +// will NOT generate a compiler error, as Foo::Bar() is never +// actually instantiated. Instead, you need: +// +// void Test2() { Foo foo; foo.Bar(); } +// +// to cause a compiler error. +template +constexpr bool StaticAssertTypeEq() noexcept { + static_assert(std::is_same::value, + "type1 and type2 are not the same type"); + return true; +} + +// Defines a test. +// +// The first parameter is the name of the test suite, and the second +// parameter is the name of the test within the test suite. +// +// The convention is to end the test suite name with "Test". For +// example, a test suite for the Foo class can be named FooTest. +// +// Test code should appear between braces after an invocation of +// this macro. Example: +// +// TEST(FooTest, InitializesCorrectly) { +// Foo foo; +// EXPECT_TRUE(foo.StatusIsOK()); +// } + +// Note that we call GetTestTypeId() instead of GetTypeId< +// ::testing::Test>() here to get the type ID of testing::Test. This +// is to work around a suspected linker bug when using Google Test as +// a framework on Mac OS X. The bug causes GetTypeId< +// ::testing::Test>() to return different values depending on whether +// the call is from the Google Test framework itself or from user test +// code. GetTestTypeId() is guaranteed to always return the same +// value, as it always calls GetTypeId<>() from the Google Test +// framework. +#define GTEST_TEST(test_suite_name, test_name) \ + GTEST_TEST_(test_suite_name, test_name, ::testing::Test, \ + ::testing::internal::GetTestTypeId()) + +// Define this macro to 1 to omit the definition of TEST(), which +// is a generic name and clashes with some other libraries. +#if !GTEST_DONT_DEFINE_TEST +#define TEST(test_suite_name, test_name) GTEST_TEST(test_suite_name, test_name) +#endif + +// Defines a test that uses a test fixture. +// +// The first parameter is the name of the test fixture class, which +// also doubles as the test suite name. The second parameter is the +// name of the test within the test suite. +// +// A test fixture class must be declared earlier. The user should put +// the test code between braces after using this macro. Example: +// +// class FooTest : public testing::Test { +// protected: +// void SetUp() override { b_.AddElement(3); } +// +// Foo a_; +// Foo b_; +// }; +// +// TEST_F(FooTest, InitializesCorrectly) { +// EXPECT_TRUE(a_.StatusIsOK()); +// } +// +// TEST_F(FooTest, ReturnsElementCountCorrectly) { +// EXPECT_EQ(a_.size(), 0); +// EXPECT_EQ(b_.size(), 1); +// } +// +// GOOGLETEST_CM0011 DO NOT DELETE +#define TEST_F(test_fixture, test_name)\ + GTEST_TEST_(test_fixture, test_name, test_fixture, \ + ::testing::internal::GetTypeId()) + +// Returns a path to temporary directory. +// Tries to determine an appropriate directory for the platform. +GTEST_API_ std::string TempDir(); + +#ifdef _MSC_VER +# pragma warning(pop) +#endif + +// Dynamically registers a test with the framework. +// +// This is an advanced API only to be used when the `TEST` macros are +// insufficient. The macros should be preferred when possible, as they avoid +// most of the complexity of calling this function. +// +// The `factory` argument is a factory callable (move-constructible) object or +// function pointer that creates a new instance of the Test object. It +// handles ownership to the caller. The signature of the callable is +// `Fixture*()`, where `Fixture` is the test fixture class for the test. All +// tests registered with the same `test_suite_name` must return the same +// fixture type. This is checked at runtime. +// +// The framework will infer the fixture class from the factory and will call +// the `SetUpTestSuite` and `TearDownTestSuite` for it. +// +// Must be called before `RUN_ALL_TESTS()` is invoked, otherwise behavior is +// undefined. +// +// Use case example: +// +// class MyFixture : public ::testing::Test { +// public: +// // All of these optional, just like in regular macro usage. +// static void SetUpTestSuite() { ... } +// static void TearDownTestSuite() { ... } +// void SetUp() override { ... } +// void TearDown() override { ... } +// }; +// +// class MyTest : public MyFixture { +// public: +// explicit MyTest(int data) : data_(data) {} +// void TestBody() override { ... } +// +// private: +// int data_; +// }; +// +// void RegisterMyTests(const std::vector& values) { +// for (int v : values) { +// ::testing::RegisterTest( +// "MyFixture", ("Test" + std::to_string(v)).c_str(), nullptr, +// std::to_string(v).c_str(), +// __FILE__, __LINE__, +// // Important to use the fixture type as the return type here. +// [=]() -> MyFixture* { return new MyTest(v); }); +// } +// } +// ... +// int main(int argc, char** argv) { +// std::vector values_to_test = LoadValuesFromConfig(); +// RegisterMyTests(values_to_test); +// ... +// return RUN_ALL_TESTS(); +// } +// +template +TestInfo* RegisterTest(const char* test_suite_name, const char* test_name, + const char* type_param, const char* value_param, + const char* file, int line, Factory factory) { + using TestT = typename std::remove_pointer::type; + + class FactoryImpl : public internal::TestFactoryBase { + public: + explicit FactoryImpl(Factory f) : factory_(std::move(f)) {} + Test* CreateTest() override { return factory_(); } + + private: + Factory factory_; + }; + + return internal::MakeAndRegisterTestInfo( + test_suite_name, test_name, type_param, value_param, + internal::CodeLocation(file, line), internal::GetTypeId(), + internal::SuiteApiResolver::GetSetUpCaseOrSuite(file, line), + internal::SuiteApiResolver::GetTearDownCaseOrSuite(file, line), + new FactoryImpl{std::move(factory)}); +} + +} // namespace testing + +// Use this function in main() to run all tests. It returns 0 if all +// tests are successful, or 1 otherwise. +// +// RUN_ALL_TESTS() should be invoked after the command line has been +// parsed by InitGoogleTest(). +// +// This function was formerly a macro; thus, it is in the global +// namespace and has an all-caps name. +int RUN_ALL_TESTS() GTEST_MUST_USE_RESULT_; + +inline int RUN_ALL_TESTS() { + return ::testing::UnitTest::GetInstance()->Run(); +} + +GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 + +#endif // GTEST_INCLUDE_GTEST_GTEST_H_ diff --git a/include/gtest/gtest_pred_impl.h b/include/gtest/gtest_pred_impl.h new file mode 100644 index 0000000..d514255 --- /dev/null +++ b/include/gtest/gtest_pred_impl.h @@ -0,0 +1,359 @@ +// Copyright 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// This file is AUTOMATICALLY GENERATED on 01/02/2019 by command +// 'gen_gtest_pred_impl.py 5'. DO NOT EDIT BY HAND! +// +// Implements a family of generic predicate assertion macros. +// GOOGLETEST_CM0001 DO NOT DELETE + +#ifndef GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ +#define GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ + +#include "gtest/gtest.h" + +namespace testing { + +// This header implements a family of generic predicate assertion +// macros: +// +// ASSERT_PRED_FORMAT1(pred_format, v1) +// ASSERT_PRED_FORMAT2(pred_format, v1, v2) +// ... +// +// where pred_format is a function or functor that takes n (in the +// case of ASSERT_PRED_FORMATn) values and their source expression +// text, and returns a testing::AssertionResult. See the definition +// of ASSERT_EQ in gtest.h for an example. +// +// If you don't care about formatting, you can use the more +// restrictive version: +// +// ASSERT_PRED1(pred, v1) +// ASSERT_PRED2(pred, v1, v2) +// ... +// +// where pred is an n-ary function or functor that returns bool, +// and the values v1, v2, ..., must support the << operator for +// streaming to std::ostream. +// +// We also define the EXPECT_* variations. +// +// For now we only support predicates whose arity is at most 5. +// Please email googletestframework@googlegroups.com if you need +// support for higher arities. + +// GTEST_ASSERT_ is the basic statement to which all of the assertions +// in this file reduce. Don't use this in your code. + +#define GTEST_ASSERT_(expression, on_failure) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (const ::testing::AssertionResult gtest_ar = (expression)) \ + ; \ + else \ + on_failure(gtest_ar.failure_message()) + + +// Helper function for implementing {EXPECT|ASSERT}_PRED1. Don't use +// this in your code. +template +AssertionResult AssertPred1Helper(const char* pred_text, + const char* e1, + Pred pred, + const T1& v1) { + if (pred(v1)) return AssertionSuccess(); + + return AssertionFailure() + << pred_text << "(" << e1 << ") evaluates to false, where" + << "\n" + << e1 << " evaluates to " << ::testing::PrintToString(v1); +} + +// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT1. +// Don't use this in your code. +#define GTEST_PRED_FORMAT1_(pred_format, v1, on_failure)\ + GTEST_ASSERT_(pred_format(#v1, v1), \ + on_failure) + +// Internal macro for implementing {EXPECT|ASSERT}_PRED1. Don't use +// this in your code. +#define GTEST_PRED1_(pred, v1, on_failure)\ + GTEST_ASSERT_(::testing::AssertPred1Helper(#pred, \ + #v1, \ + pred, \ + v1), on_failure) + +// Unary predicate assertion macros. +#define EXPECT_PRED_FORMAT1(pred_format, v1) \ + GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_NONFATAL_FAILURE_) +#define EXPECT_PRED1(pred, v1) \ + GTEST_PRED1_(pred, v1, GTEST_NONFATAL_FAILURE_) +#define ASSERT_PRED_FORMAT1(pred_format, v1) \ + GTEST_PRED_FORMAT1_(pred_format, v1, GTEST_FATAL_FAILURE_) +#define ASSERT_PRED1(pred, v1) \ + GTEST_PRED1_(pred, v1, GTEST_FATAL_FAILURE_) + + + +// Helper function for implementing {EXPECT|ASSERT}_PRED2. Don't use +// this in your code. +template +AssertionResult AssertPred2Helper(const char* pred_text, + const char* e1, + const char* e2, + Pred pred, + const T1& v1, + const T2& v2) { + if (pred(v1, v2)) return AssertionSuccess(); + + return AssertionFailure() + << pred_text << "(" << e1 << ", " << e2 + << ") evaluates to false, where" + << "\n" + << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n" + << e2 << " evaluates to " << ::testing::PrintToString(v2); +} + +// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT2. +// Don't use this in your code. +#define GTEST_PRED_FORMAT2_(pred_format, v1, v2, on_failure)\ + GTEST_ASSERT_(pred_format(#v1, #v2, v1, v2), \ + on_failure) + +// Internal macro for implementing {EXPECT|ASSERT}_PRED2. Don't use +// this in your code. +#define GTEST_PRED2_(pred, v1, v2, on_failure)\ + GTEST_ASSERT_(::testing::AssertPred2Helper(#pred, \ + #v1, \ + #v2, \ + pred, \ + v1, \ + v2), on_failure) + +// Binary predicate assertion macros. +#define EXPECT_PRED_FORMAT2(pred_format, v1, v2) \ + GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_NONFATAL_FAILURE_) +#define EXPECT_PRED2(pred, v1, v2) \ + GTEST_PRED2_(pred, v1, v2, GTEST_NONFATAL_FAILURE_) +#define ASSERT_PRED_FORMAT2(pred_format, v1, v2) \ + GTEST_PRED_FORMAT2_(pred_format, v1, v2, GTEST_FATAL_FAILURE_) +#define ASSERT_PRED2(pred, v1, v2) \ + GTEST_PRED2_(pred, v1, v2, GTEST_FATAL_FAILURE_) + + + +// Helper function for implementing {EXPECT|ASSERT}_PRED3. Don't use +// this in your code. +template +AssertionResult AssertPred3Helper(const char* pred_text, + const char* e1, + const char* e2, + const char* e3, + Pred pred, + const T1& v1, + const T2& v2, + const T3& v3) { + if (pred(v1, v2, v3)) return AssertionSuccess(); + + return AssertionFailure() + << pred_text << "(" << e1 << ", " << e2 << ", " << e3 + << ") evaluates to false, where" + << "\n" + << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n" + << e2 << " evaluates to " << ::testing::PrintToString(v2) << "\n" + << e3 << " evaluates to " << ::testing::PrintToString(v3); +} + +// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT3. +// Don't use this in your code. +#define GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, on_failure)\ + GTEST_ASSERT_(pred_format(#v1, #v2, #v3, v1, v2, v3), \ + on_failure) + +// Internal macro for implementing {EXPECT|ASSERT}_PRED3. Don't use +// this in your code. +#define GTEST_PRED3_(pred, v1, v2, v3, on_failure)\ + GTEST_ASSERT_(::testing::AssertPred3Helper(#pred, \ + #v1, \ + #v2, \ + #v3, \ + pred, \ + v1, \ + v2, \ + v3), on_failure) + +// Ternary predicate assertion macros. +#define EXPECT_PRED_FORMAT3(pred_format, v1, v2, v3) \ + GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_NONFATAL_FAILURE_) +#define EXPECT_PRED3(pred, v1, v2, v3) \ + GTEST_PRED3_(pred, v1, v2, v3, GTEST_NONFATAL_FAILURE_) +#define ASSERT_PRED_FORMAT3(pred_format, v1, v2, v3) \ + GTEST_PRED_FORMAT3_(pred_format, v1, v2, v3, GTEST_FATAL_FAILURE_) +#define ASSERT_PRED3(pred, v1, v2, v3) \ + GTEST_PRED3_(pred, v1, v2, v3, GTEST_FATAL_FAILURE_) + + + +// Helper function for implementing {EXPECT|ASSERT}_PRED4. Don't use +// this in your code. +template +AssertionResult AssertPred4Helper(const char* pred_text, + const char* e1, + const char* e2, + const char* e3, + const char* e4, + Pred pred, + const T1& v1, + const T2& v2, + const T3& v3, + const T4& v4) { + if (pred(v1, v2, v3, v4)) return AssertionSuccess(); + + return AssertionFailure() + << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ", " << e4 + << ") evaluates to false, where" + << "\n" + << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n" + << e2 << " evaluates to " << ::testing::PrintToString(v2) << "\n" + << e3 << " evaluates to " << ::testing::PrintToString(v3) << "\n" + << e4 << " evaluates to " << ::testing::PrintToString(v4); +} + +// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT4. +// Don't use this in your code. +#define GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, on_failure)\ + GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, v1, v2, v3, v4), \ + on_failure) + +// Internal macro for implementing {EXPECT|ASSERT}_PRED4. Don't use +// this in your code. +#define GTEST_PRED4_(pred, v1, v2, v3, v4, on_failure)\ + GTEST_ASSERT_(::testing::AssertPred4Helper(#pred, \ + #v1, \ + #v2, \ + #v3, \ + #v4, \ + pred, \ + v1, \ + v2, \ + v3, \ + v4), on_failure) + +// 4-ary predicate assertion macros. +#define EXPECT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ + GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) +#define EXPECT_PRED4(pred, v1, v2, v3, v4) \ + GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_NONFATAL_FAILURE_) +#define ASSERT_PRED_FORMAT4(pred_format, v1, v2, v3, v4) \ + GTEST_PRED_FORMAT4_(pred_format, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) +#define ASSERT_PRED4(pred, v1, v2, v3, v4) \ + GTEST_PRED4_(pred, v1, v2, v3, v4, GTEST_FATAL_FAILURE_) + + + +// Helper function for implementing {EXPECT|ASSERT}_PRED5. Don't use +// this in your code. +template +AssertionResult AssertPred5Helper(const char* pred_text, + const char* e1, + const char* e2, + const char* e3, + const char* e4, + const char* e5, + Pred pred, + const T1& v1, + const T2& v2, + const T3& v3, + const T4& v4, + const T5& v5) { + if (pred(v1, v2, v3, v4, v5)) return AssertionSuccess(); + + return AssertionFailure() + << pred_text << "(" << e1 << ", " << e2 << ", " << e3 << ", " << e4 + << ", " << e5 << ") evaluates to false, where" + << "\n" + << e1 << " evaluates to " << ::testing::PrintToString(v1) << "\n" + << e2 << " evaluates to " << ::testing::PrintToString(v2) << "\n" + << e3 << " evaluates to " << ::testing::PrintToString(v3) << "\n" + << e4 << " evaluates to " << ::testing::PrintToString(v4) << "\n" + << e5 << " evaluates to " << ::testing::PrintToString(v5); +} + +// Internal macro for implementing {EXPECT|ASSERT}_PRED_FORMAT5. +// Don't use this in your code. +#define GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, on_failure)\ + GTEST_ASSERT_(pred_format(#v1, #v2, #v3, #v4, #v5, v1, v2, v3, v4, v5), \ + on_failure) + +// Internal macro for implementing {EXPECT|ASSERT}_PRED5. Don't use +// this in your code. +#define GTEST_PRED5_(pred, v1, v2, v3, v4, v5, on_failure)\ + GTEST_ASSERT_(::testing::AssertPred5Helper(#pred, \ + #v1, \ + #v2, \ + #v3, \ + #v4, \ + #v5, \ + pred, \ + v1, \ + v2, \ + v3, \ + v4, \ + v5), on_failure) + +// 5-ary predicate assertion macros. +#define EXPECT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ + GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) +#define EXPECT_PRED5(pred, v1, v2, v3, v4, v5) \ + GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_NONFATAL_FAILURE_) +#define ASSERT_PRED_FORMAT5(pred_format, v1, v2, v3, v4, v5) \ + GTEST_PRED_FORMAT5_(pred_format, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) +#define ASSERT_PRED5(pred, v1, v2, v3, v4, v5) \ + GTEST_PRED5_(pred, v1, v2, v3, v4, v5, GTEST_FATAL_FAILURE_) + + + +} // namespace testing + +#endif // GTEST_INCLUDE_GTEST_GTEST_PRED_IMPL_H_ diff --git a/include/gtest/gtest_prod.h b/include/gtest/gtest_prod.h new file mode 100644 index 0000000..e651671 --- /dev/null +++ b/include/gtest/gtest_prod.h @@ -0,0 +1,61 @@ +// Copyright 2006, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// +// Google C++ Testing and Mocking Framework definitions useful in production code. +// GOOGLETEST_CM0003 DO NOT DELETE + +#ifndef GTEST_INCLUDE_GTEST_GTEST_PROD_H_ +#define GTEST_INCLUDE_GTEST_GTEST_PROD_H_ + +// When you need to test the private or protected members of a class, +// use the FRIEND_TEST macro to declare your tests as friends of the +// class. For example: +// +// class MyClass { +// private: +// void PrivateMethod(); +// FRIEND_TEST(MyClassTest, PrivateMethodWorks); +// }; +// +// class MyClassTest : public testing::Test { +// // ... +// }; +// +// TEST_F(MyClassTest, PrivateMethodWorks) { +// // Can call MyClass::PrivateMethod() here. +// } +// +// Note: The test class must be in the same namespace as the class being tested. +// For example, putting MyClassTest in an anonymous namespace will not work. + +#define FRIEND_TEST(test_case_name, test_name)\ +friend class test_case_name##_##test_name##_Test + +#endif // GTEST_INCLUDE_GTEST_GTEST_PROD_H_ diff --git a/include/gtest/internal/custom/README.md b/include/gtest/internal/custom/README.md new file mode 100644 index 0000000..ff391fb --- /dev/null +++ b/include/gtest/internal/custom/README.md @@ -0,0 +1,56 @@ +# Customization Points + +The custom directory is an injection point for custom user configurations. + +## Header `gtest.h` + +### The following macros can be defined: + +* `GTEST_OS_STACK_TRACE_GETTER_` - The name of an implementation of + `OsStackTraceGetterInterface`. +* `GTEST_CUSTOM_TEMPDIR_FUNCTION_` - An override for `testing::TempDir()`. See + `testing::TempDir` for semantics and signature. + +## Header `gtest-port.h` + +The following macros can be defined: + +### Flag related macros: + +* `GTEST_FLAG(flag_name)` +* `GTEST_USE_OWN_FLAGFILE_FLAG_` - Define to 0 when the system provides its + own flagfile flag parsing. +* `GTEST_DECLARE_bool_(name)` +* `GTEST_DECLARE_int32_(name)` +* `GTEST_DECLARE_string_(name)` +* `GTEST_DEFINE_bool_(name, default_val, doc)` +* `GTEST_DEFINE_int32_(name, default_val, doc)` +* `GTEST_DEFINE_string_(name, default_val, doc)` + +### Logging: + +* `GTEST_LOG_(severity)` +* `GTEST_CHECK_(condition)` +* Functions `LogToStderr()` and `FlushInfoLog()` have to be provided too. + +### Threading: + +* `GTEST_HAS_NOTIFICATION_` - Enabled if Notification is already provided. +* `GTEST_HAS_MUTEX_AND_THREAD_LOCAL_` - Enabled if `Mutex` and `ThreadLocal` + are already provided. Must also provide `GTEST_DECLARE_STATIC_MUTEX_(mutex)` + and `GTEST_DEFINE_STATIC_MUTEX_(mutex)` +* `GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks)` +* `GTEST_LOCK_EXCLUDED_(locks)` + +### Underlying library support features + +* `GTEST_HAS_CXXABI_H_` + +### Exporting API symbols: + +* `GTEST_API_` - Specifier for exported symbols. + +## Header `gtest-printers.h` + +* See documentation at `gtest/gtest-printers.h` for details on how to define a + custom printer. diff --git a/include/gtest/internal/custom/gtest-port.h b/include/gtest/internal/custom/gtest-port.h new file mode 100644 index 0000000..cd85d95 --- /dev/null +++ b/include/gtest/internal/custom/gtest-port.h @@ -0,0 +1,37 @@ +// Copyright 2015, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Injection point for custom user configurations. See README for details +// +// ** Custom implementation starts here ** + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PORT_H_ diff --git a/include/gtest/internal/custom/gtest-printers.h b/include/gtest/internal/custom/gtest-printers.h new file mode 100644 index 0000000..eb4467a --- /dev/null +++ b/include/gtest/internal/custom/gtest-printers.h @@ -0,0 +1,42 @@ +// Copyright 2015, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// This file provides an injection point for custom printers in a local +// installation of gTest. +// It will be included from gtest-printers.h and the overrides in this file +// will be visible to everyone. +// +// Injection point for custom user configurations. See README for details +// +// ** Custom implementation starts here ** + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_PRINTERS_H_ diff --git a/include/gtest/internal/custom/gtest.h b/include/gtest/internal/custom/gtest.h new file mode 100644 index 0000000..4c8e07b --- /dev/null +++ b/include/gtest/internal/custom/gtest.h @@ -0,0 +1,37 @@ +// Copyright 2015, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Injection point for custom user configurations. See README for details +// +// ** Custom implementation starts here ** + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_ + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_CUSTOM_GTEST_H_ diff --git a/include/gtest/internal/gtest-death-test-internal.h b/include/gtest/internal/gtest-death-test-internal.h new file mode 100644 index 0000000..68bd353 --- /dev/null +++ b/include/gtest/internal/gtest-death-test-internal.h @@ -0,0 +1,304 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// The Google C++ Testing and Mocking Framework (Google Test) +// +// This header file defines internal utilities needed for implementing +// death tests. They are subject to change without notice. +// GOOGLETEST_CM0001 DO NOT DELETE + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ + +#include "gtest/gtest-matchers.h" +#include "gtest/internal/gtest-internal.h" + +#include +#include + +namespace testing { +namespace internal { + +GTEST_DECLARE_string_(internal_run_death_test); + +// Names of the flags (needed for parsing Google Test flags). +const char kDeathTestStyleFlag[] = "death_test_style"; +const char kDeathTestUseFork[] = "death_test_use_fork"; +const char kInternalRunDeathTestFlag[] = "internal_run_death_test"; + +#if GTEST_HAS_DEATH_TEST + +GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ +/* class A needs to have dll-interface to be used by clients of class B */) + +// DeathTest is a class that hides much of the complexity of the +// GTEST_DEATH_TEST_ macro. It is abstract; its static Create method +// returns a concrete class that depends on the prevailing death test +// style, as defined by the --gtest_death_test_style and/or +// --gtest_internal_run_death_test flags. + +// In describing the results of death tests, these terms are used with +// the corresponding definitions: +// +// exit status: The integer exit information in the format specified +// by wait(2) +// exit code: The integer code passed to exit(3), _exit(2), or +// returned from main() +class GTEST_API_ DeathTest { + public: + // Create returns false if there was an error determining the + // appropriate action to take for the current death test; for example, + // if the gtest_death_test_style flag is set to an invalid value. + // The LastMessage method will return a more detailed message in that + // case. Otherwise, the DeathTest pointer pointed to by the "test" + // argument is set. If the death test should be skipped, the pointer + // is set to NULL; otherwise, it is set to the address of a new concrete + // DeathTest object that controls the execution of the current test. + static bool Create(const char* statement, Matcher matcher, + const char* file, int line, DeathTest** test); + DeathTest(); + virtual ~DeathTest() { } + + // A helper class that aborts a death test when it's deleted. + class ReturnSentinel { + public: + explicit ReturnSentinel(DeathTest* test) : test_(test) { } + ~ReturnSentinel() { test_->Abort(TEST_ENCOUNTERED_RETURN_STATEMENT); } + private: + DeathTest* const test_; + GTEST_DISALLOW_COPY_AND_ASSIGN_(ReturnSentinel); + } GTEST_ATTRIBUTE_UNUSED_; + + // An enumeration of possible roles that may be taken when a death + // test is encountered. EXECUTE means that the death test logic should + // be executed immediately. OVERSEE means that the program should prepare + // the appropriate environment for a child process to execute the death + // test, then wait for it to complete. + enum TestRole { OVERSEE_TEST, EXECUTE_TEST }; + + // An enumeration of the three reasons that a test might be aborted. + enum AbortReason { + TEST_ENCOUNTERED_RETURN_STATEMENT, + TEST_THREW_EXCEPTION, + TEST_DID_NOT_DIE + }; + + // Assumes one of the above roles. + virtual TestRole AssumeRole() = 0; + + // Waits for the death test to finish and returns its status. + virtual int Wait() = 0; + + // Returns true if the death test passed; that is, the test process + // exited during the test, its exit status matches a user-supplied + // predicate, and its stderr output matches a user-supplied regular + // expression. + // The user-supplied predicate may be a macro expression rather + // than a function pointer or functor, or else Wait and Passed could + // be combined. + virtual bool Passed(bool exit_status_ok) = 0; + + // Signals that the death test did not die as expected. + virtual void Abort(AbortReason reason) = 0; + + // Returns a human-readable outcome message regarding the outcome of + // the last death test. + static const char* LastMessage(); + + static void set_last_death_test_message(const std::string& message); + + private: + // A string containing a description of the outcome of the last death test. + static std::string last_death_test_message_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(DeathTest); +}; + +GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 + +// Factory interface for death tests. May be mocked out for testing. +class DeathTestFactory { + public: + virtual ~DeathTestFactory() { } + virtual bool Create(const char* statement, + Matcher matcher, const char* file, + int line, DeathTest** test) = 0; +}; + +// A concrete DeathTestFactory implementation for normal use. +class DefaultDeathTestFactory : public DeathTestFactory { + public: + bool Create(const char* statement, Matcher matcher, + const char* file, int line, DeathTest** test) override; +}; + +// Returns true if exit_status describes a process that was terminated +// by a signal, or exited normally with a nonzero exit code. +GTEST_API_ bool ExitedUnsuccessfully(int exit_status); + +// A string passed to EXPECT_DEATH (etc.) is caught by one of these overloads +// and interpreted as a regex (rather than an Eq matcher) for legacy +// compatibility. +inline Matcher MakeDeathTestMatcher( + ::testing::internal::RE regex) { + return ContainsRegex(regex.pattern()); +} +inline Matcher MakeDeathTestMatcher(const char* regex) { + return ContainsRegex(regex); +} +inline Matcher MakeDeathTestMatcher( + const ::std::string& regex) { + return ContainsRegex(regex); +} + +// If a Matcher is passed to EXPECT_DEATH (etc.), it's +// used directly. +inline Matcher MakeDeathTestMatcher( + Matcher matcher) { + return matcher; +} + +// Traps C++ exceptions escaping statement and reports them as test +// failures. Note that trapping SEH exceptions is not implemented here. +# if GTEST_HAS_EXCEPTIONS +# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ + try { \ + GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ + } catch (const ::std::exception& gtest_exception) { \ + fprintf(\ + stderr, \ + "\n%s: Caught std::exception-derived exception escaping the " \ + "death test statement. Exception message: %s\n", \ + ::testing::internal::FormatFileLocation(__FILE__, __LINE__).c_str(), \ + gtest_exception.what()); \ + fflush(stderr); \ + death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ + } catch (...) { \ + death_test->Abort(::testing::internal::DeathTest::TEST_THREW_EXCEPTION); \ + } + +# else +# define GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, death_test) \ + GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) + +# endif + +// This macro is for implementing ASSERT_DEATH*, EXPECT_DEATH*, +// ASSERT_EXIT*, and EXPECT_EXIT*. +#define GTEST_DEATH_TEST_(statement, predicate, regex_or_matcher, fail) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (::testing::internal::AlwaysTrue()) { \ + ::testing::internal::DeathTest* gtest_dt; \ + if (!::testing::internal::DeathTest::Create( \ + #statement, \ + ::testing::internal::MakeDeathTestMatcher(regex_or_matcher), \ + __FILE__, __LINE__, >est_dt)) { \ + goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ + } \ + if (gtest_dt != nullptr) { \ + std::unique_ptr< ::testing::internal::DeathTest> gtest_dt_ptr(gtest_dt); \ + switch (gtest_dt->AssumeRole()) { \ + case ::testing::internal::DeathTest::OVERSEE_TEST: \ + if (!gtest_dt->Passed(predicate(gtest_dt->Wait()))) { \ + goto GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__); \ + } \ + break; \ + case ::testing::internal::DeathTest::EXECUTE_TEST: { \ + ::testing::internal::DeathTest::ReturnSentinel gtest_sentinel( \ + gtest_dt); \ + GTEST_EXECUTE_DEATH_TEST_STATEMENT_(statement, gtest_dt); \ + gtest_dt->Abort(::testing::internal::DeathTest::TEST_DID_NOT_DIE); \ + break; \ + } \ + default: \ + break; \ + } \ + } \ + } else \ + GTEST_CONCAT_TOKEN_(gtest_label_, __LINE__) \ + : fail(::testing::internal::DeathTest::LastMessage()) +// The symbol "fail" here expands to something into which a message +// can be streamed. + +// This macro is for implementing ASSERT/EXPECT_DEBUG_DEATH when compiled in +// NDEBUG mode. In this case we need the statements to be executed and the macro +// must accept a streamed message even though the message is never printed. +// The regex object is not evaluated, but it is used to prevent "unused" +// warnings and to avoid an expression that doesn't compile in debug mode. +#define GTEST_EXECUTE_STATEMENT_(statement, regex_or_matcher) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (::testing::internal::AlwaysTrue()) { \ + GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ + } else if (!::testing::internal::AlwaysTrue()) { \ + ::testing::internal::MakeDeathTestMatcher(regex_or_matcher); \ + } else \ + ::testing::Message() + +// A class representing the parsed contents of the +// --gtest_internal_run_death_test flag, as it existed when +// RUN_ALL_TESTS was called. +class InternalRunDeathTestFlag { + public: + InternalRunDeathTestFlag(const std::string& a_file, + int a_line, + int an_index, + int a_write_fd) + : file_(a_file), line_(a_line), index_(an_index), + write_fd_(a_write_fd) {} + + ~InternalRunDeathTestFlag() { + if (write_fd_ >= 0) + posix::Close(write_fd_); + } + + const std::string& file() const { return file_; } + int line() const { return line_; } + int index() const { return index_; } + int write_fd() const { return write_fd_; } + + private: + std::string file_; + int line_; + int index_; + int write_fd_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(InternalRunDeathTestFlag); +}; + +// Returns a newly created InternalRunDeathTestFlag object with fields +// initialized from the GTEST_FLAG(internal_run_death_test) flag if +// the flag is specified; otherwise returns NULL. +InternalRunDeathTestFlag* ParseInternalRunDeathTestFlag(); + +#endif // GTEST_HAS_DEATH_TEST + +} // namespace internal +} // namespace testing + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_DEATH_TEST_INTERNAL_H_ diff --git a/include/gtest/internal/gtest-filepath.h b/include/gtest/internal/gtest-filepath.h new file mode 100644 index 0000000..c11b101 --- /dev/null +++ b/include/gtest/internal/gtest-filepath.h @@ -0,0 +1,211 @@ +// Copyright 2008, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Google Test filepath utilities +// +// This header file declares classes and functions used internally by +// Google Test. They are subject to change without notice. +// +// This file is #included in gtest/internal/gtest-internal.h. +// Do not include this header file separately! + +// GOOGLETEST_CM0001 DO NOT DELETE + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ + +#include "gtest/internal/gtest-string.h" + +GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ +/* class A needs to have dll-interface to be used by clients of class B */) + +namespace testing { +namespace internal { + +// FilePath - a class for file and directory pathname manipulation which +// handles platform-specific conventions (like the pathname separator). +// Used for helper functions for naming files in a directory for xml output. +// Except for Set methods, all methods are const or static, which provides an +// "immutable value object" -- useful for peace of mind. +// A FilePath with a value ending in a path separator ("like/this/") represents +// a directory, otherwise it is assumed to represent a file. In either case, +// it may or may not represent an actual file or directory in the file system. +// Names are NOT checked for syntax correctness -- no checking for illegal +// characters, malformed paths, etc. + +class GTEST_API_ FilePath { + public: + FilePath() : pathname_("") { } + FilePath(const FilePath& rhs) : pathname_(rhs.pathname_) { } + + explicit FilePath(const std::string& pathname) : pathname_(pathname) { + Normalize(); + } + + FilePath& operator=(const FilePath& rhs) { + Set(rhs); + return *this; + } + + void Set(const FilePath& rhs) { + pathname_ = rhs.pathname_; + } + + const std::string& string() const { return pathname_; } + const char* c_str() const { return pathname_.c_str(); } + + // Returns the current working directory, or "" if unsuccessful. + static FilePath GetCurrentDir(); + + // Given directory = "dir", base_name = "test", number = 0, + // extension = "xml", returns "dir/test.xml". If number is greater + // than zero (e.g., 12), returns "dir/test_12.xml". + // On Windows platform, uses \ as the separator rather than /. + static FilePath MakeFileName(const FilePath& directory, + const FilePath& base_name, + int number, + const char* extension); + + // Given directory = "dir", relative_path = "test.xml", + // returns "dir/test.xml". + // On Windows, uses \ as the separator rather than /. + static FilePath ConcatPaths(const FilePath& directory, + const FilePath& relative_path); + + // Returns a pathname for a file that does not currently exist. The pathname + // will be directory/base_name.extension or + // directory/base_name_.extension if directory/base_name.extension + // already exists. The number will be incremented until a pathname is found + // that does not already exist. + // Examples: 'dir/foo_test.xml' or 'dir/foo_test_1.xml'. + // There could be a race condition if two or more processes are calling this + // function at the same time -- they could both pick the same filename. + static FilePath GenerateUniqueFileName(const FilePath& directory, + const FilePath& base_name, + const char* extension); + + // Returns true if and only if the path is "". + bool IsEmpty() const { return pathname_.empty(); } + + // If input name has a trailing separator character, removes it and returns + // the name, otherwise return the name string unmodified. + // On Windows platform, uses \ as the separator, other platforms use /. + FilePath RemoveTrailingPathSeparator() const; + + // Returns a copy of the FilePath with the directory part removed. + // Example: FilePath("path/to/file").RemoveDirectoryName() returns + // FilePath("file"). If there is no directory part ("just_a_file"), it returns + // the FilePath unmodified. If there is no file part ("just_a_dir/") it + // returns an empty FilePath (""). + // On Windows platform, '\' is the path separator, otherwise it is '/'. + FilePath RemoveDirectoryName() const; + + // RemoveFileName returns the directory path with the filename removed. + // Example: FilePath("path/to/file").RemoveFileName() returns "path/to/". + // If the FilePath is "a_file" or "/a_file", RemoveFileName returns + // FilePath("./") or, on Windows, FilePath(".\\"). If the filepath does + // not have a file, like "just/a/dir/", it returns the FilePath unmodified. + // On Windows platform, '\' is the path separator, otherwise it is '/'. + FilePath RemoveFileName() const; + + // Returns a copy of the FilePath with the case-insensitive extension removed. + // Example: FilePath("dir/file.exe").RemoveExtension("EXE") returns + // FilePath("dir/file"). If a case-insensitive extension is not + // found, returns a copy of the original FilePath. + FilePath RemoveExtension(const char* extension) const; + + // Creates directories so that path exists. Returns true if successful or if + // the directories already exist; returns false if unable to create + // directories for any reason. Will also return false if the FilePath does + // not represent a directory (that is, it doesn't end with a path separator). + bool CreateDirectoriesRecursively() const; + + // Create the directory so that path exists. Returns true if successful or + // if the directory already exists; returns false if unable to create the + // directory for any reason, including if the parent directory does not + // exist. Not named "CreateDirectory" because that's a macro on Windows. + bool CreateFolder() const; + + // Returns true if FilePath describes something in the file-system, + // either a file, directory, or whatever, and that something exists. + bool FileOrDirectoryExists() const; + + // Returns true if pathname describes a directory in the file-system + // that exists. + bool DirectoryExists() const; + + // Returns true if FilePath ends with a path separator, which indicates that + // it is intended to represent a directory. Returns false otherwise. + // This does NOT check that a directory (or file) actually exists. + bool IsDirectory() const; + + // Returns true if pathname describes a root directory. (Windows has one + // root directory per disk drive.) + bool IsRootDirectory() const; + + // Returns true if pathname describes an absolute path. + bool IsAbsolutePath() const; + + private: + // Replaces multiple consecutive separators with a single separator. + // For example, "bar///foo" becomes "bar/foo". Does not eliminate other + // redundancies that might be in a pathname involving "." or "..". + // + // A pathname with multiple consecutive separators may occur either through + // user error or as a result of some scripts or APIs that generate a pathname + // with a trailing separator. On other platforms the same API or script + // may NOT generate a pathname with a trailing "/". Then elsewhere that + // pathname may have another "/" and pathname components added to it, + // without checking for the separator already being there. + // The script language and operating system may allow paths like "foo//bar" + // but some of the functions in FilePath will not handle that correctly. In + // particular, RemoveTrailingPathSeparator() only removes one separator, and + // it is called in CreateDirectoriesRecursively() assuming that it will change + // a pathname from directory syntax (trailing separator) to filename syntax. + // + // On Windows this method also replaces the alternate path separator '/' with + // the primary path separator '\\', so that for example "bar\\/\\foo" becomes + // "bar\\foo". + + void Normalize(); + + // Returns a pointer to the last occurence of a valid path separator in + // the FilePath. On Windows, for example, both '/' and '\' are valid path + // separators. Returns NULL if no path separator was found. + const char* FindLastPathSeparator() const; + + std::string pathname_; +}; // class FilePath + +} // namespace internal +} // namespace testing + +GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_FILEPATH_H_ diff --git a/include/gtest/internal/gtest-internal.h b/include/gtest/internal/gtest-internal.h new file mode 100644 index 0000000..94c816a --- /dev/null +++ b/include/gtest/internal/gtest-internal.h @@ -0,0 +1,1380 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// The Google C++ Testing and Mocking Framework (Google Test) +// +// This header file declares functions and macros used internally by +// Google Test. They are subject to change without notice. + +// GOOGLETEST_CM0001 DO NOT DELETE + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ + +#include "gtest/internal/gtest-port.h" + +#if GTEST_OS_LINUX +# include +# include +# include +# include +#endif // GTEST_OS_LINUX + +#if GTEST_HAS_EXCEPTIONS +# include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gtest/gtest-message.h" +#include "gtest/internal/gtest-filepath.h" +#include "gtest/internal/gtest-string.h" +#include "gtest/internal/gtest-type-util.h" + +// Due to C++ preprocessor weirdness, we need double indirection to +// concatenate two tokens when one of them is __LINE__. Writing +// +// foo ## __LINE__ +// +// will result in the token foo__LINE__, instead of foo followed by +// the current line number. For more details, see +// http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.6 +#define GTEST_CONCAT_TOKEN_(foo, bar) GTEST_CONCAT_TOKEN_IMPL_(foo, bar) +#define GTEST_CONCAT_TOKEN_IMPL_(foo, bar) foo ## bar + +// Stringifies its argument. +#define GTEST_STRINGIFY_(name) #name + +namespace proto2 { class Message; } + +namespace testing { + +// Forward declarations. + +class AssertionResult; // Result of an assertion. +class Message; // Represents a failure message. +class Test; // Represents a test. +class TestInfo; // Information about a test. +class TestPartResult; // Result of a test part. +class UnitTest; // A collection of test suites. + +template +::std::string PrintToString(const T& value); + +namespace internal { + +struct TraceInfo; // Information about a trace point. +class TestInfoImpl; // Opaque implementation of TestInfo +class UnitTestImpl; // Opaque implementation of UnitTest + +// The text used in failure messages to indicate the start of the +// stack trace. +GTEST_API_ extern const char kStackTraceMarker[]; + +// An IgnoredValue object can be implicitly constructed from ANY value. +class IgnoredValue { + struct Sink {}; + public: + // This constructor template allows any value to be implicitly + // converted to IgnoredValue. The object has no data member and + // doesn't try to remember anything about the argument. We + // deliberately omit the 'explicit' keyword in order to allow the + // conversion to be implicit. + // Disable the conversion if T already has a magical conversion operator. + // Otherwise we get ambiguity. + template ::value, + int>::type = 0> + IgnoredValue(const T& /* ignored */) {} // NOLINT(runtime/explicit) +}; + +// Appends the user-supplied message to the Google-Test-generated message. +GTEST_API_ std::string AppendUserMessage( + const std::string& gtest_msg, const Message& user_msg); + +#if GTEST_HAS_EXCEPTIONS + +GTEST_DISABLE_MSC_WARNINGS_PUSH_(4275 \ +/* an exported class was derived from a class that was not exported */) + +// This exception is thrown by (and only by) a failed Google Test +// assertion when GTEST_FLAG(throw_on_failure) is true (if exceptions +// are enabled). We derive it from std::runtime_error, which is for +// errors presumably detectable only at run time. Since +// std::runtime_error inherits from std::exception, many testing +// frameworks know how to extract and print the message inside it. +class GTEST_API_ GoogleTestFailureException : public ::std::runtime_error { + public: + explicit GoogleTestFailureException(const TestPartResult& failure); +}; + +GTEST_DISABLE_MSC_WARNINGS_POP_() // 4275 + +#endif // GTEST_HAS_EXCEPTIONS + +namespace edit_distance { +// Returns the optimal edits to go from 'left' to 'right'. +// All edits cost the same, with replace having lower priority than +// add/remove. +// Simple implementation of the Wagner-Fischer algorithm. +// See http://en.wikipedia.org/wiki/Wagner-Fischer_algorithm +enum EditType { kMatch, kAdd, kRemove, kReplace }; +GTEST_API_ std::vector CalculateOptimalEdits( + const std::vector& left, const std::vector& right); + +// Same as above, but the input is represented as strings. +GTEST_API_ std::vector CalculateOptimalEdits( + const std::vector& left, + const std::vector& right); + +// Create a diff of the input strings in Unified diff format. +GTEST_API_ std::string CreateUnifiedDiff(const std::vector& left, + const std::vector& right, + size_t context = 2); + +} // namespace edit_distance + +// Calculate the diff between 'left' and 'right' and return it in unified diff +// format. +// If not null, stores in 'total_line_count' the total number of lines found +// in left + right. +GTEST_API_ std::string DiffStrings(const std::string& left, + const std::string& right, + size_t* total_line_count); + +// Constructs and returns the message for an equality assertion +// (e.g. ASSERT_EQ, EXPECT_STREQ, etc) failure. +// +// The first four parameters are the expressions used in the assertion +// and their values, as strings. For example, for ASSERT_EQ(foo, bar) +// where foo is 5 and bar is 6, we have: +// +// expected_expression: "foo" +// actual_expression: "bar" +// expected_value: "5" +// actual_value: "6" +// +// The ignoring_case parameter is true if and only if the assertion is a +// *_STRCASEEQ*. When it's true, the string " (ignoring case)" will +// be inserted into the message. +GTEST_API_ AssertionResult EqFailure(const char* expected_expression, + const char* actual_expression, + const std::string& expected_value, + const std::string& actual_value, + bool ignoring_case); + +// Constructs a failure message for Boolean assertions such as EXPECT_TRUE. +GTEST_API_ std::string GetBoolAssertionFailureMessage( + const AssertionResult& assertion_result, + const char* expression_text, + const char* actual_predicate_value, + const char* expected_predicate_value); + +// This template class represents an IEEE floating-point number +// (either single-precision or double-precision, depending on the +// template parameters). +// +// The purpose of this class is to do more sophisticated number +// comparison. (Due to round-off error, etc, it's very unlikely that +// two floating-points will be equal exactly. Hence a naive +// comparison by the == operation often doesn't work.) +// +// Format of IEEE floating-point: +// +// The most-significant bit being the leftmost, an IEEE +// floating-point looks like +// +// sign_bit exponent_bits fraction_bits +// +// Here, sign_bit is a single bit that designates the sign of the +// number. +// +// For float, there are 8 exponent bits and 23 fraction bits. +// +// For double, there are 11 exponent bits and 52 fraction bits. +// +// More details can be found at +// http://en.wikipedia.org/wiki/IEEE_floating-point_standard. +// +// Template parameter: +// +// RawType: the raw floating-point type (either float or double) +template +class FloatingPoint { + public: + // Defines the unsigned integer type that has the same size as the + // floating point number. + typedef typename TypeWithSize::UInt Bits; + + // Constants. + + // # of bits in a number. + static const size_t kBitCount = 8*sizeof(RawType); + + // # of fraction bits in a number. + static const size_t kFractionBitCount = + std::numeric_limits::digits - 1; + + // # of exponent bits in a number. + static const size_t kExponentBitCount = kBitCount - 1 - kFractionBitCount; + + // The mask for the sign bit. + static const Bits kSignBitMask = static_cast(1) << (kBitCount - 1); + + // The mask for the fraction bits. + static const Bits kFractionBitMask = + ~static_cast(0) >> (kExponentBitCount + 1); + + // The mask for the exponent bits. + static const Bits kExponentBitMask = ~(kSignBitMask | kFractionBitMask); + + // How many ULP's (Units in the Last Place) we want to tolerate when + // comparing two numbers. The larger the value, the more error we + // allow. A 0 value means that two numbers must be exactly the same + // to be considered equal. + // + // The maximum error of a single floating-point operation is 0.5 + // units in the last place. On Intel CPU's, all floating-point + // calculations are done with 80-bit precision, while double has 64 + // bits. Therefore, 4 should be enough for ordinary use. + // + // See the following article for more details on ULP: + // http://randomascii.wordpress.com/2012/02/25/comparing-floating-point-numbers-2012-edition/ + static const size_t kMaxUlps = 4; + + // Constructs a FloatingPoint from a raw floating-point number. + // + // On an Intel CPU, passing a non-normalized NAN (Not a Number) + // around may change its bits, although the new value is guaranteed + // to be also a NAN. Therefore, don't expect this constructor to + // preserve the bits in x when x is a NAN. + explicit FloatingPoint(const RawType& x) { u_.value_ = x; } + + // Static methods + + // Reinterprets a bit pattern as a floating-point number. + // + // This function is needed to test the AlmostEquals() method. + static RawType ReinterpretBits(const Bits bits) { + FloatingPoint fp(0); + fp.u_.bits_ = bits; + return fp.u_.value_; + } + + // Returns the floating-point number that represent positive infinity. + static RawType Infinity() { + return ReinterpretBits(kExponentBitMask); + } + + // Returns the maximum representable finite floating-point number. + static RawType Max(); + + // Non-static methods + + // Returns the bits that represents this number. + const Bits &bits() const { return u_.bits_; } + + // Returns the exponent bits of this number. + Bits exponent_bits() const { return kExponentBitMask & u_.bits_; } + + // Returns the fraction bits of this number. + Bits fraction_bits() const { return kFractionBitMask & u_.bits_; } + + // Returns the sign bit of this number. + Bits sign_bit() const { return kSignBitMask & u_.bits_; } + + // Returns true if and only if this is NAN (not a number). + bool is_nan() const { + // It's a NAN if the exponent bits are all ones and the fraction + // bits are not entirely zeros. + return (exponent_bits() == kExponentBitMask) && (fraction_bits() != 0); + } + + // Returns true if and only if this number is at most kMaxUlps ULP's away + // from rhs. In particular, this function: + // + // - returns false if either number is (or both are) NAN. + // - treats really large numbers as almost equal to infinity. + // - thinks +0.0 and -0.0 are 0 DLP's apart. + bool AlmostEquals(const FloatingPoint& rhs) const { + // The IEEE standard says that any comparison operation involving + // a NAN must return false. + if (is_nan() || rhs.is_nan()) return false; + + return DistanceBetweenSignAndMagnitudeNumbers(u_.bits_, rhs.u_.bits_) + <= kMaxUlps; + } + + private: + // The data type used to store the actual floating-point number. + union FloatingPointUnion { + RawType value_; // The raw floating-point number. + Bits bits_; // The bits that represent the number. + }; + + // Converts an integer from the sign-and-magnitude representation to + // the biased representation. More precisely, let N be 2 to the + // power of (kBitCount - 1), an integer x is represented by the + // unsigned number x + N. + // + // For instance, + // + // -N + 1 (the most negative number representable using + // sign-and-magnitude) is represented by 1; + // 0 is represented by N; and + // N - 1 (the biggest number representable using + // sign-and-magnitude) is represented by 2N - 1. + // + // Read http://en.wikipedia.org/wiki/Signed_number_representations + // for more details on signed number representations. + static Bits SignAndMagnitudeToBiased(const Bits &sam) { + if (kSignBitMask & sam) { + // sam represents a negative number. + return ~sam + 1; + } else { + // sam represents a positive number. + return kSignBitMask | sam; + } + } + + // Given two numbers in the sign-and-magnitude representation, + // returns the distance between them as an unsigned number. + static Bits DistanceBetweenSignAndMagnitudeNumbers(const Bits &sam1, + const Bits &sam2) { + const Bits biased1 = SignAndMagnitudeToBiased(sam1); + const Bits biased2 = SignAndMagnitudeToBiased(sam2); + return (biased1 >= biased2) ? (biased1 - biased2) : (biased2 - biased1); + } + + FloatingPointUnion u_; +}; + +// We cannot use std::numeric_limits::max() as it clashes with the max() +// macro defined by . +template <> +inline float FloatingPoint::Max() { return FLT_MAX; } +template <> +inline double FloatingPoint::Max() { return DBL_MAX; } + +// Typedefs the instances of the FloatingPoint template class that we +// care to use. +typedef FloatingPoint Float; +typedef FloatingPoint Double; + +// In order to catch the mistake of putting tests that use different +// test fixture classes in the same test suite, we need to assign +// unique IDs to fixture classes and compare them. The TypeId type is +// used to hold such IDs. The user should treat TypeId as an opaque +// type: the only operation allowed on TypeId values is to compare +// them for equality using the == operator. +typedef const void* TypeId; + +template +class TypeIdHelper { + public: + // dummy_ must not have a const type. Otherwise an overly eager + // compiler (e.g. MSVC 7.1 & 8.0) may try to merge + // TypeIdHelper::dummy_ for different Ts as an "optimization". + static bool dummy_; +}; + +template +bool TypeIdHelper::dummy_ = false; + +// GetTypeId() returns the ID of type T. Different values will be +// returned for different types. Calling the function twice with the +// same type argument is guaranteed to return the same ID. +template +TypeId GetTypeId() { + // The compiler is required to allocate a different + // TypeIdHelper::dummy_ variable for each T used to instantiate + // the template. Therefore, the address of dummy_ is guaranteed to + // be unique. + return &(TypeIdHelper::dummy_); +} + +// Returns the type ID of ::testing::Test. Always call this instead +// of GetTypeId< ::testing::Test>() to get the type ID of +// ::testing::Test, as the latter may give the wrong result due to a +// suspected linker bug when compiling Google Test as a Mac OS X +// framework. +GTEST_API_ TypeId GetTestTypeId(); + +// Defines the abstract factory interface that creates instances +// of a Test object. +class TestFactoryBase { + public: + virtual ~TestFactoryBase() {} + + // Creates a test instance to run. The instance is both created and destroyed + // within TestInfoImpl::Run() + virtual Test* CreateTest() = 0; + + protected: + TestFactoryBase() {} + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(TestFactoryBase); +}; + +// This class provides implementation of TeastFactoryBase interface. +// It is used in TEST and TEST_F macros. +template +class TestFactoryImpl : public TestFactoryBase { + public: + Test* CreateTest() override { return new TestClass; } +}; + +#if GTEST_OS_WINDOWS + +// Predicate-formatters for implementing the HRESULT checking macros +// {ASSERT|EXPECT}_HRESULT_{SUCCEEDED|FAILED} +// We pass a long instead of HRESULT to avoid causing an +// include dependency for the HRESULT type. +GTEST_API_ AssertionResult IsHRESULTSuccess(const char* expr, + long hr); // NOLINT +GTEST_API_ AssertionResult IsHRESULTFailure(const char* expr, + long hr); // NOLINT + +#endif // GTEST_OS_WINDOWS + +// Types of SetUpTestSuite() and TearDownTestSuite() functions. +using SetUpTestSuiteFunc = void (*)(); +using TearDownTestSuiteFunc = void (*)(); + +struct CodeLocation { + CodeLocation(const std::string& a_file, int a_line) + : file(a_file), line(a_line) {} + + std::string file; + int line; +}; + +// Helper to identify which setup function for TestCase / TestSuite to call. +// Only one function is allowed, either TestCase or TestSute but not both. + +// Utility functions to help SuiteApiResolver +using SetUpTearDownSuiteFuncType = void (*)(); + +inline SetUpTearDownSuiteFuncType GetNotDefaultOrNull( + SetUpTearDownSuiteFuncType a, SetUpTearDownSuiteFuncType def) { + return a == def ? nullptr : a; +} + +template +// Note that SuiteApiResolver inherits from T because +// SetUpTestSuite()/TearDownTestSuite() could be protected. Ths way +// SuiteApiResolver can access them. +struct SuiteApiResolver : T { + // testing::Test is only forward declared at this point. So we make it a + // dependend class for the compiler to be OK with it. + using Test = + typename std::conditional::type; + + static SetUpTearDownSuiteFuncType GetSetUpCaseOrSuite(const char* filename, + int line_num) { + SetUpTearDownSuiteFuncType test_case_fp = + GetNotDefaultOrNull(&T::SetUpTestCase, &Test::SetUpTestCase); + SetUpTearDownSuiteFuncType test_suite_fp = + GetNotDefaultOrNull(&T::SetUpTestSuite, &Test::SetUpTestSuite); + + GTEST_CHECK_(!test_case_fp || !test_suite_fp) + << "Test can not provide both SetUpTestSuite and SetUpTestCase, please " + "make sure there is only one present at " + << filename << ":" << line_num; + + return test_case_fp != nullptr ? test_case_fp : test_suite_fp; + } + + static SetUpTearDownSuiteFuncType GetTearDownCaseOrSuite(const char* filename, + int line_num) { + SetUpTearDownSuiteFuncType test_case_fp = + GetNotDefaultOrNull(&T::TearDownTestCase, &Test::TearDownTestCase); + SetUpTearDownSuiteFuncType test_suite_fp = + GetNotDefaultOrNull(&T::TearDownTestSuite, &Test::TearDownTestSuite); + + GTEST_CHECK_(!test_case_fp || !test_suite_fp) + << "Test can not provide both TearDownTestSuite and TearDownTestCase," + " please make sure there is only one present at" + << filename << ":" << line_num; + + return test_case_fp != nullptr ? test_case_fp : test_suite_fp; + } +}; + +// Creates a new TestInfo object and registers it with Google Test; +// returns the created object. +// +// Arguments: +// +// test_suite_name: name of the test suite +// name: name of the test +// type_param the name of the test's type parameter, or NULL if +// this is not a typed or a type-parameterized test. +// value_param text representation of the test's value parameter, +// or NULL if this is not a type-parameterized test. +// code_location: code location where the test is defined +// fixture_class_id: ID of the test fixture class +// set_up_tc: pointer to the function that sets up the test suite +// tear_down_tc: pointer to the function that tears down the test suite +// factory: pointer to the factory that creates a test object. +// The newly created TestInfo instance will assume +// ownership of the factory object. +GTEST_API_ TestInfo* MakeAndRegisterTestInfo( + const char* test_suite_name, const char* name, const char* type_param, + const char* value_param, CodeLocation code_location, + TypeId fixture_class_id, SetUpTestSuiteFunc set_up_tc, + TearDownTestSuiteFunc tear_down_tc, TestFactoryBase* factory); + +// If *pstr starts with the given prefix, modifies *pstr to be right +// past the prefix and returns true; otherwise leaves *pstr unchanged +// and returns false. None of pstr, *pstr, and prefix can be NULL. +GTEST_API_ bool SkipPrefix(const char* prefix, const char** pstr); + +#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P + +GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ +/* class A needs to have dll-interface to be used by clients of class B */) + +// State of the definition of a type-parameterized test suite. +class GTEST_API_ TypedTestSuitePState { + public: + TypedTestSuitePState() : registered_(false) {} + + // Adds the given test name to defined_test_names_ and return true + // if the test suite hasn't been registered; otherwise aborts the + // program. + bool AddTestName(const char* file, int line, const char* case_name, + const char* test_name) { + if (registered_) { + fprintf(stderr, + "%s Test %s must be defined before " + "REGISTER_TYPED_TEST_SUITE_P(%s, ...).\n", + FormatFileLocation(file, line).c_str(), test_name, case_name); + fflush(stderr); + posix::Abort(); + } + registered_tests_.insert( + ::std::make_pair(test_name, CodeLocation(file, line))); + return true; + } + + bool TestExists(const std::string& test_name) const { + return registered_tests_.count(test_name) > 0; + } + + const CodeLocation& GetCodeLocation(const std::string& test_name) const { + RegisteredTestsMap::const_iterator it = registered_tests_.find(test_name); + GTEST_CHECK_(it != registered_tests_.end()); + return it->second; + } + + // Verifies that registered_tests match the test names in + // defined_test_names_; returns registered_tests if successful, or + // aborts the program otherwise. + const char* VerifyRegisteredTestNames( + const char* file, int line, const char* registered_tests); + + private: + typedef ::std::map RegisteredTestsMap; + + bool registered_; + RegisteredTestsMap registered_tests_; +}; + +// Legacy API is deprecated but still available +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ +using TypedTestCasePState = TypedTestSuitePState; +#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + +GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 + +// Skips to the first non-space char after the first comma in 'str'; +// returns NULL if no comma is found in 'str'. +inline const char* SkipComma(const char* str) { + const char* comma = strchr(str, ','); + if (comma == nullptr) { + return nullptr; + } + while (IsSpace(*(++comma))) {} + return comma; +} + +// Returns the prefix of 'str' before the first comma in it; returns +// the entire string if it contains no comma. +inline std::string GetPrefixUntilComma(const char* str) { + const char* comma = strchr(str, ','); + return comma == nullptr ? str : std::string(str, comma); +} + +// Splits a given string on a given delimiter, populating a given +// vector with the fields. +void SplitString(const ::std::string& str, char delimiter, + ::std::vector< ::std::string>* dest); + +// The default argument to the template below for the case when the user does +// not provide a name generator. +struct DefaultNameGenerator { + template + static std::string GetName(int i) { + return StreamableToString(i); + } +}; + +template +struct NameGeneratorSelector { + typedef Provided type; +}; + +template +void GenerateNamesRecursively(Types0, std::vector*, int) {} + +template +void GenerateNamesRecursively(Types, std::vector* result, int i) { + result->push_back(NameGenerator::template GetName(i)); + GenerateNamesRecursively(typename Types::Tail(), result, + i + 1); +} + +template +std::vector GenerateNames() { + std::vector result; + GenerateNamesRecursively(Types(), &result, 0); + return result; +} + +// TypeParameterizedTest::Register() +// registers a list of type-parameterized tests with Google Test. The +// return value is insignificant - we just need to return something +// such that we can call this function in a namespace scope. +// +// Implementation note: The GTEST_TEMPLATE_ macro declares a template +// template parameter. It's defined in gtest-type-util.h. +template +class TypeParameterizedTest { + public: + // 'index' is the index of the test in the type list 'Types' + // specified in INSTANTIATE_TYPED_TEST_SUITE_P(Prefix, TestSuite, + // Types). Valid values for 'index' are [0, N - 1] where N is the + // length of Types. + static bool Register(const char* prefix, const CodeLocation& code_location, + const char* case_name, const char* test_names, int index, + const std::vector& type_names = + GenerateNames()) { + typedef typename Types::Head Type; + typedef Fixture FixtureClass; + typedef typename GTEST_BIND_(TestSel, Type) TestClass; + + // First, registers the first type-parameterized test in the type + // list. + MakeAndRegisterTestInfo( + (std::string(prefix) + (prefix[0] == '\0' ? "" : "/") + case_name + + "/" + type_names[static_cast(index)]) + .c_str(), + StripTrailingSpaces(GetPrefixUntilComma(test_names)).c_str(), + GetTypeName().c_str(), + nullptr, // No value parameter. + code_location, GetTypeId(), + SuiteApiResolver::GetSetUpCaseOrSuite( + code_location.file.c_str(), code_location.line), + SuiteApiResolver::GetTearDownCaseOrSuite( + code_location.file.c_str(), code_location.line), + new TestFactoryImpl); + + // Next, recurses (at compile time) with the tail of the type list. + return TypeParameterizedTest::Register(prefix, + code_location, + case_name, + test_names, + index + 1, + type_names); + } +}; + +// The base case for the compile time recursion. +template +class TypeParameterizedTest { + public: + static bool Register(const char* /*prefix*/, const CodeLocation&, + const char* /*case_name*/, const char* /*test_names*/, + int /*index*/, + const std::vector& = + std::vector() /*type_names*/) { + return true; + } +}; + +// TypeParameterizedTestSuite::Register() +// registers *all combinations* of 'Tests' and 'Types' with Google +// Test. The return value is insignificant - we just need to return +// something such that we can call this function in a namespace scope. +template +class TypeParameterizedTestSuite { + public: + static bool Register(const char* prefix, CodeLocation code_location, + const TypedTestSuitePState* state, const char* case_name, + const char* test_names, + const std::vector& type_names = + GenerateNames()) { + std::string test_name = StripTrailingSpaces( + GetPrefixUntilComma(test_names)); + if (!state->TestExists(test_name)) { + fprintf(stderr, "Failed to get code location for test %s.%s at %s.", + case_name, test_name.c_str(), + FormatFileLocation(code_location.file.c_str(), + code_location.line).c_str()); + fflush(stderr); + posix::Abort(); + } + const CodeLocation& test_location = state->GetCodeLocation(test_name); + + typedef typename Tests::Head Head; + + // First, register the first test in 'Test' for each type in 'Types'. + TypeParameterizedTest::Register( + prefix, test_location, case_name, test_names, 0, type_names); + + // Next, recurses (at compile time) with the tail of the test list. + return TypeParameterizedTestSuite::Register(prefix, code_location, + state, case_name, + SkipComma(test_names), + type_names); + } +}; + +// The base case for the compile time recursion. +template +class TypeParameterizedTestSuite { + public: + static bool Register(const char* /*prefix*/, const CodeLocation&, + const TypedTestSuitePState* /*state*/, + const char* /*case_name*/, const char* /*test_names*/, + const std::vector& = + std::vector() /*type_names*/) { + return true; + } +}; + +#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P + +// Returns the current OS stack trace as an std::string. +// +// The maximum number of stack frames to be included is specified by +// the gtest_stack_trace_depth flag. The skip_count parameter +// specifies the number of top frames to be skipped, which doesn't +// count against the number of frames to be included. +// +// For example, if Foo() calls Bar(), which in turn calls +// GetCurrentOsStackTraceExceptTop(..., 1), Foo() will be included in +// the trace but Bar() and GetCurrentOsStackTraceExceptTop() won't. +GTEST_API_ std::string GetCurrentOsStackTraceExceptTop( + UnitTest* unit_test, int skip_count); + +// Helpers for suppressing warnings on unreachable code or constant +// condition. + +// Always returns true. +GTEST_API_ bool AlwaysTrue(); + +// Always returns false. +inline bool AlwaysFalse() { return !AlwaysTrue(); } + +// Helper for suppressing false warning from Clang on a const char* +// variable declared in a conditional expression always being NULL in +// the else branch. +struct GTEST_API_ ConstCharPtr { + ConstCharPtr(const char* str) : value(str) {} + operator bool() const { return true; } + const char* value; +}; + +// A simple Linear Congruential Generator for generating random +// numbers with a uniform distribution. Unlike rand() and srand(), it +// doesn't use global state (and therefore can't interfere with user +// code). Unlike rand_r(), it's portable. An LCG isn't very random, +// but it's good enough for our purposes. +class GTEST_API_ Random { + public: + static const UInt32 kMaxRange = 1u << 31; + + explicit Random(UInt32 seed) : state_(seed) {} + + void Reseed(UInt32 seed) { state_ = seed; } + + // Generates a random number from [0, range). Crashes if 'range' is + // 0 or greater than kMaxRange. + UInt32 Generate(UInt32 range); + + private: + UInt32 state_; + GTEST_DISALLOW_COPY_AND_ASSIGN_(Random); +}; + +// Turns const U&, U&, const U, and U all into U. +#define GTEST_REMOVE_REFERENCE_AND_CONST_(T) \ + typename std::remove_const::type>::type + +// IsAProtocolMessage::value is a compile-time bool constant that's +// true if and only if T is type proto2::Message or a subclass of it. +template +struct IsAProtocolMessage + : public bool_constant< + std::is_convertible::value> {}; + +// When the compiler sees expression IsContainerTest(0), if C is an +// STL-style container class, the first overload of IsContainerTest +// will be viable (since both C::iterator* and C::const_iterator* are +// valid types and NULL can be implicitly converted to them). It will +// be picked over the second overload as 'int' is a perfect match for +// the type of argument 0. If C::iterator or C::const_iterator is not +// a valid type, the first overload is not viable, and the second +// overload will be picked. Therefore, we can determine whether C is +// a container class by checking the type of IsContainerTest(0). +// The value of the expression is insignificant. +// +// In C++11 mode we check the existence of a const_iterator and that an +// iterator is properly implemented for the container. +// +// For pre-C++11 that we look for both C::iterator and C::const_iterator. +// The reason is that C++ injects the name of a class as a member of the +// class itself (e.g. you can refer to class iterator as either +// 'iterator' or 'iterator::iterator'). If we look for C::iterator +// only, for example, we would mistakenly think that a class named +// iterator is an STL container. +// +// Also note that the simpler approach of overloading +// IsContainerTest(typename C::const_iterator*) and +// IsContainerTest(...) doesn't work with Visual Age C++ and Sun C++. +typedef int IsContainer; +template ().begin()), + class = decltype(::std::declval().end()), + class = decltype(++::std::declval()), + class = decltype(*::std::declval()), + class = typename C::const_iterator> +IsContainer IsContainerTest(int /* dummy */) { + return 0; +} + +typedef char IsNotContainer; +template +IsNotContainer IsContainerTest(long /* dummy */) { return '\0'; } + +// Trait to detect whether a type T is a hash table. +// The heuristic used is that the type contains an inner type `hasher` and does +// not contain an inner type `reverse_iterator`. +// If the container is iterable in reverse, then order might actually matter. +template +struct IsHashTable { + private: + template + static char test(typename U::hasher*, typename U::reverse_iterator*); + template + static int test(typename U::hasher*, ...); + template + static char test(...); + + public: + static const bool value = sizeof(test(nullptr, nullptr)) == sizeof(int); +}; + +template +const bool IsHashTable::value; + +template (0)) == sizeof(IsContainer)> +struct IsRecursiveContainerImpl; + +template +struct IsRecursiveContainerImpl : public std::false_type {}; + +// Since the IsRecursiveContainerImpl depends on the IsContainerTest we need to +// obey the same inconsistencies as the IsContainerTest, namely check if +// something is a container is relying on only const_iterator in C++11 and +// is relying on both const_iterator and iterator otherwise +template +struct IsRecursiveContainerImpl { + using value_type = decltype(*std::declval()); + using type = + std::is_same::type>::type, + C>; +}; + +// IsRecursiveContainer is a unary compile-time predicate that +// evaluates whether C is a recursive container type. A recursive container +// type is a container type whose value_type is equal to the container type +// itself. An example for a recursive container type is +// boost::filesystem::path, whose iterator has a value_type that is equal to +// boost::filesystem::path. +template +struct IsRecursiveContainer : public IsRecursiveContainerImpl::type {}; + +// Utilities for native arrays. + +// ArrayEq() compares two k-dimensional native arrays using the +// elements' operator==, where k can be any integer >= 0. When k is +// 0, ArrayEq() degenerates into comparing a single pair of values. + +template +bool ArrayEq(const T* lhs, size_t size, const U* rhs); + +// This generic version is used when k is 0. +template +inline bool ArrayEq(const T& lhs, const U& rhs) { return lhs == rhs; } + +// This overload is used when k >= 1. +template +inline bool ArrayEq(const T(&lhs)[N], const U(&rhs)[N]) { + return internal::ArrayEq(lhs, N, rhs); +} + +// This helper reduces code bloat. If we instead put its logic inside +// the previous ArrayEq() function, arrays with different sizes would +// lead to different copies of the template code. +template +bool ArrayEq(const T* lhs, size_t size, const U* rhs) { + for (size_t i = 0; i != size; i++) { + if (!internal::ArrayEq(lhs[i], rhs[i])) + return false; + } + return true; +} + +// Finds the first element in the iterator range [begin, end) that +// equals elem. Element may be a native array type itself. +template +Iter ArrayAwareFind(Iter begin, Iter end, const Element& elem) { + for (Iter it = begin; it != end; ++it) { + if (internal::ArrayEq(*it, elem)) + return it; + } + return end; +} + +// CopyArray() copies a k-dimensional native array using the elements' +// operator=, where k can be any integer >= 0. When k is 0, +// CopyArray() degenerates into copying a single value. + +template +void CopyArray(const T* from, size_t size, U* to); + +// This generic version is used when k is 0. +template +inline void CopyArray(const T& from, U* to) { *to = from; } + +// This overload is used when k >= 1. +template +inline void CopyArray(const T(&from)[N], U(*to)[N]) { + internal::CopyArray(from, N, *to); +} + +// This helper reduces code bloat. If we instead put its logic inside +// the previous CopyArray() function, arrays with different sizes +// would lead to different copies of the template code. +template +void CopyArray(const T* from, size_t size, U* to) { + for (size_t i = 0; i != size; i++) { + internal::CopyArray(from[i], to + i); + } +} + +// The relation between an NativeArray object (see below) and the +// native array it represents. +// We use 2 different structs to allow non-copyable types to be used, as long +// as RelationToSourceReference() is passed. +struct RelationToSourceReference {}; +struct RelationToSourceCopy {}; + +// Adapts a native array to a read-only STL-style container. Instead +// of the complete STL container concept, this adaptor only implements +// members useful for Google Mock's container matchers. New members +// should be added as needed. To simplify the implementation, we only +// support Element being a raw type (i.e. having no top-level const or +// reference modifier). It's the client's responsibility to satisfy +// this requirement. Element can be an array type itself (hence +// multi-dimensional arrays are supported). +template +class NativeArray { + public: + // STL-style container typedefs. + typedef Element value_type; + typedef Element* iterator; + typedef const Element* const_iterator; + + // Constructs from a native array. References the source. + NativeArray(const Element* array, size_t count, RelationToSourceReference) { + InitRef(array, count); + } + + // Constructs from a native array. Copies the source. + NativeArray(const Element* array, size_t count, RelationToSourceCopy) { + InitCopy(array, count); + } + + // Copy constructor. + NativeArray(const NativeArray& rhs) { + (this->*rhs.clone_)(rhs.array_, rhs.size_); + } + + ~NativeArray() { + if (clone_ != &NativeArray::InitRef) + delete[] array_; + } + + // STL-style container methods. + size_t size() const { return size_; } + const_iterator begin() const { return array_; } + const_iterator end() const { return array_ + size_; } + bool operator==(const NativeArray& rhs) const { + return size() == rhs.size() && + ArrayEq(begin(), size(), rhs.begin()); + } + + private: + static_assert(!std::is_const::value, "Type must not be const"); + static_assert(!std::is_reference::value, + "Type must not be a reference"); + + // Initializes this object with a copy of the input. + void InitCopy(const Element* array, size_t a_size) { + Element* const copy = new Element[a_size]; + CopyArray(array, a_size, copy); + array_ = copy; + size_ = a_size; + clone_ = &NativeArray::InitCopy; + } + + // Initializes this object with a reference of the input. + void InitRef(const Element* array, size_t a_size) { + array_ = array; + size_ = a_size; + clone_ = &NativeArray::InitRef; + } + + const Element* array_; + size_t size_; + void (NativeArray::*clone_)(const Element*, size_t); + + GTEST_DISALLOW_ASSIGN_(NativeArray); +}; + +// Backport of std::index_sequence. +template +struct IndexSequence { + using type = IndexSequence; +}; + +// Double the IndexSequence, and one if plus_one is true. +template +struct DoubleSequence; +template +struct DoubleSequence, sizeofT> { + using type = IndexSequence; +}; +template +struct DoubleSequence, sizeofT> { + using type = IndexSequence; +}; + +// Backport of std::make_index_sequence. +// It uses O(ln(N)) instantiation depth. +template +struct MakeIndexSequence + : DoubleSequence::type, + N / 2>::type {}; + +template <> +struct MakeIndexSequence<0> : IndexSequence<> {}; + +// FIXME: This implementation of ElemFromList is O(1) in instantiation depth, +// but it is O(N^2) in total instantiations. Not sure if this is the best +// tradeoff, as it will make it somewhat slow to compile. +template +struct ElemFromListImpl {}; + +template +struct ElemFromListImpl { + using type = T; +}; + +// Get the Nth element from T... +// It uses O(1) instantiation depth. +template +struct ElemFromList; + +template +struct ElemFromList, T...> + : ElemFromListImpl... {}; + +template +class FlatTuple; + +template +struct FlatTupleElemBase; + +template +struct FlatTupleElemBase, I> { + using value_type = + typename ElemFromList::type, + T...>::type; + FlatTupleElemBase() = default; + explicit FlatTupleElemBase(value_type t) : value(std::move(t)) {} + value_type value; +}; + +template +struct FlatTupleBase; + +template +struct FlatTupleBase, IndexSequence> + : FlatTupleElemBase, Idx>... { + using Indices = IndexSequence; + FlatTupleBase() = default; + explicit FlatTupleBase(T... t) + : FlatTupleElemBase, Idx>(std::move(t))... {} +}; + +// Analog to std::tuple but with different tradeoffs. +// This class minimizes the template instantiation depth, thus allowing more +// elements that std::tuple would. std::tuple has been seen to require an +// instantiation depth of more than 10x the number of elements in some +// implementations. +// FlatTuple and ElemFromList are not recursive and have a fixed depth +// regardless of T... +// MakeIndexSequence, on the other hand, it is recursive but with an +// instantiation depth of O(ln(N)). +template +class FlatTuple + : private FlatTupleBase, + typename MakeIndexSequence::type> { + using Indices = typename FlatTuple::FlatTupleBase::Indices; + + public: + FlatTuple() = default; + explicit FlatTuple(T... t) : FlatTuple::FlatTupleBase(std::move(t)...) {} + + template + const typename ElemFromList::type& Get() const { + return static_cast*>(this)->value; + } + + template + typename ElemFromList::type& Get() { + return static_cast*>(this)->value; + } +}; + +// Utility functions to be called with static_assert to induce deprecation +// warnings. +GTEST_INTERNAL_DEPRECATED( + "INSTANTIATE_TEST_CASE_P is deprecated, please use " + "INSTANTIATE_TEST_SUITE_P") +constexpr bool InstantiateTestCase_P_IsDeprecated() { return true; } + +GTEST_INTERNAL_DEPRECATED( + "TYPED_TEST_CASE_P is deprecated, please use " + "TYPED_TEST_SUITE_P") +constexpr bool TypedTestCase_P_IsDeprecated() { return true; } + +GTEST_INTERNAL_DEPRECATED( + "TYPED_TEST_CASE is deprecated, please use " + "TYPED_TEST_SUITE") +constexpr bool TypedTestCaseIsDeprecated() { return true; } + +GTEST_INTERNAL_DEPRECATED( + "REGISTER_TYPED_TEST_CASE_P is deprecated, please use " + "REGISTER_TYPED_TEST_SUITE_P") +constexpr bool RegisterTypedTestCase_P_IsDeprecated() { return true; } + +GTEST_INTERNAL_DEPRECATED( + "INSTANTIATE_TYPED_TEST_CASE_P is deprecated, please use " + "INSTANTIATE_TYPED_TEST_SUITE_P") +constexpr bool InstantiateTypedTestCase_P_IsDeprecated() { return true; } + +} // namespace internal +} // namespace testing + +#define GTEST_MESSAGE_AT_(file, line, message, result_type) \ + ::testing::internal::AssertHelper(result_type, file, line, message) \ + = ::testing::Message() + +#define GTEST_MESSAGE_(message, result_type) \ + GTEST_MESSAGE_AT_(__FILE__, __LINE__, message, result_type) + +#define GTEST_FATAL_FAILURE_(message) \ + return GTEST_MESSAGE_(message, ::testing::TestPartResult::kFatalFailure) + +#define GTEST_NONFATAL_FAILURE_(message) \ + GTEST_MESSAGE_(message, ::testing::TestPartResult::kNonFatalFailure) + +#define GTEST_SUCCESS_(message) \ + GTEST_MESSAGE_(message, ::testing::TestPartResult::kSuccess) + +#define GTEST_SKIP_(message) \ + return GTEST_MESSAGE_(message, ::testing::TestPartResult::kSkip) + +// Suppress MSVC warning 4072 (unreachable code) for the code following +// statement if it returns or throws (or doesn't return or throw in some +// situations). +#define GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement) \ + if (::testing::internal::AlwaysTrue()) { statement; } + +#define GTEST_TEST_THROW_(statement, expected_exception, fail) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (::testing::internal::ConstCharPtr gtest_msg = "") { \ + bool gtest_caught_expected = false; \ + try { \ + GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ + } \ + catch (expected_exception const&) { \ + gtest_caught_expected = true; \ + } \ + catch (...) { \ + gtest_msg.value = \ + "Expected: " #statement " throws an exception of type " \ + #expected_exception ".\n Actual: it throws a different type."; \ + goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ + } \ + if (!gtest_caught_expected) { \ + gtest_msg.value = \ + "Expected: " #statement " throws an exception of type " \ + #expected_exception ".\n Actual: it throws nothing."; \ + goto GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__); \ + } \ + } else \ + GTEST_CONCAT_TOKEN_(gtest_label_testthrow_, __LINE__): \ + fail(gtest_msg.value) + +#define GTEST_TEST_NO_THROW_(statement, fail) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (::testing::internal::AlwaysTrue()) { \ + try { \ + GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ + } \ + catch (...) { \ + goto GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__); \ + } \ + } else \ + GTEST_CONCAT_TOKEN_(gtest_label_testnothrow_, __LINE__): \ + fail("Expected: " #statement " doesn't throw an exception.\n" \ + " Actual: it throws.") + +#define GTEST_TEST_ANY_THROW_(statement, fail) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (::testing::internal::AlwaysTrue()) { \ + bool gtest_caught_any = false; \ + try { \ + GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ + } \ + catch (...) { \ + gtest_caught_any = true; \ + } \ + if (!gtest_caught_any) { \ + goto GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__); \ + } \ + } else \ + GTEST_CONCAT_TOKEN_(gtest_label_testanythrow_, __LINE__): \ + fail("Expected: " #statement " throws an exception.\n" \ + " Actual: it doesn't.") + + +// Implements Boolean test assertions such as EXPECT_TRUE. expression can be +// either a boolean expression or an AssertionResult. text is a textual +// represenation of expression as it was passed into the EXPECT_TRUE. +#define GTEST_TEST_BOOLEAN_(expression, text, actual, expected, fail) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (const ::testing::AssertionResult gtest_ar_ = \ + ::testing::AssertionResult(expression)) \ + ; \ + else \ + fail(::testing::internal::GetBoolAssertionFailureMessage(\ + gtest_ar_, text, #actual, #expected).c_str()) + +#define GTEST_TEST_NO_FATAL_FAILURE_(statement, fail) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (::testing::internal::AlwaysTrue()) { \ + ::testing::internal::HasNewFatalFailureHelper gtest_fatal_failure_checker; \ + GTEST_SUPPRESS_UNREACHABLE_CODE_WARNING_BELOW_(statement); \ + if (gtest_fatal_failure_checker.has_new_fatal_failure()) { \ + goto GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__); \ + } \ + } else \ + GTEST_CONCAT_TOKEN_(gtest_label_testnofatal_, __LINE__): \ + fail("Expected: " #statement " doesn't generate new fatal " \ + "failures in the current thread.\n" \ + " Actual: it does.") + +// Expands to the name of the class that implements the given test. +#define GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \ + test_suite_name##_##test_name##_Test + +// Helper macro for defining tests. +#define GTEST_TEST_(test_suite_name, test_name, parent_class, parent_id) \ + static_assert(sizeof(GTEST_STRINGIFY_(test_suite_name)) > 1, \ + "test_suite_name must not be empty"); \ + static_assert(sizeof(GTEST_STRINGIFY_(test_name)) > 1, \ + "test_name must not be empty"); \ + class GTEST_TEST_CLASS_NAME_(test_suite_name, test_name) \ + : public parent_class { \ + public: \ + GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)() {} \ + \ + private: \ + virtual void TestBody(); \ + static ::testing::TestInfo* const test_info_ GTEST_ATTRIBUTE_UNUSED_; \ + GTEST_DISALLOW_COPY_AND_ASSIGN_(GTEST_TEST_CLASS_NAME_(test_suite_name, \ + test_name)); \ + }; \ + \ + ::testing::TestInfo* const GTEST_TEST_CLASS_NAME_(test_suite_name, \ + test_name)::test_info_ = \ + ::testing::internal::MakeAndRegisterTestInfo( \ + #test_suite_name, #test_name, nullptr, nullptr, \ + ::testing::internal::CodeLocation(__FILE__, __LINE__), (parent_id), \ + ::testing::internal::SuiteApiResolver< \ + parent_class>::GetSetUpCaseOrSuite(__FILE__, __LINE__), \ + ::testing::internal::SuiteApiResolver< \ + parent_class>::GetTearDownCaseOrSuite(__FILE__, __LINE__), \ + new ::testing::internal::TestFactoryImpl); \ + void GTEST_TEST_CLASS_NAME_(test_suite_name, test_name)::TestBody() + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_INTERNAL_H_ diff --git a/include/gtest/internal/gtest-param-util.h b/include/gtest/internal/gtest-param-util.h new file mode 100644 index 0000000..9753399 --- /dev/null +++ b/include/gtest/internal/gtest-param-util.h @@ -0,0 +1,883 @@ +// Copyright 2008 Google Inc. +// All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +// Type and function utilities for implementing parameterized tests. + +// GOOGLETEST_CM0001 DO NOT DELETE + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ + +#include + +#include +#include +#include +#include +#include +#include +#include + +#include "gtest/internal/gtest-internal.h" +#include "gtest/internal/gtest-port.h" +#include "gtest/gtest-printers.h" + +namespace testing { +// Input to a parameterized test name generator, describing a test parameter. +// Consists of the parameter value and the integer parameter index. +template +struct TestParamInfo { + TestParamInfo(const ParamType& a_param, size_t an_index) : + param(a_param), + index(an_index) {} + ParamType param; + size_t index; +}; + +// A builtin parameterized test name generator which returns the result of +// testing::PrintToString. +struct PrintToStringParamName { + template + std::string operator()(const TestParamInfo& info) const { + return PrintToString(info.param); + } +}; + +namespace internal { + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// Utility Functions + +// Outputs a message explaining invalid registration of different +// fixture class for the same test suite. This may happen when +// TEST_P macro is used to define two tests with the same name +// but in different namespaces. +GTEST_API_ void ReportInvalidTestSuiteType(const char* test_suite_name, + CodeLocation code_location); + +template class ParamGeneratorInterface; +template class ParamGenerator; + +// Interface for iterating over elements provided by an implementation +// of ParamGeneratorInterface. +template +class ParamIteratorInterface { + public: + virtual ~ParamIteratorInterface() {} + // A pointer to the base generator instance. + // Used only for the purposes of iterator comparison + // to make sure that two iterators belong to the same generator. + virtual const ParamGeneratorInterface* BaseGenerator() const = 0; + // Advances iterator to point to the next element + // provided by the generator. The caller is responsible + // for not calling Advance() on an iterator equal to + // BaseGenerator()->End(). + virtual void Advance() = 0; + // Clones the iterator object. Used for implementing copy semantics + // of ParamIterator. + virtual ParamIteratorInterface* Clone() const = 0; + // Dereferences the current iterator and provides (read-only) access + // to the pointed value. It is the caller's responsibility not to call + // Current() on an iterator equal to BaseGenerator()->End(). + // Used for implementing ParamGenerator::operator*(). + virtual const T* Current() const = 0; + // Determines whether the given iterator and other point to the same + // element in the sequence generated by the generator. + // Used for implementing ParamGenerator::operator==(). + virtual bool Equals(const ParamIteratorInterface& other) const = 0; +}; + +// Class iterating over elements provided by an implementation of +// ParamGeneratorInterface. It wraps ParamIteratorInterface +// and implements the const forward iterator concept. +template +class ParamIterator { + public: + typedef T value_type; + typedef const T& reference; + typedef ptrdiff_t difference_type; + + // ParamIterator assumes ownership of the impl_ pointer. + ParamIterator(const ParamIterator& other) : impl_(other.impl_->Clone()) {} + ParamIterator& operator=(const ParamIterator& other) { + if (this != &other) + impl_.reset(other.impl_->Clone()); + return *this; + } + + const T& operator*() const { return *impl_->Current(); } + const T* operator->() const { return impl_->Current(); } + // Prefix version of operator++. + ParamIterator& operator++() { + impl_->Advance(); + return *this; + } + // Postfix version of operator++. + ParamIterator operator++(int /*unused*/) { + ParamIteratorInterface* clone = impl_->Clone(); + impl_->Advance(); + return ParamIterator(clone); + } + bool operator==(const ParamIterator& other) const { + return impl_.get() == other.impl_.get() || impl_->Equals(*other.impl_); + } + bool operator!=(const ParamIterator& other) const { + return !(*this == other); + } + + private: + friend class ParamGenerator; + explicit ParamIterator(ParamIteratorInterface* impl) : impl_(impl) {} + std::unique_ptr > impl_; +}; + +// ParamGeneratorInterface is the binary interface to access generators +// defined in other translation units. +template +class ParamGeneratorInterface { + public: + typedef T ParamType; + + virtual ~ParamGeneratorInterface() {} + + // Generator interface definition + virtual ParamIteratorInterface* Begin() const = 0; + virtual ParamIteratorInterface* End() const = 0; +}; + +// Wraps ParamGeneratorInterface and provides general generator syntax +// compatible with the STL Container concept. +// This class implements copy initialization semantics and the contained +// ParamGeneratorInterface instance is shared among all copies +// of the original object. This is possible because that instance is immutable. +template +class ParamGenerator { + public: + typedef ParamIterator iterator; + + explicit ParamGenerator(ParamGeneratorInterface* impl) : impl_(impl) {} + ParamGenerator(const ParamGenerator& other) : impl_(other.impl_) {} + + ParamGenerator& operator=(const ParamGenerator& other) { + impl_ = other.impl_; + return *this; + } + + iterator begin() const { return iterator(impl_->Begin()); } + iterator end() const { return iterator(impl_->End()); } + + private: + std::shared_ptr > impl_; +}; + +// Generates values from a range of two comparable values. Can be used to +// generate sequences of user-defined types that implement operator+() and +// operator<(). +// This class is used in the Range() function. +template +class RangeGenerator : public ParamGeneratorInterface { + public: + RangeGenerator(T begin, T end, IncrementT step) + : begin_(begin), end_(end), + step_(step), end_index_(CalculateEndIndex(begin, end, step)) {} + ~RangeGenerator() override {} + + ParamIteratorInterface* Begin() const override { + return new Iterator(this, begin_, 0, step_); + } + ParamIteratorInterface* End() const override { + return new Iterator(this, end_, end_index_, step_); + } + + private: + class Iterator : public ParamIteratorInterface { + public: + Iterator(const ParamGeneratorInterface* base, T value, int index, + IncrementT step) + : base_(base), value_(value), index_(index), step_(step) {} + ~Iterator() override {} + + const ParamGeneratorInterface* BaseGenerator() const override { + return base_; + } + void Advance() override { + value_ = static_cast(value_ + step_); + index_++; + } + ParamIteratorInterface* Clone() const override { + return new Iterator(*this); + } + const T* Current() const override { return &value_; } + bool Equals(const ParamIteratorInterface& other) const override { + // Having the same base generator guarantees that the other + // iterator is of the same type and we can downcast. + GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) + << "The program attempted to compare iterators " + << "from different generators." << std::endl; + const int other_index = + CheckedDowncastToActualType(&other)->index_; + return index_ == other_index; + } + + private: + Iterator(const Iterator& other) + : ParamIteratorInterface(), + base_(other.base_), value_(other.value_), index_(other.index_), + step_(other.step_) {} + + // No implementation - assignment is unsupported. + void operator=(const Iterator& other); + + const ParamGeneratorInterface* const base_; + T value_; + int index_; + const IncrementT step_; + }; // class RangeGenerator::Iterator + + static int CalculateEndIndex(const T& begin, + const T& end, + const IncrementT& step) { + int end_index = 0; + for (T i = begin; i < end; i = static_cast(i + step)) + end_index++; + return end_index; + } + + // No implementation - assignment is unsupported. + void operator=(const RangeGenerator& other); + + const T begin_; + const T end_; + const IncrementT step_; + // The index for the end() iterator. All the elements in the generated + // sequence are indexed (0-based) to aid iterator comparison. + const int end_index_; +}; // class RangeGenerator + + +// Generates values from a pair of STL-style iterators. Used in the +// ValuesIn() function. The elements are copied from the source range +// since the source can be located on the stack, and the generator +// is likely to persist beyond that stack frame. +template +class ValuesInIteratorRangeGenerator : public ParamGeneratorInterface { + public: + template + ValuesInIteratorRangeGenerator(ForwardIterator begin, ForwardIterator end) + : container_(begin, end) {} + ~ValuesInIteratorRangeGenerator() override {} + + ParamIteratorInterface* Begin() const override { + return new Iterator(this, container_.begin()); + } + ParamIteratorInterface* End() const override { + return new Iterator(this, container_.end()); + } + + private: + typedef typename ::std::vector ContainerType; + + class Iterator : public ParamIteratorInterface { + public: + Iterator(const ParamGeneratorInterface* base, + typename ContainerType::const_iterator iterator) + : base_(base), iterator_(iterator) {} + ~Iterator() override {} + + const ParamGeneratorInterface* BaseGenerator() const override { + return base_; + } + void Advance() override { + ++iterator_; + value_.reset(); + } + ParamIteratorInterface* Clone() const override { + return new Iterator(*this); + } + // We need to use cached value referenced by iterator_ because *iterator_ + // can return a temporary object (and of type other then T), so just + // having "return &*iterator_;" doesn't work. + // value_ is updated here and not in Advance() because Advance() + // can advance iterator_ beyond the end of the range, and we cannot + // detect that fact. The client code, on the other hand, is + // responsible for not calling Current() on an out-of-range iterator. + const T* Current() const override { + if (value_.get() == nullptr) value_.reset(new T(*iterator_)); + return value_.get(); + } + bool Equals(const ParamIteratorInterface& other) const override { + // Having the same base generator guarantees that the other + // iterator is of the same type and we can downcast. + GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) + << "The program attempted to compare iterators " + << "from different generators." << std::endl; + return iterator_ == + CheckedDowncastToActualType(&other)->iterator_; + } + + private: + Iterator(const Iterator& other) + // The explicit constructor call suppresses a false warning + // emitted by gcc when supplied with the -Wextra option. + : ParamIteratorInterface(), + base_(other.base_), + iterator_(other.iterator_) {} + + const ParamGeneratorInterface* const base_; + typename ContainerType::const_iterator iterator_; + // A cached value of *iterator_. We keep it here to allow access by + // pointer in the wrapping iterator's operator->(). + // value_ needs to be mutable to be accessed in Current(). + // Use of std::unique_ptr helps manage cached value's lifetime, + // which is bound by the lifespan of the iterator itself. + mutable std::unique_ptr value_; + }; // class ValuesInIteratorRangeGenerator::Iterator + + // No implementation - assignment is unsupported. + void operator=(const ValuesInIteratorRangeGenerator& other); + + const ContainerType container_; +}; // class ValuesInIteratorRangeGenerator + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// Default parameterized test name generator, returns a string containing the +// integer test parameter index. +template +std::string DefaultParamName(const TestParamInfo& info) { + Message name_stream; + name_stream << info.index; + return name_stream.GetString(); +} + +template +void TestNotEmpty() { + static_assert(sizeof(T) == 0, "Empty arguments are not allowed."); +} +template +void TestNotEmpty(const T&) {} + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// Stores a parameter value and later creates tests parameterized with that +// value. +template +class ParameterizedTestFactory : public TestFactoryBase { + public: + typedef typename TestClass::ParamType ParamType; + explicit ParameterizedTestFactory(ParamType parameter) : + parameter_(parameter) {} + Test* CreateTest() override { + TestClass::SetParam(¶meter_); + return new TestClass(); + } + + private: + const ParamType parameter_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestFactory); +}; + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// TestMetaFactoryBase is a base class for meta-factories that create +// test factories for passing into MakeAndRegisterTestInfo function. +template +class TestMetaFactoryBase { + public: + virtual ~TestMetaFactoryBase() {} + + virtual TestFactoryBase* CreateTestFactory(ParamType parameter) = 0; +}; + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// TestMetaFactory creates test factories for passing into +// MakeAndRegisterTestInfo function. Since MakeAndRegisterTestInfo receives +// ownership of test factory pointer, same factory object cannot be passed +// into that method twice. But ParameterizedTestSuiteInfo is going to call +// it for each Test/Parameter value combination. Thus it needs meta factory +// creator class. +template +class TestMetaFactory + : public TestMetaFactoryBase { + public: + using ParamType = typename TestSuite::ParamType; + + TestMetaFactory() {} + + TestFactoryBase* CreateTestFactory(ParamType parameter) override { + return new ParameterizedTestFactory(parameter); + } + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(TestMetaFactory); +}; + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// ParameterizedTestSuiteInfoBase is a generic interface +// to ParameterizedTestSuiteInfo classes. ParameterizedTestSuiteInfoBase +// accumulates test information provided by TEST_P macro invocations +// and generators provided by INSTANTIATE_TEST_SUITE_P macro invocations +// and uses that information to register all resulting test instances +// in RegisterTests method. The ParameterizeTestSuiteRegistry class holds +// a collection of pointers to the ParameterizedTestSuiteInfo objects +// and calls RegisterTests() on each of them when asked. +class ParameterizedTestSuiteInfoBase { + public: + virtual ~ParameterizedTestSuiteInfoBase() {} + + // Base part of test suite name for display purposes. + virtual const std::string& GetTestSuiteName() const = 0; + // Test case id to verify identity. + virtual TypeId GetTestSuiteTypeId() const = 0; + // UnitTest class invokes this method to register tests in this + // test suite right before running them in RUN_ALL_TESTS macro. + // This method should not be called more than once on any single + // instance of a ParameterizedTestSuiteInfoBase derived class. + virtual void RegisterTests() = 0; + + protected: + ParameterizedTestSuiteInfoBase() {} + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteInfoBase); +}; + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// ParameterizedTestSuiteInfo accumulates tests obtained from TEST_P +// macro invocations for a particular test suite and generators +// obtained from INSTANTIATE_TEST_SUITE_P macro invocations for that +// test suite. It registers tests with all values generated by all +// generators when asked. +template +class ParameterizedTestSuiteInfo : public ParameterizedTestSuiteInfoBase { + public: + // ParamType and GeneratorCreationFunc are private types but are required + // for declarations of public methods AddTestPattern() and + // AddTestSuiteInstantiation(). + using ParamType = typename TestSuite::ParamType; + // A function that returns an instance of appropriate generator type. + typedef ParamGenerator(GeneratorCreationFunc)(); + using ParamNameGeneratorFunc = std::string(const TestParamInfo&); + + explicit ParameterizedTestSuiteInfo(const char* name, + CodeLocation code_location) + : test_suite_name_(name), code_location_(code_location) {} + + // Test case base name for display purposes. + const std::string& GetTestSuiteName() const override { + return test_suite_name_; + } + // Test case id to verify identity. + TypeId GetTestSuiteTypeId() const override { return GetTypeId(); } + // TEST_P macro uses AddTestPattern() to record information + // about a single test in a LocalTestInfo structure. + // test_suite_name is the base name of the test suite (without invocation + // prefix). test_base_name is the name of an individual test without + // parameter index. For the test SequenceA/FooTest.DoBar/1 FooTest is + // test suite base name and DoBar is test base name. + void AddTestPattern(const char* test_suite_name, const char* test_base_name, + TestMetaFactoryBase* meta_factory) { + tests_.push_back(std::shared_ptr( + new TestInfo(test_suite_name, test_base_name, meta_factory))); + } + // INSTANTIATE_TEST_SUITE_P macro uses AddGenerator() to record information + // about a generator. + int AddTestSuiteInstantiation(const std::string& instantiation_name, + GeneratorCreationFunc* func, + ParamNameGeneratorFunc* name_func, + const char* file, int line) { + instantiations_.push_back( + InstantiationInfo(instantiation_name, func, name_func, file, line)); + return 0; // Return value used only to run this method in namespace scope. + } + // UnitTest class invokes this method to register tests in this test suite + // test suites right before running tests in RUN_ALL_TESTS macro. + // This method should not be called more than once on any single + // instance of a ParameterizedTestSuiteInfoBase derived class. + // UnitTest has a guard to prevent from calling this method more than once. + void RegisterTests() override { + for (typename TestInfoContainer::iterator test_it = tests_.begin(); + test_it != tests_.end(); ++test_it) { + std::shared_ptr test_info = *test_it; + for (typename InstantiationContainer::iterator gen_it = + instantiations_.begin(); gen_it != instantiations_.end(); + ++gen_it) { + const std::string& instantiation_name = gen_it->name; + ParamGenerator generator((*gen_it->generator)()); + ParamNameGeneratorFunc* name_func = gen_it->name_func; + const char* file = gen_it->file; + int line = gen_it->line; + + std::string test_suite_name; + if ( !instantiation_name.empty() ) + test_suite_name = instantiation_name + "/"; + test_suite_name += test_info->test_suite_base_name; + + size_t i = 0; + std::set test_param_names; + for (typename ParamGenerator::iterator param_it = + generator.begin(); + param_it != generator.end(); ++param_it, ++i) { + Message test_name_stream; + + std::string param_name = name_func( + TestParamInfo(*param_it, i)); + + GTEST_CHECK_(IsValidParamName(param_name)) + << "Parameterized test name '" << param_name + << "' is invalid, in " << file + << " line " << line << std::endl; + + GTEST_CHECK_(test_param_names.count(param_name) == 0) + << "Duplicate parameterized test name '" << param_name + << "', in " << file << " line " << line << std::endl; + + test_param_names.insert(param_name); + + if (!test_info->test_base_name.empty()) { + test_name_stream << test_info->test_base_name << "/"; + } + test_name_stream << param_name; + MakeAndRegisterTestInfo( + test_suite_name.c_str(), test_name_stream.GetString().c_str(), + nullptr, // No type parameter. + PrintToString(*param_it).c_str(), code_location_, + GetTestSuiteTypeId(), + SuiteApiResolver::GetSetUpCaseOrSuite(file, line), + SuiteApiResolver::GetTearDownCaseOrSuite(file, line), + test_info->test_meta_factory->CreateTestFactory(*param_it)); + } // for param_it + } // for gen_it + } // for test_it + } // RegisterTests + + private: + // LocalTestInfo structure keeps information about a single test registered + // with TEST_P macro. + struct TestInfo { + TestInfo(const char* a_test_suite_base_name, const char* a_test_base_name, + TestMetaFactoryBase* a_test_meta_factory) + : test_suite_base_name(a_test_suite_base_name), + test_base_name(a_test_base_name), + test_meta_factory(a_test_meta_factory) {} + + const std::string test_suite_base_name; + const std::string test_base_name; + const std::unique_ptr > test_meta_factory; + }; + using TestInfoContainer = ::std::vector >; + // Records data received from INSTANTIATE_TEST_SUITE_P macros: + // + struct InstantiationInfo { + InstantiationInfo(const std::string &name_in, + GeneratorCreationFunc* generator_in, + ParamNameGeneratorFunc* name_func_in, + const char* file_in, + int line_in) + : name(name_in), + generator(generator_in), + name_func(name_func_in), + file(file_in), + line(line_in) {} + + std::string name; + GeneratorCreationFunc* generator; + ParamNameGeneratorFunc* name_func; + const char* file; + int line; + }; + typedef ::std::vector InstantiationContainer; + + static bool IsValidParamName(const std::string& name) { + // Check for empty string + if (name.empty()) + return false; + + // Check for invalid characters + for (std::string::size_type index = 0; index < name.size(); ++index) { + if (!isalnum(name[index]) && name[index] != '_') + return false; + } + + return true; + } + + const std::string test_suite_name_; + CodeLocation code_location_; + TestInfoContainer tests_; + InstantiationContainer instantiations_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteInfo); +}; // class ParameterizedTestSuiteInfo + +// Legacy API is deprecated but still available +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ +template +using ParameterizedTestCaseInfo = ParameterizedTestSuiteInfo; +#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// ParameterizedTestSuiteRegistry contains a map of +// ParameterizedTestSuiteInfoBase classes accessed by test suite names. TEST_P +// and INSTANTIATE_TEST_SUITE_P macros use it to locate their corresponding +// ParameterizedTestSuiteInfo descriptors. +class ParameterizedTestSuiteRegistry { + public: + ParameterizedTestSuiteRegistry() {} + ~ParameterizedTestSuiteRegistry() { + for (auto& test_suite_info : test_suite_infos_) { + delete test_suite_info; + } + } + + // Looks up or creates and returns a structure containing information about + // tests and instantiations of a particular test suite. + template + ParameterizedTestSuiteInfo* GetTestSuitePatternHolder( + const char* test_suite_name, CodeLocation code_location) { + ParameterizedTestSuiteInfo* typed_test_info = nullptr; + for (auto& test_suite_info : test_suite_infos_) { + if (test_suite_info->GetTestSuiteName() == test_suite_name) { + if (test_suite_info->GetTestSuiteTypeId() != GetTypeId()) { + // Complain about incorrect usage of Google Test facilities + // and terminate the program since we cannot guaranty correct + // test suite setup and tear-down in this case. + ReportInvalidTestSuiteType(test_suite_name, code_location); + posix::Abort(); + } else { + // At this point we are sure that the object we found is of the same + // type we are looking for, so we downcast it to that type + // without further checks. + typed_test_info = CheckedDowncastToActualType< + ParameterizedTestSuiteInfo >(test_suite_info); + } + break; + } + } + if (typed_test_info == nullptr) { + typed_test_info = new ParameterizedTestSuiteInfo( + test_suite_name, code_location); + test_suite_infos_.push_back(typed_test_info); + } + return typed_test_info; + } + void RegisterTests() { + for (auto& test_suite_info : test_suite_infos_) { + test_suite_info->RegisterTests(); + } + } +// Legacy API is deprecated but still available +#ifndef GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + template + ParameterizedTestCaseInfo* GetTestCasePatternHolder( + const char* test_case_name, CodeLocation code_location) { + return GetTestSuitePatternHolder(test_case_name, code_location); + } + +#endif // GTEST_REMOVE_LEGACY_TEST_CASEAPI_ + + private: + using TestSuiteInfoContainer = ::std::vector; + + TestSuiteInfoContainer test_suite_infos_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(ParameterizedTestSuiteRegistry); +}; + +} // namespace internal + +// Forward declarations of ValuesIn(), which is implemented in +// include/gtest/gtest-param-test.h. +template +internal::ParamGenerator ValuesIn( + const Container& container); + +namespace internal { +// Used in the Values() function to provide polymorphic capabilities. + +template +class ValueArray { + public: + ValueArray(Ts... v) : v_{std::move(v)...} {} + + template + operator ParamGenerator() const { // NOLINT + return ValuesIn(MakeVector(MakeIndexSequence())); + } + + private: + template + std::vector MakeVector(IndexSequence) const { + return std::vector{static_cast(v_.template Get())...}; + } + + FlatTuple v_; +}; + +template +class CartesianProductGenerator + : public ParamGeneratorInterface<::std::tuple> { + public: + typedef ::std::tuple ParamType; + + CartesianProductGenerator(const std::tuple...>& g) + : generators_(g) {} + ~CartesianProductGenerator() override {} + + ParamIteratorInterface* Begin() const override { + return new Iterator(this, generators_, false); + } + ParamIteratorInterface* End() const override { + return new Iterator(this, generators_, true); + } + + private: + template + class IteratorImpl; + template + class IteratorImpl> + : public ParamIteratorInterface { + public: + IteratorImpl(const ParamGeneratorInterface* base, + const std::tuple...>& generators, bool is_end) + : base_(base), + begin_(std::get(generators).begin()...), + end_(std::get(generators).end()...), + current_(is_end ? end_ : begin_) { + ComputeCurrentValue(); + } + ~IteratorImpl() override {} + + const ParamGeneratorInterface* BaseGenerator() const override { + return base_; + } + // Advance should not be called on beyond-of-range iterators + // so no component iterators must be beyond end of range, either. + void Advance() override { + assert(!AtEnd()); + // Advance the last iterator. + ++std::get(current_); + // if that reaches end, propagate that up. + AdvanceIfEnd(); + ComputeCurrentValue(); + } + ParamIteratorInterface* Clone() const override { + return new IteratorImpl(*this); + } + + const ParamType* Current() const override { return current_value_.get(); } + + bool Equals(const ParamIteratorInterface& other) const override { + // Having the same base generator guarantees that the other + // iterator is of the same type and we can downcast. + GTEST_CHECK_(BaseGenerator() == other.BaseGenerator()) + << "The program attempted to compare iterators " + << "from different generators." << std::endl; + const IteratorImpl* typed_other = + CheckedDowncastToActualType(&other); + + // We must report iterators equal if they both point beyond their + // respective ranges. That can happen in a variety of fashions, + // so we have to consult AtEnd(). + if (AtEnd() && typed_other->AtEnd()) return true; + + bool same = true; + bool dummy[] = { + (same = same && std::get(current_) == + std::get(typed_other->current_))...}; + (void)dummy; + return same; + } + + private: + template + void AdvanceIfEnd() { + if (std::get(current_) != std::get(end_)) return; + + bool last = ThisI == 0; + if (last) { + // We are done. Nothing else to propagate. + return; + } + + constexpr size_t NextI = ThisI - (ThisI != 0); + std::get(current_) = std::get(begin_); + ++std::get(current_); + AdvanceIfEnd(); + } + + void ComputeCurrentValue() { + if (!AtEnd()) + current_value_ = std::make_shared(*std::get(current_)...); + } + bool AtEnd() const { + bool at_end = false; + bool dummy[] = { + (at_end = at_end || std::get(current_) == std::get(end_))...}; + (void)dummy; + return at_end; + } + + const ParamGeneratorInterface* const base_; + std::tuple::iterator...> begin_; + std::tuple::iterator...> end_; + std::tuple::iterator...> current_; + std::shared_ptr current_value_; + }; + + using Iterator = IteratorImpl::type>; + + std::tuple...> generators_; +}; + +template +class CartesianProductHolder { + public: + CartesianProductHolder(const Gen&... g) : generators_(g...) {} + template + operator ParamGenerator<::std::tuple>() const { + return ParamGenerator<::std::tuple>( + new CartesianProductGenerator(generators_)); + } + + private: + std::tuple generators_; +}; + +} // namespace internal +} // namespace testing + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PARAM_UTIL_H_ diff --git a/include/gtest/internal/gtest-port-arch.h b/include/gtest/internal/gtest-port-arch.h new file mode 100644 index 0000000..cece93d --- /dev/null +++ b/include/gtest/internal/gtest-port-arch.h @@ -0,0 +1,107 @@ +// Copyright 2015, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// The Google C++ Testing and Mocking Framework (Google Test) +// +// This header file defines the GTEST_OS_* macro. +// It is separate from gtest-port.h so that custom/gtest-port.h can include it. + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_ + +// Determines the platform on which Google Test is compiled. +#ifdef __CYGWIN__ +# define GTEST_OS_CYGWIN 1 +# elif defined(__MINGW__) || defined(__MINGW32__) || defined(__MINGW64__) +# define GTEST_OS_WINDOWS_MINGW 1 +# define GTEST_OS_WINDOWS 1 +#elif defined _WIN32 +# define GTEST_OS_WINDOWS 1 +# ifdef _WIN32_WCE +# define GTEST_OS_WINDOWS_MOBILE 1 +# elif defined(WINAPI_FAMILY) +# include +# if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP) +# define GTEST_OS_WINDOWS_DESKTOP 1 +# elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_PHONE_APP) +# define GTEST_OS_WINDOWS_PHONE 1 +# elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_APP) +# define GTEST_OS_WINDOWS_RT 1 +# elif WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_TV_TITLE) +# define GTEST_OS_WINDOWS_PHONE 1 +# define GTEST_OS_WINDOWS_TV_TITLE 1 +# else + // WINAPI_FAMILY defined but no known partition matched. + // Default to desktop. +# define GTEST_OS_WINDOWS_DESKTOP 1 +# endif +# else +# define GTEST_OS_WINDOWS_DESKTOP 1 +# endif // _WIN32_WCE +#elif defined __OS2__ +# define GTEST_OS_OS2 1 +#elif defined __APPLE__ +# define GTEST_OS_MAC 1 +# if TARGET_OS_IPHONE +# define GTEST_OS_IOS 1 +# endif +#elif defined __DragonFly__ +# define GTEST_OS_DRAGONFLY 1 +#elif defined __FreeBSD__ +# define GTEST_OS_FREEBSD 1 +#elif defined __Fuchsia__ +# define GTEST_OS_FUCHSIA 1 +#elif defined(__GLIBC__) && defined(__FreeBSD_kernel__) +# define GTEST_OS_GNU_KFREEBSD 1 +#elif defined __linux__ +# define GTEST_OS_LINUX 1 +# if defined __ANDROID__ +# define GTEST_OS_LINUX_ANDROID 1 +# endif +#elif defined __MVS__ +# define GTEST_OS_ZOS 1 +#elif defined(__sun) && defined(__SVR4) +# define GTEST_OS_SOLARIS 1 +#elif defined(_AIX) +# define GTEST_OS_AIX 1 +#elif defined(__hpux) +# define GTEST_OS_HPUX 1 +#elif defined __native_client__ +# define GTEST_OS_NACL 1 +#elif defined __NetBSD__ +# define GTEST_OS_NETBSD 1 +#elif defined __OpenBSD__ +# define GTEST_OS_OPENBSD 1 +#elif defined __QNX__ +# define GTEST_OS_QNX 1 +#elif defined(__HAIKU__) +#define GTEST_OS_HAIKU 1 +#endif // __CYGWIN__ + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_ARCH_H_ diff --git a/include/gtest/internal/gtest-port.h b/include/gtest/internal/gtest-port.h new file mode 100644 index 0000000..063fcb1 --- /dev/null +++ b/include/gtest/internal/gtest-port.h @@ -0,0 +1,2231 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// Low-level types and utilities for porting Google Test to various +// platforms. All macros ending with _ and symbols defined in an +// internal namespace are subject to change without notice. Code +// outside Google Test MUST NOT USE THEM DIRECTLY. Macros that don't +// end with _ are part of Google Test's public API and can be used by +// code outside Google Test. +// +// This file is fundamental to Google Test. All other Google Test source +// files are expected to #include this. Therefore, it cannot #include +// any other Google Test header. + +// GOOGLETEST_CM0001 DO NOT DELETE + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ + +// Environment-describing macros +// ----------------------------- +// +// Google Test can be used in many different environments. Macros in +// this section tell Google Test what kind of environment it is being +// used in, such that Google Test can provide environment-specific +// features and implementations. +// +// Google Test tries to automatically detect the properties of its +// environment, so users usually don't need to worry about these +// macros. However, the automatic detection is not perfect. +// Sometimes it's necessary for a user to define some of the following +// macros in the build script to override Google Test's decisions. +// +// If the user doesn't define a macro in the list, Google Test will +// provide a default definition. After this header is #included, all +// macros in this list will be defined to either 1 or 0. +// +// Notes to maintainers: +// - Each macro here is a user-tweakable knob; do not grow the list +// lightly. +// - Use #if to key off these macros. Don't use #ifdef or "#if +// defined(...)", which will not work as these macros are ALWAYS +// defined. +// +// GTEST_HAS_CLONE - Define it to 1/0 to indicate that clone(2) +// is/isn't available. +// GTEST_HAS_EXCEPTIONS - Define it to 1/0 to indicate that exceptions +// are enabled. +// GTEST_HAS_POSIX_RE - Define it to 1/0 to indicate that POSIX regular +// expressions are/aren't available. +// GTEST_HAS_PTHREAD - Define it to 1/0 to indicate that +// is/isn't available. +// GTEST_HAS_RTTI - Define it to 1/0 to indicate that RTTI is/isn't +// enabled. +// GTEST_HAS_STD_WSTRING - Define it to 1/0 to indicate that +// std::wstring does/doesn't work (Google Test can +// be used where std::wstring is unavailable). +// GTEST_HAS_SEH - Define it to 1/0 to indicate whether the +// compiler supports Microsoft's "Structured +// Exception Handling". +// GTEST_HAS_STREAM_REDIRECTION +// - Define it to 1/0 to indicate whether the +// platform supports I/O stream redirection using +// dup() and dup2(). +// GTEST_LINKED_AS_SHARED_LIBRARY +// - Define to 1 when compiling tests that use +// Google Test as a shared library (known as +// DLL on Windows). +// GTEST_CREATE_SHARED_LIBRARY +// - Define to 1 when compiling Google Test itself +// as a shared library. +// GTEST_DEFAULT_DEATH_TEST_STYLE +// - The default value of --gtest_death_test_style. +// The legacy default has been "fast" in the open +// source version since 2008. The recommended value +// is "threadsafe", and can be set in +// custom/gtest-port.h. + +// Platform-indicating macros +// -------------------------- +// +// Macros indicating the platform on which Google Test is being used +// (a macro is defined to 1 if compiled on the given platform; +// otherwise UNDEFINED -- it's never defined to 0.). Google Test +// defines these macros automatically. Code outside Google Test MUST +// NOT define them. +// +// GTEST_OS_AIX - IBM AIX +// GTEST_OS_CYGWIN - Cygwin +// GTEST_OS_DRAGONFLY - DragonFlyBSD +// GTEST_OS_FREEBSD - FreeBSD +// GTEST_OS_FUCHSIA - Fuchsia +// GTEST_OS_GNU_KFREEBSD - GNU/kFreeBSD +// GTEST_OS_HAIKU - Haiku +// GTEST_OS_HPUX - HP-UX +// GTEST_OS_LINUX - Linux +// GTEST_OS_LINUX_ANDROID - Google Android +// GTEST_OS_MAC - Mac OS X +// GTEST_OS_IOS - iOS +// GTEST_OS_NACL - Google Native Client (NaCl) +// GTEST_OS_NETBSD - NetBSD +// GTEST_OS_OPENBSD - OpenBSD +// GTEST_OS_OS2 - OS/2 +// GTEST_OS_QNX - QNX +// GTEST_OS_SOLARIS - Sun Solaris +// GTEST_OS_WINDOWS - Windows (Desktop, MinGW, or Mobile) +// GTEST_OS_WINDOWS_DESKTOP - Windows Desktop +// GTEST_OS_WINDOWS_MINGW - MinGW +// GTEST_OS_WINDOWS_MOBILE - Windows Mobile +// GTEST_OS_WINDOWS_PHONE - Windows Phone +// GTEST_OS_WINDOWS_RT - Windows Store App/WinRT +// GTEST_OS_ZOS - z/OS +// +// Among the platforms, Cygwin, Linux, Mac OS X, and Windows have the +// most stable support. Since core members of the Google Test project +// don't have access to other platforms, support for them may be less +// stable. If you notice any problems on your platform, please notify +// googletestframework@googlegroups.com (patches for fixing them are +// even more welcome!). +// +// It is possible that none of the GTEST_OS_* macros are defined. + +// Feature-indicating macros +// ------------------------- +// +// Macros indicating which Google Test features are available (a macro +// is defined to 1 if the corresponding feature is supported; +// otherwise UNDEFINED -- it's never defined to 0.). Google Test +// defines these macros automatically. Code outside Google Test MUST +// NOT define them. +// +// These macros are public so that portable tests can be written. +// Such tests typically surround code using a feature with an #if +// which controls that code. For example: +// +// #if GTEST_HAS_DEATH_TEST +// EXPECT_DEATH(DoSomethingDeadly()); +// #endif +// +// GTEST_HAS_DEATH_TEST - death tests +// GTEST_HAS_TYPED_TEST - typed tests +// GTEST_HAS_TYPED_TEST_P - type-parameterized tests +// GTEST_IS_THREADSAFE - Google Test is thread-safe. +// GOOGLETEST_CM0007 DO NOT DELETE +// GTEST_USES_POSIX_RE - enhanced POSIX regex is used. Do not confuse with +// GTEST_HAS_POSIX_RE (see above) which users can +// define themselves. +// GTEST_USES_SIMPLE_RE - our own simple regex is used; +// the above RE\b(s) are mutually exclusive. + +// Misc public macros +// ------------------ +// +// GTEST_FLAG(flag_name) - references the variable corresponding to +// the given Google Test flag. + +// Internal utilities +// ------------------ +// +// The following macros and utilities are for Google Test's INTERNAL +// use only. Code outside Google Test MUST NOT USE THEM DIRECTLY. +// +// Macros for basic C++ coding: +// GTEST_AMBIGUOUS_ELSE_BLOCKER_ - for disabling a gcc warning. +// GTEST_ATTRIBUTE_UNUSED_ - declares that a class' instances or a +// variable don't have to be used. +// GTEST_DISALLOW_ASSIGN_ - disables operator=. +// GTEST_DISALLOW_COPY_AND_ASSIGN_ - disables copy ctor and operator=. +// GTEST_MUST_USE_RESULT_ - declares that a function's result must be used. +// GTEST_INTENTIONAL_CONST_COND_PUSH_ - start code section where MSVC C4127 is +// suppressed (constant conditional). +// GTEST_INTENTIONAL_CONST_COND_POP_ - finish code section where MSVC C4127 +// is suppressed. +// +// Synchronization: +// Mutex, MutexLock, ThreadLocal, GetThreadCount() +// - synchronization primitives. +// +// Regular expressions: +// RE - a simple regular expression class using the POSIX +// Extended Regular Expression syntax on UNIX-like platforms +// GOOGLETEST_CM0008 DO NOT DELETE +// or a reduced regular exception syntax on other +// platforms, including Windows. +// Logging: +// GTEST_LOG_() - logs messages at the specified severity level. +// LogToStderr() - directs all log messages to stderr. +// FlushInfoLog() - flushes informational log messages. +// +// Stdout and stderr capturing: +// CaptureStdout() - starts capturing stdout. +// GetCapturedStdout() - stops capturing stdout and returns the captured +// string. +// CaptureStderr() - starts capturing stderr. +// GetCapturedStderr() - stops capturing stderr and returns the captured +// string. +// +// Integer types: +// TypeWithSize - maps an integer to a int type. +// Int32, UInt32, Int64, UInt64, TimeInMillis +// - integers of known sizes. +// BiggestInt - the biggest signed integer type. +// +// Command-line utilities: +// GTEST_DECLARE_*() - declares a flag. +// GTEST_DEFINE_*() - defines a flag. +// GetInjectableArgvs() - returns the command line as a vector of strings. +// +// Environment variable utilities: +// GetEnv() - gets the value of an environment variable. +// BoolFromGTestEnv() - parses a bool environment variable. +// Int32FromGTestEnv() - parses an Int32 environment variable. +// StringFromGTestEnv() - parses a string environment variable. +// +// Deprecation warnings: +// GTEST_INTERNAL_DEPRECATED(message) - attribute marking a function as +// deprecated; calling a marked function +// should generate a compiler warning + +#include // for isspace, etc +#include // for ptrdiff_t +#include +#include +#include +#include +#include + +#ifndef _WIN32_WCE +# include +# include +#endif // !_WIN32_WCE + +#if defined __APPLE__ +# include +# include +#endif + +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include // NOLINT +#include +#include +#include // NOLINT + +#include "gtest/internal/gtest-port-arch.h" +#include "gtest/internal/custom/gtest-port.h" + +#if !defined(GTEST_DEV_EMAIL_) +# define GTEST_DEV_EMAIL_ "googletestframework@@googlegroups.com" +# define GTEST_FLAG_PREFIX_ "gtest_" +# define GTEST_FLAG_PREFIX_DASH_ "gtest-" +# define GTEST_FLAG_PREFIX_UPPER_ "GTEST_" +# define GTEST_NAME_ "Google Test" +# define GTEST_PROJECT_URL_ "https://github.com/google/googletest/" +#endif // !defined(GTEST_DEV_EMAIL_) + +#if !defined(GTEST_INIT_GOOGLE_TEST_NAME_) +# define GTEST_INIT_GOOGLE_TEST_NAME_ "testing::InitGoogleTest" +#endif // !defined(GTEST_INIT_GOOGLE_TEST_NAME_) + +// Determines the version of gcc that is used to compile this. +#ifdef __GNUC__ +// 40302 means version 4.3.2. +# define GTEST_GCC_VER_ \ + (__GNUC__*10000 + __GNUC_MINOR__*100 + __GNUC_PATCHLEVEL__) +#endif // __GNUC__ + +// Macros for disabling Microsoft Visual C++ warnings. +// +// GTEST_DISABLE_MSC_WARNINGS_PUSH_(4800 4385) +// /* code that triggers warnings C4800 and C4385 */ +// GTEST_DISABLE_MSC_WARNINGS_POP_() +#if defined(_MSC_VER) +# define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) \ + __pragma(warning(push)) \ + __pragma(warning(disable: warnings)) +# define GTEST_DISABLE_MSC_WARNINGS_POP_() \ + __pragma(warning(pop)) +#else +// Not all compilers are MSVC +# define GTEST_DISABLE_MSC_WARNINGS_PUSH_(warnings) +# define GTEST_DISABLE_MSC_WARNINGS_POP_() +#endif + +// Clang on Windows does not understand MSVC's pragma warning. +// We need clang-specific way to disable function deprecation warning. +#ifdef __clang__ +# define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \ + _Pragma("clang diagnostic push") \ + _Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") \ + _Pragma("clang diagnostic ignored \"-Wdeprecated-implementations\"") +#define GTEST_DISABLE_MSC_DEPRECATED_POP_() \ + _Pragma("clang diagnostic pop") +#else +# define GTEST_DISABLE_MSC_DEPRECATED_PUSH_() \ + GTEST_DISABLE_MSC_WARNINGS_PUSH_(4996) +# define GTEST_DISABLE_MSC_DEPRECATED_POP_() \ + GTEST_DISABLE_MSC_WARNINGS_POP_() +#endif + +// Brings in definitions for functions used in the testing::internal::posix +// namespace (read, write, close, chdir, isatty, stat). We do not currently +// use them on Windows Mobile. +#if GTEST_OS_WINDOWS +# if !GTEST_OS_WINDOWS_MOBILE +# include +# include +# endif +// In order to avoid having to include , use forward declaration +#if GTEST_OS_WINDOWS_MINGW && !defined(__MINGW64_VERSION_MAJOR) +// MinGW defined _CRITICAL_SECTION and _RTL_CRITICAL_SECTION as two +// separate (equivalent) structs, instead of using typedef +typedef struct _CRITICAL_SECTION GTEST_CRITICAL_SECTION; +#else +// Assume CRITICAL_SECTION is a typedef of _RTL_CRITICAL_SECTION. +// This assumption is verified by +// WindowsTypesTest.CRITICAL_SECTIONIs_RTL_CRITICAL_SECTION. +typedef struct _RTL_CRITICAL_SECTION GTEST_CRITICAL_SECTION; +#endif +#else +// This assumes that non-Windows OSes provide unistd.h. For OSes where this +// is not the case, we need to include headers that provide the functions +// mentioned above. +# include +# include +#endif // GTEST_OS_WINDOWS + +#if GTEST_OS_LINUX_ANDROID +// Used to define __ANDROID_API__ matching the target NDK API level. +# include // NOLINT +#endif + +// Defines this to true if and only if Google Test can use POSIX regular +// expressions. +#ifndef GTEST_HAS_POSIX_RE +# if GTEST_OS_LINUX_ANDROID +// On Android, is only available starting with Gingerbread. +# define GTEST_HAS_POSIX_RE (__ANDROID_API__ >= 9) +# else +# define GTEST_HAS_POSIX_RE (!GTEST_OS_WINDOWS) +# endif +#endif + +#if GTEST_USES_PCRE +// The appropriate headers have already been included. + +#elif GTEST_HAS_POSIX_RE + +// On some platforms, needs someone to define size_t, and +// won't compile otherwise. We can #include it here as we already +// included , which is guaranteed to define size_t through +// . +# include // NOLINT + +# define GTEST_USES_POSIX_RE 1 + +#elif GTEST_OS_WINDOWS + +// is not available on Windows. Use our own simple regex +// implementation instead. +# define GTEST_USES_SIMPLE_RE 1 + +#else + +// may not be available on this platform. Use our own +// simple regex implementation instead. +# define GTEST_USES_SIMPLE_RE 1 + +#endif // GTEST_USES_PCRE + +#ifndef GTEST_HAS_EXCEPTIONS +// The user didn't tell us whether exceptions are enabled, so we need +// to figure it out. +# if defined(_MSC_VER) && defined(_CPPUNWIND) +// MSVC defines _CPPUNWIND to 1 if and only if exceptions are enabled. +# define GTEST_HAS_EXCEPTIONS 1 +# elif defined(__BORLANDC__) +// C++Builder's implementation of the STL uses the _HAS_EXCEPTIONS +// macro to enable exceptions, so we'll do the same. +// Assumes that exceptions are enabled by default. +# ifndef _HAS_EXCEPTIONS +# define _HAS_EXCEPTIONS 1 +# endif // _HAS_EXCEPTIONS +# define GTEST_HAS_EXCEPTIONS _HAS_EXCEPTIONS +# elif defined(__clang__) +// clang defines __EXCEPTIONS if and only if exceptions are enabled before clang +// 220714, but if and only if cleanups are enabled after that. In Obj-C++ files, +// there can be cleanups for ObjC exceptions which also need cleanups, even if +// C++ exceptions are disabled. clang has __has_feature(cxx_exceptions) which +// checks for C++ exceptions starting at clang r206352, but which checked for +// cleanups prior to that. To reliably check for C++ exception availability with +// clang, check for +// __EXCEPTIONS && __has_feature(cxx_exceptions). +# define GTEST_HAS_EXCEPTIONS (__EXCEPTIONS && __has_feature(cxx_exceptions)) +# elif defined(__GNUC__) && __EXCEPTIONS +// gcc defines __EXCEPTIONS to 1 if and only if exceptions are enabled. +# define GTEST_HAS_EXCEPTIONS 1 +# elif defined(__SUNPRO_CC) +// Sun Pro CC supports exceptions. However, there is no compile-time way of +// detecting whether they are enabled or not. Therefore, we assume that +// they are enabled unless the user tells us otherwise. +# define GTEST_HAS_EXCEPTIONS 1 +# elif defined(__IBMCPP__) && __EXCEPTIONS +// xlC defines __EXCEPTIONS to 1 if and only if exceptions are enabled. +# define GTEST_HAS_EXCEPTIONS 1 +# elif defined(__HP_aCC) +// Exception handling is in effect by default in HP aCC compiler. It has to +// be turned of by +noeh compiler option if desired. +# define GTEST_HAS_EXCEPTIONS 1 +# else +// For other compilers, we assume exceptions are disabled to be +// conservative. +# define GTEST_HAS_EXCEPTIONS 0 +# endif // defined(_MSC_VER) || defined(__BORLANDC__) +#endif // GTEST_HAS_EXCEPTIONS + +#if !defined(GTEST_HAS_STD_STRING) +// Even though we don't use this macro any longer, we keep it in case +// some clients still depend on it. +# define GTEST_HAS_STD_STRING 1 +#elif !GTEST_HAS_STD_STRING +// The user told us that ::std::string isn't available. +# error "::std::string isn't available." +#endif // !defined(GTEST_HAS_STD_STRING) + +#ifndef GTEST_HAS_STD_WSTRING +// The user didn't tell us whether ::std::wstring is available, so we need +// to figure it out. +// Cygwin 1.7 and below doesn't support ::std::wstring. +// Solaris' libc++ doesn't support it either. Android has +// no support for it at least as recent as Froyo (2.2). +#define GTEST_HAS_STD_WSTRING \ + (!(GTEST_OS_LINUX_ANDROID || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \ + GTEST_OS_HAIKU)) + +#endif // GTEST_HAS_STD_WSTRING + +// Determines whether RTTI is available. +#ifndef GTEST_HAS_RTTI +// The user didn't tell us whether RTTI is enabled, so we need to +// figure it out. + +# ifdef _MSC_VER + +#ifdef _CPPRTTI // MSVC defines this macro if and only if RTTI is enabled. +# define GTEST_HAS_RTTI 1 +# else +# define GTEST_HAS_RTTI 0 +# endif + +// Starting with version 4.3.2, gcc defines __GXX_RTTI if and only if RTTI is +// enabled. +# elif defined(__GNUC__) + +# ifdef __GXX_RTTI +// When building against STLport with the Android NDK and with +// -frtti -fno-exceptions, the build fails at link time with undefined +// references to __cxa_bad_typeid. Note sure if STL or toolchain bug, +// so disable RTTI when detected. +# if GTEST_OS_LINUX_ANDROID && defined(_STLPORT_MAJOR) && \ + !defined(__EXCEPTIONS) +# define GTEST_HAS_RTTI 0 +# else +# define GTEST_HAS_RTTI 1 +# endif // GTEST_OS_LINUX_ANDROID && __STLPORT_MAJOR && !__EXCEPTIONS +# else +# define GTEST_HAS_RTTI 0 +# endif // __GXX_RTTI + +// Clang defines __GXX_RTTI starting with version 3.0, but its manual recommends +// using has_feature instead. has_feature(cxx_rtti) is supported since 2.7, the +// first version with C++ support. +# elif defined(__clang__) + +# define GTEST_HAS_RTTI __has_feature(cxx_rtti) + +// Starting with version 9.0 IBM Visual Age defines __RTTI_ALL__ to 1 if +// both the typeid and dynamic_cast features are present. +# elif defined(__IBMCPP__) && (__IBMCPP__ >= 900) + +# ifdef __RTTI_ALL__ +# define GTEST_HAS_RTTI 1 +# else +# define GTEST_HAS_RTTI 0 +# endif + +# else + +// For all other compilers, we assume RTTI is enabled. +# define GTEST_HAS_RTTI 1 + +# endif // _MSC_VER + +#endif // GTEST_HAS_RTTI + +// It's this header's responsibility to #include when RTTI +// is enabled. +#if GTEST_HAS_RTTI +# include +#endif + +// Determines whether Google Test can use the pthreads library. +#ifndef GTEST_HAS_PTHREAD +// The user didn't tell us explicitly, so we make reasonable assumptions about +// which platforms have pthreads support. +// +// To disable threading support in Google Test, add -DGTEST_HAS_PTHREAD=0 +// to your compiler flags. +#define GTEST_HAS_PTHREAD \ + (GTEST_OS_LINUX || GTEST_OS_MAC || GTEST_OS_HPUX || GTEST_OS_QNX || \ + GTEST_OS_FREEBSD || GTEST_OS_NACL || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA || \ + GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_OPENBSD || \ + GTEST_OS_HAIKU) +#endif // GTEST_HAS_PTHREAD + +#if GTEST_HAS_PTHREAD +// gtest-port.h guarantees to #include when GTEST_HAS_PTHREAD is +// true. +# include // NOLINT + +// For timespec and nanosleep, used below. +# include // NOLINT +#endif + +// Determines whether clone(2) is supported. +// Usually it will only be available on Linux, excluding +// Linux on the Itanium architecture. +// Also see http://linux.die.net/man/2/clone. +#ifndef GTEST_HAS_CLONE +// The user didn't tell us, so we need to figure it out. + +# if GTEST_OS_LINUX && !defined(__ia64__) +# if GTEST_OS_LINUX_ANDROID +// On Android, clone() became available at different API levels for each 32-bit +// architecture. +# if defined(__LP64__) || \ + (defined(__arm__) && __ANDROID_API__ >= 9) || \ + (defined(__mips__) && __ANDROID_API__ >= 12) || \ + (defined(__i386__) && __ANDROID_API__ >= 17) +# define GTEST_HAS_CLONE 1 +# else +# define GTEST_HAS_CLONE 0 +# endif +# else +# define GTEST_HAS_CLONE 1 +# endif +# else +# define GTEST_HAS_CLONE 0 +# endif // GTEST_OS_LINUX && !defined(__ia64__) + +#endif // GTEST_HAS_CLONE + +// Determines whether to support stream redirection. This is used to test +// output correctness and to implement death tests. +#ifndef GTEST_HAS_STREAM_REDIRECTION +// By default, we assume that stream redirection is supported on all +// platforms except known mobile ones. +# if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT +# define GTEST_HAS_STREAM_REDIRECTION 0 +# else +# define GTEST_HAS_STREAM_REDIRECTION 1 +# endif // !GTEST_OS_WINDOWS_MOBILE +#endif // GTEST_HAS_STREAM_REDIRECTION + +// Determines whether to support death tests. +// pops up a dialog window that cannot be suppressed programmatically. +#if (GTEST_OS_LINUX || GTEST_OS_CYGWIN || GTEST_OS_SOLARIS || \ + (GTEST_OS_MAC && !GTEST_OS_IOS) || \ + (GTEST_OS_WINDOWS_DESKTOP && _MSC_VER) || GTEST_OS_WINDOWS_MINGW || \ + GTEST_OS_AIX || GTEST_OS_HPUX || GTEST_OS_OPENBSD || GTEST_OS_QNX || \ + GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_FUCHSIA || \ + GTEST_OS_DRAGONFLY || GTEST_OS_GNU_KFREEBSD || GTEST_OS_HAIKU) +# define GTEST_HAS_DEATH_TEST 1 +#endif + +// Determines whether to support type-driven tests. + +// Typed tests need and variadic macros, which GCC, VC++ 8.0, +// Sun Pro CC, IBM Visual Age, and HP aCC support. +#if defined(__GNUC__) || defined(_MSC_VER) || defined(__SUNPRO_CC) || \ + defined(__IBMCPP__) || defined(__HP_aCC) +# define GTEST_HAS_TYPED_TEST 1 +# define GTEST_HAS_TYPED_TEST_P 1 +#endif + +// Determines whether the system compiler uses UTF-16 for encoding wide strings. +#define GTEST_WIDE_STRING_USES_UTF16_ \ + (GTEST_OS_WINDOWS || GTEST_OS_CYGWIN || GTEST_OS_AIX || GTEST_OS_OS2) + +// Determines whether test results can be streamed to a socket. +#if GTEST_OS_LINUX || GTEST_OS_GNU_KFREEBSD || GTEST_OS_DRAGONFLY || \ + GTEST_OS_FREEBSD || GTEST_OS_NETBSD || GTEST_OS_OPENBSD +# define GTEST_CAN_STREAM_RESULTS_ 1 +#endif + +// Defines some utility macros. + +// The GNU compiler emits a warning if nested "if" statements are followed by +// an "else" statement and braces are not used to explicitly disambiguate the +// "else" binding. This leads to problems with code like: +// +// if (gate) +// ASSERT_*(condition) << "Some message"; +// +// The "switch (0) case 0:" idiom is used to suppress this. +#ifdef __INTEL_COMPILER +# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ +#else +# define GTEST_AMBIGUOUS_ELSE_BLOCKER_ switch (0) case 0: default: // NOLINT +#endif + +// Use this annotation at the end of a struct/class definition to +// prevent the compiler from optimizing away instances that are never +// used. This is useful when all interesting logic happens inside the +// c'tor and / or d'tor. Example: +// +// struct Foo { +// Foo() { ... } +// } GTEST_ATTRIBUTE_UNUSED_; +// +// Also use it after a variable or parameter declaration to tell the +// compiler the variable/parameter does not have to be used. +#if defined(__GNUC__) && !defined(COMPILER_ICC) +# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused)) +#elif defined(__clang__) +# if __has_attribute(unused) +# define GTEST_ATTRIBUTE_UNUSED_ __attribute__ ((unused)) +# endif +#endif +#ifndef GTEST_ATTRIBUTE_UNUSED_ +# define GTEST_ATTRIBUTE_UNUSED_ +#endif + +// Use this annotation before a function that takes a printf format string. +#if (defined(__GNUC__) || defined(__clang__)) && !defined(COMPILER_ICC) +# if defined(__MINGW_PRINTF_FORMAT) +// MinGW has two different printf implementations. Ensure the format macro +// matches the selected implementation. See +// https://sourceforge.net/p/mingw-w64/wiki2/gnu%20printf/. +# define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \ + __attribute__((__format__(__MINGW_PRINTF_FORMAT, string_index, \ + first_to_check))) +# else +# define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \ + __attribute__((__format__(__printf__, string_index, first_to_check))) +# endif +#else +# define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) +#endif + + +// A macro to disallow operator= +// This should be used in the private: declarations for a class. +#define GTEST_DISALLOW_ASSIGN_(type) \ + void operator=(type const &) = delete + +// A macro to disallow copy constructor and operator= +// This should be used in the private: declarations for a class. +#define GTEST_DISALLOW_COPY_AND_ASSIGN_(type) \ + type(type const &) = delete; \ + GTEST_DISALLOW_ASSIGN_(type) + +// Tell the compiler to warn about unused return values for functions declared +// with this macro. The macro should be used on function declarations +// following the argument list: +// +// Sprocket* AllocateSprocket() GTEST_MUST_USE_RESULT_; +#if defined(__GNUC__) && !defined(COMPILER_ICC) +# define GTEST_MUST_USE_RESULT_ __attribute__ ((warn_unused_result)) +#else +# define GTEST_MUST_USE_RESULT_ +#endif // __GNUC__ && !COMPILER_ICC + +// MS C++ compiler emits warning when a conditional expression is compile time +// constant. In some contexts this warning is false positive and needs to be +// suppressed. Use the following two macros in such cases: +// +// GTEST_INTENTIONAL_CONST_COND_PUSH_() +// while (true) { +// GTEST_INTENTIONAL_CONST_COND_POP_() +// } +# define GTEST_INTENTIONAL_CONST_COND_PUSH_() \ + GTEST_DISABLE_MSC_WARNINGS_PUSH_(4127) +# define GTEST_INTENTIONAL_CONST_COND_POP_() \ + GTEST_DISABLE_MSC_WARNINGS_POP_() + +// Determine whether the compiler supports Microsoft's Structured Exception +// Handling. This is supported by several Windows compilers but generally +// does not exist on any other system. +#ifndef GTEST_HAS_SEH +// The user didn't tell us, so we need to figure it out. + +# if defined(_MSC_VER) || defined(__BORLANDC__) +// These two compilers are known to support SEH. +# define GTEST_HAS_SEH 1 +# else +// Assume no SEH. +# define GTEST_HAS_SEH 0 +# endif + +#endif // GTEST_HAS_SEH + +#ifndef GTEST_IS_THREADSAFE + +#define GTEST_IS_THREADSAFE \ + (GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ || \ + (GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT) || \ + GTEST_HAS_PTHREAD) + +#endif // GTEST_IS_THREADSAFE + +// GTEST_API_ qualifies all symbols that must be exported. The definitions below +// are guarded by #ifndef to give embedders a chance to define GTEST_API_ in +// gtest/internal/custom/gtest-port.h +#ifndef GTEST_API_ + +#ifdef _MSC_VER +# if GTEST_LINKED_AS_SHARED_LIBRARY +# define GTEST_API_ __declspec(dllimport) +# elif GTEST_CREATE_SHARED_LIBRARY +# define GTEST_API_ __declspec(dllexport) +# endif +#elif __GNUC__ >= 4 || defined(__clang__) +# define GTEST_API_ __attribute__((visibility ("default"))) +#endif // _MSC_VER + +#endif // GTEST_API_ + +#ifndef GTEST_API_ +# define GTEST_API_ +#endif // GTEST_API_ + +#ifndef GTEST_DEFAULT_DEATH_TEST_STYLE +# define GTEST_DEFAULT_DEATH_TEST_STYLE "fast" +#endif // GTEST_DEFAULT_DEATH_TEST_STYLE + +#ifdef __GNUC__ +// Ask the compiler to never inline a given function. +# define GTEST_NO_INLINE_ __attribute__((noinline)) +#else +# define GTEST_NO_INLINE_ +#endif + +// _LIBCPP_VERSION is defined by the libc++ library from the LLVM project. +#if !defined(GTEST_HAS_CXXABI_H_) +# if defined(__GLIBCXX__) || (defined(_LIBCPP_VERSION) && !defined(_MSC_VER)) +# define GTEST_HAS_CXXABI_H_ 1 +# else +# define GTEST_HAS_CXXABI_H_ 0 +# endif +#endif + +// A function level attribute to disable checking for use of uninitialized +// memory when built with MemorySanitizer. +#if defined(__clang__) +# if __has_feature(memory_sanitizer) +# define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ \ + __attribute__((no_sanitize_memory)) +# else +# define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ +# endif // __has_feature(memory_sanitizer) +#else +# define GTEST_ATTRIBUTE_NO_SANITIZE_MEMORY_ +#endif // __clang__ + +// A function level attribute to disable AddressSanitizer instrumentation. +#if defined(__clang__) +# if __has_feature(address_sanitizer) +# define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ \ + __attribute__((no_sanitize_address)) +# else +# define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ +# endif // __has_feature(address_sanitizer) +#else +# define GTEST_ATTRIBUTE_NO_SANITIZE_ADDRESS_ +#endif // __clang__ + +// A function level attribute to disable HWAddressSanitizer instrumentation. +#if defined(__clang__) +# if __has_feature(hwaddress_sanitizer) +# define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ \ + __attribute__((no_sanitize("hwaddress"))) +# else +# define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ +# endif // __has_feature(hwaddress_sanitizer) +#else +# define GTEST_ATTRIBUTE_NO_SANITIZE_HWADDRESS_ +#endif // __clang__ + +// A function level attribute to disable ThreadSanitizer instrumentation. +#if defined(__clang__) +# if __has_feature(thread_sanitizer) +# define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ \ + __attribute__((no_sanitize_thread)) +# else +# define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ +# endif // __has_feature(thread_sanitizer) +#else +# define GTEST_ATTRIBUTE_NO_SANITIZE_THREAD_ +#endif // __clang__ + +namespace testing { + +class Message; + +// Legacy imports for backwards compatibility. +// New code should use std:: names directly. +using std::get; +using std::make_tuple; +using std::tuple; +using std::tuple_element; +using std::tuple_size; + +namespace internal { + +// A secret type that Google Test users don't know about. It has no +// definition on purpose. Therefore it's impossible to create a +// Secret object, which is what we want. +class Secret; + +// The GTEST_COMPILE_ASSERT_ is a legacy macro used to verify that a compile +// time expression is true (in new code, use static_assert instead). For +// example, you could use it to verify the size of a static array: +// +// GTEST_COMPILE_ASSERT_(GTEST_ARRAY_SIZE_(names) == NUM_NAMES, +// names_incorrect_size); +// +// The second argument to the macro must be a valid C++ identifier. If the +// expression is false, compiler will issue an error containing this identifier. +#define GTEST_COMPILE_ASSERT_(expr, msg) static_assert(expr, #msg) + +// Evaluates to the number of elements in 'array'. +#define GTEST_ARRAY_SIZE_(array) (sizeof(array) / sizeof(array[0])) + +// A helper for suppressing warnings on constant condition. It just +// returns 'condition'. +GTEST_API_ bool IsTrue(bool condition); + +// Defines RE. + +#if GTEST_USES_PCRE +// if used, PCRE is injected by custom/gtest-port.h +#elif GTEST_USES_POSIX_RE || GTEST_USES_SIMPLE_RE + +// A simple C++ wrapper for . It uses the POSIX Extended +// Regular Expression syntax. +class GTEST_API_ RE { + public: + // A copy constructor is required by the Standard to initialize object + // references from r-values. + RE(const RE& other) { Init(other.pattern()); } + + // Constructs an RE from a string. + RE(const ::std::string& regex) { Init(regex.c_str()); } // NOLINT + + RE(const char* regex) { Init(regex); } // NOLINT + ~RE(); + + // Returns the string representation of the regex. + const char* pattern() const { return pattern_; } + + // FullMatch(str, re) returns true if and only if regular expression re + // matches the entire str. + // PartialMatch(str, re) returns true if and only if regular expression re + // matches a substring of str (including str itself). + static bool FullMatch(const ::std::string& str, const RE& re) { + return FullMatch(str.c_str(), re); + } + static bool PartialMatch(const ::std::string& str, const RE& re) { + return PartialMatch(str.c_str(), re); + } + + static bool FullMatch(const char* str, const RE& re); + static bool PartialMatch(const char* str, const RE& re); + + private: + void Init(const char* regex); + const char* pattern_; + bool is_valid_; + +# if GTEST_USES_POSIX_RE + + regex_t full_regex_; // For FullMatch(). + regex_t partial_regex_; // For PartialMatch(). + +# else // GTEST_USES_SIMPLE_RE + + const char* full_pattern_; // For FullMatch(); + +# endif + + GTEST_DISALLOW_ASSIGN_(RE); +}; + +#endif // GTEST_USES_PCRE + +// Formats a source file path and a line number as they would appear +// in an error message from the compiler used to compile this code. +GTEST_API_ ::std::string FormatFileLocation(const char* file, int line); + +// Formats a file location for compiler-independent XML output. +// Although this function is not platform dependent, we put it next to +// FormatFileLocation in order to contrast the two functions. +GTEST_API_ ::std::string FormatCompilerIndependentFileLocation(const char* file, + int line); + +// Defines logging utilities: +// GTEST_LOG_(severity) - logs messages at the specified severity level. The +// message itself is streamed into the macro. +// LogToStderr() - directs all log messages to stderr. +// FlushInfoLog() - flushes informational log messages. + +enum GTestLogSeverity { + GTEST_INFO, + GTEST_WARNING, + GTEST_ERROR, + GTEST_FATAL +}; + +// Formats log entry severity, provides a stream object for streaming the +// log message, and terminates the message with a newline when going out of +// scope. +class GTEST_API_ GTestLog { + public: + GTestLog(GTestLogSeverity severity, const char* file, int line); + + // Flushes the buffers and, if severity is GTEST_FATAL, aborts the program. + ~GTestLog(); + + ::std::ostream& GetStream() { return ::std::cerr; } + + private: + const GTestLogSeverity severity_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestLog); +}; + +#if !defined(GTEST_LOG_) + +# define GTEST_LOG_(severity) \ + ::testing::internal::GTestLog(::testing::internal::GTEST_##severity, \ + __FILE__, __LINE__).GetStream() + +inline void LogToStderr() {} +inline void FlushInfoLog() { fflush(nullptr); } + +#endif // !defined(GTEST_LOG_) + +#if !defined(GTEST_CHECK_) +// INTERNAL IMPLEMENTATION - DO NOT USE. +// +// GTEST_CHECK_ is an all-mode assert. It aborts the program if the condition +// is not satisfied. +// Synopsys: +// GTEST_CHECK_(boolean_condition); +// or +// GTEST_CHECK_(boolean_condition) << "Additional message"; +// +// This checks the condition and if the condition is not satisfied +// it prints message about the condition violation, including the +// condition itself, plus additional message streamed into it, if any, +// and then it aborts the program. It aborts the program irrespective of +// whether it is built in the debug mode or not. +# define GTEST_CHECK_(condition) \ + GTEST_AMBIGUOUS_ELSE_BLOCKER_ \ + if (::testing::internal::IsTrue(condition)) \ + ; \ + else \ + GTEST_LOG_(FATAL) << "Condition " #condition " failed. " +#endif // !defined(GTEST_CHECK_) + +// An all-mode assert to verify that the given POSIX-style function +// call returns 0 (indicating success). Known limitation: this +// doesn't expand to a balanced 'if' statement, so enclose the macro +// in {} if you need to use it as the only statement in an 'if' +// branch. +#define GTEST_CHECK_POSIX_SUCCESS_(posix_call) \ + if (const int gtest_error = (posix_call)) \ + GTEST_LOG_(FATAL) << #posix_call << "failed with error " \ + << gtest_error + +// Transforms "T" into "const T&" according to standard reference collapsing +// rules (this is only needed as a backport for C++98 compilers that do not +// support reference collapsing). Specifically, it transforms: +// +// char ==> const char& +// const char ==> const char& +// char& ==> char& +// const char& ==> const char& +// +// Note that the non-const reference will not have "const" added. This is +// standard, and necessary so that "T" can always bind to "const T&". +template +struct ConstRef { typedef const T& type; }; +template +struct ConstRef { typedef T& type; }; + +// The argument T must depend on some template parameters. +#define GTEST_REFERENCE_TO_CONST_(T) \ + typename ::testing::internal::ConstRef::type + +// INTERNAL IMPLEMENTATION - DO NOT USE IN USER CODE. +// +// Use ImplicitCast_ as a safe version of static_cast for upcasting in +// the type hierarchy (e.g. casting a Foo* to a SuperclassOfFoo* or a +// const Foo*). When you use ImplicitCast_, the compiler checks that +// the cast is safe. Such explicit ImplicitCast_s are necessary in +// surprisingly many situations where C++ demands an exact type match +// instead of an argument type convertable to a target type. +// +// The syntax for using ImplicitCast_ is the same as for static_cast: +// +// ImplicitCast_(expr) +// +// ImplicitCast_ would have been part of the C++ standard library, +// but the proposal was submitted too late. It will probably make +// its way into the language in the future. +// +// This relatively ugly name is intentional. It prevents clashes with +// similar functions users may have (e.g., implicit_cast). The internal +// namespace alone is not enough because the function can be found by ADL. +template +inline To ImplicitCast_(To x) { return x; } + +// When you upcast (that is, cast a pointer from type Foo to type +// SuperclassOfFoo), it's fine to use ImplicitCast_<>, since upcasts +// always succeed. When you downcast (that is, cast a pointer from +// type Foo to type SubclassOfFoo), static_cast<> isn't safe, because +// how do you know the pointer is really of type SubclassOfFoo? It +// could be a bare Foo, or of type DifferentSubclassOfFoo. Thus, +// when you downcast, you should use this macro. In debug mode, we +// use dynamic_cast<> to double-check the downcast is legal (we die +// if it's not). In normal mode, we do the efficient static_cast<> +// instead. Thus, it's important to test in debug mode to make sure +// the cast is legal! +// This is the only place in the code we should use dynamic_cast<>. +// In particular, you SHOULDN'T be using dynamic_cast<> in order to +// do RTTI (eg code like this: +// if (dynamic_cast(foo)) HandleASubclass1Object(foo); +// if (dynamic_cast(foo)) HandleASubclass2Object(foo); +// You should design the code some other way not to need this. +// +// This relatively ugly name is intentional. It prevents clashes with +// similar functions users may have (e.g., down_cast). The internal +// namespace alone is not enough because the function can be found by ADL. +template // use like this: DownCast_(foo); +inline To DownCast_(From* f) { // so we only accept pointers + // Ensures that To is a sub-type of From *. This test is here only + // for compile-time type checking, and has no overhead in an + // optimized build at run-time, as it will be optimized away + // completely. + GTEST_INTENTIONAL_CONST_COND_PUSH_() + if (false) { + GTEST_INTENTIONAL_CONST_COND_POP_() + const To to = nullptr; + ::testing::internal::ImplicitCast_(to); + } + +#if GTEST_HAS_RTTI + // RTTI: debug mode only! + GTEST_CHECK_(f == nullptr || dynamic_cast(f) != nullptr); +#endif + return static_cast(f); +} + +// Downcasts the pointer of type Base to Derived. +// Derived must be a subclass of Base. The parameter MUST +// point to a class of type Derived, not any subclass of it. +// When RTTI is available, the function performs a runtime +// check to enforce this. +template +Derived* CheckedDowncastToActualType(Base* base) { +#if GTEST_HAS_RTTI + GTEST_CHECK_(typeid(*base) == typeid(Derived)); +#endif + +#if GTEST_HAS_DOWNCAST_ + return ::down_cast(base); +#elif GTEST_HAS_RTTI + return dynamic_cast(base); // NOLINT +#else + return static_cast(base); // Poor man's downcast. +#endif +} + +#if GTEST_HAS_STREAM_REDIRECTION + +// Defines the stderr capturer: +// CaptureStdout - starts capturing stdout. +// GetCapturedStdout - stops capturing stdout and returns the captured string. +// CaptureStderr - starts capturing stderr. +// GetCapturedStderr - stops capturing stderr and returns the captured string. +// +GTEST_API_ void CaptureStdout(); +GTEST_API_ std::string GetCapturedStdout(); +GTEST_API_ void CaptureStderr(); +GTEST_API_ std::string GetCapturedStderr(); + +#endif // GTEST_HAS_STREAM_REDIRECTION +// Returns the size (in bytes) of a file. +GTEST_API_ size_t GetFileSize(FILE* file); + +// Reads the entire content of a file as a string. +GTEST_API_ std::string ReadEntireFile(FILE* file); + +// All command line arguments. +GTEST_API_ std::vector GetArgvs(); + +#if GTEST_HAS_DEATH_TEST + +std::vector GetInjectableArgvs(); +// Deprecated: pass the args vector by value instead. +void SetInjectableArgvs(const std::vector* new_argvs); +void SetInjectableArgvs(const std::vector& new_argvs); +void ClearInjectableArgvs(); + +#endif // GTEST_HAS_DEATH_TEST + +// Defines synchronization primitives. +#if GTEST_IS_THREADSAFE +# if GTEST_HAS_PTHREAD +// Sleeps for (roughly) n milliseconds. This function is only for testing +// Google Test's own constructs. Don't use it in user tests, either +// directly or indirectly. +inline void SleepMilliseconds(int n) { + const timespec time = { + 0, // 0 seconds. + n * 1000L * 1000L, // And n ms. + }; + nanosleep(&time, nullptr); +} +# endif // GTEST_HAS_PTHREAD + +# if GTEST_HAS_NOTIFICATION_ +// Notification has already been imported into the namespace. +// Nothing to do here. + +# elif GTEST_HAS_PTHREAD +// Allows a controller thread to pause execution of newly created +// threads until notified. Instances of this class must be created +// and destroyed in the controller thread. +// +// This class is only for testing Google Test's own constructs. Do not +// use it in user tests, either directly or indirectly. +class Notification { + public: + Notification() : notified_(false) { + GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, nullptr)); + } + ~Notification() { + pthread_mutex_destroy(&mutex_); + } + + // Notifies all threads created with this notification to start. Must + // be called from the controller thread. + void Notify() { + pthread_mutex_lock(&mutex_); + notified_ = true; + pthread_mutex_unlock(&mutex_); + } + + // Blocks until the controller thread notifies. Must be called from a test + // thread. + void WaitForNotification() { + for (;;) { + pthread_mutex_lock(&mutex_); + const bool notified = notified_; + pthread_mutex_unlock(&mutex_); + if (notified) + break; + SleepMilliseconds(10); + } + } + + private: + pthread_mutex_t mutex_; + bool notified_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification); +}; + +# elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT + +GTEST_API_ void SleepMilliseconds(int n); + +// Provides leak-safe Windows kernel handle ownership. +// Used in death tests and in threading support. +class GTEST_API_ AutoHandle { + public: + // Assume that Win32 HANDLE type is equivalent to void*. Doing so allows us to + // avoid including in this header file. Including is + // undesirable because it defines a lot of symbols and macros that tend to + // conflict with client code. This assumption is verified by + // WindowsTypesTest.HANDLEIsVoidStar. + typedef void* Handle; + AutoHandle(); + explicit AutoHandle(Handle handle); + + ~AutoHandle(); + + Handle Get() const; + void Reset(); + void Reset(Handle handle); + + private: + // Returns true if and only if the handle is a valid handle object that can be + // closed. + bool IsCloseable() const; + + Handle handle_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(AutoHandle); +}; + +// Allows a controller thread to pause execution of newly created +// threads until notified. Instances of this class must be created +// and destroyed in the controller thread. +// +// This class is only for testing Google Test's own constructs. Do not +// use it in user tests, either directly or indirectly. +class GTEST_API_ Notification { + public: + Notification(); + void Notify(); + void WaitForNotification(); + + private: + AutoHandle event_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(Notification); +}; +# endif // GTEST_HAS_NOTIFICATION_ + +// On MinGW, we can have both GTEST_OS_WINDOWS and GTEST_HAS_PTHREAD +// defined, but we don't want to use MinGW's pthreads implementation, which +// has conformance problems with some versions of the POSIX standard. +# if GTEST_HAS_PTHREAD && !GTEST_OS_WINDOWS_MINGW + +// As a C-function, ThreadFuncWithCLinkage cannot be templated itself. +// Consequently, it cannot select a correct instantiation of ThreadWithParam +// in order to call its Run(). Introducing ThreadWithParamBase as a +// non-templated base class for ThreadWithParam allows us to bypass this +// problem. +class ThreadWithParamBase { + public: + virtual ~ThreadWithParamBase() {} + virtual void Run() = 0; +}; + +// pthread_create() accepts a pointer to a function type with the C linkage. +// According to the Standard (7.5/1), function types with different linkages +// are different even if they are otherwise identical. Some compilers (for +// example, SunStudio) treat them as different types. Since class methods +// cannot be defined with C-linkage we need to define a free C-function to +// pass into pthread_create(). +extern "C" inline void* ThreadFuncWithCLinkage(void* thread) { + static_cast(thread)->Run(); + return nullptr; +} + +// Helper class for testing Google Test's multi-threading constructs. +// To use it, write: +// +// void ThreadFunc(int param) { /* Do things with param */ } +// Notification thread_can_start; +// ... +// // The thread_can_start parameter is optional; you can supply NULL. +// ThreadWithParam thread(&ThreadFunc, 5, &thread_can_start); +// thread_can_start.Notify(); +// +// These classes are only for testing Google Test's own constructs. Do +// not use them in user tests, either directly or indirectly. +template +class ThreadWithParam : public ThreadWithParamBase { + public: + typedef void UserThreadFunc(T); + + ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start) + : func_(func), + param_(param), + thread_can_start_(thread_can_start), + finished_(false) { + ThreadWithParamBase* const base = this; + // The thread can be created only after all fields except thread_ + // have been initialized. + GTEST_CHECK_POSIX_SUCCESS_( + pthread_create(&thread_, nullptr, &ThreadFuncWithCLinkage, base)); + } + ~ThreadWithParam() override { Join(); } + + void Join() { + if (!finished_) { + GTEST_CHECK_POSIX_SUCCESS_(pthread_join(thread_, nullptr)); + finished_ = true; + } + } + + void Run() override { + if (thread_can_start_ != nullptr) thread_can_start_->WaitForNotification(); + func_(param_); + } + + private: + UserThreadFunc* const func_; // User-supplied thread function. + const T param_; // User-supplied parameter to the thread function. + // When non-NULL, used to block execution until the controller thread + // notifies. + Notification* const thread_can_start_; + bool finished_; // true if and only if we know that the thread function has + // finished. + pthread_t thread_; // The native thread object. + + GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam); +}; +# endif // !GTEST_OS_WINDOWS && GTEST_HAS_PTHREAD || + // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ + +# if GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ +// Mutex and ThreadLocal have already been imported into the namespace. +// Nothing to do here. + +# elif GTEST_OS_WINDOWS && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT + +// Mutex implements mutex on Windows platforms. It is used in conjunction +// with class MutexLock: +// +// Mutex mutex; +// ... +// MutexLock lock(&mutex); // Acquires the mutex and releases it at the +// // end of the current scope. +// +// A static Mutex *must* be defined or declared using one of the following +// macros: +// GTEST_DEFINE_STATIC_MUTEX_(g_some_mutex); +// GTEST_DECLARE_STATIC_MUTEX_(g_some_mutex); +// +// (A non-static Mutex is defined/declared in the usual way). +class GTEST_API_ Mutex { + public: + enum MutexType { kStatic = 0, kDynamic = 1 }; + // We rely on kStaticMutex being 0 as it is to what the linker initializes + // type_ in static mutexes. critical_section_ will be initialized lazily + // in ThreadSafeLazyInit(). + enum StaticConstructorSelector { kStaticMutex = 0 }; + + // This constructor intentionally does nothing. It relies on type_ being + // statically initialized to 0 (effectively setting it to kStatic) and on + // ThreadSafeLazyInit() to lazily initialize the rest of the members. + explicit Mutex(StaticConstructorSelector /*dummy*/) {} + + Mutex(); + ~Mutex(); + + void Lock(); + + void Unlock(); + + // Does nothing if the current thread holds the mutex. Otherwise, crashes + // with high probability. + void AssertHeld(); + + private: + // Initializes owner_thread_id_ and critical_section_ in static mutexes. + void ThreadSafeLazyInit(); + + // Per https://blogs.msdn.microsoft.com/oldnewthing/20040223-00/?p=40503, + // we assume that 0 is an invalid value for thread IDs. + unsigned int owner_thread_id_; + + // For static mutexes, we rely on these members being initialized to zeros + // by the linker. + MutexType type_; + long critical_section_init_phase_; // NOLINT + GTEST_CRITICAL_SECTION* critical_section_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex); +}; + +# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ + extern ::testing::internal::Mutex mutex + +# define GTEST_DEFINE_STATIC_MUTEX_(mutex) \ + ::testing::internal::Mutex mutex(::testing::internal::Mutex::kStaticMutex) + +// We cannot name this class MutexLock because the ctor declaration would +// conflict with a macro named MutexLock, which is defined on some +// platforms. That macro is used as a defensive measure to prevent against +// inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than +// "MutexLock l(&mu)". Hence the typedef trick below. +class GTestMutexLock { + public: + explicit GTestMutexLock(Mutex* mutex) + : mutex_(mutex) { mutex_->Lock(); } + + ~GTestMutexLock() { mutex_->Unlock(); } + + private: + Mutex* const mutex_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock); +}; + +typedef GTestMutexLock MutexLock; + +// Base class for ValueHolder. Allows a caller to hold and delete a value +// without knowing its type. +class ThreadLocalValueHolderBase { + public: + virtual ~ThreadLocalValueHolderBase() {} +}; + +// Provides a way for a thread to send notifications to a ThreadLocal +// regardless of its parameter type. +class ThreadLocalBase { + public: + // Creates a new ValueHolder object holding a default value passed to + // this ThreadLocal's constructor and returns it. It is the caller's + // responsibility not to call this when the ThreadLocal instance already + // has a value on the current thread. + virtual ThreadLocalValueHolderBase* NewValueForCurrentThread() const = 0; + + protected: + ThreadLocalBase() {} + virtual ~ThreadLocalBase() {} + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocalBase); +}; + +// Maps a thread to a set of ThreadLocals that have values instantiated on that +// thread and notifies them when the thread exits. A ThreadLocal instance is +// expected to persist until all threads it has values on have terminated. +class GTEST_API_ ThreadLocalRegistry { + public: + // Registers thread_local_instance as having value on the current thread. + // Returns a value that can be used to identify the thread from other threads. + static ThreadLocalValueHolderBase* GetValueOnCurrentThread( + const ThreadLocalBase* thread_local_instance); + + // Invoked when a ThreadLocal instance is destroyed. + static void OnThreadLocalDestroyed( + const ThreadLocalBase* thread_local_instance); +}; + +class GTEST_API_ ThreadWithParamBase { + public: + void Join(); + + protected: + class Runnable { + public: + virtual ~Runnable() {} + virtual void Run() = 0; + }; + + ThreadWithParamBase(Runnable *runnable, Notification* thread_can_start); + virtual ~ThreadWithParamBase(); + + private: + AutoHandle thread_; +}; + +// Helper class for testing Google Test's multi-threading constructs. +template +class ThreadWithParam : public ThreadWithParamBase { + public: + typedef void UserThreadFunc(T); + + ThreadWithParam(UserThreadFunc* func, T param, Notification* thread_can_start) + : ThreadWithParamBase(new RunnableImpl(func, param), thread_can_start) { + } + virtual ~ThreadWithParam() {} + + private: + class RunnableImpl : public Runnable { + public: + RunnableImpl(UserThreadFunc* func, T param) + : func_(func), + param_(param) { + } + virtual ~RunnableImpl() {} + virtual void Run() { + func_(param_); + } + + private: + UserThreadFunc* const func_; + const T param_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(RunnableImpl); + }; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadWithParam); +}; + +// Implements thread-local storage on Windows systems. +// +// // Thread 1 +// ThreadLocal tl(100); // 100 is the default value for each thread. +// +// // Thread 2 +// tl.set(150); // Changes the value for thread 2 only. +// EXPECT_EQ(150, tl.get()); +// +// // Thread 1 +// EXPECT_EQ(100, tl.get()); // In thread 1, tl has the original value. +// tl.set(200); +// EXPECT_EQ(200, tl.get()); +// +// The template type argument T must have a public copy constructor. +// In addition, the default ThreadLocal constructor requires T to have +// a public default constructor. +// +// The users of a TheadLocal instance have to make sure that all but one +// threads (including the main one) using that instance have exited before +// destroying it. Otherwise, the per-thread objects managed for them by the +// ThreadLocal instance are not guaranteed to be destroyed on all platforms. +// +// Google Test only uses global ThreadLocal objects. That means they +// will die after main() has returned. Therefore, no per-thread +// object managed by Google Test will be leaked as long as all threads +// using Google Test have exited when main() returns. +template +class ThreadLocal : public ThreadLocalBase { + public: + ThreadLocal() : default_factory_(new DefaultValueHolderFactory()) {} + explicit ThreadLocal(const T& value) + : default_factory_(new InstanceValueHolderFactory(value)) {} + + ~ThreadLocal() { ThreadLocalRegistry::OnThreadLocalDestroyed(this); } + + T* pointer() { return GetOrCreateValue(); } + const T* pointer() const { return GetOrCreateValue(); } + const T& get() const { return *pointer(); } + void set(const T& value) { *pointer() = value; } + + private: + // Holds a value of T. Can be deleted via its base class without the caller + // knowing the type of T. + class ValueHolder : public ThreadLocalValueHolderBase { + public: + ValueHolder() : value_() {} + explicit ValueHolder(const T& value) : value_(value) {} + + T* pointer() { return &value_; } + + private: + T value_; + GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder); + }; + + + T* GetOrCreateValue() const { + return static_cast( + ThreadLocalRegistry::GetValueOnCurrentThread(this))->pointer(); + } + + virtual ThreadLocalValueHolderBase* NewValueForCurrentThread() const { + return default_factory_->MakeNewHolder(); + } + + class ValueHolderFactory { + public: + ValueHolderFactory() {} + virtual ~ValueHolderFactory() {} + virtual ValueHolder* MakeNewHolder() const = 0; + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory); + }; + + class DefaultValueHolderFactory : public ValueHolderFactory { + public: + DefaultValueHolderFactory() {} + virtual ValueHolder* MakeNewHolder() const { return new ValueHolder(); } + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory); + }; + + class InstanceValueHolderFactory : public ValueHolderFactory { + public: + explicit InstanceValueHolderFactory(const T& value) : value_(value) {} + virtual ValueHolder* MakeNewHolder() const { + return new ValueHolder(value_); + } + + private: + const T value_; // The value for each thread. + + GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory); + }; + + std::unique_ptr default_factory_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal); +}; + +# elif GTEST_HAS_PTHREAD + +// MutexBase and Mutex implement mutex on pthreads-based platforms. +class MutexBase { + public: + // Acquires this mutex. + void Lock() { + GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_lock(&mutex_)); + owner_ = pthread_self(); + has_owner_ = true; + } + + // Releases this mutex. + void Unlock() { + // Since the lock is being released the owner_ field should no longer be + // considered valid. We don't protect writing to has_owner_ here, as it's + // the caller's responsibility to ensure that the current thread holds the + // mutex when this is called. + has_owner_ = false; + GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_unlock(&mutex_)); + } + + // Does nothing if the current thread holds the mutex. Otherwise, crashes + // with high probability. + void AssertHeld() const { + GTEST_CHECK_(has_owner_ && pthread_equal(owner_, pthread_self())) + << "The current thread is not holding the mutex @" << this; + } + + // A static mutex may be used before main() is entered. It may even + // be used before the dynamic initialization stage. Therefore we + // must be able to initialize a static mutex object at link time. + // This means MutexBase has to be a POD and its member variables + // have to be public. + public: + pthread_mutex_t mutex_; // The underlying pthread mutex. + // has_owner_ indicates whether the owner_ field below contains a valid thread + // ID and is therefore safe to inspect (e.g., to use in pthread_equal()). All + // accesses to the owner_ field should be protected by a check of this field. + // An alternative might be to memset() owner_ to all zeros, but there's no + // guarantee that a zero'd pthread_t is necessarily invalid or even different + // from pthread_self(). + bool has_owner_; + pthread_t owner_; // The thread holding the mutex. +}; + +// Forward-declares a static mutex. +# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ + extern ::testing::internal::MutexBase mutex + +// Defines and statically (i.e. at link time) initializes a static mutex. +// The initialization list here does not explicitly initialize each field, +// instead relying on default initialization for the unspecified fields. In +// particular, the owner_ field (a pthread_t) is not explicitly initialized. +// This allows initialization to work whether pthread_t is a scalar or struct. +// The flag -Wmissing-field-initializers must not be specified for this to work. +#define GTEST_DEFINE_STATIC_MUTEX_(mutex) \ + ::testing::internal::MutexBase mutex = {PTHREAD_MUTEX_INITIALIZER, false, 0} + +// The Mutex class can only be used for mutexes created at runtime. It +// shares its API with MutexBase otherwise. +class Mutex : public MutexBase { + public: + Mutex() { + GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_init(&mutex_, nullptr)); + has_owner_ = false; + } + ~Mutex() { + GTEST_CHECK_POSIX_SUCCESS_(pthread_mutex_destroy(&mutex_)); + } + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(Mutex); +}; + +// We cannot name this class MutexLock because the ctor declaration would +// conflict with a macro named MutexLock, which is defined on some +// platforms. That macro is used as a defensive measure to prevent against +// inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than +// "MutexLock l(&mu)". Hence the typedef trick below. +class GTestMutexLock { + public: + explicit GTestMutexLock(MutexBase* mutex) + : mutex_(mutex) { mutex_->Lock(); } + + ~GTestMutexLock() { mutex_->Unlock(); } + + private: + MutexBase* const mutex_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(GTestMutexLock); +}; + +typedef GTestMutexLock MutexLock; + +// Helpers for ThreadLocal. + +// pthread_key_create() requires DeleteThreadLocalValue() to have +// C-linkage. Therefore it cannot be templatized to access +// ThreadLocal. Hence the need for class +// ThreadLocalValueHolderBase. +class ThreadLocalValueHolderBase { + public: + virtual ~ThreadLocalValueHolderBase() {} +}; + +// Called by pthread to delete thread-local data stored by +// pthread_setspecific(). +extern "C" inline void DeleteThreadLocalValue(void* value_holder) { + delete static_cast(value_holder); +} + +// Implements thread-local storage on pthreads-based systems. +template +class GTEST_API_ ThreadLocal { + public: + ThreadLocal() + : key_(CreateKey()), default_factory_(new DefaultValueHolderFactory()) {} + explicit ThreadLocal(const T& value) + : key_(CreateKey()), + default_factory_(new InstanceValueHolderFactory(value)) {} + + ~ThreadLocal() { + // Destroys the managed object for the current thread, if any. + DeleteThreadLocalValue(pthread_getspecific(key_)); + + // Releases resources associated with the key. This will *not* + // delete managed objects for other threads. + GTEST_CHECK_POSIX_SUCCESS_(pthread_key_delete(key_)); + } + + T* pointer() { return GetOrCreateValue(); } + const T* pointer() const { return GetOrCreateValue(); } + const T& get() const { return *pointer(); } + void set(const T& value) { *pointer() = value; } + + private: + // Holds a value of type T. + class ValueHolder : public ThreadLocalValueHolderBase { + public: + ValueHolder() : value_() {} + explicit ValueHolder(const T& value) : value_(value) {} + + T* pointer() { return &value_; } + + private: + T value_; + GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolder); + }; + + static pthread_key_t CreateKey() { + pthread_key_t key; + // When a thread exits, DeleteThreadLocalValue() will be called on + // the object managed for that thread. + GTEST_CHECK_POSIX_SUCCESS_( + pthread_key_create(&key, &DeleteThreadLocalValue)); + return key; + } + + T* GetOrCreateValue() const { + ThreadLocalValueHolderBase* const holder = + static_cast(pthread_getspecific(key_)); + if (holder != nullptr) { + return CheckedDowncastToActualType(holder)->pointer(); + } + + ValueHolder* const new_holder = default_factory_->MakeNewHolder(); + ThreadLocalValueHolderBase* const holder_base = new_holder; + GTEST_CHECK_POSIX_SUCCESS_(pthread_setspecific(key_, holder_base)); + return new_holder->pointer(); + } + + class ValueHolderFactory { + public: + ValueHolderFactory() {} + virtual ~ValueHolderFactory() {} + virtual ValueHolder* MakeNewHolder() const = 0; + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(ValueHolderFactory); + }; + + class DefaultValueHolderFactory : public ValueHolderFactory { + public: + DefaultValueHolderFactory() {} + virtual ValueHolder* MakeNewHolder() const { return new ValueHolder(); } + + private: + GTEST_DISALLOW_COPY_AND_ASSIGN_(DefaultValueHolderFactory); + }; + + class InstanceValueHolderFactory : public ValueHolderFactory { + public: + explicit InstanceValueHolderFactory(const T& value) : value_(value) {} + virtual ValueHolder* MakeNewHolder() const { + return new ValueHolder(value_); + } + + private: + const T value_; // The value for each thread. + + GTEST_DISALLOW_COPY_AND_ASSIGN_(InstanceValueHolderFactory); + }; + + // A key pthreads uses for looking up per-thread values. + const pthread_key_t key_; + std::unique_ptr default_factory_; + + GTEST_DISALLOW_COPY_AND_ASSIGN_(ThreadLocal); +}; + +# endif // GTEST_HAS_MUTEX_AND_THREAD_LOCAL_ + +#else // GTEST_IS_THREADSAFE + +// A dummy implementation of synchronization primitives (mutex, lock, +// and thread-local variable). Necessary for compiling Google Test where +// mutex is not supported - using Google Test in multiple threads is not +// supported on such platforms. + +class Mutex { + public: + Mutex() {} + void Lock() {} + void Unlock() {} + void AssertHeld() const {} +}; + +# define GTEST_DECLARE_STATIC_MUTEX_(mutex) \ + extern ::testing::internal::Mutex mutex + +# define GTEST_DEFINE_STATIC_MUTEX_(mutex) ::testing::internal::Mutex mutex + +// We cannot name this class MutexLock because the ctor declaration would +// conflict with a macro named MutexLock, which is defined on some +// platforms. That macro is used as a defensive measure to prevent against +// inadvertent misuses of MutexLock like "MutexLock(&mu)" rather than +// "MutexLock l(&mu)". Hence the typedef trick below. +class GTestMutexLock { + public: + explicit GTestMutexLock(Mutex*) {} // NOLINT +}; + +typedef GTestMutexLock MutexLock; + +template +class GTEST_API_ ThreadLocal { + public: + ThreadLocal() : value_() {} + explicit ThreadLocal(const T& value) : value_(value) {} + T* pointer() { return &value_; } + const T* pointer() const { return &value_; } + const T& get() const { return value_; } + void set(const T& value) { value_ = value; } + private: + T value_; +}; + +#endif // GTEST_IS_THREADSAFE + +// Returns the number of threads running in the process, or 0 to indicate that +// we cannot detect it. +GTEST_API_ size_t GetThreadCount(); + +template +using bool_constant = std::integral_constant; + +#if GTEST_OS_WINDOWS +# define GTEST_PATH_SEP_ "\\" +# define GTEST_HAS_ALT_PATH_SEP_ 1 +// The biggest signed integer type the compiler supports. +typedef __int64 BiggestInt; +#else +# define GTEST_PATH_SEP_ "/" +# define GTEST_HAS_ALT_PATH_SEP_ 0 +typedef long long BiggestInt; // NOLINT +#endif // GTEST_OS_WINDOWS + +// Utilities for char. + +// isspace(int ch) and friends accept an unsigned char or EOF. char +// may be signed, depending on the compiler (or compiler flags). +// Therefore we need to cast a char to unsigned char before calling +// isspace(), etc. + +inline bool IsAlpha(char ch) { + return isalpha(static_cast(ch)) != 0; +} +inline bool IsAlNum(char ch) { + return isalnum(static_cast(ch)) != 0; +} +inline bool IsDigit(char ch) { + return isdigit(static_cast(ch)) != 0; +} +inline bool IsLower(char ch) { + return islower(static_cast(ch)) != 0; +} +inline bool IsSpace(char ch) { + return isspace(static_cast(ch)) != 0; +} +inline bool IsUpper(char ch) { + return isupper(static_cast(ch)) != 0; +} +inline bool IsXDigit(char ch) { + return isxdigit(static_cast(ch)) != 0; +} +inline bool IsXDigit(wchar_t ch) { + const unsigned char low_byte = static_cast(ch); + return ch == low_byte && isxdigit(low_byte) != 0; +} + +inline char ToLower(char ch) { + return static_cast(tolower(static_cast(ch))); +} +inline char ToUpper(char ch) { + return static_cast(toupper(static_cast(ch))); +} + +inline std::string StripTrailingSpaces(std::string str) { + std::string::iterator it = str.end(); + while (it != str.begin() && IsSpace(*--it)) + it = str.erase(it); + return str; +} + +// The testing::internal::posix namespace holds wrappers for common +// POSIX functions. These wrappers hide the differences between +// Windows/MSVC and POSIX systems. Since some compilers define these +// standard functions as macros, the wrapper cannot have the same name +// as the wrapped function. + +namespace posix { + +// Functions with a different name on Windows. + +#if GTEST_OS_WINDOWS + +typedef struct _stat StatStruct; + +# ifdef __BORLANDC__ +inline int IsATTY(int fd) { return isatty(fd); } +inline int StrCaseCmp(const char* s1, const char* s2) { + return stricmp(s1, s2); +} +inline char* StrDup(const char* src) { return strdup(src); } +# else // !__BORLANDC__ +# if GTEST_OS_WINDOWS_MOBILE +inline int IsATTY(int /* fd */) { return 0; } +# else +inline int IsATTY(int fd) { return _isatty(fd); } +# endif // GTEST_OS_WINDOWS_MOBILE +inline int StrCaseCmp(const char* s1, const char* s2) { + return _stricmp(s1, s2); +} +inline char* StrDup(const char* src) { return _strdup(src); } +# endif // __BORLANDC__ + +# if GTEST_OS_WINDOWS_MOBILE +inline int FileNo(FILE* file) { return reinterpret_cast(_fileno(file)); } +// Stat(), RmDir(), and IsDir() are not needed on Windows CE at this +// time and thus not defined there. +# else +inline int FileNo(FILE* file) { return _fileno(file); } +inline int Stat(const char* path, StatStruct* buf) { return _stat(path, buf); } +inline int RmDir(const char* dir) { return _rmdir(dir); } +inline bool IsDir(const StatStruct& st) { + return (_S_IFDIR & st.st_mode) != 0; +} +# endif // GTEST_OS_WINDOWS_MOBILE + +#else + +typedef struct stat StatStruct; + +inline int FileNo(FILE* file) { return fileno(file); } +inline int IsATTY(int fd) { return isatty(fd); } +inline int Stat(const char* path, StatStruct* buf) { return stat(path, buf); } +inline int StrCaseCmp(const char* s1, const char* s2) { + return strcasecmp(s1, s2); +} +inline char* StrDup(const char* src) { return strdup(src); } +inline int RmDir(const char* dir) { return rmdir(dir); } +inline bool IsDir(const StatStruct& st) { return S_ISDIR(st.st_mode); } + +#endif // GTEST_OS_WINDOWS + +// Functions deprecated by MSVC 8.0. + +GTEST_DISABLE_MSC_DEPRECATED_PUSH_() + +inline const char* StrNCpy(char* dest, const char* src, size_t n) { + return strncpy(dest, src, n); +} + +// ChDir(), FReopen(), FDOpen(), Read(), Write(), Close(), and +// StrError() aren't needed on Windows CE at this time and thus not +// defined there. + +#if !GTEST_OS_WINDOWS_MOBILE && !GTEST_OS_WINDOWS_PHONE && !GTEST_OS_WINDOWS_RT +inline int ChDir(const char* dir) { return chdir(dir); } +#endif +inline FILE* FOpen(const char* path, const char* mode) { + return fopen(path, mode); +} +#if !GTEST_OS_WINDOWS_MOBILE +inline FILE *FReopen(const char* path, const char* mode, FILE* stream) { + return freopen(path, mode, stream); +} +inline FILE* FDOpen(int fd, const char* mode) { return fdopen(fd, mode); } +#endif +inline int FClose(FILE* fp) { return fclose(fp); } +#if !GTEST_OS_WINDOWS_MOBILE +inline int Read(int fd, void* buf, unsigned int count) { + return static_cast(read(fd, buf, count)); +} +inline int Write(int fd, const void* buf, unsigned int count) { + return static_cast(write(fd, buf, count)); +} +inline int Close(int fd) { return close(fd); } +inline const char* StrError(int errnum) { return strerror(errnum); } +#endif +inline const char* GetEnv(const char* name) { +#if GTEST_OS_WINDOWS_MOBILE || GTEST_OS_WINDOWS_PHONE || GTEST_OS_WINDOWS_RT + // We are on Windows CE, which has no environment variables. + static_cast(name); // To prevent 'unused argument' warning. + return nullptr; +#elif defined(__BORLANDC__) || defined(__SunOS_5_8) || defined(__SunOS_5_9) + // Environment variables which we programmatically clear will be set to the + // empty string rather than unset (NULL). Handle that case. + const char* const env = getenv(name); + return (env != nullptr && env[0] != '\0') ? env : nullptr; +#else + return getenv(name); +#endif +} + +GTEST_DISABLE_MSC_DEPRECATED_POP_() + +#if GTEST_OS_WINDOWS_MOBILE +// Windows CE has no C library. The abort() function is used in +// several places in Google Test. This implementation provides a reasonable +// imitation of standard behaviour. +[[noreturn]] void Abort(); +#else +[[noreturn]] inline void Abort() { abort(); } +#endif // GTEST_OS_WINDOWS_MOBILE + +} // namespace posix + +// MSVC "deprecates" snprintf and issues warnings wherever it is used. In +// order to avoid these warnings, we need to use _snprintf or _snprintf_s on +// MSVC-based platforms. We map the GTEST_SNPRINTF_ macro to the appropriate +// function in order to achieve that. We use macro definition here because +// snprintf is a variadic function. +#if _MSC_VER && !GTEST_OS_WINDOWS_MOBILE +// MSVC 2005 and above support variadic macros. +# define GTEST_SNPRINTF_(buffer, size, format, ...) \ + _snprintf_s(buffer, size, size, format, __VA_ARGS__) +#elif defined(_MSC_VER) +// Windows CE does not define _snprintf_s +# define GTEST_SNPRINTF_ _snprintf +#else +# define GTEST_SNPRINTF_ snprintf +#endif + +// The maximum number a BiggestInt can represent. This definition +// works no matter BiggestInt is represented in one's complement or +// two's complement. +// +// We cannot rely on numeric_limits in STL, as __int64 and long long +// are not part of standard C++ and numeric_limits doesn't need to be +// defined for them. +const BiggestInt kMaxBiggestInt = + ~(static_cast(1) << (8*sizeof(BiggestInt) - 1)); + +// This template class serves as a compile-time function from size to +// type. It maps a size in bytes to a primitive type with that +// size. e.g. +// +// TypeWithSize<4>::UInt +// +// is typedef-ed to be unsigned int (unsigned integer made up of 4 +// bytes). +// +// Such functionality should belong to STL, but I cannot find it +// there. +// +// Google Test uses this class in the implementation of floating-point +// comparison. +// +// For now it only handles UInt (unsigned int) as that's all Google Test +// needs. Other types can be easily added in the future if need +// arises. +template +class TypeWithSize { + public: + // This prevents the user from using TypeWithSize with incorrect + // values of N. + typedef void UInt; +}; + +// The specialization for size 4. +template <> +class TypeWithSize<4> { + public: + // unsigned int has size 4 in both gcc and MSVC. + // + // As base/basictypes.h doesn't compile on Windows, we cannot use + // uint32, uint64, and etc here. + typedef int Int; + typedef unsigned int UInt; +}; + +// The specialization for size 8. +template <> +class TypeWithSize<8> { + public: +#if GTEST_OS_WINDOWS + typedef __int64 Int; + typedef unsigned __int64 UInt; +#else + typedef long long Int; // NOLINT + typedef unsigned long long UInt; // NOLINT +#endif // GTEST_OS_WINDOWS +}; + +// Integer types of known sizes. +typedef TypeWithSize<4>::Int Int32; +typedef TypeWithSize<4>::UInt UInt32; +typedef TypeWithSize<8>::Int Int64; +typedef TypeWithSize<8>::UInt UInt64; +typedef TypeWithSize<8>::Int TimeInMillis; // Represents time in milliseconds. + +// Utilities for command line flags and environment variables. + +// Macro for referencing flags. +#if !defined(GTEST_FLAG) +# define GTEST_FLAG(name) FLAGS_gtest_##name +#endif // !defined(GTEST_FLAG) + +#if !defined(GTEST_USE_OWN_FLAGFILE_FLAG_) +# define GTEST_USE_OWN_FLAGFILE_FLAG_ 1 +#endif // !defined(GTEST_USE_OWN_FLAGFILE_FLAG_) + +#if !defined(GTEST_DECLARE_bool_) +# define GTEST_FLAG_SAVER_ ::testing::internal::GTestFlagSaver + +// Macros for declaring flags. +# define GTEST_DECLARE_bool_(name) GTEST_API_ extern bool GTEST_FLAG(name) +# define GTEST_DECLARE_int32_(name) \ + GTEST_API_ extern ::testing::internal::Int32 GTEST_FLAG(name) +# define GTEST_DECLARE_string_(name) \ + GTEST_API_ extern ::std::string GTEST_FLAG(name) + +// Macros for defining flags. +# define GTEST_DEFINE_bool_(name, default_val, doc) \ + GTEST_API_ bool GTEST_FLAG(name) = (default_val) +# define GTEST_DEFINE_int32_(name, default_val, doc) \ + GTEST_API_ ::testing::internal::Int32 GTEST_FLAG(name) = (default_val) +# define GTEST_DEFINE_string_(name, default_val, doc) \ + GTEST_API_ ::std::string GTEST_FLAG(name) = (default_val) + +#endif // !defined(GTEST_DECLARE_bool_) + +// Thread annotations +#if !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_) +# define GTEST_EXCLUSIVE_LOCK_REQUIRED_(locks) +# define GTEST_LOCK_EXCLUDED_(locks) +#endif // !defined(GTEST_EXCLUSIVE_LOCK_REQUIRED_) + +// Parses 'str' for a 32-bit signed integer. If successful, writes the result +// to *value and returns true; otherwise leaves *value unchanged and returns +// false. +bool ParseInt32(const Message& src_text, const char* str, Int32* value); + +// Parses a bool/Int32/string from the environment variable +// corresponding to the given Google Test flag. +bool BoolFromGTestEnv(const char* flag, bool default_val); +GTEST_API_ Int32 Int32FromGTestEnv(const char* flag, Int32 default_val); +std::string OutputFlagAlsoCheckEnvVar(); +const char* StringFromGTestEnv(const char* flag, const char* default_val); + +} // namespace internal +} // namespace testing + +#if !defined(GTEST_INTERNAL_DEPRECATED) + +// Internal Macro to mark an API deprecated, for googletest usage only +// Usage: class GTEST_INTERNAL_DEPRECATED(message) MyClass or +// GTEST_INTERNAL_DEPRECATED(message) myFunction(); Every usage of +// a deprecated entity will trigger a warning when compiled with +// `-Wdeprecated-declarations` option (clang, gcc, any __GNUC__ compiler). +// For msvc /W3 option will need to be used +// Note that for 'other' compilers this macro evaluates to nothing to prevent +// compilations errors. +#if defined(_MSC_VER) +#define GTEST_INTERNAL_DEPRECATED(message) __declspec(deprecated(message)) +#elif defined(__GNUC__) +#define GTEST_INTERNAL_DEPRECATED(message) __attribute__((deprecated(message))) +#else +#define GTEST_INTERNAL_DEPRECATED(message) +#endif + +#endif // !defined(GTEST_INTERNAL_DEPRECATED) + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_PORT_H_ diff --git a/include/gtest/internal/gtest-string.h b/include/gtest/internal/gtest-string.h new file mode 100644 index 0000000..82aaa63 --- /dev/null +++ b/include/gtest/internal/gtest-string.h @@ -0,0 +1,171 @@ +// Copyright 2005, Google Inc. +// All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// +// The Google C++ Testing and Mocking Framework (Google Test) +// +// This header file declares the String class and functions used internally by +// Google Test. They are subject to change without notice. They should not used +// by code external to Google Test. +// +// This header file is #included by gtest-internal.h. +// It should not be #included by other files. + +// GOOGLETEST_CM0001 DO NOT DELETE + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ + +#ifdef __BORLANDC__ +// string.h is not guaranteed to provide strcpy on C++ Builder. +# include +#endif + +#include +#include + +#include "gtest/internal/gtest-port.h" + +namespace testing { +namespace internal { + +// String - an abstract class holding static string utilities. +class GTEST_API_ String { + public: + // Static utility methods + + // Clones a 0-terminated C string, allocating memory using new. The + // caller is responsible for deleting the return value using + // delete[]. Returns the cloned string, or NULL if the input is + // NULL. + // + // This is different from strdup() in string.h, which allocates + // memory using malloc(). + static const char* CloneCString(const char* c_str); + +#if GTEST_OS_WINDOWS_MOBILE + // Windows CE does not have the 'ANSI' versions of Win32 APIs. To be + // able to pass strings to Win32 APIs on CE we need to convert them + // to 'Unicode', UTF-16. + + // Creates a UTF-16 wide string from the given ANSI string, allocating + // memory using new. The caller is responsible for deleting the return + // value using delete[]. Returns the wide string, or NULL if the + // input is NULL. + // + // The wide string is created using the ANSI codepage (CP_ACP) to + // match the behaviour of the ANSI versions of Win32 calls and the + // C runtime. + static LPCWSTR AnsiToUtf16(const char* c_str); + + // Creates an ANSI string from the given wide string, allocating + // memory using new. The caller is responsible for deleting the return + // value using delete[]. Returns the ANSI string, or NULL if the + // input is NULL. + // + // The returned string is created using the ANSI codepage (CP_ACP) to + // match the behaviour of the ANSI versions of Win32 calls and the + // C runtime. + static const char* Utf16ToAnsi(LPCWSTR utf16_str); +#endif + + // Compares two C strings. Returns true if and only if they have the same + // content. + // + // Unlike strcmp(), this function can handle NULL argument(s). A + // NULL C string is considered different to any non-NULL C string, + // including the empty string. + static bool CStringEquals(const char* lhs, const char* rhs); + + // Converts a wide C string to a String using the UTF-8 encoding. + // NULL will be converted to "(null)". If an error occurred during + // the conversion, "(failed to convert from wide string)" is + // returned. + static std::string ShowWideCString(const wchar_t* wide_c_str); + + // Compares two wide C strings. Returns true if and only if they have the + // same content. + // + // Unlike wcscmp(), this function can handle NULL argument(s). A + // NULL C string is considered different to any non-NULL C string, + // including the empty string. + static bool WideCStringEquals(const wchar_t* lhs, const wchar_t* rhs); + + // Compares two C strings, ignoring case. Returns true if and only if + // they have the same content. + // + // Unlike strcasecmp(), this function can handle NULL argument(s). + // A NULL C string is considered different to any non-NULL C string, + // including the empty string. + static bool CaseInsensitiveCStringEquals(const char* lhs, + const char* rhs); + + // Compares two wide C strings, ignoring case. Returns true if and only if + // they have the same content. + // + // Unlike wcscasecmp(), this function can handle NULL argument(s). + // A NULL C string is considered different to any non-NULL wide C string, + // including the empty string. + // NB: The implementations on different platforms slightly differ. + // On windows, this method uses _wcsicmp which compares according to LC_CTYPE + // environment variable. On GNU platform this method uses wcscasecmp + // which compares according to LC_CTYPE category of the current locale. + // On MacOS X, it uses towlower, which also uses LC_CTYPE category of the + // current locale. + static bool CaseInsensitiveWideCStringEquals(const wchar_t* lhs, + const wchar_t* rhs); + + // Returns true if and only if the given string ends with the given suffix, + // ignoring case. Any string is considered to end with an empty suffix. + static bool EndsWithCaseInsensitive( + const std::string& str, const std::string& suffix); + + // Formats an int value as "%02d". + static std::string FormatIntWidth2(int value); // "%02d" for width == 2 + + // Formats an int value as "%X". + static std::string FormatHexInt(int value); + + // Formats an int value as "%X". + static std::string FormatHexUInt32(UInt32 value); + + // Formats a byte as "%02X". + static std::string FormatByte(unsigned char value); + + private: + String(); // Not meant to be instantiated. +}; // class String + +// Gets the content of the stringstream's buffer as an std::string. Each '\0' +// character in the buffer is replaced with "\\0". +GTEST_API_ std::string StringStreamToString(::std::stringstream* stream); + +} // namespace internal +} // namespace testing + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_STRING_H_ diff --git a/include/gtest/internal/gtest-type-util.h b/include/gtest/internal/gtest-type-util.h new file mode 100644 index 0000000..3d7542d --- /dev/null +++ b/include/gtest/internal/gtest-type-util.h @@ -0,0 +1,3335 @@ +// This file was GENERATED by command: +// pump.py gtest-type-util.h.pump +// DO NOT EDIT BY HAND!!! + +// Copyright 2008 Google Inc. +// All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +// Type utilities needed for implementing typed and type-parameterized +// tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND! +// +// Currently we support at most 50 types in a list, and at most 50 +// type-parameterized tests in one type-parameterized test suite. +// Please contact googletestframework@googlegroups.com if you need +// more. + +// GOOGLETEST_CM0001 DO NOT DELETE + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ + +#include "gtest/internal/gtest-port.h" + +// #ifdef __GNUC__ is too general here. It is possible to use gcc without using +// libstdc++ (which is where cxxabi.h comes from). +# if GTEST_HAS_CXXABI_H_ +# include +# elif defined(__HP_aCC) +# include +# endif // GTEST_HASH_CXXABI_H_ + +namespace testing { +namespace internal { + +// Canonicalizes a given name with respect to the Standard C++ Library. +// This handles removing the inline namespace within `std` that is +// used by various standard libraries (e.g., `std::__1`). Names outside +// of namespace std are returned unmodified. +inline std::string CanonicalizeForStdLibVersioning(std::string s) { + static const char prefix[] = "std::__"; + if (s.compare(0, strlen(prefix), prefix) == 0) { + std::string::size_type end = s.find("::", strlen(prefix)); + if (end != s.npos) { + // Erase everything between the initial `std` and the second `::`. + s.erase(strlen("std"), end - strlen("std")); + } + } + return s; +} + +// GetTypeName() returns a human-readable name of type T. +// NB: This function is also used in Google Mock, so don't move it inside of +// the typed-test-only section below. +template +std::string GetTypeName() { +# if GTEST_HAS_RTTI + + const char* const name = typeid(T).name(); +# if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC) + int status = 0; + // gcc's implementation of typeid(T).name() mangles the type name, + // so we have to demangle it. +# if GTEST_HAS_CXXABI_H_ + using abi::__cxa_demangle; +# endif // GTEST_HAS_CXXABI_H_ + char* const readable_name = __cxa_demangle(name, nullptr, nullptr, &status); + const std::string name_str(status == 0 ? readable_name : name); + free(readable_name); + return CanonicalizeForStdLibVersioning(name_str); +# else + return name; +# endif // GTEST_HAS_CXXABI_H_ || __HP_aCC + +# else + + return ""; + +# endif // GTEST_HAS_RTTI +} + +#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P + +// A unique type used as the default value for the arguments of class +// template Types. This allows us to simulate variadic templates +// (e.g. Types, Type, and etc), which C++ doesn't +// support directly. +struct None {}; + +// The following family of struct and struct templates are used to +// represent type lists. In particular, TypesN +// represents a type list with N types (T1, T2, ..., and TN) in it. +// Except for Types0, every struct in the family has two member types: +// Head for the first type in the list, and Tail for the rest of the +// list. + +// The empty type list. +struct Types0 {}; + +// Type lists of length 1, 2, 3, and so on. + +template +struct Types1 { + typedef T1 Head; + typedef Types0 Tail; +}; +template +struct Types2 { + typedef T1 Head; + typedef Types1 Tail; +}; + +template +struct Types3 { + typedef T1 Head; + typedef Types2 Tail; +}; + +template +struct Types4 { + typedef T1 Head; + typedef Types3 Tail; +}; + +template +struct Types5 { + typedef T1 Head; + typedef Types4 Tail; +}; + +template +struct Types6 { + typedef T1 Head; + typedef Types5 Tail; +}; + +template +struct Types7 { + typedef T1 Head; + typedef Types6 Tail; +}; + +template +struct Types8 { + typedef T1 Head; + typedef Types7 Tail; +}; + +template +struct Types9 { + typedef T1 Head; + typedef Types8 Tail; +}; + +template +struct Types10 { + typedef T1 Head; + typedef Types9 Tail; +}; + +template +struct Types11 { + typedef T1 Head; + typedef Types10 Tail; +}; + +template +struct Types12 { + typedef T1 Head; + typedef Types11 Tail; +}; + +template +struct Types13 { + typedef T1 Head; + typedef Types12 Tail; +}; + +template +struct Types14 { + typedef T1 Head; + typedef Types13 Tail; +}; + +template +struct Types15 { + typedef T1 Head; + typedef Types14 Tail; +}; + +template +struct Types16 { + typedef T1 Head; + typedef Types15 Tail; +}; + +template +struct Types17 { + typedef T1 Head; + typedef Types16 Tail; +}; + +template +struct Types18 { + typedef T1 Head; + typedef Types17 Tail; +}; + +template +struct Types19 { + typedef T1 Head; + typedef Types18 Tail; +}; + +template +struct Types20 { + typedef T1 Head; + typedef Types19 Tail; +}; + +template +struct Types21 { + typedef T1 Head; + typedef Types20 Tail; +}; + +template +struct Types22 { + typedef T1 Head; + typedef Types21 Tail; +}; + +template +struct Types23 { + typedef T1 Head; + typedef Types22 Tail; +}; + +template +struct Types24 { + typedef T1 Head; + typedef Types23 Tail; +}; + +template +struct Types25 { + typedef T1 Head; + typedef Types24 Tail; +}; + +template +struct Types26 { + typedef T1 Head; + typedef Types25 Tail; +}; + +template +struct Types27 { + typedef T1 Head; + typedef Types26 Tail; +}; + +template +struct Types28 { + typedef T1 Head; + typedef Types27 Tail; +}; + +template +struct Types29 { + typedef T1 Head; + typedef Types28 Tail; +}; + +template +struct Types30 { + typedef T1 Head; + typedef Types29 Tail; +}; + +template +struct Types31 { + typedef T1 Head; + typedef Types30 Tail; +}; + +template +struct Types32 { + typedef T1 Head; + typedef Types31 Tail; +}; + +template +struct Types33 { + typedef T1 Head; + typedef Types32 Tail; +}; + +template +struct Types34 { + typedef T1 Head; + typedef Types33 Tail; +}; + +template +struct Types35 { + typedef T1 Head; + typedef Types34 Tail; +}; + +template +struct Types36 { + typedef T1 Head; + typedef Types35 Tail; +}; + +template +struct Types37 { + typedef T1 Head; + typedef Types36 Tail; +}; + +template +struct Types38 { + typedef T1 Head; + typedef Types37 Tail; +}; + +template +struct Types39 { + typedef T1 Head; + typedef Types38 Tail; +}; + +template +struct Types40 { + typedef T1 Head; + typedef Types39 Tail; +}; + +template +struct Types41 { + typedef T1 Head; + typedef Types40 Tail; +}; + +template +struct Types42 { + typedef T1 Head; + typedef Types41 Tail; +}; + +template +struct Types43 { + typedef T1 Head; + typedef Types42 Tail; +}; + +template +struct Types44 { + typedef T1 Head; + typedef Types43 Tail; +}; + +template +struct Types45 { + typedef T1 Head; + typedef Types44 Tail; +}; + +template +struct Types46 { + typedef T1 Head; + typedef Types45 Tail; +}; + +template +struct Types47 { + typedef T1 Head; + typedef Types46 Tail; +}; + +template +struct Types48 { + typedef T1 Head; + typedef Types47 Tail; +}; + +template +struct Types49 { + typedef T1 Head; + typedef Types48 Tail; +}; + +template +struct Types50 { + typedef T1 Head; + typedef Types49 Tail; +}; + + +} // namespace internal + +// We don't want to require the users to write TypesN<...> directly, +// as that would require them to count the length. Types<...> is much +// easier to write, but generates horrible messages when there is a +// compiler error, as gcc insists on printing out each template +// argument, even if it has the default value (this means Types +// will appear as Types in the compiler +// errors). +// +// Our solution is to combine the best part of the two approaches: a +// user would write Types, and Google Test will translate +// that to TypesN internally to make error messages +// readable. The translation is done by the 'type' member of the +// Types template. +template +struct Types { + typedef internal::Types50 type; +}; + +template <> +struct Types { + typedef internal::Types0 type; +}; +template +struct Types { + typedef internal::Types1 type; +}; +template +struct Types { + typedef internal::Types2 type; +}; +template +struct Types { + typedef internal::Types3 type; +}; +template +struct Types { + typedef internal::Types4 type; +}; +template +struct Types { + typedef internal::Types5 type; +}; +template +struct Types { + typedef internal::Types6 type; +}; +template +struct Types { + typedef internal::Types7 type; +}; +template +struct Types { + typedef internal::Types8 type; +}; +template +struct Types { + typedef internal::Types9 type; +}; +template +struct Types { + typedef internal::Types10 type; +}; +template +struct Types { + typedef internal::Types11 type; +}; +template +struct Types { + typedef internal::Types12 type; +}; +template +struct Types { + typedef internal::Types13 type; +}; +template +struct Types { + typedef internal::Types14 type; +}; +template +struct Types { + typedef internal::Types15 type; +}; +template +struct Types { + typedef internal::Types16 type; +}; +template +struct Types { + typedef internal::Types17 type; +}; +template +struct Types { + typedef internal::Types18 type; +}; +template +struct Types { + typedef internal::Types19 type; +}; +template +struct Types { + typedef internal::Types20 type; +}; +template +struct Types { + typedef internal::Types21 type; +}; +template +struct Types { + typedef internal::Types22 type; +}; +template +struct Types { + typedef internal::Types23 type; +}; +template +struct Types { + typedef internal::Types24 type; +}; +template +struct Types { + typedef internal::Types25 type; +}; +template +struct Types { + typedef internal::Types26 type; +}; +template +struct Types { + typedef internal::Types27 type; +}; +template +struct Types { + typedef internal::Types28 type; +}; +template +struct Types { + typedef internal::Types29 type; +}; +template +struct Types { + typedef internal::Types30 type; +}; +template +struct Types { + typedef internal::Types31 type; +}; +template +struct Types { + typedef internal::Types32 type; +}; +template +struct Types { + typedef internal::Types33 type; +}; +template +struct Types { + typedef internal::Types34 type; +}; +template +struct Types { + typedef internal::Types35 type; +}; +template +struct Types { + typedef internal::Types36 type; +}; +template +struct Types { + typedef internal::Types37 type; +}; +template +struct Types { + typedef internal::Types38 type; +}; +template +struct Types { + typedef internal::Types39 type; +}; +template +struct Types { + typedef internal::Types40 type; +}; +template +struct Types { + typedef internal::Types41 type; +}; +template +struct Types { + typedef internal::Types42 type; +}; +template +struct Types { + typedef internal::Types43 type; +}; +template +struct Types { + typedef internal::Types44 type; +}; +template +struct Types { + typedef internal::Types45 type; +}; +template +struct Types { + typedef internal::Types46 type; +}; +template +struct Types { + typedef internal::Types47 type; +}; +template +struct Types { + typedef internal::Types48 type; +}; +template +struct Types { + typedef internal::Types49 type; +}; + +namespace internal { + +# define GTEST_TEMPLATE_ template class + +// The template "selector" struct TemplateSel is used to +// represent Tmpl, which must be a class template with one type +// parameter, as a type. TemplateSel::Bind::type is defined +// as the type Tmpl. This allows us to actually instantiate the +// template "selected" by TemplateSel. +// +// This trick is necessary for simulating typedef for class templates, +// which C++ doesn't support directly. +template +struct TemplateSel { + template + struct Bind { + typedef Tmpl type; + }; +}; + +# define GTEST_BIND_(TmplSel, T) \ + TmplSel::template Bind::type + +// A unique struct template used as the default value for the +// arguments of class template Templates. This allows us to simulate +// variadic templates (e.g. Templates, Templates, +// and etc), which C++ doesn't support directly. +template +struct NoneT {}; + +// The following family of struct and struct templates are used to +// represent template lists. In particular, TemplatesN represents a list of N templates (T1, T2, ..., and TN). Except +// for Templates0, every struct in the family has two member types: +// Head for the selector of the first template in the list, and Tail +// for the rest of the list. + +// The empty template list. +struct Templates0 {}; + +// Template lists of length 1, 2, 3, and so on. + +template +struct Templates1 { + typedef TemplateSel Head; + typedef Templates0 Tail; +}; +template +struct Templates2 { + typedef TemplateSel Head; + typedef Templates1 Tail; +}; + +template +struct Templates3 { + typedef TemplateSel Head; + typedef Templates2 Tail; +}; + +template +struct Templates4 { + typedef TemplateSel Head; + typedef Templates3 Tail; +}; + +template +struct Templates5 { + typedef TemplateSel Head; + typedef Templates4 Tail; +}; + +template +struct Templates6 { + typedef TemplateSel Head; + typedef Templates5 Tail; +}; + +template +struct Templates7 { + typedef TemplateSel Head; + typedef Templates6 Tail; +}; + +template +struct Templates8 { + typedef TemplateSel Head; + typedef Templates7 Tail; +}; + +template +struct Templates9 { + typedef TemplateSel Head; + typedef Templates8 Tail; +}; + +template +struct Templates10 { + typedef TemplateSel Head; + typedef Templates9 Tail; +}; + +template +struct Templates11 { + typedef TemplateSel Head; + typedef Templates10 Tail; +}; + +template +struct Templates12 { + typedef TemplateSel Head; + typedef Templates11 Tail; +}; + +template +struct Templates13 { + typedef TemplateSel Head; + typedef Templates12 Tail; +}; + +template +struct Templates14 { + typedef TemplateSel Head; + typedef Templates13 Tail; +}; + +template +struct Templates15 { + typedef TemplateSel Head; + typedef Templates14 Tail; +}; + +template +struct Templates16 { + typedef TemplateSel Head; + typedef Templates15 Tail; +}; + +template +struct Templates17 { + typedef TemplateSel Head; + typedef Templates16 Tail; +}; + +template +struct Templates18 { + typedef TemplateSel Head; + typedef Templates17 Tail; +}; + +template +struct Templates19 { + typedef TemplateSel Head; + typedef Templates18 Tail; +}; + +template +struct Templates20 { + typedef TemplateSel Head; + typedef Templates19 Tail; +}; + +template +struct Templates21 { + typedef TemplateSel Head; + typedef Templates20 Tail; +}; + +template +struct Templates22 { + typedef TemplateSel Head; + typedef Templates21 Tail; +}; + +template +struct Templates23 { + typedef TemplateSel Head; + typedef Templates22 Tail; +}; + +template +struct Templates24 { + typedef TemplateSel Head; + typedef Templates23 Tail; +}; + +template +struct Templates25 { + typedef TemplateSel Head; + typedef Templates24 Tail; +}; + +template +struct Templates26 { + typedef TemplateSel Head; + typedef Templates25 Tail; +}; + +template +struct Templates27 { + typedef TemplateSel Head; + typedef Templates26 Tail; +}; + +template +struct Templates28 { + typedef TemplateSel Head; + typedef Templates27 Tail; +}; + +template +struct Templates29 { + typedef TemplateSel Head; + typedef Templates28 Tail; +}; + +template +struct Templates30 { + typedef TemplateSel Head; + typedef Templates29 Tail; +}; + +template +struct Templates31 { + typedef TemplateSel Head; + typedef Templates30 Tail; +}; + +template +struct Templates32 { + typedef TemplateSel Head; + typedef Templates31 Tail; +}; + +template +struct Templates33 { + typedef TemplateSel Head; + typedef Templates32 Tail; +}; + +template +struct Templates34 { + typedef TemplateSel Head; + typedef Templates33 Tail; +}; + +template +struct Templates35 { + typedef TemplateSel Head; + typedef Templates34 Tail; +}; + +template +struct Templates36 { + typedef TemplateSel Head; + typedef Templates35 Tail; +}; + +template +struct Templates37 { + typedef TemplateSel Head; + typedef Templates36 Tail; +}; + +template +struct Templates38 { + typedef TemplateSel Head; + typedef Templates37 Tail; +}; + +template +struct Templates39 { + typedef TemplateSel Head; + typedef Templates38 Tail; +}; + +template +struct Templates40 { + typedef TemplateSel Head; + typedef Templates39 Tail; +}; + +template +struct Templates41 { + typedef TemplateSel Head; + typedef Templates40 Tail; +}; + +template +struct Templates42 { + typedef TemplateSel Head; + typedef Templates41 Tail; +}; + +template +struct Templates43 { + typedef TemplateSel Head; + typedef Templates42 Tail; +}; + +template +struct Templates44 { + typedef TemplateSel Head; + typedef Templates43 Tail; +}; + +template +struct Templates45 { + typedef TemplateSel Head; + typedef Templates44 Tail; +}; + +template +struct Templates46 { + typedef TemplateSel Head; + typedef Templates45 Tail; +}; + +template +struct Templates47 { + typedef TemplateSel Head; + typedef Templates46 Tail; +}; + +template +struct Templates48 { + typedef TemplateSel Head; + typedef Templates47 Tail; +}; + +template +struct Templates49 { + typedef TemplateSel Head; + typedef Templates48 Tail; +}; + +template +struct Templates50 { + typedef TemplateSel Head; + typedef Templates49 Tail; +}; + + +// We don't want to require the users to write TemplatesN<...> directly, +// as that would require them to count the length. Templates<...> is much +// easier to write, but generates horrible messages when there is a +// compiler error, as gcc insists on printing out each template +// argument, even if it has the default value (this means Templates +// will appear as Templates in the compiler +// errors). +// +// Our solution is to combine the best part of the two approaches: a +// user would write Templates, and Google Test will translate +// that to TemplatesN internally to make error messages +// readable. The translation is done by the 'type' member of the +// Templates template. +template +struct Templates { + typedef Templates50 type; +}; + +template <> +struct Templates { + typedef Templates0 type; +}; +template +struct Templates { + typedef Templates1 type; +}; +template +struct Templates { + typedef Templates2 type; +}; +template +struct Templates { + typedef Templates3 type; +}; +template +struct Templates { + typedef Templates4 type; +}; +template +struct Templates { + typedef Templates5 type; +}; +template +struct Templates { + typedef Templates6 type; +}; +template +struct Templates { + typedef Templates7 type; +}; +template +struct Templates { + typedef Templates8 type; +}; +template +struct Templates { + typedef Templates9 type; +}; +template +struct Templates { + typedef Templates10 type; +}; +template +struct Templates { + typedef Templates11 type; +}; +template +struct Templates { + typedef Templates12 type; +}; +template +struct Templates { + typedef Templates13 type; +}; +template +struct Templates { + typedef Templates14 type; +}; +template +struct Templates { + typedef Templates15 type; +}; +template +struct Templates { + typedef Templates16 type; +}; +template +struct Templates { + typedef Templates17 type; +}; +template +struct Templates { + typedef Templates18 type; +}; +template +struct Templates { + typedef Templates19 type; +}; +template +struct Templates { + typedef Templates20 type; +}; +template +struct Templates { + typedef Templates21 type; +}; +template +struct Templates { + typedef Templates22 type; +}; +template +struct Templates { + typedef Templates23 type; +}; +template +struct Templates { + typedef Templates24 type; +}; +template +struct Templates { + typedef Templates25 type; +}; +template +struct Templates { + typedef Templates26 type; +}; +template +struct Templates { + typedef Templates27 type; +}; +template +struct Templates { + typedef Templates28 type; +}; +template +struct Templates { + typedef Templates29 type; +}; +template +struct Templates { + typedef Templates30 type; +}; +template +struct Templates { + typedef Templates31 type; +}; +template +struct Templates { + typedef Templates32 type; +}; +template +struct Templates { + typedef Templates33 type; +}; +template +struct Templates { + typedef Templates34 type; +}; +template +struct Templates { + typedef Templates35 type; +}; +template +struct Templates { + typedef Templates36 type; +}; +template +struct Templates { + typedef Templates37 type; +}; +template +struct Templates { + typedef Templates38 type; +}; +template +struct Templates { + typedef Templates39 type; +}; +template +struct Templates { + typedef Templates40 type; +}; +template +struct Templates { + typedef Templates41 type; +}; +template +struct Templates { + typedef Templates42 type; +}; +template +struct Templates { + typedef Templates43 type; +}; +template +struct Templates { + typedef Templates44 type; +}; +template +struct Templates { + typedef Templates45 type; +}; +template +struct Templates { + typedef Templates46 type; +}; +template +struct Templates { + typedef Templates47 type; +}; +template +struct Templates { + typedef Templates48 type; +}; +template +struct Templates { + typedef Templates49 type; +}; + +// The TypeList template makes it possible to use either a single type +// or a Types<...> list in TYPED_TEST_SUITE() and +// INSTANTIATE_TYPED_TEST_SUITE_P(). + +template +struct TypeList { + typedef Types1 type; +}; + +template +struct TypeList > { + typedef typename Types::type type; +}; + +#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P + +} // namespace internal +} // namespace testing + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ diff --git a/include/gtest/internal/gtest-type-util.h.pump b/include/gtest/internal/gtest-type-util.h.pump new file mode 100644 index 0000000..5e31b7b --- /dev/null +++ b/include/gtest/internal/gtest-type-util.h.pump @@ -0,0 +1,302 @@ +$$ -*- mode: c++; -*- +$var n = 50 $$ Maximum length of type lists we want to support. +// Copyright 2008 Google Inc. +// All Rights Reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are +// met: +// +// * Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// * Redistributions in binary form must reproduce the above +// copyright notice, this list of conditions and the following disclaimer +// in the documentation and/or other materials provided with the +// distribution. +// * Neither the name of Google Inc. nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +// Type utilities needed for implementing typed and type-parameterized +// tests. This file is generated by a SCRIPT. DO NOT EDIT BY HAND! +// +// Currently we support at most $n types in a list, and at most $n +// type-parameterized tests in one type-parameterized test suite. +// Please contact googletestframework@googlegroups.com if you need +// more. + +// GOOGLETEST_CM0001 DO NOT DELETE + +#ifndef GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ +#define GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ + +#include "gtest/internal/gtest-port.h" + +// #ifdef __GNUC__ is too general here. It is possible to use gcc without using +// libstdc++ (which is where cxxabi.h comes from). +# if GTEST_HAS_CXXABI_H_ +# include +# elif defined(__HP_aCC) +# include +# endif // GTEST_HASH_CXXABI_H_ + +namespace testing { +namespace internal { + +// Canonicalizes a given name with respect to the Standard C++ Library. +// This handles removing the inline namespace within `std` that is +// used by various standard libraries (e.g., `std::__1`). Names outside +// of namespace std are returned unmodified. +inline std::string CanonicalizeForStdLibVersioning(std::string s) { + static const char prefix[] = "std::__"; + if (s.compare(0, strlen(prefix), prefix) == 0) { + std::string::size_type end = s.find("::", strlen(prefix)); + if (end != s.npos) { + // Erase everything between the initial `std` and the second `::`. + s.erase(strlen("std"), end - strlen("std")); + } + } + return s; +} + +// GetTypeName() returns a human-readable name of type T. +// NB: This function is also used in Google Mock, so don't move it inside of +// the typed-test-only section below. +template +std::string GetTypeName() { +# if GTEST_HAS_RTTI + + const char* const name = typeid(T).name(); +# if GTEST_HAS_CXXABI_H_ || defined(__HP_aCC) + int status = 0; + // gcc's implementation of typeid(T).name() mangles the type name, + // so we have to demangle it. +# if GTEST_HAS_CXXABI_H_ + using abi::__cxa_demangle; +# endif // GTEST_HAS_CXXABI_H_ + char* const readable_name = __cxa_demangle(name, nullptr, nullptr, &status); + const std::string name_str(status == 0 ? readable_name : name); + free(readable_name); + return CanonicalizeForStdLibVersioning(name_str); +# else + return name; +# endif // GTEST_HAS_CXXABI_H_ || __HP_aCC + +# else + + return ""; + +# endif // GTEST_HAS_RTTI +} + +#if GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P + +// A unique type used as the default value for the arguments of class +// template Types. This allows us to simulate variadic templates +// (e.g. Types, Type, and etc), which C++ doesn't +// support directly. +struct None {}; + +// The following family of struct and struct templates are used to +// represent type lists. In particular, TypesN +// represents a type list with N types (T1, T2, ..., and TN) in it. +// Except for Types0, every struct in the family has two member types: +// Head for the first type in the list, and Tail for the rest of the +// list. + +// The empty type list. +struct Types0 {}; + +// Type lists of length 1, 2, 3, and so on. + +template +struct Types1 { + typedef T1 Head; + typedef Types0 Tail; +}; + +$range i 2..n + +$for i [[ +$range j 1..i +$range k 2..i +template <$for j, [[typename T$j]]> +struct Types$i { + typedef T1 Head; + typedef Types$(i-1)<$for k, [[T$k]]> Tail; +}; + + +]] + +} // namespace internal + +// We don't want to require the users to write TypesN<...> directly, +// as that would require them to count the length. Types<...> is much +// easier to write, but generates horrible messages when there is a +// compiler error, as gcc insists on printing out each template +// argument, even if it has the default value (this means Types +// will appear as Types in the compiler +// errors). +// +// Our solution is to combine the best part of the two approaches: a +// user would write Types, and Google Test will translate +// that to TypesN internally to make error messages +// readable. The translation is done by the 'type' member of the +// Types template. + +$range i 1..n +template <$for i, [[typename T$i = internal::None]]> +struct Types { + typedef internal::Types$n<$for i, [[T$i]]> type; +}; + +template <> +struct Types<$for i, [[internal::None]]> { + typedef internal::Types0 type; +}; + +$range i 1..n-1 +$for i [[ +$range j 1..i +$range k i+1..n +template <$for j, [[typename T$j]]> +struct Types<$for j, [[T$j]]$for k[[, internal::None]]> { + typedef internal::Types$i<$for j, [[T$j]]> type; +}; + +]] + +namespace internal { + +# define GTEST_TEMPLATE_ template class + +// The template "selector" struct TemplateSel is used to +// represent Tmpl, which must be a class template with one type +// parameter, as a type. TemplateSel::Bind::type is defined +// as the type Tmpl. This allows us to actually instantiate the +// template "selected" by TemplateSel. +// +// This trick is necessary for simulating typedef for class templates, +// which C++ doesn't support directly. +template +struct TemplateSel { + template + struct Bind { + typedef Tmpl type; + }; +}; + +# define GTEST_BIND_(TmplSel, T) \ + TmplSel::template Bind::type + +// A unique struct template used as the default value for the +// arguments of class template Templates. This allows us to simulate +// variadic templates (e.g. Templates, Templates, +// and etc), which C++ doesn't support directly. +template +struct NoneT {}; + +// The following family of struct and struct templates are used to +// represent template lists. In particular, TemplatesN represents a list of N templates (T1, T2, ..., and TN). Except +// for Templates0, every struct in the family has two member types: +// Head for the selector of the first template in the list, and Tail +// for the rest of the list. + +// The empty template list. +struct Templates0 {}; + +// Template lists of length 1, 2, 3, and so on. + +template +struct Templates1 { + typedef TemplateSel Head; + typedef Templates0 Tail; +}; + +$range i 2..n + +$for i [[ +$range j 1..i +$range k 2..i +template <$for j, [[GTEST_TEMPLATE_ T$j]]> +struct Templates$i { + typedef TemplateSel Head; + typedef Templates$(i-1)<$for k, [[T$k]]> Tail; +}; + + +]] + +// We don't want to require the users to write TemplatesN<...> directly, +// as that would require them to count the length. Templates<...> is much +// easier to write, but generates horrible messages when there is a +// compiler error, as gcc insists on printing out each template +// argument, even if it has the default value (this means Templates +// will appear as Templates in the compiler +// errors). +// +// Our solution is to combine the best part of the two approaches: a +// user would write Templates, and Google Test will translate +// that to TemplatesN internally to make error messages +// readable. The translation is done by the 'type' member of the +// Templates template. + +$range i 1..n +template <$for i, [[GTEST_TEMPLATE_ T$i = NoneT]]> +struct Templates { + typedef Templates$n<$for i, [[T$i]]> type; +}; + +template <> +struct Templates<$for i, [[NoneT]]> { + typedef Templates0 type; +}; + +$range i 1..n-1 +$for i [[ +$range j 1..i +$range k i+1..n +template <$for j, [[GTEST_TEMPLATE_ T$j]]> +struct Templates<$for j, [[T$j]]$for k[[, NoneT]]> { + typedef Templates$i<$for j, [[T$j]]> type; +}; + +]] + +// The TypeList template makes it possible to use either a single type +// or a Types<...> list in TYPED_TEST_SUITE() and +// INSTANTIATE_TYPED_TEST_SUITE_P(). + +template +struct TypeList { + typedef Types1 type; +}; + + +$range i 1..n +template <$for i, [[typename T$i]]> +struct TypeList > { + typedef typename Types<$for i, [[T$i]]>::type type; +}; + +#endif // GTEST_HAS_TYPED_TEST || GTEST_HAS_TYPED_TEST_P + +} // namespace internal +} // namespace testing + +#endif // GTEST_INCLUDE_GTEST_INTERNAL_GTEST_TYPE_UTIL_H_ diff --git a/include/hiredis/adapters/ae.h b/include/hiredis/adapters/ae.h new file mode 100644 index 0000000..660d82e --- /dev/null +++ b/include/hiredis/adapters/ae.h @@ -0,0 +1,130 @@ +/* + * Copyright (c) 2010-2011, Pieter Noordhuis + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __HIREDIS_AE_H__ +#define __HIREDIS_AE_H__ +#include +#include +#include "../hiredis.h" +#include "../async.h" + +typedef struct redisAeEvents { + redisAsyncContext *context; + aeEventLoop *loop; + int fd; + int reading, writing; +} redisAeEvents; + +static void redisAeReadEvent(aeEventLoop *el, int fd, void *privdata, int mask) { + ((void)el); ((void)fd); ((void)mask); + + redisAeEvents *e = (redisAeEvents*)privdata; + redisAsyncHandleRead(e->context); +} + +static void redisAeWriteEvent(aeEventLoop *el, int fd, void *privdata, int mask) { + ((void)el); ((void)fd); ((void)mask); + + redisAeEvents *e = (redisAeEvents*)privdata; + redisAsyncHandleWrite(e->context); +} + +static void redisAeAddRead(void *privdata) { + redisAeEvents *e = (redisAeEvents*)privdata; + aeEventLoop *loop = e->loop; + if (!e->reading) { + e->reading = 1; + aeCreateFileEvent(loop,e->fd,AE_READABLE,redisAeReadEvent,e); + } +} + +static void redisAeDelRead(void *privdata) { + redisAeEvents *e = (redisAeEvents*)privdata; + aeEventLoop *loop = e->loop; + if (e->reading) { + e->reading = 0; + aeDeleteFileEvent(loop,e->fd,AE_READABLE); + } +} + +static void redisAeAddWrite(void *privdata) { + redisAeEvents *e = (redisAeEvents*)privdata; + aeEventLoop *loop = e->loop; + if (!e->writing) { + e->writing = 1; + aeCreateFileEvent(loop,e->fd,AE_WRITABLE,redisAeWriteEvent,e); + } +} + +static void redisAeDelWrite(void *privdata) { + redisAeEvents *e = (redisAeEvents*)privdata; + aeEventLoop *loop = e->loop; + if (e->writing) { + e->writing = 0; + aeDeleteFileEvent(loop,e->fd,AE_WRITABLE); + } +} + +static void redisAeCleanup(void *privdata) { + redisAeEvents *e = (redisAeEvents*)privdata; + redisAeDelRead(privdata); + redisAeDelWrite(privdata); + hi_free(e); +} + +static int redisAeAttach(aeEventLoop *loop, redisAsyncContext *ac) { + redisContext *c = &(ac->c); + redisAeEvents *e; + + /* Nothing should be attached when something is already attached */ + if (ac->ev.data != NULL) + return REDIS_ERR; + + /* Create container for context and r/w events */ + e = (redisAeEvents*)hi_malloc(sizeof(*e)); + if (e == NULL) + return REDIS_ERR; + + e->context = ac; + e->loop = loop; + e->fd = c->fd; + e->reading = e->writing = 0; + + /* Register functions to start/stop listening for events */ + ac->ev.addRead = redisAeAddRead; + ac->ev.delRead = redisAeDelRead; + ac->ev.addWrite = redisAeAddWrite; + ac->ev.delWrite = redisAeDelWrite; + ac->ev.cleanup = redisAeCleanup; + ac->ev.data = e; + + return REDIS_OK; +} +#endif diff --git a/include/hiredis/adapters/glib.h b/include/hiredis/adapters/glib.h new file mode 100644 index 0000000..ad59dd1 --- /dev/null +++ b/include/hiredis/adapters/glib.h @@ -0,0 +1,156 @@ +#ifndef __HIREDIS_GLIB_H__ +#define __HIREDIS_GLIB_H__ + +#include + +#include "../hiredis.h" +#include "../async.h" + +typedef struct +{ + GSource source; + redisAsyncContext *ac; + GPollFD poll_fd; +} RedisSource; + +static void +redis_source_add_read (gpointer data) +{ + RedisSource *source = (RedisSource *)data; + g_return_if_fail(source); + source->poll_fd.events |= G_IO_IN; + g_main_context_wakeup(g_source_get_context((GSource *)data)); +} + +static void +redis_source_del_read (gpointer data) +{ + RedisSource *source = (RedisSource *)data; + g_return_if_fail(source); + source->poll_fd.events &= ~G_IO_IN; + g_main_context_wakeup(g_source_get_context((GSource *)data)); +} + +static void +redis_source_add_write (gpointer data) +{ + RedisSource *source = (RedisSource *)data; + g_return_if_fail(source); + source->poll_fd.events |= G_IO_OUT; + g_main_context_wakeup(g_source_get_context((GSource *)data)); +} + +static void +redis_source_del_write (gpointer data) +{ + RedisSource *source = (RedisSource *)data; + g_return_if_fail(source); + source->poll_fd.events &= ~G_IO_OUT; + g_main_context_wakeup(g_source_get_context((GSource *)data)); +} + +static void +redis_source_cleanup (gpointer data) +{ + RedisSource *source = (RedisSource *)data; + + g_return_if_fail(source); + + redis_source_del_read(source); + redis_source_del_write(source); + /* + * It is not our responsibility to remove ourself from the + * current main loop. However, we will remove the GPollFD. + */ + if (source->poll_fd.fd >= 0) { + g_source_remove_poll((GSource *)data, &source->poll_fd); + source->poll_fd.fd = -1; + } +} + +static gboolean +redis_source_prepare (GSource *source, + gint *timeout_) +{ + RedisSource *redis = (RedisSource *)source; + *timeout_ = -1; + return !!(redis->poll_fd.events & redis->poll_fd.revents); +} + +static gboolean +redis_source_check (GSource *source) +{ + RedisSource *redis = (RedisSource *)source; + return !!(redis->poll_fd.events & redis->poll_fd.revents); +} + +static gboolean +redis_source_dispatch (GSource *source, + GSourceFunc callback, + gpointer user_data) +{ + RedisSource *redis = (RedisSource *)source; + + if ((redis->poll_fd.revents & G_IO_OUT)) { + redisAsyncHandleWrite(redis->ac); + redis->poll_fd.revents &= ~G_IO_OUT; + } + + if ((redis->poll_fd.revents & G_IO_IN)) { + redisAsyncHandleRead(redis->ac); + redis->poll_fd.revents &= ~G_IO_IN; + } + + if (callback) { + return callback(user_data); + } + + return TRUE; +} + +static void +redis_source_finalize (GSource *source) +{ + RedisSource *redis = (RedisSource *)source; + + if (redis->poll_fd.fd >= 0) { + g_source_remove_poll(source, &redis->poll_fd); + redis->poll_fd.fd = -1; + } +} + +static GSource * +redis_source_new (redisAsyncContext *ac) +{ + static GSourceFuncs source_funcs = { + .prepare = redis_source_prepare, + .check = redis_source_check, + .dispatch = redis_source_dispatch, + .finalize = redis_source_finalize, + }; + redisContext *c = &ac->c; + RedisSource *source; + + g_return_val_if_fail(ac != NULL, NULL); + + source = (RedisSource *)g_source_new(&source_funcs, sizeof *source); + if (source == NULL) + return NULL; + + source->ac = ac; + source->poll_fd.fd = c->fd; + source->poll_fd.events = 0; + source->poll_fd.revents = 0; + g_source_add_poll((GSource *)source, &source->poll_fd); + + ac->ev.addRead = redis_source_add_read; + ac->ev.delRead = redis_source_del_read; + ac->ev.addWrite = redis_source_add_write; + ac->ev.delWrite = redis_source_del_write; + ac->ev.cleanup = redis_source_cleanup; + ac->ev.data = source; + + return (GSource *)source; +} + +#endif /* __HIREDIS_GLIB_H__ */ diff --git a/include/hiredis/adapters/ivykis.h b/include/hiredis/adapters/ivykis.h new file mode 100644 index 0000000..179f6ab --- /dev/null +++ b/include/hiredis/adapters/ivykis.h @@ -0,0 +1,84 @@ +#ifndef __HIREDIS_IVYKIS_H__ +#define __HIREDIS_IVYKIS_H__ +#include +#include "../hiredis.h" +#include "../async.h" + +typedef struct redisIvykisEvents { + redisAsyncContext *context; + struct iv_fd fd; +} redisIvykisEvents; + +static void redisIvykisReadEvent(void *arg) { + redisAsyncContext *context = (redisAsyncContext *)arg; + redisAsyncHandleRead(context); +} + +static void redisIvykisWriteEvent(void *arg) { + redisAsyncContext *context = (redisAsyncContext *)arg; + redisAsyncHandleWrite(context); +} + +static void redisIvykisAddRead(void *privdata) { + redisIvykisEvents *e = (redisIvykisEvents*)privdata; + iv_fd_set_handler_in(&e->fd, redisIvykisReadEvent); +} + +static void redisIvykisDelRead(void *privdata) { + redisIvykisEvents *e = (redisIvykisEvents*)privdata; + iv_fd_set_handler_in(&e->fd, NULL); +} + +static void redisIvykisAddWrite(void *privdata) { + redisIvykisEvents *e = (redisIvykisEvents*)privdata; + iv_fd_set_handler_out(&e->fd, redisIvykisWriteEvent); +} + +static void redisIvykisDelWrite(void *privdata) { + redisIvykisEvents *e = (redisIvykisEvents*)privdata; + iv_fd_set_handler_out(&e->fd, NULL); +} + +static void redisIvykisCleanup(void *privdata) { + redisIvykisEvents *e = (redisIvykisEvents*)privdata; + + iv_fd_unregister(&e->fd); + hi_free(e); +} + +static int redisIvykisAttach(redisAsyncContext *ac) { + redisContext *c = &(ac->c); + redisIvykisEvents *e; + + /* Nothing should be attached when something is already attached */ + if (ac->ev.data != NULL) + return REDIS_ERR; + + /* Create container for context and r/w events */ + e = (redisIvykisEvents*)hi_malloc(sizeof(*e)); + if (e == NULL) + return REDIS_ERR; + + e->context = ac; + + /* Register functions to start/stop listening for events */ + ac->ev.addRead = redisIvykisAddRead; + ac->ev.delRead = redisIvykisDelRead; + ac->ev.addWrite = redisIvykisAddWrite; + ac->ev.delWrite = redisIvykisDelWrite; + ac->ev.cleanup = redisIvykisCleanup; + ac->ev.data = e; + + /* Initialize and install read/write events */ + IV_FD_INIT(&e->fd); + e->fd.fd = c->fd; + e->fd.handler_in = redisIvykisReadEvent; + e->fd.handler_out = redisIvykisWriteEvent; + e->fd.handler_err = NULL; + e->fd.cookie = e->context; + + iv_fd_register(&e->fd); + + return REDIS_OK; +} +#endif diff --git a/include/hiredis/adapters/libev.h b/include/hiredis/adapters/libev.h new file mode 100644 index 0000000..6191543 --- /dev/null +++ b/include/hiredis/adapters/libev.h @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2010-2011, Pieter Noordhuis + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __HIREDIS_LIBEV_H__ +#define __HIREDIS_LIBEV_H__ +#include +#include +#include +#include "../hiredis.h" +#include "../async.h" + +typedef struct redisLibevEvents { + redisAsyncContext *context; + struct ev_loop *loop; + int reading, writing; + ev_io rev, wev; + ev_timer timer; +} redisLibevEvents; + +static void redisLibevReadEvent(EV_P_ ev_io *watcher, int revents) { +#if EV_MULTIPLICITY + ((void)EV_A); +#endif + ((void)revents); + + redisLibevEvents *e = (redisLibevEvents*)watcher->data; + redisAsyncHandleRead(e->context); +} + +static void redisLibevWriteEvent(EV_P_ ev_io *watcher, int revents) { +#if EV_MULTIPLICITY + ((void)EV_A); +#endif + ((void)revents); + + redisLibevEvents *e = (redisLibevEvents*)watcher->data; + redisAsyncHandleWrite(e->context); +} + +static void redisLibevAddRead(void *privdata) { + redisLibevEvents *e = (redisLibevEvents*)privdata; + struct ev_loop *loop = e->loop; + ((void)loop); + if (!e->reading) { + e->reading = 1; + ev_io_start(EV_A_ &e->rev); + } +} + +static void redisLibevDelRead(void *privdata) { + redisLibevEvents *e = (redisLibevEvents*)privdata; + struct ev_loop *loop = e->loop; + ((void)loop); + if (e->reading) { + e->reading = 0; + ev_io_stop(EV_A_ &e->rev); + } +} + +static void redisLibevAddWrite(void *privdata) { + redisLibevEvents *e = (redisLibevEvents*)privdata; + struct ev_loop *loop = e->loop; + ((void)loop); + if (!e->writing) { + e->writing = 1; + ev_io_start(EV_A_ &e->wev); + } +} + +static void redisLibevDelWrite(void *privdata) { + redisLibevEvents *e = (redisLibevEvents*)privdata; + struct ev_loop *loop = e->loop; + ((void)loop); + if (e->writing) { + e->writing = 0; + ev_io_stop(EV_A_ &e->wev); + } +} + +static void redisLibevStopTimer(void *privdata) { + redisLibevEvents *e = (redisLibevEvents*)privdata; + struct ev_loop *loop = e->loop; + ((void)loop); + ev_timer_stop(EV_A_ &e->timer); +} + +static void redisLibevCleanup(void *privdata) { + redisLibevEvents *e = (redisLibevEvents*)privdata; + redisLibevDelRead(privdata); + redisLibevDelWrite(privdata); + redisLibevStopTimer(privdata); + hi_free(e); +} + +static void redisLibevTimeout(EV_P_ ev_timer *timer, int revents) { + ((void)revents); + redisLibevEvents *e = (redisLibevEvents*)timer->data; + redisAsyncHandleTimeout(e->context); +} + +static void redisLibevSetTimeout(void *privdata, struct timeval tv) { + redisLibevEvents *e = (redisLibevEvents*)privdata; + struct ev_loop *loop = e->loop; + ((void)loop); + + if (!ev_is_active(&e->timer)) { + ev_init(&e->timer, redisLibevTimeout); + e->timer.data = e; + } + + e->timer.repeat = tv.tv_sec + tv.tv_usec / 1000000.00; + ev_timer_again(EV_A_ &e->timer); +} + +static int redisLibevAttach(EV_P_ redisAsyncContext *ac) { + redisContext *c = &(ac->c); + redisLibevEvents *e; + + /* Nothing should be attached when something is already attached */ + if (ac->ev.data != NULL) + return REDIS_ERR; + + /* Create container for context and r/w events */ + e = (redisLibevEvents*)hi_calloc(1, sizeof(*e)); + if (e == NULL) + return REDIS_ERR; + + e->context = ac; +#if EV_MULTIPLICITY + e->loop = EV_A; +#else + e->loop = NULL; +#endif + e->rev.data = e; + e->wev.data = e; + + /* Register functions to start/stop listening for events */ + ac->ev.addRead = redisLibevAddRead; + ac->ev.delRead = redisLibevDelRead; + ac->ev.addWrite = redisLibevAddWrite; + ac->ev.delWrite = redisLibevDelWrite; + ac->ev.cleanup = redisLibevCleanup; + ac->ev.scheduleTimer = redisLibevSetTimeout; + ac->ev.data = e; + + /* Initialize read/write events */ + ev_io_init(&e->rev,redisLibevReadEvent,c->fd,EV_READ); + ev_io_init(&e->wev,redisLibevWriteEvent,c->fd,EV_WRITE); + return REDIS_OK; +} + +#endif diff --git a/include/hiredis/adapters/libevent.h b/include/hiredis/adapters/libevent.h new file mode 100644 index 0000000..9150979 --- /dev/null +++ b/include/hiredis/adapters/libevent.h @@ -0,0 +1,175 @@ +/* + * Copyright (c) 2010-2011, Pieter Noordhuis + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __HIREDIS_LIBEVENT_H__ +#define __HIREDIS_LIBEVENT_H__ +#include +#include "../hiredis.h" +#include "../async.h" + +#define REDIS_LIBEVENT_DELETED 0x01 +#define REDIS_LIBEVENT_ENTERED 0x02 + +typedef struct redisLibeventEvents { + redisAsyncContext *context; + struct event *ev; + struct event_base *base; + struct timeval tv; + short flags; + short state; +} redisLibeventEvents; + +static void redisLibeventDestroy(redisLibeventEvents *e) { + hi_free(e); +} + +static void redisLibeventHandler(int fd, short event, void *arg) { + ((void)fd); + redisLibeventEvents *e = (redisLibeventEvents*)arg; + e->state |= REDIS_LIBEVENT_ENTERED; + + #define CHECK_DELETED() if (e->state & REDIS_LIBEVENT_DELETED) {\ + redisLibeventDestroy(e);\ + return; \ + } + + if ((event & EV_TIMEOUT) && (e->state & REDIS_LIBEVENT_DELETED) == 0) { + redisAsyncHandleTimeout(e->context); + CHECK_DELETED(); + } + + if ((event & EV_READ) && e->context && (e->state & REDIS_LIBEVENT_DELETED) == 0) { + redisAsyncHandleRead(e->context); + CHECK_DELETED(); + } + + if ((event & EV_WRITE) && e->context && (e->state & REDIS_LIBEVENT_DELETED) == 0) { + redisAsyncHandleWrite(e->context); + CHECK_DELETED(); + } + + e->state &= ~REDIS_LIBEVENT_ENTERED; + #undef CHECK_DELETED +} + +static void redisLibeventUpdate(void *privdata, short flag, int isRemove) { + redisLibeventEvents *e = (redisLibeventEvents *)privdata; + const struct timeval *tv = e->tv.tv_sec || e->tv.tv_usec ? &e->tv : NULL; + + if (isRemove) { + if ((e->flags & flag) == 0) { + return; + } else { + e->flags &= ~flag; + } + } else { + if (e->flags & flag) { + return; + } else { + e->flags |= flag; + } + } + + event_del(e->ev); + event_assign(e->ev, e->base, e->context->c.fd, e->flags | EV_PERSIST, + redisLibeventHandler, privdata); + event_add(e->ev, tv); +} + +static void redisLibeventAddRead(void *privdata) { + redisLibeventUpdate(privdata, EV_READ, 0); +} + +static void redisLibeventDelRead(void *privdata) { + redisLibeventUpdate(privdata, EV_READ, 1); +} + +static void redisLibeventAddWrite(void *privdata) { + redisLibeventUpdate(privdata, EV_WRITE, 0); +} + +static void redisLibeventDelWrite(void *privdata) { + redisLibeventUpdate(privdata, EV_WRITE, 1); +} + +static void redisLibeventCleanup(void *privdata) { + redisLibeventEvents *e = (redisLibeventEvents*)privdata; + if (!e) { + return; + } + event_del(e->ev); + event_free(e->ev); + e->ev = NULL; + + if (e->state & REDIS_LIBEVENT_ENTERED) { + e->state |= REDIS_LIBEVENT_DELETED; + } else { + redisLibeventDestroy(e); + } +} + +static void redisLibeventSetTimeout(void *privdata, struct timeval tv) { + redisLibeventEvents *e = (redisLibeventEvents *)privdata; + short flags = e->flags; + e->flags = 0; + e->tv = tv; + redisLibeventUpdate(e, flags, 0); +} + +static int redisLibeventAttach(redisAsyncContext *ac, struct event_base *base) { + redisContext *c = &(ac->c); + redisLibeventEvents *e; + + /* Nothing should be attached when something is already attached */ + if (ac->ev.data != NULL) + return REDIS_ERR; + + /* Create container for context and r/w events */ + e = (redisLibeventEvents*)hi_calloc(1, sizeof(*e)); + if (e == NULL) + return REDIS_ERR; + + e->context = ac; + + /* Register functions to start/stop listening for events */ + ac->ev.addRead = redisLibeventAddRead; + ac->ev.delRead = redisLibeventDelRead; + ac->ev.addWrite = redisLibeventAddWrite; + ac->ev.delWrite = redisLibeventDelWrite; + ac->ev.cleanup = redisLibeventCleanup; + ac->ev.scheduleTimer = redisLibeventSetTimeout; + ac->ev.data = e; + + /* Initialize and install read/write events */ + e->ev = event_new(base, c->fd, EV_READ | EV_WRITE, redisLibeventHandler, e); + e->base = base; + return REDIS_OK; +} +#endif diff --git a/include/hiredis/adapters/libuv.h b/include/hiredis/adapters/libuv.h new file mode 100644 index 0000000..c120b1b --- /dev/null +++ b/include/hiredis/adapters/libuv.h @@ -0,0 +1,117 @@ +#ifndef __HIREDIS_LIBUV_H__ +#define __HIREDIS_LIBUV_H__ +#include +#include +#include "../hiredis.h" +#include "../async.h" +#include + +typedef struct redisLibuvEvents { + redisAsyncContext* context; + uv_poll_t handle; + int events; +} redisLibuvEvents; + + +static void redisLibuvPoll(uv_poll_t* handle, int status, int events) { + redisLibuvEvents* p = (redisLibuvEvents*)handle->data; + int ev = (status ? p->events : events); + + if (p->context != NULL && (ev & UV_READABLE)) { + redisAsyncHandleRead(p->context); + } + if (p->context != NULL && (ev & UV_WRITABLE)) { + redisAsyncHandleWrite(p->context); + } +} + + +static void redisLibuvAddRead(void *privdata) { + redisLibuvEvents* p = (redisLibuvEvents*)privdata; + + p->events |= UV_READABLE; + + uv_poll_start(&p->handle, p->events, redisLibuvPoll); +} + + +static void redisLibuvDelRead(void *privdata) { + redisLibuvEvents* p = (redisLibuvEvents*)privdata; + + p->events &= ~UV_READABLE; + + if (p->events) { + uv_poll_start(&p->handle, p->events, redisLibuvPoll); + } else { + uv_poll_stop(&p->handle); + } +} + + +static void redisLibuvAddWrite(void *privdata) { + redisLibuvEvents* p = (redisLibuvEvents*)privdata; + + p->events |= UV_WRITABLE; + + uv_poll_start(&p->handle, p->events, redisLibuvPoll); +} + + +static void redisLibuvDelWrite(void *privdata) { + redisLibuvEvents* p = (redisLibuvEvents*)privdata; + + p->events &= ~UV_WRITABLE; + + if (p->events) { + uv_poll_start(&p->handle, p->events, redisLibuvPoll); + } else { + uv_poll_stop(&p->handle); + } +} + + +static void on_close(uv_handle_t* handle) { + redisLibuvEvents* p = (redisLibuvEvents*)handle->data; + + hi_free(p); +} + + +static void redisLibuvCleanup(void *privdata) { + redisLibuvEvents* p = (redisLibuvEvents*)privdata; + + p->context = NULL; // indicate that context might no longer exist + uv_close((uv_handle_t*)&p->handle, on_close); +} + + +static int redisLibuvAttach(redisAsyncContext* ac, uv_loop_t* loop) { + redisContext *c = &(ac->c); + + if (ac->ev.data != NULL) { + return REDIS_ERR; + } + + ac->ev.addRead = redisLibuvAddRead; + ac->ev.delRead = redisLibuvDelRead; + ac->ev.addWrite = redisLibuvAddWrite; + ac->ev.delWrite = redisLibuvDelWrite; + ac->ev.cleanup = redisLibuvCleanup; + + redisLibuvEvents* p = (redisLibuvEvents*)hi_malloc(sizeof(*p)); + if (p == NULL) + return REDIS_ERR; + + memset(p, 0, sizeof(*p)); + + if (uv_poll_init_socket(loop, &p->handle, c->fd) != 0) { + return REDIS_ERR; + } + + ac->ev.data = p; + p->handle.data = p; + p->context = ac; + + return REDIS_OK; +} +#endif diff --git a/include/hiredis/adapters/macosx.h b/include/hiredis/adapters/macosx.h new file mode 100644 index 0000000..3c87f1b --- /dev/null +++ b/include/hiredis/adapters/macosx.h @@ -0,0 +1,115 @@ +// +// Created by Дмитрий Бахвалов on 13.07.15. +// Copyright (c) 2015 Dmitry Bakhvalov. All rights reserved. +// + +#ifndef __HIREDIS_MACOSX_H__ +#define __HIREDIS_MACOSX_H__ + +#include + +#include "../hiredis.h" +#include "../async.h" + +typedef struct { + redisAsyncContext *context; + CFSocketRef socketRef; + CFRunLoopSourceRef sourceRef; +} RedisRunLoop; + +static int freeRedisRunLoop(RedisRunLoop* redisRunLoop) { + if( redisRunLoop != NULL ) { + if( redisRunLoop->sourceRef != NULL ) { + CFRunLoopSourceInvalidate(redisRunLoop->sourceRef); + CFRelease(redisRunLoop->sourceRef); + } + if( redisRunLoop->socketRef != NULL ) { + CFSocketInvalidate(redisRunLoop->socketRef); + CFRelease(redisRunLoop->socketRef); + } + hi_free(redisRunLoop); + } + return REDIS_ERR; +} + +static void redisMacOSAddRead(void *privdata) { + RedisRunLoop *redisRunLoop = (RedisRunLoop*)privdata; + CFSocketEnableCallBacks(redisRunLoop->socketRef, kCFSocketReadCallBack); +} + +static void redisMacOSDelRead(void *privdata) { + RedisRunLoop *redisRunLoop = (RedisRunLoop*)privdata; + CFSocketDisableCallBacks(redisRunLoop->socketRef, kCFSocketReadCallBack); +} + +static void redisMacOSAddWrite(void *privdata) { + RedisRunLoop *redisRunLoop = (RedisRunLoop*)privdata; + CFSocketEnableCallBacks(redisRunLoop->socketRef, kCFSocketWriteCallBack); +} + +static void redisMacOSDelWrite(void *privdata) { + RedisRunLoop *redisRunLoop = (RedisRunLoop*)privdata; + CFSocketDisableCallBacks(redisRunLoop->socketRef, kCFSocketWriteCallBack); +} + +static void redisMacOSCleanup(void *privdata) { + RedisRunLoop *redisRunLoop = (RedisRunLoop*)privdata; + freeRedisRunLoop(redisRunLoop); +} + +static void redisMacOSAsyncCallback(CFSocketRef __unused s, CFSocketCallBackType callbackType, CFDataRef __unused address, const void __unused *data, void *info) { + redisAsyncContext* context = (redisAsyncContext*) info; + + switch (callbackType) { + case kCFSocketReadCallBack: + redisAsyncHandleRead(context); + break; + + case kCFSocketWriteCallBack: + redisAsyncHandleWrite(context); + break; + + default: + break; + } +} + +static int redisMacOSAttach(redisAsyncContext *redisAsyncCtx, CFRunLoopRef runLoop) { + redisContext *redisCtx = &(redisAsyncCtx->c); + + /* Nothing should be attached when something is already attached */ + if( redisAsyncCtx->ev.data != NULL ) return REDIS_ERR; + + RedisRunLoop* redisRunLoop = (RedisRunLoop*) hi_calloc(1, sizeof(RedisRunLoop)); + if (redisRunLoop == NULL) + return REDIS_ERR; + + /* Setup redis stuff */ + redisRunLoop->context = redisAsyncCtx; + + redisAsyncCtx->ev.addRead = redisMacOSAddRead; + redisAsyncCtx->ev.delRead = redisMacOSDelRead; + redisAsyncCtx->ev.addWrite = redisMacOSAddWrite; + redisAsyncCtx->ev.delWrite = redisMacOSDelWrite; + redisAsyncCtx->ev.cleanup = redisMacOSCleanup; + redisAsyncCtx->ev.data = redisRunLoop; + + /* Initialize and install read/write events */ + CFSocketContext socketCtx = { 0, redisAsyncCtx, NULL, NULL, NULL }; + + redisRunLoop->socketRef = CFSocketCreateWithNative(NULL, redisCtx->fd, + kCFSocketReadCallBack | kCFSocketWriteCallBack, + redisMacOSAsyncCallback, + &socketCtx); + if( !redisRunLoop->socketRef ) return freeRedisRunLoop(redisRunLoop); + + redisRunLoop->sourceRef = CFSocketCreateRunLoopSource(NULL, redisRunLoop->socketRef, 0); + if( !redisRunLoop->sourceRef ) return freeRedisRunLoop(redisRunLoop); + + CFRunLoopAddSource(runLoop, redisRunLoop->sourceRef, kCFRunLoopDefaultMode); + + return REDIS_OK; +} + +#endif + diff --git a/include/hiredis/adapters/qt.h b/include/hiredis/adapters/qt.h new file mode 100644 index 0000000..5cc02e6 --- /dev/null +++ b/include/hiredis/adapters/qt.h @@ -0,0 +1,135 @@ +/*- + * Copyright (C) 2014 Pietro Cerutti + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef __HIREDIS_QT_H__ +#define __HIREDIS_QT_H__ +#include +#include "../async.h" + +static void RedisQtAddRead(void *); +static void RedisQtDelRead(void *); +static void RedisQtAddWrite(void *); +static void RedisQtDelWrite(void *); +static void RedisQtCleanup(void *); + +class RedisQtAdapter : public QObject { + + Q_OBJECT + + friend + void RedisQtAddRead(void * adapter) { + RedisQtAdapter * a = static_cast(adapter); + a->addRead(); + } + + friend + void RedisQtDelRead(void * adapter) { + RedisQtAdapter * a = static_cast(adapter); + a->delRead(); + } + + friend + void RedisQtAddWrite(void * adapter) { + RedisQtAdapter * a = static_cast(adapter); + a->addWrite(); + } + + friend + void RedisQtDelWrite(void * adapter) { + RedisQtAdapter * a = static_cast(adapter); + a->delWrite(); + } + + friend + void RedisQtCleanup(void * adapter) { + RedisQtAdapter * a = static_cast(adapter); + a->cleanup(); + } + + public: + RedisQtAdapter(QObject * parent = 0) + : QObject(parent), m_ctx(0), m_read(0), m_write(0) { } + + ~RedisQtAdapter() { + if (m_ctx != 0) { + m_ctx->ev.data = NULL; + } + } + + int setContext(redisAsyncContext * ac) { + if (ac->ev.data != NULL) { + return REDIS_ERR; + } + m_ctx = ac; + m_ctx->ev.data = this; + m_ctx->ev.addRead = RedisQtAddRead; + m_ctx->ev.delRead = RedisQtDelRead; + m_ctx->ev.addWrite = RedisQtAddWrite; + m_ctx->ev.delWrite = RedisQtDelWrite; + m_ctx->ev.cleanup = RedisQtCleanup; + return REDIS_OK; + } + + private: + void addRead() { + if (m_read) return; + m_read = new QSocketNotifier(m_ctx->c.fd, QSocketNotifier::Read, 0); + connect(m_read, SIGNAL(activated(int)), this, SLOT(read())); + } + + void delRead() { + if (!m_read) return; + delete m_read; + m_read = 0; + } + + void addWrite() { + if (m_write) return; + m_write = new QSocketNotifier(m_ctx->c.fd, QSocketNotifier::Write, 0); + connect(m_write, SIGNAL(activated(int)), this, SLOT(write())); + } + + void delWrite() { + if (!m_write) return; + delete m_write; + m_write = 0; + } + + void cleanup() { + delRead(); + delWrite(); + } + + private slots: + void read() { redisAsyncHandleRead(m_ctx); } + void write() { redisAsyncHandleWrite(m_ctx); } + + private: + redisAsyncContext * m_ctx; + QSocketNotifier * m_read; + QSocketNotifier * m_write; +}; + +#endif /* !__HIREDIS_QT_H__ */ diff --git a/include/hiredis/alloc.h b/include/hiredis/alloc.h new file mode 100644 index 0000000..34a05f4 --- /dev/null +++ b/include/hiredis/alloc.h @@ -0,0 +1,91 @@ +/* + * Copyright (c) 2020, Michael Grunder + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef HIREDIS_ALLOC_H +#define HIREDIS_ALLOC_H + +#include /* for size_t */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Structure pointing to our actually configured allocators */ +typedef struct hiredisAllocFuncs { + void *(*mallocFn)(size_t); + void *(*callocFn)(size_t,size_t); + void *(*reallocFn)(void*,size_t); + char *(*strdupFn)(const char*); + void (*freeFn)(void*); +} hiredisAllocFuncs; + +hiredisAllocFuncs hiredisSetAllocators(hiredisAllocFuncs *ha); +void hiredisResetAllocators(void); + +#ifndef _WIN32 + +/* Hiredis' configured allocator function pointer struct */ +extern hiredisAllocFuncs hiredisAllocFns; + +static inline void *hi_malloc(size_t size) { + return hiredisAllocFns.mallocFn(size); +} + +static inline void *hi_calloc(size_t nmemb, size_t size) { + return hiredisAllocFns.callocFn(nmemb, size); +} + +static inline void *hi_realloc(void *ptr, size_t size) { + return hiredisAllocFns.reallocFn(ptr, size); +} + +static inline char *hi_strdup(const char *str) { + return hiredisAllocFns.strdupFn(str); +} + +static inline void hi_free(void *ptr) { + hiredisAllocFns.freeFn(ptr); +} + +#else + +void *hi_malloc(size_t size); +void *hi_calloc(size_t nmemb, size_t size); +void *hi_realloc(void *ptr, size_t size); +char *hi_strdup(const char *str); +void hi_free(void *ptr); + +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* HIREDIS_ALLOC_H */ diff --git a/include/hiredis/async.h b/include/hiredis/async.h new file mode 100644 index 0000000..b1d2cb2 --- /dev/null +++ b/include/hiredis/async.h @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2009-2011, Salvatore Sanfilippo + * Copyright (c) 2010-2011, Pieter Noordhuis + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __HIREDIS_ASYNC_H +#define __HIREDIS_ASYNC_H +#include "hiredis.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct redisAsyncContext; /* need forward declaration of redisAsyncContext */ +struct dict; /* dictionary header is included in async.c */ + +/* Reply callback prototype and container */ +typedef void (redisCallbackFn)(struct redisAsyncContext*, void*, void*); +typedef struct redisCallback { + struct redisCallback *next; /* simple singly linked list */ + redisCallbackFn *fn; + int pending_subs; + void *privdata; +} redisCallback; + +/* List of callbacks for either regular replies or pub/sub */ +typedef struct redisCallbackList { + redisCallback *head, *tail; +} redisCallbackList; + +/* Connection callback prototypes */ +typedef void (redisDisconnectCallback)(const struct redisAsyncContext*, int status); +typedef void (redisConnectCallback)(const struct redisAsyncContext*, int status); +typedef void(redisTimerCallback)(void *timer, void *privdata); + +/* Context for an async connection to Redis */ +typedef struct redisAsyncContext { + /* Hold the regular context, so it can be realloc'ed. */ + redisContext c; + + /* Setup error flags so they can be used directly. */ + int err; + char *errstr; + + /* Not used by hiredis */ + void *data; + void (*dataCleanup)(void *privdata); + + /* Event library data and hooks */ + struct { + void *data; + + /* Hooks that are called when the library expects to start + * reading/writing. These functions should be idempotent. */ + void (*addRead)(void *privdata); + void (*delRead)(void *privdata); + void (*addWrite)(void *privdata); + void (*delWrite)(void *privdata); + void (*cleanup)(void *privdata); + void (*scheduleTimer)(void *privdata, struct timeval tv); + } ev; + + /* Called when either the connection is terminated due to an error or per + * user request. The status is set accordingly (REDIS_OK, REDIS_ERR). */ + redisDisconnectCallback *onDisconnect; + + /* Called when the first write event was received. */ + redisConnectCallback *onConnect; + + /* Regular command callbacks */ + redisCallbackList replies; + + /* Address used for connect() */ + struct sockaddr *saddr; + size_t addrlen; + + /* Subscription callbacks */ + struct { + redisCallbackList invalid; + struct dict *channels; + struct dict *patterns; + } sub; + + /* Any configured RESP3 PUSH handler */ + redisAsyncPushFn *push_cb; +} redisAsyncContext; + +/* Functions that proxy to hiredis */ +redisAsyncContext *redisAsyncConnectWithOptions(const redisOptions *options); +redisAsyncContext *redisAsyncConnect(const char *ip, int port); +redisAsyncContext *redisAsyncConnectBind(const char *ip, int port, const char *source_addr); +redisAsyncContext *redisAsyncConnectBindWithReuse(const char *ip, int port, + const char *source_addr); +redisAsyncContext *redisAsyncConnectUnix(const char *path); +int redisAsyncSetConnectCallback(redisAsyncContext *ac, redisConnectCallback *fn); +int redisAsyncSetDisconnectCallback(redisAsyncContext *ac, redisDisconnectCallback *fn); + +redisAsyncPushFn *redisAsyncSetPushCallback(redisAsyncContext *ac, redisAsyncPushFn *fn); +int redisAsyncSetTimeout(redisAsyncContext *ac, struct timeval tv); +void redisAsyncDisconnect(redisAsyncContext *ac); +void redisAsyncFree(redisAsyncContext *ac); + +/* Handle read/write events */ +void redisAsyncHandleRead(redisAsyncContext *ac); +void redisAsyncHandleWrite(redisAsyncContext *ac); +void redisAsyncHandleTimeout(redisAsyncContext *ac); +void redisAsyncRead(redisAsyncContext *ac); +void redisAsyncWrite(redisAsyncContext *ac); + +/* Command functions for an async context. Write the command to the + * output buffer and register the provided callback. */ +int redisvAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, const char *format, va_list ap); +int redisAsyncCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, const char *format, ...); +int redisAsyncCommandArgv(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, int argc, const char **argv, const size_t *argvlen); +int redisAsyncFormattedCommand(redisAsyncContext *ac, redisCallbackFn *fn, void *privdata, const char *cmd, size_t len); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/hiredis/hiredis.h b/include/hiredis/hiredis.h new file mode 100644 index 0000000..e77a88a --- /dev/null +++ b/include/hiredis/hiredis.h @@ -0,0 +1,337 @@ +/* + * Copyright (c) 2009-2011, Salvatore Sanfilippo + * Copyright (c) 2010-2014, Pieter Noordhuis + * Copyright (c) 2015, Matt Stancliff , + * Jan-Erik Rediger + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __HIREDIS_H +#define __HIREDIS_H +#include "read.h" +#include /* for va_list */ +#ifndef _MSC_VER +#include /* for struct timeval */ +#else +struct timeval; /* forward declaration */ +typedef long long ssize_t; +#endif +#include /* uintXX_t, etc */ +#include "sds.h" /* for sds */ +#include "alloc.h" /* for allocation wrappers */ + +#define HIREDIS_MAJOR 1 +#define HIREDIS_MINOR 0 +#define HIREDIS_PATCH 1 +#define HIREDIS_SONAME 1.0.1-dev + +/* Connection type can be blocking or non-blocking and is set in the + * least significant bit of the flags field in redisContext. */ +#define REDIS_BLOCK 0x1 + +/* Connection may be disconnected before being free'd. The second bit + * in the flags field is set when the context is connected. */ +#define REDIS_CONNECTED 0x2 + +/* The async API might try to disconnect cleanly and flush the output + * buffer and read all subsequent replies before disconnecting. + * This flag means no new commands can come in and the connection + * should be terminated once all replies have been read. */ +#define REDIS_DISCONNECTING 0x4 + +/* Flag specific to the async API which means that the context should be clean + * up as soon as possible. */ +#define REDIS_FREEING 0x8 + +/* Flag that is set when an async callback is executed. */ +#define REDIS_IN_CALLBACK 0x10 + +/* Flag that is set when the async context has one or more subscriptions. */ +#define REDIS_SUBSCRIBED 0x20 + +/* Flag that is set when monitor mode is active */ +#define REDIS_MONITORING 0x40 + +/* Flag that is set when we should set SO_REUSEADDR before calling bind() */ +#define REDIS_REUSEADDR 0x80 + +/** + * Flag that indicates the user does not want the context to + * be automatically freed upon error + */ +#define REDIS_NO_AUTO_FREE 0x200 + +#define REDIS_KEEPALIVE_INTERVAL 15 /* seconds */ + +/* number of times we retry to connect in the case of EADDRNOTAVAIL and + * SO_REUSEADDR is being used. */ +#define REDIS_CONNECT_RETRIES 10 + +/* Forward declarations for structs defined elsewhere */ +struct redisAsyncContext; +struct redisContext; + +/* RESP3 push helpers and callback prototypes */ +#define redisIsPushReply(r) (((redisReply*)(r))->type == REDIS_REPLY_PUSH) +typedef void (redisPushFn)(void *, void *); +typedef void (redisAsyncPushFn)(struct redisAsyncContext *, void *); + +#ifdef __cplusplus +extern "C" { +#endif + +/* This is the reply object returned by redisCommand() */ +typedef struct redisReply { + int type; /* REDIS_REPLY_* */ + long long integer; /* The integer when type is REDIS_REPLY_INTEGER */ + double dval; /* The double when type is REDIS_REPLY_DOUBLE */ + size_t len; /* Length of string */ + char *str; /* Used for REDIS_REPLY_ERROR, REDIS_REPLY_STRING + REDIS_REPLY_VERB, REDIS_REPLY_DOUBLE (in additional to dval), + and REDIS_REPLY_BIGNUM. */ + char vtype[4]; /* Used for REDIS_REPLY_VERB, contains the null + terminated 3 character content type, such as "txt". */ + size_t elements; /* number of elements, for REDIS_REPLY_ARRAY */ + struct redisReply **element; /* elements vector for REDIS_REPLY_ARRAY */ +} redisReply; + +redisReader *redisReaderCreate(void); + +/* Function to free the reply objects hiredis returns by default. */ +void freeReplyObject(void *reply); + +/* Functions to format a command according to the protocol. */ +int redisvFormatCommand(char **target, const char *format, va_list ap); +int redisFormatCommand(char **target, const char *format, ...); +int redisFormatCommandArgv(char **target, int argc, const char **argv, const size_t *argvlen); +int redisFormatSdsCommandArgv(sds *target, int argc, const char ** argv, const size_t *argvlen); +void redisFreeCommand(char *cmd); +void redisFreeSdsCommand(sds cmd); + +enum redisConnectionType { + REDIS_CONN_TCP, + REDIS_CONN_UNIX, + REDIS_CONN_USERFD +}; + +struct redisSsl; + +#define REDIS_OPT_NONBLOCK 0x01 +#define REDIS_OPT_REUSEADDR 0x02 + +/** + * Don't automatically free the async object on a connection failure, + * or other implicit conditions. Only free on an explicit call to disconnect() or free() + */ +#define REDIS_OPT_NOAUTOFREE 0x04 + +/* Don't automatically intercept and free RESP3 PUSH replies. */ +#define REDIS_OPT_NO_PUSH_AUTOFREE 0x08 + +/* In Unix systems a file descriptor is a regular signed int, with -1 + * representing an invalid descriptor. In Windows it is a SOCKET + * (32- or 64-bit unsigned integer depending on the architecture), where + * all bits set (~0) is INVALID_SOCKET. */ +#ifndef _WIN32 +typedef int redisFD; +#define REDIS_INVALID_FD -1 +#else +#ifdef _WIN64 +typedef unsigned long long redisFD; /* SOCKET = 64-bit UINT_PTR */ +#else +typedef unsigned long redisFD; /* SOCKET = 32-bit UINT_PTR */ +#endif +#define REDIS_INVALID_FD ((redisFD)(~0)) /* INVALID_SOCKET */ +#endif + +typedef struct { + /* + * the type of connection to use. This also indicates which + * `endpoint` member field to use + */ + int type; + /* bit field of REDIS_OPT_xxx */ + int options; + /* timeout value for connect operation. If NULL, no timeout is used */ + const struct timeval *connect_timeout; + /* timeout value for commands. If NULL, no timeout is used. This can be + * updated at runtime with redisSetTimeout/redisAsyncSetTimeout. */ + const struct timeval *command_timeout; + union { + /** use this field for tcp/ip connections */ + struct { + const char *source_addr; + const char *ip; + int port; + } tcp; + /** use this field for unix domain sockets */ + const char *unix_socket; + /** + * use this field to have hiredis operate an already-open + * file descriptor */ + redisFD fd; + } endpoint; + + /* Optional user defined data/destructor */ + void *privdata; + void (*free_privdata)(void *); + + /* A user defined PUSH message callback */ + redisPushFn *push_cb; + redisAsyncPushFn *async_push_cb; +} redisOptions; + +/** + * Helper macros to initialize options to their specified fields. + */ +#define REDIS_OPTIONS_SET_TCP(opts, ip_, port_) \ + (opts)->type = REDIS_CONN_TCP; \ + (opts)->endpoint.tcp.ip = ip_; \ + (opts)->endpoint.tcp.port = port_; + +#define REDIS_OPTIONS_SET_UNIX(opts, path) \ + (opts)->type = REDIS_CONN_UNIX; \ + (opts)->endpoint.unix_socket = path; + +#define REDIS_OPTIONS_SET_PRIVDATA(opts, data, dtor) \ + (opts)->privdata = data; \ + (opts)->free_privdata = dtor; \ + +typedef struct redisContextFuncs { + void (*free_privctx)(void *); + void (*async_read)(struct redisAsyncContext *); + void (*async_write)(struct redisAsyncContext *); + ssize_t (*read)(struct redisContext *, char *, size_t); + ssize_t (*write)(struct redisContext *); +} redisContextFuncs; + +/* Context for a connection to Redis */ +typedef struct redisContext { + const redisContextFuncs *funcs; /* Function table */ + + int err; /* Error flags, 0 when there is no error */ + char errstr[128]; /* String representation of error when applicable */ + redisFD fd; + int flags; + char *obuf; /* Write buffer */ + redisReader *reader; /* Protocol reader */ + + enum redisConnectionType connection_type; + struct timeval *connect_timeout; + struct timeval *command_timeout; + + struct { + char *host; + char *source_addr; + int port; + } tcp; + + struct { + char *path; + } unix_sock; + + /* For non-blocking connect */ + struct sockaddr *saddr; + size_t addrlen; + + /* Optional data and corresponding destructor users can use to provide + * context to a given redisContext. Not used by hiredis. */ + void *privdata; + void (*free_privdata)(void *); + + /* Internal context pointer presently used by hiredis to manage + * SSL connections. */ + void *privctx; + + /* An optional RESP3 PUSH handler */ + redisPushFn *push_cb; +} redisContext; + +redisContext *redisConnectWithOptions(const redisOptions *options); +redisContext *redisConnect(const char *ip, int port); +redisContext *redisConnectWithTimeout(const char *ip, int port, const struct timeval tv); +redisContext *redisConnectNonBlock(const char *ip, int port); +redisContext *redisConnectBindNonBlock(const char *ip, int port, + const char *source_addr); +redisContext *redisConnectBindNonBlockWithReuse(const char *ip, int port, + const char *source_addr); +redisContext *redisConnectUnix(const char *path); +redisContext *redisConnectUnixWithTimeout(const char *path, const struct timeval tv); +redisContext *redisConnectUnixNonBlock(const char *path); +redisContext *redisConnectFd(redisFD fd); + +/** + * Reconnect the given context using the saved information. + * + * This re-uses the exact same connect options as in the initial connection. + * host, ip (or path), timeout and bind address are reused, + * flags are used unmodified from the existing context. + * + * Returns REDIS_OK on successful connect or REDIS_ERR otherwise. + */ +int redisReconnect(redisContext *c); + +redisPushFn *redisSetPushCallback(redisContext *c, redisPushFn *fn); +int redisSetTimeout(redisContext *c, const struct timeval tv); +int redisEnableKeepAlive(redisContext *c); +void redisFree(redisContext *c); +redisFD redisFreeKeepFd(redisContext *c); +int redisBufferRead(redisContext *c); +int redisBufferWrite(redisContext *c, int *done); + +/* In a blocking context, this function first checks if there are unconsumed + * replies to return and returns one if so. Otherwise, it flushes the output + * buffer to the socket and reads until it has a reply. In a non-blocking + * context, it will return unconsumed replies until there are no more. */ +int redisGetReply(redisContext *c, void **reply); +int redisGetReplyFromReader(redisContext *c, void **reply); + +/* Write a formatted command to the output buffer. Use these functions in blocking mode + * to get a pipeline of commands. */ +int redisAppendFormattedCommand(redisContext *c, const char *cmd, size_t len); + +/* Write a command to the output buffer. Use these functions in blocking mode + * to get a pipeline of commands. */ +int redisvAppendCommand(redisContext *c, const char *format, va_list ap); +int redisAppendCommand(redisContext *c, const char *format, ...); +int redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen); + +/* Issue a command to Redis. In a blocking context, it is identical to calling + * redisAppendCommand, followed by redisGetReply. The function will return + * NULL if there was an error in performing the request, otherwise it will + * return the reply. In a non-blocking context, it is identical to calling + * only redisAppendCommand and will always return NULL. */ +void *redisvCommand(redisContext *c, const char *format, va_list ap); +void *redisCommand(redisContext *c, const char *format, ...); +void *redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/hiredis/read.h b/include/hiredis/read.h new file mode 100644 index 0000000..2d74d77 --- /dev/null +++ b/include/hiredis/read.h @@ -0,0 +1,129 @@ +/* + * Copyright (c) 2009-2011, Salvatore Sanfilippo + * Copyright (c) 2010-2011, Pieter Noordhuis + * + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + + +#ifndef __HIREDIS_READ_H +#define __HIREDIS_READ_H +#include /* for size_t */ + +#define REDIS_ERR -1 +#define REDIS_OK 0 + +/* When an error occurs, the err flag in a context is set to hold the type of + * error that occurred. REDIS_ERR_IO means there was an I/O error and you + * should use the "errno" variable to find out what is wrong. + * For other values, the "errstr" field will hold a description. */ +#define REDIS_ERR_IO 1 /* Error in read or write */ +#define REDIS_ERR_EOF 3 /* End of file */ +#define REDIS_ERR_PROTOCOL 4 /* Protocol error */ +#define REDIS_ERR_OOM 5 /* Out of memory */ +#define REDIS_ERR_TIMEOUT 6 /* Timed out */ +#define REDIS_ERR_OTHER 2 /* Everything else... */ + +#define REDIS_REPLY_STRING 1 +#define REDIS_REPLY_ARRAY 2 +#define REDIS_REPLY_INTEGER 3 +#define REDIS_REPLY_NIL 4 +#define REDIS_REPLY_STATUS 5 +#define REDIS_REPLY_ERROR 6 +#define REDIS_REPLY_DOUBLE 7 +#define REDIS_REPLY_BOOL 8 +#define REDIS_REPLY_MAP 9 +#define REDIS_REPLY_SET 10 +#define REDIS_REPLY_ATTR 11 +#define REDIS_REPLY_PUSH 12 +#define REDIS_REPLY_BIGNUM 13 +#define REDIS_REPLY_VERB 14 + +/* Default max unused reader buffer. */ +#define REDIS_READER_MAX_BUF (1024*16) + +/* Default multi-bulk element limit */ +#define REDIS_READER_MAX_ARRAY_ELEMENTS ((1LL<<32) - 1) + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct redisReadTask { + int type; + long long elements; /* number of elements in multibulk container */ + int idx; /* index in parent (array) object */ + void *obj; /* holds user-generated value for a read task */ + struct redisReadTask *parent; /* parent task */ + void *privdata; /* user-settable arbitrary field */ +} redisReadTask; + +typedef struct redisReplyObjectFunctions { + void *(*createString)(const redisReadTask*, char*, size_t); + void *(*createArray)(const redisReadTask*, size_t); + void *(*createInteger)(const redisReadTask*, long long); + void *(*createDouble)(const redisReadTask*, double, char*, size_t); + void *(*createNil)(const redisReadTask*); + void *(*createBool)(const redisReadTask*, int); + void (*freeObject)(void*); +} redisReplyObjectFunctions; + +typedef struct redisReader { + int err; /* Error flags, 0 when there is no error */ + char errstr[128]; /* String representation of error when applicable */ + + char *buf; /* Read buffer */ + size_t pos; /* Buffer cursor */ + size_t len; /* Buffer length */ + size_t maxbuf; /* Max length of unused buffer */ + long long maxelements; /* Max multi-bulk elements */ + + redisReadTask **task; + int tasks; + + int ridx; /* Index of current read task */ + void *reply; /* Temporary reply pointer */ + + redisReplyObjectFunctions *fn; + void *privdata; +} redisReader; + +/* Public API for the protocol parser. */ +redisReader *redisReaderCreateWithFunctions(redisReplyObjectFunctions *fn); +void redisReaderFree(redisReader *r); +int redisReaderFeed(redisReader *r, const char *buf, size_t len); +int redisReaderGetReply(redisReader *r, void **reply); + +#define redisReaderSetPrivdata(_r, _p) (int)(((redisReader*)(_r))->privdata = (_p)) +#define redisReaderGetObject(_r) (((redisReader*)(_r))->reply) +#define redisReaderGetError(_r) (((redisReader*)(_r))->errstr) + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/hiredis/sds.h b/include/hiredis/sds.h new file mode 100644 index 0000000..eda8833 --- /dev/null +++ b/include/hiredis/sds.h @@ -0,0 +1,278 @@ +/* SDSLib 2.0 -- A C dynamic strings library + * + * Copyright (c) 2006-2015, Salvatore Sanfilippo + * Copyright (c) 2015, Oran Agra + * Copyright (c) 2015, Redis Labs, Inc + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the name of Redis nor the names of its contributors may be used + * to endorse or promote products derived from this software without + * specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __SDS_H +#define __SDS_H + +#define SDS_MAX_PREALLOC (1024*1024) +#ifdef _MSC_VER +#define __attribute__(x) +typedef long long ssize_t; +#define SSIZE_MAX (LLONG_MAX >> 1) +#endif + +#include +#include +#include + +typedef char *sds; + +/* Note: sdshdr5 is never used, we just access the flags byte directly. + * However is here to document the layout of type 5 SDS strings. */ +struct __attribute__ ((__packed__)) sdshdr5 { + unsigned char flags; /* 3 lsb of type, and 5 msb of string length */ + char buf[]; +}; +struct __attribute__ ((__packed__)) sdshdr8 { + uint8_t len; /* used */ + uint8_t alloc; /* excluding the header and null terminator */ + unsigned char flags; /* 3 lsb of type, 5 unused bits */ + char buf[]; +}; +struct __attribute__ ((__packed__)) sdshdr16 { + uint16_t len; /* used */ + uint16_t alloc; /* excluding the header and null terminator */ + unsigned char flags; /* 3 lsb of type, 5 unused bits */ + char buf[]; +}; +struct __attribute__ ((__packed__)) sdshdr32 { + uint32_t len; /* used */ + uint32_t alloc; /* excluding the header and null terminator */ + unsigned char flags; /* 3 lsb of type, 5 unused bits */ + char buf[]; +}; +struct __attribute__ ((__packed__)) sdshdr64 { + uint64_t len; /* used */ + uint64_t alloc; /* excluding the header and null terminator */ + unsigned char flags; /* 3 lsb of type, 5 unused bits */ + char buf[]; +}; + +#define SDS_TYPE_5 0 +#define SDS_TYPE_8 1 +#define SDS_TYPE_16 2 +#define SDS_TYPE_32 3 +#define SDS_TYPE_64 4 +#define SDS_TYPE_MASK 7 +#define SDS_TYPE_BITS 3 +#define SDS_HDR_VAR(T,s) struct sdshdr##T *sh = (struct sdshdr##T *)((s)-(sizeof(struct sdshdr##T))); +#define SDS_HDR(T,s) ((struct sdshdr##T *)((s)-(sizeof(struct sdshdr##T)))) +#define SDS_TYPE_5_LEN(f) ((f)>>SDS_TYPE_BITS) + +static inline size_t sdslen(const sds s) { + unsigned char flags = s[-1]; + switch(flags&SDS_TYPE_MASK) { + case SDS_TYPE_5: + return SDS_TYPE_5_LEN(flags); + case SDS_TYPE_8: + return SDS_HDR(8,s)->len; + case SDS_TYPE_16: + return SDS_HDR(16,s)->len; + case SDS_TYPE_32: + return SDS_HDR(32,s)->len; + case SDS_TYPE_64: + return SDS_HDR(64,s)->len; + } + return 0; +} + +static inline size_t sdsavail(const sds s) { + unsigned char flags = s[-1]; + switch(flags&SDS_TYPE_MASK) { + case SDS_TYPE_5: { + return 0; + } + case SDS_TYPE_8: { + SDS_HDR_VAR(8,s); + return sh->alloc - sh->len; + } + case SDS_TYPE_16: { + SDS_HDR_VAR(16,s); + return sh->alloc - sh->len; + } + case SDS_TYPE_32: { + SDS_HDR_VAR(32,s); + return sh->alloc - sh->len; + } + case SDS_TYPE_64: { + SDS_HDR_VAR(64,s); + return sh->alloc - sh->len; + } + } + return 0; +} + +static inline void sdssetlen(sds s, size_t newlen) { + unsigned char flags = s[-1]; + switch(flags&SDS_TYPE_MASK) { + case SDS_TYPE_5: + { + unsigned char *fp = ((unsigned char*)s)-1; + *fp = (unsigned char)(SDS_TYPE_5 | (newlen << SDS_TYPE_BITS)); + } + break; + case SDS_TYPE_8: + SDS_HDR(8,s)->len = (uint8_t)newlen; + break; + case SDS_TYPE_16: + SDS_HDR(16,s)->len = (uint16_t)newlen; + break; + case SDS_TYPE_32: + SDS_HDR(32,s)->len = (uint32_t)newlen; + break; + case SDS_TYPE_64: + SDS_HDR(64,s)->len = (uint64_t)newlen; + break; + } +} + +static inline void sdsinclen(sds s, size_t inc) { + unsigned char flags = s[-1]; + switch(flags&SDS_TYPE_MASK) { + case SDS_TYPE_5: + { + unsigned char *fp = ((unsigned char*)s)-1; + unsigned char newlen = SDS_TYPE_5_LEN(flags)+(unsigned char)inc; + *fp = SDS_TYPE_5 | (newlen << SDS_TYPE_BITS); + } + break; + case SDS_TYPE_8: + SDS_HDR(8,s)->len += (uint8_t)inc; + break; + case SDS_TYPE_16: + SDS_HDR(16,s)->len += (uint16_t)inc; + break; + case SDS_TYPE_32: + SDS_HDR(32,s)->len += (uint32_t)inc; + break; + case SDS_TYPE_64: + SDS_HDR(64,s)->len += (uint64_t)inc; + break; + } +} + +/* sdsalloc() = sdsavail() + sdslen() */ +static inline size_t sdsalloc(const sds s) { + unsigned char flags = s[-1]; + switch(flags&SDS_TYPE_MASK) { + case SDS_TYPE_5: + return SDS_TYPE_5_LEN(flags); + case SDS_TYPE_8: + return SDS_HDR(8,s)->alloc; + case SDS_TYPE_16: + return SDS_HDR(16,s)->alloc; + case SDS_TYPE_32: + return SDS_HDR(32,s)->alloc; + case SDS_TYPE_64: + return SDS_HDR(64,s)->alloc; + } + return 0; +} + +static inline void sdssetalloc(sds s, size_t newlen) { + unsigned char flags = s[-1]; + switch(flags&SDS_TYPE_MASK) { + case SDS_TYPE_5: + /* Nothing to do, this type has no total allocation info. */ + break; + case SDS_TYPE_8: + SDS_HDR(8,s)->alloc = (uint8_t)newlen; + break; + case SDS_TYPE_16: + SDS_HDR(16,s)->alloc = (uint16_t)newlen; + break; + case SDS_TYPE_32: + SDS_HDR(32,s)->alloc = (uint32_t)newlen; + break; + case SDS_TYPE_64: + SDS_HDR(64,s)->alloc = (uint64_t)newlen; + break; + } +} + +sds sdsnewlen(const void *init, size_t initlen); +sds sdsnew(const char *init); +sds sdsempty(void); +sds sdsdup(const sds s); +void sdsfree(sds s); +sds sdsgrowzero(sds s, size_t len); +sds sdscatlen(sds s, const void *t, size_t len); +sds sdscat(sds s, const char *t); +sds sdscatsds(sds s, const sds t); +sds sdscpylen(sds s, const char *t, size_t len); +sds sdscpy(sds s, const char *t); + +sds sdscatvprintf(sds s, const char *fmt, va_list ap); +#ifdef __GNUC__ +sds sdscatprintf(sds s, const char *fmt, ...) + __attribute__((format(printf, 2, 3))); +#else +sds sdscatprintf(sds s, const char *fmt, ...); +#endif + +sds sdscatfmt(sds s, char const *fmt, ...); +sds sdstrim(sds s, const char *cset); +int sdsrange(sds s, ssize_t start, ssize_t end); +void sdsupdatelen(sds s); +void sdsclear(sds s); +int sdscmp(const sds s1, const sds s2); +sds *sdssplitlen(const char *s, int len, const char *sep, int seplen, int *count); +void sdsfreesplitres(sds *tokens, int count); +void sdstolower(sds s); +void sdstoupper(sds s); +sds sdsfromlonglong(long long value); +sds sdscatrepr(sds s, const char *p, size_t len); +sds *sdssplitargs(const char *line, int *argc); +sds sdsmapchars(sds s, const char *from, const char *to, size_t setlen); +sds sdsjoin(char **argv, int argc, char *sep); +sds sdsjoinsds(sds *argv, int argc, const char *sep, size_t seplen); + +/* Low level functions exposed to the user API */ +sds sdsMakeRoomFor(sds s, size_t addlen); +void sdsIncrLen(sds s, int incr); +sds sdsRemoveFreeSpace(sds s); +size_t sdsAllocSize(sds s); +void *sdsAllocPtr(sds s); + +/* Export the allocator used by SDS to the program using SDS. + * Sometimes the program SDS is linked to, may use a different set of + * allocators, but may want to allocate or free things that SDS will + * respectively free or allocate. */ +void *sds_malloc(size_t size); +void *sds_realloc(void *ptr, size_t size); +void sds_free(void *ptr); + +#ifdef REDIS_TEST +int sdsTest(int argc, char *argv[]); +#endif + +#endif diff --git a/include/nettle/aes.h b/include/nettle/aes.h new file mode 100644 index 0000000..5a0545c --- /dev/null +++ b/include/nettle/aes.h @@ -0,0 +1,177 @@ +/* aes.h + + The aes/rijndael block cipher. + + Copyright (C) 2001, 2013 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_AES_H_INCLUDED +#define NETTLE_AES_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define aes_set_encrypt_key nettle_aes_set_encrypt_key +#define aes_set_decrypt_key nettle_aes_set_decrypt_key +#define aes_invert_key nettle_aes_invert_key +#define aes_encrypt nettle_aes_encrypt +#define aes_decrypt nettle_aes_decrypt +#define aes128_set_encrypt_key nettle_aes128_set_encrypt_key +#define aes128_set_decrypt_key nettle_aes128_set_decrypt_key +#define aes128_invert_key nettle_aes128_invert_key +#define aes128_encrypt nettle_aes128_encrypt +#define aes128_decrypt nettle_aes128_decrypt +#define aes192_set_encrypt_key nettle_aes192_set_encrypt_key +#define aes192_set_decrypt_key nettle_aes192_set_decrypt_key +#define aes192_invert_key nettle_aes192_invert_key +#define aes192_encrypt nettle_aes192_encrypt +#define aes192_decrypt nettle_aes192_decrypt +#define aes256_set_encrypt_key nettle_aes256_set_encrypt_key +#define aes256_set_decrypt_key nettle_aes256_set_decrypt_key +#define aes256_invert_key nettle_aes256_invert_key +#define aes256_encrypt nettle_aes256_encrypt +#define aes256_decrypt nettle_aes256_decrypt + +#define AES_BLOCK_SIZE 16 + +#define AES128_KEY_SIZE 16 +#define AES192_KEY_SIZE 24 +#define AES256_KEY_SIZE 32 +#define _AES128_ROUNDS 10 +#define _AES192_ROUNDS 12 +#define _AES256_ROUNDS 14 + +/* Variable key size between 128 and 256 bits. But the only valid + * values are 16 (128 bits), 24 (192 bits) and 32 (256 bits). */ +#define AES_MIN_KEY_SIZE AES128_KEY_SIZE +#define AES_MAX_KEY_SIZE AES256_KEY_SIZE + +/* Older nettle-2.7 interface */ + +#define AES_KEY_SIZE 32 + +struct aes_ctx +{ + unsigned rounds; /* number of rounds to use for our key size */ + uint32_t keys[4*(_AES256_ROUNDS + 1)]; /* maximum size of key schedule */ +}; + +void +aes_set_encrypt_key(struct aes_ctx *ctx, + size_t length, const uint8_t *key); + +void +aes_set_decrypt_key(struct aes_ctx *ctx, + size_t length, const uint8_t *key); + +void +aes_invert_key(struct aes_ctx *dst, + const struct aes_ctx *src); + +void +aes_encrypt(const struct aes_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); +void +aes_decrypt(const struct aes_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); + +struct aes128_ctx +{ + uint32_t keys[4 * (_AES128_ROUNDS + 1)]; +}; + +void +aes128_set_encrypt_key(struct aes128_ctx *ctx, const uint8_t *key); +void +aes128_set_decrypt_key(struct aes128_ctx *ctx, const uint8_t *key); +void +aes128_invert_key(struct aes128_ctx *dst, + const struct aes128_ctx *src); +void +aes128_encrypt(const struct aes128_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); +void +aes128_decrypt(const struct aes128_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); + +struct aes192_ctx +{ + uint32_t keys[4 * (_AES192_ROUNDS + 1)]; +}; + +void +aes192_set_encrypt_key(struct aes192_ctx *ctx, const uint8_t *key); +void +aes192_set_decrypt_key(struct aes192_ctx *ctx, const uint8_t *key); +void +aes192_invert_key(struct aes192_ctx *dst, + const struct aes192_ctx *src); +void +aes192_encrypt(const struct aes192_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); +void +aes192_decrypt(const struct aes192_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); + +struct aes256_ctx +{ + uint32_t keys[4 * (_AES256_ROUNDS + 1)]; +}; + +void +aes256_set_encrypt_key(struct aes256_ctx *ctx, const uint8_t *key); +void +aes256_set_decrypt_key(struct aes256_ctx *ctx, const uint8_t *key); +void +aes256_invert_key(struct aes256_ctx *dst, + const struct aes256_ctx *src); +void +aes256_encrypt(const struct aes256_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); +void +aes256_decrypt(const struct aes256_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_AES_H_INCLUDED */ diff --git a/include/nettle/arcfour.h b/include/nettle/arcfour.h new file mode 100644 index 0000000..804b9e4 --- /dev/null +++ b/include/nettle/arcfour.h @@ -0,0 +1,79 @@ +/* arcfour.h + + The arcfour/rc4 stream cipher. + + Copyright (C) 2001, 2014 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_ARCFOUR_H_INCLUDED +#define NETTLE_ARCFOUR_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define arcfour128_set_key nettle_arcfour128_set_key +#define arcfour_set_key nettle_arcfour_set_key +#define arcfour_crypt nettle_arcfour_crypt + +/* Minimum and maximum keysizes, and a reasonable default. In + * octets.*/ +#define ARCFOUR_MIN_KEY_SIZE 1 +#define ARCFOUR_MAX_KEY_SIZE 256 +#define ARCFOUR_KEY_SIZE 16 +#define ARCFOUR128_KEY_SIZE 16 + +struct arcfour_ctx +{ + uint8_t S[256]; + uint8_t i; + uint8_t j; +}; + +void +arcfour_set_key(struct arcfour_ctx *ctx, + size_t length, const uint8_t *key); + +void +arcfour128_set_key(struct arcfour_ctx *ctx, const uint8_t *key); + +void +arcfour_crypt(struct arcfour_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_ARCFOUR_H_INCLUDED */ + diff --git a/include/nettle/arctwo.h b/include/nettle/arctwo.h new file mode 100644 index 0000000..1a9b8b3 --- /dev/null +++ b/include/nettle/arctwo.h @@ -0,0 +1,103 @@ +/* arctwo.h + + The arctwo/rfc2268 block cipher. + + Copyright (C) 2004 Simon Josefsson + Copyright (C) 2002, 2004, 2014 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_ARCTWO_H_INCLUDED +#define NETTLE_ARCTWO_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define arctwo_set_key nettle_arctwo_set_key +#define arctwo_set_key_ekb nettle_arctwo_set_key_ekb +#define arctwo_set_key_gutmann nettle_arctwo_set_key_gutmann +#define arctwo40_set_key nettle_arctwo40_set_key +#define arctwo64_set_key nettle_arctwo64_set_key +#define arctwo128_set_key nettle_arctwo128_set_key +#define arctwo128_set_key_gutmann nettle_arctwo128_set_key_gutmann +#define arctwo_encrypt nettle_arctwo_encrypt +#define arctwo_decrypt nettle_arctwo_decrypt + +#define ARCTWO_BLOCK_SIZE 8 + +/* Variable key size from 1 byte to 128 bytes. */ +#define ARCTWO_MIN_KEY_SIZE 1 +#define ARCTWO_MAX_KEY_SIZE 128 + +#define ARCTWO_KEY_SIZE 8 + +struct arctwo_ctx +{ + uint16_t S[64]; +}; + +/* Key expansion function that takes the "effective key bits", 1-1024, + as an explicit argument. 0 means maximum key bits. */ +void +arctwo_set_key_ekb (struct arctwo_ctx *ctx, + size_t length, const uint8_t * key, unsigned ekb); + +/* Equvivalent to arctwo_set_key_ekb, with ekb = 8 * length */ +void +arctwo_set_key (struct arctwo_ctx *ctx, size_t length, const uint8_t *key); +void +arctwo40_set_key (struct arctwo_ctx *ctx, const uint8_t *key); +void +arctwo64_set_key (struct arctwo_ctx *ctx, const uint8_t *key); +void +arctwo128_set_key (struct arctwo_ctx *ctx, const uint8_t *key); + +/* Equvivalent to arctwo_set_key_ekb, with ekb = 1024 */ +void +arctwo_set_key_gutmann (struct arctwo_ctx *ctx, + size_t length, const uint8_t *key); +void +arctwo128_set_key_gutmann (struct arctwo_ctx *ctx, + const uint8_t *key); + +void +arctwo_encrypt (struct arctwo_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); +void +arctwo_decrypt (struct arctwo_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_ARCTWO_H_INCLUDED */ diff --git a/include/nettle/asn1.h b/include/nettle/asn1.h new file mode 100644 index 0000000..da2fbe5 --- /dev/null +++ b/include/nettle/asn1.h @@ -0,0 +1,152 @@ +/* asn1.h + + Limited support for ASN.1 DER decoding. + + Copyright (C) 2005 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_ASN1_H_INCLUDED +#define NETTLE_ASN1_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define asn1_der_iterator_first nettle_asn1_der_iterator_first +#define asn1_der_iterator_next nettle_asn1_der_iterator_next +#define asn1_der_decode_constructed nettle_asn1_der_decode_constructed +#define asn1_der_decode_constructed_last nettle_asn1_der_decode_constructed_last +#define asn1_der_decode_bitstring nettle_asn1_der_decode_bitstring +#define asn1_der_decode_bitstring_last nettle_asn1_der_decode_bitstring_last +#define asn1_der_get_uint32 nettle_asn1_der_get_uint32 +#define asn1_der_get_bignum nettle_asn1_der_get_bignum + + +/* enum asn1_type keeps the class number and the constructive in bits + 13-14, and the constructive flag in bit 12. The remaining 14 bits + are the tag (although currently, only tags in the range 0-30 are + supported). */ + +enum + { + ASN1_TYPE_CONSTRUCTED = 1 << 12, + + ASN1_CLASS_UNIVERSAL = 0, + ASN1_CLASS_APPLICATION = 1 << 13, + ASN1_CLASS_CONTEXT_SPECIFIC = 2 << 13, + ASN1_CLASS_PRIVATE = 3 << 13, + + ASN1_CLASS_MASK = 3 << 13, + ASN1_CLASS_SHIFT = 13, + }; + +enum asn1_type + { + ASN1_BOOLEAN = 1, + ASN1_INTEGER = 2, + ASN1_BITSTRING = 3, + ASN1_OCTETSTRING = 4, + ASN1_NULL = 5, + ASN1_IDENTIFIER = 6, + ASN1_REAL = 9, + ASN1_ENUMERATED = 10, + ASN1_UTF8STRING = 12, + ASN1_SEQUENCE = 16 | ASN1_TYPE_CONSTRUCTED, + ASN1_SET = 17 | ASN1_TYPE_CONSTRUCTED, + ASN1_PRINTABLESTRING = 19, + ASN1_TELETEXSTRING = 20, + ASN1_IA5STRING = 22, + ASN1_UTC = 23, + ASN1_UNIVERSALSTRING = 28, + ASN1_BMPSTRING = 30, + }; + +enum asn1_iterator_result + { + ASN1_ITERATOR_ERROR, + ASN1_ITERATOR_PRIMITIVE, + ASN1_ITERATOR_CONSTRUCTED, + ASN1_ITERATOR_END, + }; + +/* Parsing DER objects. */ +struct asn1_der_iterator +{ + size_t buffer_length; + const uint8_t *buffer; + + /* Next object to parse. */ + size_t pos; + + enum asn1_type type; + + /* Pointer to the current object */ + size_t length; + const uint8_t *data; +}; + +/* Initializes the iterator. */ +enum asn1_iterator_result +asn1_der_iterator_first(struct asn1_der_iterator *iterator, + size_t length, const uint8_t *input); + +enum asn1_iterator_result +asn1_der_iterator_next(struct asn1_der_iterator *iterator); + +/* Starts parsing of a constructed object. */ +enum asn1_iterator_result +asn1_der_decode_constructed(struct asn1_der_iterator *i, + struct asn1_der_iterator *contents); + +/* For the common case that we have a sequence at the end of the + object. Checks that the current object is the final one, and then + reinitializes the iterator to parse its ontents. */ +enum asn1_iterator_result +asn1_der_decode_constructed_last(struct asn1_der_iterator *i); + +enum asn1_iterator_result +asn1_der_decode_bitstring(struct asn1_der_iterator *i, + struct asn1_der_iterator *contents); + +enum asn1_iterator_result +asn1_der_decode_bitstring_last(struct asn1_der_iterator *i); + +/* All these functions return 1 on success, 0 on failure */ +int +asn1_der_get_uint32(struct asn1_der_iterator *i, + uint32_t *x); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_ASN1_H_INCLUDED */ diff --git a/include/nettle/base16.h b/include/nettle/base16.h new file mode 100644 index 0000000..755e6ed --- /dev/null +++ b/include/nettle/base16.h @@ -0,0 +1,110 @@ +/* base16.h + + Hex encoding and decoding, following spki conventions (i.e. + allowing whitespace between digits). + + Copyright (C) 2002 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_BASE16_H_INCLUDED +#define NETTLE_BASE16_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define base16_encode_single nettle_base16_encode_single +#define base16_encode_update nettle_base16_encode_update +#define base16_decode_init nettle_base16_decode_init +#define base16_decode_single nettle_base16_decode_single +#define base16_decode_update nettle_base16_decode_update +#define base16_decode_final nettle_base16_decode_final + +/* Base16 encoding */ + +/* Maximum length of output for base16_encode_update. */ +#define BASE16_ENCODE_LENGTH(length) ((length) * 2) + +/* Encodes a single byte. Always stores two digits in dst[0] and dst[1]. */ +void +base16_encode_single(char *dst, + uint8_t src); + +/* Always stores BASE16_ENCODE_LENGTH(length) digits in dst. */ +void +base16_encode_update(char *dst, + size_t length, + const uint8_t *src); + + +/* Base16 decoding */ + +/* Maximum length of output for base16_decode_update. */ +/* We have at most 4 buffered bits, and a total of (length + 1) * 4 bits. */ +#define BASE16_DECODE_LENGTH(length) (((length) + 1) / 2) + +struct base16_decode_ctx +{ + unsigned char word; /* Leftover bits */ + unsigned char bits; /* Number buffered bits */ +}; + +void +base16_decode_init(struct base16_decode_ctx *ctx); + +/* Decodes a single byte. Returns amount of output (0 or 1), or -1 on + * errors. */ +int +base16_decode_single(struct base16_decode_ctx *ctx, + uint8_t *dst, + char src); + +/* Returns 1 on success, 0 on error. DST should point to an area of + * size at least BASE16_DECODE_LENGTH(length). The amount of data + * generated is returned in *DST_LENGTH. */ + +int +base16_decode_update(struct base16_decode_ctx *ctx, + size_t *dst_length, + uint8_t *dst, + size_t src_length, + const char *src); + +/* Returns 1 on success. */ +int +base16_decode_final(struct base16_decode_ctx *ctx); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_BASE16_H_INCLUDED */ diff --git a/include/nettle/base64.h b/include/nettle/base64.h new file mode 100644 index 0000000..8e69adb --- /dev/null +++ b/include/nettle/base64.h @@ -0,0 +1,172 @@ +/* base64.h + + Base-64 encoding and decoding. + + Copyright (C) 2002 Niels Möller, Dan Egnor + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_BASE64_H_INCLUDED +#define NETTLE_BASE64_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define base64_encode_init nettle_base64_encode_init +#define base64url_encode_init nettle_base64url_encode_init +#define base64_encode_single nettle_base64_encode_single +#define base64_encode_update nettle_base64_encode_update +#define base64_encode_final nettle_base64_encode_final +#define base64_encode_raw nettle_base64_encode_raw +#define base64_encode_group nettle_base64_encode_group +#define base64_decode_init nettle_base64_decode_init +#define base64url_decode_init nettle_base64url_decode_init +#define base64_decode_single nettle_base64_decode_single +#define base64_decode_update nettle_base64_decode_update +#define base64_decode_final nettle_base64_decode_final + +#define BASE64_BINARY_BLOCK_SIZE 3 +#define BASE64_TEXT_BLOCK_SIZE 4 + +/* Base64 encoding */ + +/* Maximum length of output for base64_encode_update. NOTE: Doesn't + * include any padding that base64_encode_final may add. */ +/* We have at most 4 buffered bits, and a total of (4 + length * 8) bits. */ +#define BASE64_ENCODE_LENGTH(length) (((length) * 8 + 4)/6) + +/* Maximum length of output generated by base64_encode_final. */ +#define BASE64_ENCODE_FINAL_LENGTH 3 + +/* Exact length of output generated by base64_encode_raw, including + * padding. */ +#define BASE64_ENCODE_RAW_LENGTH(length) ((((length) + 2)/3)*4) + +struct base64_encode_ctx +{ + const char *alphabet; /* Alphabet to use for encoding */ + unsigned short word; /* Leftover bits */ + unsigned char bits; /* Number of bits, always 0, 2, or 4. */ +}; + +/* Initialize encoding context for base-64 */ +void +base64_encode_init(struct base64_encode_ctx *ctx); + +/* Initialize encoding context for URL safe alphabet, RFC 4648. */ +void +base64url_encode_init(struct base64_encode_ctx *ctx); + +/* Encodes a single byte. Returns amount of output (always 1 or 2). */ +size_t +base64_encode_single(struct base64_encode_ctx *ctx, + char *dst, + uint8_t src); + +/* Returns the number of output characters. DST should point to an + * area of size at least BASE64_ENCODE_LENGTH(length). */ +size_t +base64_encode_update(struct base64_encode_ctx *ctx, + char *dst, + size_t length, + const uint8_t *src); + +/* DST should point to an area of size at least + * BASE64_ENCODE_FINAL_LENGTH */ +size_t +base64_encode_final(struct base64_encode_ctx *ctx, + char *dst); + +/* Lower level functions */ + +/* Encodes a string in one go, including any padding at the end. + * Generates exactly BASE64_ENCODE_RAW_LENGTH(length) bytes of output. + * Supports overlapped operation, if src <= dst. FIXME: Use of overlap + * is deprecated, if needed there should be a separate public fucntion + * to do that.*/ +void +base64_encode_raw(char *dst, size_t length, const uint8_t *src); + +void +base64_encode_group(char *dst, uint32_t group); + + +/* Base64 decoding */ + +/* Maximum length of output for base64_decode_update. */ +/* We have at most 6 buffered bits, and a total of (length + 1) * 6 bits. */ +#define BASE64_DECODE_LENGTH(length) ((((length) + 1) * 6) / 8) + +struct base64_decode_ctx +{ + const signed char *table; /* Decoding table */ + unsigned short word; /* Leftover bits */ + unsigned char bits; /* Number buffered bits */ + + /* Number of padding characters encountered */ + unsigned char padding; +}; + +/* Initialize decoding context for base-64 */ +void +base64_decode_init(struct base64_decode_ctx *ctx); + +/* Initialize encoding context for URL safe alphabet, RFC 4648. */ +void +base64url_decode_init(struct base64_decode_ctx *ctx); + +/* Decodes a single byte. Returns amount of output (0 or 1), or -1 on + * errors. */ +int +base64_decode_single(struct base64_decode_ctx *ctx, + uint8_t *dst, + char src); + +/* Returns 1 on success, 0 on error. DST should point to an area of + * size at least BASE64_DECODE_LENGTH(length). The amount of data + * generated is returned in *DST_LENGTH. */ +int +base64_decode_update(struct base64_decode_ctx *ctx, + size_t *dst_length, + uint8_t *dst, + size_t src_length, + const char *src); + +/* Returns 1 on success. */ +int +base64_decode_final(struct base64_decode_ctx *ctx); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_BASE64_H_INCLUDED */ diff --git a/include/nettle/bignum.h b/include/nettle/bignum.h new file mode 100644 index 0000000..9afcd29 --- /dev/null +++ b/include/nettle/bignum.h @@ -0,0 +1,140 @@ +/* bignum.h + + Bignum operations that are missing from gmp. + + Copyright (C) 2001 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_BIGNUM_H_INCLUDED +#define NETTLE_BIGNUM_H_INCLUDED + +#include "nettle-meta.h" + +#include "nettle-types.h" + +/* For NETTLE_USE_MINI_GMP */ +#include "version.h" + +#if NETTLE_USE_MINI_GMP +# include "mini-gmp.h" + +# define GMP_NUMB_MASK (~(mp_limb_t) 0) + +/* Function missing in older gmp versions, and checked for with ifdef */ +# define mpz_limbs_read mpz_limbs_read +/* Side-channel silent powm not available in mini-gmp. */ +# define mpz_powm_sec mpz_powm +#else +# include +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Size needed for signed encoding, including extra sign byte if + * necessary. */ +size_t +nettle_mpz_sizeinbase_256_s(const mpz_t x); + +/* Size needed for unsigned encoding */ +size_t +nettle_mpz_sizeinbase_256_u(const mpz_t x); + +/* Writes an integer as length octets, using big endian byte order, + * and two's complement for negative numbers. */ +void +nettle_mpz_get_str_256(size_t length, uint8_t *s, const mpz_t x); + +/* Reads a big endian, two's complement, integer. */ +void +nettle_mpz_set_str_256_s(mpz_t x, + size_t length, const uint8_t *s); + +void +nettle_mpz_init_set_str_256_s(mpz_t x, + size_t length, const uint8_t *s); + +/* Similar, but for unsigned format. These function don't interpret + * the most significant bit as the sign. */ +void +nettle_mpz_set_str_256_u(mpz_t x, + size_t length, const uint8_t *s); + +void +nettle_mpz_init_set_str_256_u(mpz_t x, + size_t length, const uint8_t *s); + +/* Returns a uniformly distributed random number 0 <= x < 2^n */ +void +nettle_mpz_random_size(mpz_t x, + void *ctx, nettle_random_func *random, + unsigned bits); + +/* Returns a number x, almost uniformly random in the range + * 0 <= x < n. */ +void +nettle_mpz_random(mpz_t x, + void *ctx, nettle_random_func *random, + const mpz_t n); + +void +nettle_random_prime(mpz_t p, unsigned bits, int top_bits_set, + void *ctx, nettle_random_func *random, + void *progress_ctx, nettle_progress_func *progress); + +void +_nettle_generate_pocklington_prime (mpz_t p, mpz_t r, + unsigned bits, int top_bits_set, + void *ctx, nettle_random_func *random, + const mpz_t p0, + const mpz_t q, + const mpz_t p0q); + +/* sexp parsing */ +struct sexp_iterator; + +/* If LIMIT is non-zero, the number must be at most LIMIT bits. + * Implies sexp_iterator_next. */ +int +nettle_mpz_set_sexp(mpz_t x, unsigned limit, struct sexp_iterator *i); + + +/* der parsing */ +struct asn1_der_iterator; + +int +nettle_asn1_der_get_bignum(struct asn1_der_iterator *iterator, + mpz_t x, unsigned max_bits); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_BIGNUM_H_INCLUDED */ diff --git a/include/nettle/blowfish.h b/include/nettle/blowfish.h new file mode 100644 index 0000000..bcdc7cb --- /dev/null +++ b/include/nettle/blowfish.h @@ -0,0 +1,89 @@ +/* blowfish.h + + Blowfish block cipher. + + Copyright (C) 2014 Niels Möller + Copyright (C) 1998, 2001 FSF, Ray Dassen, Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_BLOWFISH_H_INCLUDED +#define NETTLE_BLOWFISH_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define blowfish_set_key nettle_blowfish_set_key +#define blowfish128_set_key nettle_blowfish128_set_key +#define blowfish_encrypt nettle_blowfish_encrypt +#define blowfish_decrypt nettle_blowfish_decrypt + +#define BLOWFISH_BLOCK_SIZE 8 + +/* Variable key size between 64 and 448 bits. */ +#define BLOWFISH_MIN_KEY_SIZE 8 +#define BLOWFISH_MAX_KEY_SIZE 56 + +/* Default to 128 bits */ +#define BLOWFISH_KEY_SIZE 16 + +#define BLOWFISH128_KEY_SIZE 16 + +#define _BLOWFISH_ROUNDS 16 + +struct blowfish_ctx +{ + uint32_t s[4][256]; + uint32_t p[_BLOWFISH_ROUNDS+2]; +}; + +/* Returns 0 for weak keys, otherwise 1. */ +int +blowfish_set_key(struct blowfish_ctx *ctx, + size_t length, const uint8_t *key); +int +blowfish128_set_key(struct blowfish_ctx *ctx, const uint8_t *key); + +void +blowfish_encrypt(const struct blowfish_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); +void +blowfish_decrypt(const struct blowfish_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_BLOWFISH_H_INCLUDED */ diff --git a/include/nettle/buffer.h b/include/nettle/buffer.h new file mode 100644 index 0000000..9cbcfb1 --- /dev/null +++ b/include/nettle/buffer.h @@ -0,0 +1,106 @@ +/* buffer.h + + A bare-bones string stream. + + Copyright (C) 2002 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_BUFFER_H_INCLUDED +#define NETTLE_BUFFER_H_INCLUDED + +#include "realloc.h" + +#ifdef __cplusplus +extern "C" { +#endif + +struct nettle_buffer +{ + uint8_t *contents; + /* Allocated size */ + size_t alloc; + + void *realloc_ctx; + nettle_realloc_func *realloc; + + /* Current size */ + size_t size; +}; + +/* Initializes a buffer that uses plain realloc */ +void +nettle_buffer_init(struct nettle_buffer *buffer); + +void +nettle_buffer_init_realloc(struct nettle_buffer *buffer, + void *realloc_ctx, + nettle_realloc_func *realloc); + +/* Initializes a buffer of fix size */ +void +nettle_buffer_init_size(struct nettle_buffer *buffer, + size_t length, uint8_t *space); + +void +nettle_buffer_clear(struct nettle_buffer *buffer); + +/* Resets the buffer, without freeing the buffer space. */ +void +nettle_buffer_reset(struct nettle_buffer *buffer); + +int +nettle_buffer_grow(struct nettle_buffer *buffer, + size_t length); + +#define NETTLE_BUFFER_PUTC(buffer, c) \ +( (((buffer)->size < (buffer)->alloc) || nettle_buffer_grow((buffer), 1)) \ + && ((buffer)->contents[(buffer)->size++] = (c), 1) ) + +int +nettle_buffer_write(struct nettle_buffer *buffer, + size_t length, const uint8_t *data); + +/* Like nettle_buffer_write, but instead of copying data to the + * buffer, it returns a pointer to the area where the caller can copy + * the data. The pointer is valid only until the next call that can + * reallocate the buffer. */ +uint8_t * +nettle_buffer_space(struct nettle_buffer *buffer, + size_t length); + +/* Copy the contents of SRC to the end of DST. */ +int +nettle_buffer_copy(struct nettle_buffer *dst, + const struct nettle_buffer *src); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_BUFFER_H_INCLUDED */ diff --git a/include/nettle/camellia.h b/include/nettle/camellia.h new file mode 100644 index 0000000..b035db3 --- /dev/null +++ b/include/nettle/camellia.h @@ -0,0 +1,143 @@ +/* camellia.h + + Copyright (C) 2006,2007 NTT + (Nippon Telegraph and Telephone Corporation). + + Copyright (C) 2010, 2013 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_CAMELLIA_H_INCLUDED +#define NETTLE_CAMELLIA_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define camellia128_set_encrypt_key nettle_camellia128_set_encrypt_key +#define camellia128_set_decrypt_key nettle_camellia_set_decrypt_key +#define camellia128_invert_key nettle_camellia128_invert_key +#define camellia128_crypt nettle_camellia128_crypt + +#define camellia192_set_encrypt_key nettle_camellia192_set_encrypt_key +#define camellia192_set_decrypt_key nettle_camellia192_set_decrypt_key + +#define camellia256_set_encrypt_key nettle_camellia256_set_encrypt_key +#define camellia256_set_decrypt_key nettle_camellia256_set_decrypt_key +#define camellia256_invert_key nettle_camellia256_invert_key +#define camellia256_crypt nettle_camellia256_crypt + + +#define CAMELLIA_BLOCK_SIZE 16 +/* Valid key sizes are 128, 192 or 256 bits (16, 24 or 32 bytes) */ +#define CAMELLIA128_KEY_SIZE 16 +#define CAMELLIA192_KEY_SIZE 24 +#define CAMELLIA256_KEY_SIZE 32 + +/* For 128-bit keys, there are 18 regular rounds, pre- and + post-whitening, and two FL and FLINV rounds, using a total of 26 + subkeys, each of 64 bit. For 192- and 256-bit keys, there are 6 + additional regular rounds and one additional FL and FLINV, using a + total of 34 subkeys. */ +/* The clever combination of subkeys imply one of the pre- and + post-whitening keys is folded with the round keys, so that subkey + #1 and the last one (#25 or #33) is not used. The result is that we + have only 24 or 32 subkeys at the end of key setup. */ + +#define _CAMELLIA128_NKEYS 24 +#define _CAMELLIA256_NKEYS 32 + +struct camellia128_ctx +{ + uint64_t keys[_CAMELLIA128_NKEYS]; +}; + +void +camellia128_set_encrypt_key(struct camellia128_ctx *ctx, + const uint8_t *key); + +void +camellia128_set_decrypt_key(struct camellia128_ctx *ctx, + const uint8_t *key); + +void +camellia128_invert_key(struct camellia128_ctx *dst, + const struct camellia128_ctx *src); + +void +camellia128_crypt(const struct camellia128_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); + +struct camellia256_ctx +{ + uint64_t keys[_CAMELLIA256_NKEYS]; +}; + +void +camellia256_set_encrypt_key(struct camellia256_ctx *ctx, + const uint8_t *key); + +void +camellia256_set_decrypt_key(struct camellia256_ctx *ctx, + const uint8_t *key); + +void +camellia256_invert_key(struct camellia256_ctx *dst, + const struct camellia256_ctx *src); + +void +camellia256_crypt(const struct camellia256_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); + +/* camellia192 is the same as camellia256, except for the key + schedule. */ +/* Slightly ugly with a #define on a struct tag, since it might cause + surprises if also used as a name of a variable. */ +#define camellia192_ctx camellia256_ctx + +void +camellia192_set_encrypt_key(struct camellia256_ctx *ctx, + const uint8_t *key); + +void +camellia192_set_decrypt_key(struct camellia256_ctx *ctx, + const uint8_t *key); + +#define camellia192_invert_key camellia256_invert_key +#define camellia192_crypt camellia256_crypt + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_CAMELLIA_H_INCLUDED */ diff --git a/include/nettle/cast128.h b/include/nettle/cast128.h new file mode 100644 index 0000000..9d099ec --- /dev/null +++ b/include/nettle/cast128.h @@ -0,0 +1,86 @@ +/* cast128.h + + The CAST-128 block cipher. + + Copyright (C) 2001, 2014 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_CAST128_H_INCLUDED +#define NETTLE_CAST128_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define cast5_set_key nettle_cast5_set_key +#define cast128_set_key nettle_cast128_set_key +#define cast128_encrypt nettle_cast128_encrypt +#define cast128_decrypt nettle_cast128_decrypt + +#define CAST128_BLOCK_SIZE 8 + +/* Variable key size between 40 and 128. */ +#define CAST5_MIN_KEY_SIZE 5 +#define CAST5_MAX_KEY_SIZE 16 + +#define CAST128_KEY_SIZE 16 + +struct cast128_ctx +{ + unsigned rounds; /* Number of rounds to use, 12 or 16 */ + /* Expanded key, rotations (5 bits only) and 32-bit masks. */ + unsigned char Kr[16]; + uint32_t Km[16]; +}; + +/* Using variable key size. */ +void +cast5_set_key(struct cast128_ctx *ctx, + size_t length, const uint8_t *key); + +void +cast128_set_key(struct cast128_ctx *ctx, const uint8_t *key); + +void +cast128_encrypt(const struct cast128_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); +void +cast128_decrypt(const struct cast128_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_CAST128_H_INCLUDED */ diff --git a/include/nettle/cbc.h b/include/nettle/cbc.h new file mode 100644 index 0000000..93b2e73 --- /dev/null +++ b/include/nettle/cbc.h @@ -0,0 +1,86 @@ +/* cbc.h + + Cipher block chaining mode. + + Copyright (C) 2001 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_CBC_H_INCLUDED +#define NETTLE_CBC_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define cbc_encrypt nettle_cbc_encrypt +#define cbc_decrypt nettle_cbc_decrypt + +void +cbc_encrypt(const void *ctx, nettle_cipher_func *f, + size_t block_size, uint8_t *iv, + size_t length, uint8_t *dst, + const uint8_t *src); + +void +cbc_decrypt(const void *ctx, nettle_cipher_func *f, + size_t block_size, uint8_t *iv, + size_t length, uint8_t *dst, + const uint8_t *src); + +#define CBC_CTX(type, size) \ +{ type ctx; uint8_t iv[size]; } + +#define CBC_SET_IV(ctx, data) \ +memcpy((ctx)->iv, (data), sizeof((ctx)->iv)) + +/* NOTE: Avoid using NULL, as we don't include anything defining it. */ +#define CBC_ENCRYPT(self, f, length, dst, src) \ + (0 ? ((f)(&(self)->ctx, ~(size_t) 0, \ + (uint8_t *) 0, (const uint8_t *) 0)) \ + : cbc_encrypt((void *) &(self)->ctx, \ + (nettle_cipher_func *) (f), \ + sizeof((self)->iv), (self)->iv, \ + (length), (dst), (src))) + +#define CBC_DECRYPT(self, f, length, dst, src) \ + (0 ? ((f)(&(self)->ctx, ~(size_t) 0, \ + (uint8_t *) 0, (const uint8_t *) 0)) \ + : cbc_decrypt((void *) &(self)->ctx, \ + (nettle_cipher_func *) (f), \ + sizeof((self)->iv), (self)->iv, \ + (length), (dst), (src))) + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_CBC_H_INCLUDED */ diff --git a/include/nettle/ccm.h b/include/nettle/ccm.h new file mode 100644 index 0000000..0a742a5 --- /dev/null +++ b/include/nettle/ccm.h @@ -0,0 +1,302 @@ +/* ccm.h + + Counter with CBC-MAC mode, specified by NIST, + http://csrc.nist.gov/publications/nistpubs/800-38C/SP800-38C_updated-July20_2007.pdf + + Copyright (C) 2014 Exegin Technologies Limited + Copyright (C) 2014 Owen Kirby + + Contributed to GNU Nettle by Owen Kirby + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +/* NIST SP800-38C doesn't specify the particular formatting and + * counter generation algorithm for CCM, but it does include an + * example algorithm. This example has become the de-factor standard, + * and has been adopted by both the IETF and IEEE across a wide + * variety of protocols. + */ + +#ifndef NETTLE_CCM_H_INCLUDED +#define NETTLE_CCM_H_INCLUDED + +#include "aes.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define ccm_set_nonce nettle_ccm_set_nonce +#define ccm_update nettle_ccm_update +#define ccm_encrypt nettle_ccm_encrypt +#define ccm_decrypt nettle_ccm_decrypt +#define ccm_digest nettle_ccm_digest +#define ccm_encrypt_message nettle_ccm_encrypt_message +#define ccm_decrypt_message nettle_ccm_decrypt_message + +#define ccm_aes128_set_key nettle_ccm_aes128_set_key +#define ccm_aes128_set_nonce nettle_ccm_aes128_set_nonce +#define ccm_aes128_update nettle_ccm_aes128_update +#define ccm_aes128_encrypt nettle_ccm_aes128_encrypt +#define ccm_aes128_decrypt nettle_ccm_aes128_decrypt +#define ccm_aes128_digest nettle_ccm_aes128_digest +#define ccm_aes128_encrypt_message nettle_ccm_aes128_encrypt_message +#define ccm_aes128_decrypt_message nettle_ccm_aes128_decrypt_message + +#define ccm_aes192_set_key nettle_ccm_aes192_set_key +#define ccm_aes192_set_nonce nettle_ccm_aes192_set_nonce +#define ccm_aes192_update nettle_ccm_aes192_update +#define ccm_aes192_encrypt nettle_ccm_aes192_encrypt +#define ccm_aes192_decrypt nettle_ccm_aes192_decrypt +#define ccm_aes192_digest nettle_ccm_aes192_digest +#define ccm_aes192_encrypt_message nettle_ccm_aes192_encrypt_message +#define ccm_aes192_decrypt_message nettle_ccm_aes192_decrypt_message + +#define ccm_aes256_set_key nettle_ccm_aes256_set_key +#define ccm_aes256_set_nonce nettle_ccm_aes256_set_nonce +#define ccm_aes256_update nettle_ccm_aes256_update +#define ccm_aes256_encrypt nettle_ccm_aes256_encrypt +#define ccm_aes256_decrypt nettle_ccm_aes256_decrypt +#define ccm_aes256_digest nettle_ccm_aes256_digest +#define ccm_aes256_encrypt_message nettle_ccm_aes256_encrypt_message +#define ccm_aes256_decrypt_message nettle_ccm_aes256_decrypt_message + +/* For CCM, the block size of the block cipher shall be 128 bits. */ +#define CCM_BLOCK_SIZE 16 +#define CCM_DIGEST_SIZE 16 +#define CCM_MIN_NONCE_SIZE 7 +#define CCM_MAX_NONCE_SIZE 14 + +/* Maximum cleartext message size, as a function of the nonce size N. + The length field is L octets, with L = 15 - N, and then the maximum + size M = 2^{8L} - 1. */ +#define CCM_MAX_MSG_SIZE(N) \ + ((sizeof(size_t) + (N) <= 15) \ + ? ~(size_t) 0 \ + : ((size_t) 1 << (8*(15 - N))) - 1) + +/* Per-message state */ +struct ccm_ctx { + union nettle_block16 ctr; /* Counter for CTR encryption. */ + union nettle_block16 tag; /* CBC-MAC message tag. */ + /* Length of data processed by the CBC-MAC modulus the block size */ + unsigned int blength; +}; + +/* + * CCM mode requires the adata and message lengths when building the IV, which + * prevents streaming processing and it incompatible with the AEAD API. + */ +void +ccm_set_nonce(struct ccm_ctx *ctx, const void *cipher, nettle_cipher_func *f, + size_t noncelen, const uint8_t *nonce, + size_t authlen, size_t msglen, size_t taglen); + +void +ccm_update(struct ccm_ctx *ctx, const void *cipher, nettle_cipher_func *f, + size_t length, const uint8_t *data); + +void +ccm_encrypt(struct ccm_ctx *ctx, const void *cipher, nettle_cipher_func *f, + size_t length, uint8_t *dst, const uint8_t *src); + +void +ccm_decrypt(struct ccm_ctx *ctx, const void *cipher, nettle_cipher_func *f, + size_t length, uint8_t *dst, const uint8_t *src); + +void +ccm_digest(struct ccm_ctx *ctx, const void *cipher, nettle_cipher_func *f, + size_t length, uint8_t *digest); + +/* + * All-in-one encryption and decryption API: + * tlength = sizeof(digest) + * mlength = sizeof(cleartext) + * clength = sizeof(ciphertext) = mlength + tlength + * + * The ciphertext will contain the encrypted payload with the message digest + * appended to the end. + */ +void +ccm_encrypt_message(const void *cipher, nettle_cipher_func *f, + size_t nlength, const uint8_t *nonce, + size_t alength, const uint8_t *adata, + size_t tlength, + size_t clength, uint8_t *dst, const uint8_t *src); + +/* + * The decryption function will write the plaintext to dst and parse the digest + * from the final tlength bytes of the ciphertext. If the digest matched the + * value computed during decryption then this will return 1, or it will return + * 0 if the digest was invalid. + */ +int +ccm_decrypt_message(const void *cipher, nettle_cipher_func *f, + size_t nlength, const uint8_t *nonce, + size_t alength, const uint8_t *adata, + size_t tlength, + size_t mlength, uint8_t *dst, const uint8_t *src); + +/* CCM Mode with AES-128 */ +struct ccm_aes128_ctx { + struct ccm_ctx ccm; + struct aes128_ctx cipher; +}; + +void +ccm_aes128_set_key(struct ccm_aes128_ctx *ctx, const uint8_t *key); + +void +ccm_aes128_set_nonce(struct ccm_aes128_ctx *ctx, + size_t length, const uint8_t *nonce, + size_t authlen, size_t msglen, size_t taglen); + +void +ccm_aes128_update (struct ccm_aes128_ctx *ctx, + size_t length, const uint8_t *data); + +void +ccm_aes128_encrypt(struct ccm_aes128_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); + +void +ccm_aes128_decrypt(struct ccm_aes128_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); + +void +ccm_aes128_digest(struct ccm_aes128_ctx *ctx, + size_t length, uint8_t *digest); + +void +ccm_aes128_encrypt_message(struct ccm_aes128_ctx *ctx, + size_t nlength, const uint8_t *nonce, + size_t alength, const uint8_t *adata, + size_t tlength, + size_t clength, uint8_t *dst, const uint8_t *src); + +int +ccm_aes128_decrypt_message(struct ccm_aes128_ctx *ctx, + size_t nlength, const uint8_t *nonce, + size_t alength, const uint8_t *adata, + size_t tlength, + size_t mlength, uint8_t *dst, const uint8_t *src); + +struct ccm_aes192_ctx { + struct ccm_ctx ccm; + struct aes192_ctx cipher; +}; + +/* CCM Mode with AES-192 */ +void +ccm_aes192_set_key(struct ccm_aes192_ctx *ctx, const uint8_t *key); + +void +ccm_aes192_set_nonce(struct ccm_aes192_ctx *ctx, + size_t length, const uint8_t *nonce, + size_t authlen, size_t msglen, size_t taglen); + +void +ccm_aes192_update(struct ccm_aes192_ctx *ctx, + size_t length, const uint8_t *data); + +void +ccm_aes192_encrypt(struct ccm_aes192_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); + +void +ccm_aes192_decrypt(struct ccm_aes192_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); + +void +ccm_aes192_digest(struct ccm_aes192_ctx *ctx, + size_t length, uint8_t *digest); + +void +ccm_aes192_encrypt_message(struct ccm_aes192_ctx *ctx, + size_t nlength, const uint8_t *nonce, + size_t alength, const uint8_t *adata, + size_t tlength, + size_t clength, uint8_t *dst, const uint8_t *src); + +int +ccm_aes192_decrypt_message(struct ccm_aes192_ctx *ctx, + size_t nlength, const uint8_t *nonce, + size_t alength, const uint8_t *adata, + size_t tlength, + size_t mlength, uint8_t *dst, const uint8_t *src); + +/* CCM Mode with AES-256 */ +struct ccm_aes256_ctx { + struct ccm_ctx ccm; + struct aes256_ctx cipher; +}; + +void +ccm_aes256_set_key(struct ccm_aes256_ctx *ctx, const uint8_t *key); + +void +ccm_aes256_set_nonce(struct ccm_aes256_ctx *ctx, + size_t length, const uint8_t *nonce, + size_t authlen, size_t msglen, size_t taglen); + +void +ccm_aes256_update(struct ccm_aes256_ctx *ctx, + size_t length, const uint8_t *data); + +void +ccm_aes256_encrypt(struct ccm_aes256_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); + +void +ccm_aes256_decrypt(struct ccm_aes256_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); + +void +ccm_aes256_digest(struct ccm_aes256_ctx *ctx, + size_t length, uint8_t *digest); + +void +ccm_aes256_encrypt_message(struct ccm_aes256_ctx *ctx, + size_t nlength, const uint8_t *nonce, + size_t alength, const uint8_t *adata, + size_t tlength, + size_t clength, uint8_t *dst, const uint8_t *src); + +int +ccm_aes256_decrypt_message(struct ccm_aes256_ctx *ctx, + size_t nlength, const uint8_t *nonce, + size_t alength, const uint8_t *adata, + size_t tlength, + size_t mlength, uint8_t *dst, const uint8_t *src); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_CCM_H_INCLUDED */ diff --git a/include/nettle/cfb.h b/include/nettle/cfb.h new file mode 100644 index 0000000..16660df --- /dev/null +++ b/include/nettle/cfb.h @@ -0,0 +1,87 @@ +/* cfb.h + + Cipher feedback mode. + + Copyright (C) 2015, 2017 Dmitry Eremin-Solenikov + Copyright (C) 2001 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_CFB_H_INCLUDED +#define NETTLE_CFB_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define cfb_encrypt nettle_cfb_encrypt +#define cfb_decrypt nettle_cfb_decrypt + +void +cfb_encrypt(const void *ctx, nettle_cipher_func *f, + size_t block_size, uint8_t *iv, + size_t length, uint8_t *dst, + const uint8_t *src); + +void +cfb_decrypt(const void *ctx, nettle_cipher_func *f, + size_t block_size, uint8_t *iv, + size_t length, uint8_t *dst, + const uint8_t *src); + +#define CFB_CTX(type, size) \ +{ type ctx; uint8_t iv[size]; } + +#define CFB_SET_IV(ctx, data) \ +memcpy((ctx)->iv, (data), sizeof((ctx)->iv)) + +/* NOTE: Avoid using NULL, as we don't include anything defining it. */ +#define CFB_ENCRYPT(self, f, length, dst, src) \ + (0 ? ((f)(&(self)->ctx, ~(size_t) 0, \ + (uint8_t *) 0, (const uint8_t *) 0)) \ + : cfb_encrypt((void *) &(self)->ctx, \ + (nettle_cipher_func *) (f), \ + sizeof((self)->iv), (self)->iv, \ + (length), (dst), (src))) + +#define CFB_DECRYPT(self, f, length, dst, src) \ + (0 ? ((f)(&(self)->ctx, ~(size_t) 0, \ + (uint8_t *) 0, (const uint8_t *) 0)) \ + : cfb_decrypt((void *) &(self)->ctx, \ + (nettle_cipher_func *) (f), \ + sizeof((self)->iv), (self)->iv, \ + (length), (dst), (src))) + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_CFB_H_INCLUDED */ diff --git a/include/nettle/chacha-poly1305.h b/include/nettle/chacha-poly1305.h new file mode 100644 index 0000000..ce40b77 --- /dev/null +++ b/include/nettle/chacha-poly1305.h @@ -0,0 +1,98 @@ +/* chacha-poly1305.h + + AEAD mechanism based on chacha and poly1305. + See draft-agl-tls-chacha20poly1305-04. + + Copyright (C) 2014 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_CHACHA_POLY1305_H_INCLUDED +#define NETTLE_CHACHA_POLY1305_H_INCLUDED + +#include "chacha.h" +#include "poly1305.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define chacha_poly1305_set_key nettle_chacha_poly1305_set_key +#define chacha_poly1305_set_nonce nettle_chacha_poly1305_set_nonce +#define chacha_poly1305_update nettle_chacha_poly1305_update +#define chacha_poly1305_decrypt nettle_chacha_poly1305_decrypt +#define chacha_poly1305_encrypt nettle_chacha_poly1305_encrypt +#define chacha_poly1305_digest nettle_chacha_poly1305_digest + +#define CHACHA_POLY1305_BLOCK_SIZE 64 +/* FIXME: Any need for 128-bit variant? */ +#define CHACHA_POLY1305_KEY_SIZE 32 +#define CHACHA_POLY1305_NONCE_SIZE CHACHA_NONCE96_SIZE +#define CHACHA_POLY1305_DIGEST_SIZE 16 + +struct chacha_poly1305_ctx +{ + struct chacha_ctx chacha; + struct poly1305_ctx poly1305; + union nettle_block16 s; + uint64_t auth_size; + uint64_t data_size; + /* poly1305 block */ + uint8_t block[POLY1305_BLOCK_SIZE]; + unsigned index; +}; + +void +chacha_poly1305_set_key (struct chacha_poly1305_ctx *ctx, + const uint8_t *key); +void +chacha_poly1305_set_nonce (struct chacha_poly1305_ctx *ctx, + const uint8_t *nonce); + +void +chacha_poly1305_update (struct chacha_poly1305_ctx *ctx, + size_t length, const uint8_t *data); + +void +chacha_poly1305_encrypt (struct chacha_poly1305_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); + +void +chacha_poly1305_decrypt (struct chacha_poly1305_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); + +void +chacha_poly1305_digest (struct chacha_poly1305_ctx *ctx, + size_t length, uint8_t *digest); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_CHACHA_POLY1305_H_INCLUDED */ diff --git a/include/nettle/chacha.h b/include/nettle/chacha.h new file mode 100644 index 0000000..3f08283 --- /dev/null +++ b/include/nettle/chacha.h @@ -0,0 +1,96 @@ +/* chacha.h + + The ChaCha stream cipher. + + Copyright (C) 2013 Joachim Strömbergson + Copyright (C) 2012 Simon Josefsson + Copyright (C) 2014 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_CHACHA_H_INCLUDED +#define NETTLE_CHACHA_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define chacha_set_key nettle_chacha_set_key +#define chacha_set_nonce nettle_chacha_set_nonce +#define chacha_set_nonce96 nettle_chacha_set_nonce96 +#define chacha_crypt nettle_chacha_crypt +#define _chacha_core _nettle_chacha_core + +/* Currently, only 256-bit keys are supported. */ +#define CHACHA_KEY_SIZE 32 +#define CHACHA_BLOCK_SIZE 64 +#define CHACHA_NONCE_SIZE 8 +#define CHACHA_NONCE96_SIZE 12 + +#define _CHACHA_STATE_LENGTH 16 + +struct chacha_ctx +{ + /* Indices 0-3 holds a constant (SIGMA or TAU). + Indices 4-11 holds the key. + Indices 12-13 holds the block counter. + Indices 14-15 holds the IV: + + This creates the state matrix: + C C C C + K K K K + K K K K + B B I I + */ + uint32_t state[_CHACHA_STATE_LENGTH]; +}; + +void +chacha_set_key(struct chacha_ctx *ctx, const uint8_t *key); + +void +chacha_set_nonce(struct chacha_ctx *ctx, const uint8_t *nonce); + +void +chacha_set_nonce96(struct chacha_ctx *ctx, const uint8_t *nonce); + +void +chacha_crypt(struct chacha_ctx *ctx, size_t length, + uint8_t *dst, const uint8_t *src); + +void +_chacha_core(uint32_t *dst, const uint32_t *src, unsigned rounds); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_CHACHA_H_INCLUDED */ diff --git a/include/nettle/ctr.h b/include/nettle/ctr.h new file mode 100644 index 0000000..7dd06a2 --- /dev/null +++ b/include/nettle/ctr.h @@ -0,0 +1,71 @@ +/* ctr.h + + Counter mode, using an network byte order incremented counter, + matching the testcases of NIST 800-38A. + + Copyright (C) 2005 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_CTR_H_INCLUDED +#define NETTLE_CTR_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define ctr_crypt nettle_ctr_crypt + +void +ctr_crypt(const void *ctx, nettle_cipher_func *f, + size_t block_size, uint8_t *ctr, + size_t length, uint8_t *dst, + const uint8_t *src); + +#define CTR_CTX(type, size) \ +{ type ctx; uint8_t ctr[size]; } + +#define CTR_SET_COUNTER(ctx, data) \ +memcpy((ctx)->ctr, (data), sizeof((ctx)->ctr)) + +#define CTR_CRYPT(self, f, length, dst, src) \ + (0 ? ((f)(&(self)->ctx, ~(size_t) 0, \ + (uint8_t *) 0, (const uint8_t *) 0)) \ + : ctr_crypt((void *) &(self)->ctx, \ + (nettle_cipher_func *) (f), \ + sizeof((self)->ctr), (self)->ctr, \ + (length), (dst), (src))) + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_CTR_H_INCLUDED */ diff --git a/include/nettle/curve25519.h b/include/nettle/curve25519.h new file mode 100644 index 0000000..1dcd94d --- /dev/null +++ b/include/nettle/curve25519.h @@ -0,0 +1,60 @@ +/* curve25519.h + + Copyright (C) 2014 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_CURVE25519_H +#define NETTLE_CURVE25519_H + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define curve25519_mul_g nettle_curve25519_mul_g +#define curve25519_mul nettle_curve25519_mul + +#define CURVE25519_SIZE 32 + +/* Indicates that curve25519_mul conforms to RFC 7748. */ +#define NETTLE_CURVE25519_RFC7748 1 + +void +curve25519_mul_g (uint8_t *q, const uint8_t *n); + +void +curve25519_mul (uint8_t *q, const uint8_t *n, const uint8_t *p); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_CURVE25519_H */ diff --git a/include/nettle/des-compat.h b/include/nettle/des-compat.h new file mode 100644 index 0000000..bda4e75 --- /dev/null +++ b/include/nettle/des-compat.h @@ -0,0 +1,162 @@ +/* des-compat.h + + The des block cipher, old libdes/openssl-style interface. + + Copyright (C) 2001 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_DES_COMPAT_H_INCLUDED +#define NETTLE_DES_COMPAT_H_INCLUDED + +/* According to Assar, des_set_key, des_set_key_odd_parity, + * des_is_weak_key, plus the encryption functions (des_*_encrypt and + * des_cbc_cksum) would be a pretty useful subset. */ + +/* NOTE: This is quite experimental, and not all functions are + * implemented. Contributions, in particular test cases are welcome. */ + +#include "des.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* We use some name mangling, to avoid collisions with either other + * nettle functions or with libcrypto. */ + +#define des_ecb3_encrypt nettle_openssl_des_ecb3_encrypt +#define des_cbc_cksum nettle_openssl_des_cbc_cksum +#define des_ncbc_encrypt nettle_openssl_des_ncbc_encrypt +#define des_cbc_encrypt nettle_openssl_des_cbc_encrypt +#define des_ecb_encrypt nettle_openssl_des_ecb_encrypt +#define des_ede3_cbc_encrypt nettle_openssl_des_ede3_cbc_encrypt +#define des_set_odd_parity nettle_openssl_des_set_odd_parity +#define des_check_key nettle_openssl_des_check_key +#define des_key_sched nettle_openssl_des_key_sched +#define des_is_weak_key nettle_openssl_des_is_weak_key + +/* An extra alias */ +#undef des_set_key +#define des_set_key nettle_openssl_des_key_sched + +enum { DES_DECRYPT = 0, DES_ENCRYPT = 1 }; + +/* Types */ +typedef uint32_t DES_LONG; + +/* Note: Typedef:ed arrays should be avoided, but they're used here + * for compatibility. */ +typedef struct des_ctx des_key_schedule[1]; + +typedef uint8_t des_cblock[DES_BLOCK_SIZE]; +/* Note: The proper definition, + + typedef const uint8_t const_des_cblock[DES_BLOCK_SIZE]; + + would have worked, *if* all the prototypes had used arguments like + foo(const_des_cblock src, des_cblock dst), letting argument arrays + "decay" into pointers of type uint8_t * and const uint8_t *. + + But since openssl's prototypes use *pointers* const_des_cblock *src, + des_cblock *dst, this ends up in type conflicts, and the workaround + is to not use const at all. +*/ +#define const_des_cblock des_cblock + +/* Aliases */ +#define des_ecb2_encrypt(i,o,k1,k2,e) \ + des_ecb3_encrypt((i),(o),(k1),(k2),(k1),(e)) + +#define des_ede2_cbc_encrypt(i,o,l,k1,k2,iv,e) \ + des_ede3_cbc_encrypt((i),(o),(l),(k1),(k2),(k1),(iv),(e)) + +/* Global flag */ +extern int des_check_key; + +/* Prototypes */ + +/* Typing is a little confusing. Since both des_cblock and + des_key_schedule are typedef:ed arrays, it automatically decay to + a pointers. + + But the functions are declared taking pointers to des_cblock, i.e. + pointers to arrays. And on the other hand, they take plain + des_key_schedule arguments, which is equivalent to pointers to + struct des_ctx. */ +void +des_ecb3_encrypt(const_des_cblock *src, des_cblock *dst, + des_key_schedule k1, + des_key_schedule k2, + des_key_schedule k3, int enc); + +/* des_cbc_cksum in libdes returns a 32 bit integer, representing the + * latter half of the output block, using little endian byte order. */ +uint32_t +des_cbc_cksum(const uint8_t *src, des_cblock *dst, + long length, des_key_schedule ctx, + const_des_cblock *iv); + +/* NOTE: Doesn't update iv. */ +void +des_cbc_encrypt(const_des_cblock *src, des_cblock *dst, long length, + des_key_schedule ctx, const_des_cblock *iv, + int enc); + +/* Similar, but updates iv. */ +void +des_ncbc_encrypt(const_des_cblock *src, des_cblock *dst, long length, + des_key_schedule ctx, des_cblock *iv, + int enc); + +void +des_ecb_encrypt(const_des_cblock *src, des_cblock *dst, + des_key_schedule ctx, int enc); + +void +des_ede3_cbc_encrypt(const_des_cblock *src, des_cblock *dst, long length, + des_key_schedule k1, + des_key_schedule k2, + des_key_schedule k3, + des_cblock *iv, + int enc); + +int +des_set_odd_parity(des_cblock *key); + +int +des_key_sched(const_des_cblock *key, des_key_schedule ctx); + +int +des_is_weak_key(const_des_cblock *key); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_DES_COMPAT_H_INCLUDED */ diff --git a/include/nettle/des.h b/include/nettle/des.h new file mode 100644 index 0000000..f8f3fea --- /dev/null +++ b/include/nettle/des.h @@ -0,0 +1,120 @@ +/* des.h + + The des block cipher. And triple des. + + Copyright (C) 1992 Dana L. How + Copyright (C) 2001 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +/* + * des - fast & portable DES encryption & decryption. + * Copyright (C) 1992 Dana L. How + * Please see the file `../lib/descore.README' for the complete copyright + * notice. + * + * Slightly edited by Niels Möller, 1997 + */ + +#ifndef NETTLE_DES_H_INCLUDED +#define NETTLE_DES_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Namespace mangling */ +#define des_set_key nettle_des_set_key +#define des_encrypt nettle_des_encrypt +#define des_decrypt nettle_des_decrypt +#define des_check_parity nettle_des_check_parity +#define des_fix_parity nettle_des_fix_parity +#define des3_set_key nettle_des3_set_key +#define des3_encrypt nettle_des3_encrypt +#define des3_decrypt nettle_des3_decrypt + +#define DES_KEY_SIZE 8 +#define DES_BLOCK_SIZE 8 + +/* Expanded key length */ +#define _DES_KEY_LENGTH 32 + +struct des_ctx +{ + uint32_t key[_DES_KEY_LENGTH]; +}; + +/* Returns 1 for good keys and 0 for weak keys. */ +int +des_set_key(struct des_ctx *ctx, const uint8_t *key); + +void +des_encrypt(const struct des_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); +void +des_decrypt(const struct des_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); + +int +des_check_parity(size_t length, const uint8_t *key); + +void +des_fix_parity(size_t length, uint8_t *dst, + const uint8_t *src); + +#define DES3_KEY_SIZE 24 +#define DES3_BLOCK_SIZE DES_BLOCK_SIZE + +struct des3_ctx +{ + struct des_ctx des[3]; +}; + + +/* Returns 1 for good keys and 0 for weak keys. */ +int +des3_set_key(struct des3_ctx *ctx, const uint8_t *key); + +void +des3_encrypt(const struct des3_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); +void +des3_decrypt(const struct des3_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_DES_H_INCLUDED */ diff --git a/include/nettle/dsa-compat.h b/include/nettle/dsa-compat.h new file mode 100644 index 0000000..4ec96ed --- /dev/null +++ b/include/nettle/dsa-compat.h @@ -0,0 +1,183 @@ +/* dsa-compat.h + + Old DSA publickey interface. + + Copyright (C) 2002, 2013, 2014 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_DSA_COMPAT_H_INCLUDED +#define NETTLE_DSA_COMPAT_H_INCLUDED + +#include "dsa.h" + +#include "sha1.h" +#include "sha2.h" + +/* Name mangling */ +#define dsa_public_key_init nettle_dsa_public_key_init +#define dsa_public_key_clear nettle_dsa_public_key_clear +#define dsa_private_key_init nettle_dsa_private_key_init +#define dsa_private_key_clear nettle_dsa_private_key_clear +#define dsa_sha1_sign nettle_dsa_sha1_sign +#define dsa_sha1_verify nettle_dsa_sha1_verify +#define dsa_sha256_sign nettle_dsa_sha256_sign +#define dsa_sha256_verify nettle_dsa_sha256_verify +#define dsa_sha1_sign_digest nettle_dsa_sha1_sign_digest +#define dsa_sha1_verify_digest nettle_dsa_sha1_verify_digest +#define dsa_sha256_sign_digest nettle_dsa_sha256_sign_digest +#define dsa_sha256_verify_digest nettle_dsa_sha256_verify_digest +#define dsa_compat_generate_keypair nettle_dsa_compat_generate_keypair + +/* Switch meaning of dsa_generate_keypair */ +#undef dsa_generate_keypair +#define dsa_generate_keypair nettle_dsa_compat_generate_keypair + +#ifdef __cplusplus +extern "C" { +#endif + +struct dsa_public_key +{ + /* Same as struct dsa_params, but can't use that struct here without + breaking backwards compatibility. Layout must be identical, since + this is cast to a struct dsa_param pointer for calling _dsa_sign + and _dsa_verify */ + mpz_t p; + mpz_t q; + mpz_t g; + + /* Public value */ + mpz_t y; +}; + +struct dsa_private_key +{ + /* Unlike an rsa public key, private key operations will need both + * the private and the public information. */ + mpz_t x; +}; + +/* Signing a message works as follows: + * + * Store the private key in a dsa_private_key struct. + * + * Initialize a hashing context, by callling + * sha1_init + * + * Hash the message by calling + * sha1_update + * + * Create the signature by calling + * dsa_sha1_sign + * + * The signature is represented as a struct dsa_signature. This call also + * resets the hashing context. + * + * When done with the key and signature, don't forget to call + * dsa_signature_clear. + */ + +/* Calls mpz_init to initialize bignum storage. */ +void +dsa_public_key_init(struct dsa_public_key *key); + +/* Calls mpz_clear to deallocate bignum storage. */ +void +dsa_public_key_clear(struct dsa_public_key *key); + + +/* Calls mpz_init to initialize bignum storage. */ +void +dsa_private_key_init(struct dsa_private_key *key); + +/* Calls mpz_clear to deallocate bignum storage. */ +void +dsa_private_key_clear(struct dsa_private_key *key); + +int +dsa_sha1_sign(const struct dsa_public_key *pub, + const struct dsa_private_key *key, + void *random_ctx, nettle_random_func *random, + struct sha1_ctx *hash, + struct dsa_signature *signature); + +int +dsa_sha256_sign(const struct dsa_public_key *pub, + const struct dsa_private_key *key, + void *random_ctx, nettle_random_func *random, + struct sha256_ctx *hash, + struct dsa_signature *signature); + +int +dsa_sha1_verify(const struct dsa_public_key *key, + struct sha1_ctx *hash, + const struct dsa_signature *signature); + +int +dsa_sha256_verify(const struct dsa_public_key *key, + struct sha256_ctx *hash, + const struct dsa_signature *signature); + +int +dsa_sha1_sign_digest(const struct dsa_public_key *pub, + const struct dsa_private_key *key, + void *random_ctx, nettle_random_func *random, + const uint8_t *digest, + struct dsa_signature *signature); +int +dsa_sha256_sign_digest(const struct dsa_public_key *pub, + const struct dsa_private_key *key, + void *random_ctx, nettle_random_func *random, + const uint8_t *digest, + struct dsa_signature *signature); + +int +dsa_sha1_verify_digest(const struct dsa_public_key *key, + const uint8_t *digest, + const struct dsa_signature *signature); + +int +dsa_sha256_verify_digest(const struct dsa_public_key *key, + const uint8_t *digest, + const struct dsa_signature *signature); + +/* Key generation */ +int +dsa_generate_keypair(struct dsa_public_key *pub, + struct dsa_private_key *key, + + void *random_ctx, nettle_random_func *random, + void *progress_ctx, nettle_progress_func *progress, + unsigned p_bits, unsigned q_bits); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_DSA_COMPAT_H_INCLUDED */ diff --git a/include/nettle/dsa.h b/include/nettle/dsa.h new file mode 100644 index 0000000..7aa982a --- /dev/null +++ b/include/nettle/dsa.h @@ -0,0 +1,216 @@ +/* dsa.h + + The DSA publickey algorithm. + + Copyright (C) 2002, 2013, 2014 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_DSA_H_INCLUDED +#define NETTLE_DSA_H_INCLUDED + +#include "nettle-types.h" +#include "bignum.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define dsa_params_init nettle_dsa_params_init +#define dsa_params_clear nettle_dsa_params_clear +#define dsa_signature_init nettle_dsa_signature_init +#define dsa_signature_clear nettle_dsa_signature_clear +#define dsa_sign nettle_dsa_sign +#define dsa_verify nettle_dsa_verify +#define dsa_generate_params nettle_dsa_generate_params +#define dsa_generate_keypair nettle_dsa_generate_keypair +#define dsa_signature_from_sexp nettle_dsa_signature_from_sexp +#define dsa_keypair_to_sexp nettle_dsa_keypair_to_sexp +#define dsa_keypair_from_sexp_alist nettle_dsa_keypair_from_sexp_alist +#define dsa_sha1_keypair_from_sexp nettle_dsa_sha1_keypair_from_sexp +#define dsa_sha256_keypair_from_sexp nettle_dsa_sha256_keypair_from_sexp +#define dsa_params_from_der_iterator nettle_dsa_params_from_der_iterator +#define dsa_public_key_from_der_iterator nettle_dsa_public_key_from_der_iterator +#define dsa_openssl_private_key_from_der_iterator nettle_dsa_openssl_private_key_from_der_iterator +#define dsa_openssl_private_key_from_der nettle_openssl_provate_key_from_der +#define _dsa_hash _nettle_dsa_hash + +/* For FIPS approved parameters */ +#define DSA_SHA1_MIN_P_BITS 512 +#define DSA_SHA1_Q_OCTETS 20 +#define DSA_SHA1_Q_BITS 160 + +#define DSA_SHA256_MIN_P_BITS 1024 +#define DSA_SHA256_Q_OCTETS 32 +#define DSA_SHA256_Q_BITS 256 + +struct dsa_params +{ + /* Modulo */ + mpz_t p; + + /* Group order */ + mpz_t q; + + /* Generator */ + mpz_t g; +}; + +void +dsa_params_init (struct dsa_params *params); + +void +dsa_params_clear (struct dsa_params *params); + +struct dsa_signature +{ + mpz_t r; + mpz_t s; +}; + +/* Calls mpz_init to initialize bignum storage. */ +void +dsa_signature_init(struct dsa_signature *signature); + +/* Calls mpz_clear to deallocate bignum storage. */ +void +dsa_signature_clear(struct dsa_signature *signature); + +int +dsa_sign(const struct dsa_params *params, + const mpz_t x, + void *random_ctx, nettle_random_func *random, + size_t digest_size, + const uint8_t *digest, + struct dsa_signature *signature); + +int +dsa_verify(const struct dsa_params *params, + const mpz_t y, + size_t digest_size, + const uint8_t *digest, + const struct dsa_signature *signature); + + +/* Key generation */ + +int +dsa_generate_params(struct dsa_params *params, + void *random_ctx, nettle_random_func *random, + void *progress_ctx, nettle_progress_func *progress, + unsigned p_bits, unsigned q_bits); + +void +dsa_generate_keypair (const struct dsa_params *params, + mpz_t pub, mpz_t key, + void *random_ctx, nettle_random_func *random); + +/* Keys in sexp form. */ + +struct nettle_buffer; + +/* Generates a public-key expression if PRIV is NULL .*/ +int +dsa_keypair_to_sexp(struct nettle_buffer *buffer, + const char *algorithm_name, /* NULL means "dsa" */ + const struct dsa_params *params, + const mpz_t pub, + const mpz_t priv); + +struct sexp_iterator; + +int +dsa_signature_from_sexp(struct dsa_signature *rs, + struct sexp_iterator *i, + unsigned q_bits); + +int +dsa_keypair_from_sexp_alist(struct dsa_params *params, + mpz_t pub, + mpz_t priv, + unsigned p_max_bits, + unsigned q_bits, + struct sexp_iterator *i); + +/* If PRIV is NULL, expect a public-key expression. If PUB is NULL, + * expect a private key expression and ignore the parts not needed for + * the public key. */ +/* Keys must be initialized before calling this function, as usual. */ +int +dsa_sha1_keypair_from_sexp(struct dsa_params *params, + mpz_t pub, + mpz_t priv, + unsigned p_max_bits, + size_t length, const uint8_t *expr); + +int +dsa_sha256_keypair_from_sexp(struct dsa_params *params, + mpz_t pub, + mpz_t priv, + unsigned p_max_bits, + size_t length, const uint8_t *expr); + +/* Keys in X.509 andd OpenSSL format. */ +struct asn1_der_iterator; + +int +dsa_params_from_der_iterator(struct dsa_params *params, + unsigned max_bits, unsigned q_bits, + struct asn1_der_iterator *i); + +int +dsa_public_key_from_der_iterator(const struct dsa_params *params, + mpz_t pub, + struct asn1_der_iterator *i); + +int +dsa_openssl_private_key_from_der_iterator(struct dsa_params *params, + mpz_t pub, + mpz_t priv, + unsigned p_max_bits, + struct asn1_der_iterator *i); + +int +dsa_openssl_private_key_from_der(struct dsa_params *params, + mpz_t pub, + mpz_t priv, + unsigned p_max_bits, + size_t length, const uint8_t *data); + + +/* Internal functions. */ +void +_dsa_hash (mpz_t h, unsigned bit_size, + size_t length, const uint8_t *digest); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_DSA_H_INCLUDED */ diff --git a/include/nettle/eax.h b/include/nettle/eax.h new file mode 100644 index 0000000..e9747f3 --- /dev/null +++ b/include/nettle/eax.h @@ -0,0 +1,185 @@ +/* eax.h + + EAX mode, see http://www.cs.ucdavis.edu/~rogaway/papers/eax.pdf + + Copyright (C) 2013 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_EAX_H_INCLUDED +#define NETTLE_EAX_H_INCLUDED + +#include "aes.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define eax_set_key nettle_eax_set_key +#define eax_set_nonce nettle_eax_set_nonce +#define eax_update nettle_eax_update +#define eax_encrypt nettle_eax_encrypt +#define eax_decrypt nettle_eax_decrypt +#define eax_digest nettle_eax_digest + +#define eax_aes128_set_key nettle_eax_aes128_set_key +#define eax_aes128_set_nonce nettle_eax_aes128_set_nonce +#define eax_aes128_update nettle_eax_aes128_update +#define eax_aes128_encrypt nettle_eax_aes128_encrypt +#define eax_aes128_decrypt nettle_eax_aes128_decrypt +#define eax_aes128_digest nettle_eax_aes128_digest + +/* Restricted to block ciphers with 128 bit block size. FIXME: Reflect + this in naming? */ + +#define EAX_BLOCK_SIZE 16 +#define EAX_DIGEST_SIZE 16 +/* FIXME: Reasonable default? */ +#define EAX_IV_SIZE 16 + +/* Values independent of message and nonce */ +struct eax_key +{ + union nettle_block16 pad_block; + union nettle_block16 pad_partial; +}; + +struct eax_ctx +{ + union nettle_block16 omac_nonce; + union nettle_block16 omac_data; + union nettle_block16 omac_message; + union nettle_block16 ctr; +}; + +void +eax_set_key (struct eax_key *key, const void *cipher, nettle_cipher_func *f); + +void +eax_set_nonce (struct eax_ctx *eax, const struct eax_key *key, + const void *cipher, nettle_cipher_func *f, + size_t nonce_length, const uint8_t *nonce); + +void +eax_update (struct eax_ctx *eax, const struct eax_key *key, + const void *cipher, nettle_cipher_func *f, + size_t data_length, const uint8_t *data); + +void +eax_encrypt (struct eax_ctx *eax, const struct eax_key *key, + const void *cipher, nettle_cipher_func *f, + size_t length, uint8_t *dst, const uint8_t *src); + +void +eax_decrypt (struct eax_ctx *eax, const struct eax_key *key, + const void *cipher, nettle_cipher_func *f, + size_t length, uint8_t *dst, const uint8_t *src); + +void +eax_digest (struct eax_ctx *eax, const struct eax_key *key, + const void *cipher, nettle_cipher_func *f, + size_t length, uint8_t *digest); + +/* Put the cipher last, to get cipher-independent offsets for the EAX + * state. */ +#define EAX_CTX(type) \ + { struct eax_key key; struct eax_ctx eax; type cipher; } + +#define EAX_SET_KEY(ctx, set_key, encrypt, data) \ + do { \ + (set_key)(&(ctx)->cipher, (data)); \ + if (0) (encrypt) (&(ctx)->cipher, ~(size_t) 0, \ + (uint8_t *) 0, (const uint8_t *) 0); \ + eax_set_key (&(ctx)->key, &(ctx)->cipher, (nettle_cipher_func *) encrypt); \ + } while (0) + +#define EAX_SET_NONCE(ctx, encrypt, length, nonce) \ + (0 ? (encrypt) (&(ctx)->cipher, ~(size_t) 0, \ + (uint8_t *) 0, (const uint8_t *) 0) \ + : eax_set_nonce (&(ctx)->eax, &(ctx)->key, \ + &(ctx)->cipher, (nettle_cipher_func *) (encrypt), \ + (length), (nonce))) + +#define EAX_UPDATE(ctx, encrypt, length, data) \ + (0 ? (encrypt) (&(ctx)->cipher, ~(size_t) 0, \ + (uint8_t *) 0, (const uint8_t *) 0) \ + : eax_update (&(ctx)->eax, &(ctx)->key, \ + &(ctx)->cipher, (nettle_cipher_func *) (encrypt), \ + (length), (data))) + +#define EAX_ENCRYPT(ctx, encrypt, length, dst, src) \ + (0 ? (encrypt) (&(ctx)->cipher, ~(size_t) 0, \ + (uint8_t *) 0, (const uint8_t *) 0) \ + : eax_encrypt (&(ctx)->eax, &(ctx)->key, \ + &(ctx)->cipher, (nettle_cipher_func *) (encrypt), \ + (length), (dst), (src))) + +#define EAX_DECRYPT(ctx, encrypt, length, dst, src) \ + (0 ? (encrypt) (&(ctx)->cipher, ~(size_t) 0, \ + (uint8_t *) 0, (const uint8_t *) 0) \ + : eax_decrypt (&(ctx)->eax, &(ctx)->key, \ + &(ctx)->cipher, (nettle_cipher_func *) (encrypt), \ + (length), (dst), (src))) + +#define EAX_DIGEST(ctx, encrypt, length, digest) \ + (0 ? (encrypt) (&(ctx)->cipher, ~(size_t) 0, \ + (uint8_t *) 0, (const uint8_t *) 0) \ + : eax_digest (&(ctx)->eax, &(ctx)->key, \ + &(ctx)->cipher, (nettle_cipher_func *) (encrypt), \ + (length), (digest))) + +struct eax_aes128_ctx EAX_CTX(struct aes128_ctx); + +void +eax_aes128_set_key(struct eax_aes128_ctx *ctx, const uint8_t *key); + +void +eax_aes128_set_nonce(struct eax_aes128_ctx *ctx, + size_t length, const uint8_t *iv); + +void +eax_aes128_update(struct eax_aes128_ctx *ctx, + size_t length, const uint8_t *data); + +void +eax_aes128_encrypt(struct eax_aes128_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); + +void +eax_aes128_decrypt(struct eax_aes128_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); + +void +eax_aes128_digest(struct eax_aes128_ctx *ctx, size_t length, uint8_t *digest); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_EAX_H_INCLUDED */ diff --git a/include/nettle/ecc-curve.h b/include/nettle/ecc-curve.h new file mode 100644 index 0000000..c08479a --- /dev/null +++ b/include/nettle/ecc-curve.h @@ -0,0 +1,71 @@ +/* ecc-curve.h + + Copyright (C) 2013 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +/* Development of Nettle's ECC support was funded by the .SE Internet Fund. */ + +#ifndef NETTLE_ECC_CURVE_H_INCLUDED +#define NETTLE_ECC_CURVE_H_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +/* The contents of this struct is internal. */ +struct ecc_curve; + +/* FIXME: Rename with leading underscore. Due to ABI subtleties, + applications should not refer to these directly, but use the below + accessor functions. */ +extern const struct ecc_curve nettle_secp_192r1; +extern const struct ecc_curve nettle_secp_224r1; +extern const struct ecc_curve nettle_secp_256r1; +extern const struct ecc_curve nettle_secp_384r1; +extern const struct ecc_curve nettle_secp_521r1; + +#ifdef __GNUC__ +#define NETTLE_PURE __attribute__((pure)) +#else +#define NETTLE_PURE +#endif + +const struct ecc_curve * NETTLE_PURE nettle_get_secp_192r1(void); +const struct ecc_curve * NETTLE_PURE nettle_get_secp_224r1(void); +const struct ecc_curve * NETTLE_PURE nettle_get_secp_256r1(void); +const struct ecc_curve * NETTLE_PURE nettle_get_secp_384r1(void); +const struct ecc_curve * NETTLE_PURE nettle_get_secp_521r1(void); + +#undef NETTLE_PURE + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_ECC_CURVE_H_INCLUDED */ diff --git a/include/nettle/ecc.h b/include/nettle/ecc.h new file mode 100644 index 0000000..93fc9e8 --- /dev/null +++ b/include/nettle/ecc.h @@ -0,0 +1,159 @@ +/* ecc.h + + Copyright (C) 2013 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +/* Development of Nettle's ECC support was funded by the .SE Internet Fund. */ + +#ifndef NETTLE_ECC_H_INCLUDED +#define NETTLE_ECC_H_INCLUDED + +#include "nettle-types.h" +#include "bignum.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define ecc_point_init nettle_ecc_point_init +#define ecc_point_clear nettle_ecc_point_clear +#define ecc_point_set nettle_ecc_point_set +#define ecc_point_get nettle_ecc_point_get +#define ecc_point_mul nettle_ecc_point_mul +#define ecc_point_mul_g nettle_ecc_point_mul_g +#define ecc_scalar_init nettle_ecc_scalar_init +#define ecc_scalar_clear nettle_ecc_scalar_clear +#define ecc_scalar_set nettle_ecc_scalar_set +#define ecc_scalar_get nettle_ecc_scalar_get +#define ecc_scalar_random nettle_ecc_scalar_random +#define ecc_point_mul nettle_ecc_point_mul +#define ecc_bit_size nettle_ecc_bit_size +#define ecc_size nettle_ecc_size +#define ecc_size_a nettle_ecc_size_a +#define ecc_size_j nettle_ecc_size_j + +struct ecc_curve; + +/* High level interface, for ECDSA, DH, etc */ + +/* Represents a point on the ECC curve */ +struct ecc_point +{ + const struct ecc_curve *ecc; + /* Allocated using the same allocation function as GMP. */ + mp_limb_t *p; +}; + +/* Represents a non-zero scalar, an element of Z_q^*, where q is the + group order of the curve. */ +struct ecc_scalar +{ + const struct ecc_curve *ecc; + /* Allocated using the same allocation function as GMP. */ + mp_limb_t *p; +}; + +void +ecc_point_init (struct ecc_point *p, const struct ecc_curve *ecc); +void +ecc_point_clear (struct ecc_point *p); + +/* Fails and returns zero if the point is not on the curve. */ +int +ecc_point_set (struct ecc_point *p, const mpz_t x, const mpz_t y); +void +ecc_point_get (const struct ecc_point *p, mpz_t x, mpz_t y); + +void +ecc_scalar_init (struct ecc_scalar *s, const struct ecc_curve *ecc); +void +ecc_scalar_clear (struct ecc_scalar *s); + +/* Fails and returns zero if the scalar is not in the proper range. */ +int +ecc_scalar_set (struct ecc_scalar *s, const mpz_t z); +void +ecc_scalar_get (const struct ecc_scalar *s, mpz_t z); +/* Generates a random scalar, suitable as an ECDSA private key or a + ECDH exponent. */ +void +ecc_scalar_random (struct ecc_scalar *s, + void *random_ctx, nettle_random_func *random); + +/* Computes r = n p */ +void +ecc_point_mul (struct ecc_point *r, const struct ecc_scalar *n, + const struct ecc_point *p); + +/* Computes r = n g */ +void +ecc_point_mul_g (struct ecc_point *r, const struct ecc_scalar *n); + + +/* Low-level interface */ + +/* Points on a curve are represented as arrays of mp_limb_t, with + curve-specific representation. For the secp curves, we use Jacobian + coordinates (possibly in Montgomery form for mod multiplication). + For curve25519 we use homogeneous coordinates on an equivalent + Edwards curve. The suffix "_h" denotes this internal + representation. + + Since we use additive notation for the groups, the infinity point + on the curve is denoted 0. The infinity point can be represented + with x = y = 0 in affine coordinates, and Z = 0 in Jacobian + coordinates. However, note that most of the ECC functions do *not* + support infinity as an input or output. +*/ + +/* Returns the bit size of a single coordinate (and of the prime p). */ +unsigned +ecc_bit_size (const struct ecc_curve *ecc); + +/* Returns the size of a single coordinate. */ +mp_size_t +ecc_size (const struct ecc_curve *ecc); + +/* Size of a point, using affine coordinates x, y. */ +mp_size_t +ecc_size_a (const struct ecc_curve *ecc); + +/* Size of a point, using jacobian coordinates X, Y and Z. */ +mp_size_t +ecc_size_j (const struct ecc_curve *ecc); + +/* FIXME: Define a generic ecc_dup, ecc_add, for any type of curve. Do + they need to handle infinity points? */ + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_ECC_H_INCLUDED */ diff --git a/include/nettle/ecdsa.h b/include/nettle/ecdsa.h new file mode 100644 index 0000000..693aca8 --- /dev/null +++ b/include/nettle/ecdsa.h @@ -0,0 +1,103 @@ +/* ecdsa.h + + Copyright (C) 2013 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +/* Development of Nettle's ECC support was funded by the .SE Internet Fund. */ + +#ifndef NETTLE_ECDSA_H_INCLUDED +#define NETTLE_ECDSA_H_INCLUDED + +#include "ecc.h" +#include "dsa.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define ecdsa_sign nettle_ecdsa_sign +#define ecdsa_verify nettle_ecdsa_verify +#define ecdsa_generate_keypair nettle_ecdsa_generate_keypair +#define ecc_ecdsa_sign nettle_ecc_ecdsa_sign +#define ecc_ecdsa_sign_itch nettle_ecc_ecdsa_sign_itch +#define ecc_ecdsa_verify nettle_ecc_ecdsa_verify +#define ecc_ecdsa_verify_itch nettle_ecc_ecdsa_verify_itch + +/* High level ECDSA functions. + * + * A public key is represented as a struct ecc_point, and a private + * key as a struct ecc_scalar. FIXME: Introduce some aliases? */ +void +ecdsa_sign (const struct ecc_scalar *key, + void *random_ctx, nettle_random_func *random, + size_t digest_length, + const uint8_t *digest, + struct dsa_signature *signature); + +int +ecdsa_verify (const struct ecc_point *pub, + size_t length, const uint8_t *digest, + const struct dsa_signature *signature); + +void +ecdsa_generate_keypair (struct ecc_point *pub, + struct ecc_scalar *key, + void *random_ctx, nettle_random_func *random); + +/* Low-level ECDSA functions. */ +mp_size_t +ecc_ecdsa_sign_itch (const struct ecc_curve *ecc); + +void +ecc_ecdsa_sign (const struct ecc_curve *ecc, + const mp_limb_t *zp, + /* Random nonce, must be invertible mod ecc group + order. */ + const mp_limb_t *kp, + size_t length, const uint8_t *digest, + mp_limb_t *rp, mp_limb_t *sp, + mp_limb_t *scratch); + +mp_size_t +ecc_ecdsa_verify_itch (const struct ecc_curve *ecc); + +int +ecc_ecdsa_verify (const struct ecc_curve *ecc, + const mp_limb_t *pp, /* Public key */ + size_t length, const uint8_t *digest, + const mp_limb_t *rp, const mp_limb_t *sp, + mp_limb_t *scratch); + + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_ECDSA_H_INCLUDED */ diff --git a/include/nettle/eddsa.h b/include/nettle/eddsa.h new file mode 100644 index 0000000..49f1a02 --- /dev/null +++ b/include/nettle/eddsa.h @@ -0,0 +1,149 @@ +/* eddsa.h + + Copyright (C) 2014 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_EDDSA_H +#define NETTLE_EDDSA_H + +#include "nettle-types.h" + +#include "bignum.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define ed25519_sha512_set_private_key nettle_ed25519_sha512_set_private_key +#define ed25519_sha512_public_key nettle_ed25519_sha512_public_key +#define ed25519_sha512_sign nettle_ed25519_sha512_sign +#define ed25519_sha512_verify nettle_ed25519_sha512_verify + +#define _eddsa_compress _nettle_eddsa_compress +#define _eddsa_compress_itch _nettle_eddsa_compress_itch +#define _eddsa_decompress _nettle_eddsa_decompress +#define _eddsa_decompress_itch _nettle_eddsa_decompress_itch +#define _eddsa_hash _nettle_eddsa_hash +#define _eddsa_expand_key _nettle_eddsa_expand_key +#define _eddsa_sign _nettle_eddsa_sign +#define _eddsa_sign_itch _nettle_eddsa_sign_itch +#define _eddsa_verify _nettle_eddsa_verify +#define _eddsa_verify_itch _nettle_eddsa_verify_itch +#define _eddsa_public_key_itch _nettle_eddsa_public_key_itch +#define _eddsa_public_key _nettle_eddsa_public_key + +#define ED25519_KEY_SIZE 32 +#define ED25519_SIGNATURE_SIZE 64 + +void +ed25519_sha512_public_key (uint8_t *pub, const uint8_t *priv); + +void +ed25519_sha512_sign (const uint8_t *pub, + const uint8_t *priv, + size_t length, const uint8_t *msg, + uint8_t *signature); + +int +ed25519_sha512_verify (const uint8_t *pub, + size_t length, const uint8_t *msg, + const uint8_t *signature); + +/* Low-level internal functions */ + +struct ecc_curve; +struct ecc_modulo; + +mp_size_t +_eddsa_compress_itch (const struct ecc_curve *ecc); +void +_eddsa_compress (const struct ecc_curve *ecc, uint8_t *r, mp_limb_t *p, + mp_limb_t *scratch); + +mp_size_t +_eddsa_decompress_itch (const struct ecc_curve *ecc); +int +_eddsa_decompress (const struct ecc_curve *ecc, mp_limb_t *p, + const uint8_t *cp, + mp_limb_t *scratch); + +void +_eddsa_hash (const struct ecc_modulo *m, + mp_limb_t *rp, const uint8_t *digest); + +mp_size_t +_eddsa_sign_itch (const struct ecc_curve *ecc); + +void +_eddsa_sign (const struct ecc_curve *ecc, + const struct nettle_hash *H, + const uint8_t *pub, + void *ctx, + const mp_limb_t *k2, + size_t length, + const uint8_t *msg, + uint8_t *signature, + mp_limb_t *scratch); + +mp_size_t +_eddsa_verify_itch (const struct ecc_curve *ecc); + +int +_eddsa_verify (const struct ecc_curve *ecc, + const struct nettle_hash *H, + const uint8_t *pub, + const mp_limb_t *A, + void *ctx, + size_t length, + const uint8_t *msg, + const uint8_t *signature, + mp_limb_t *scratch); + +void +_eddsa_expand_key (const struct ecc_curve *ecc, + const struct nettle_hash *H, + void *ctx, + const uint8_t *key, + uint8_t *digest, + mp_limb_t *k2); + +mp_size_t +_eddsa_public_key_itch (const struct ecc_curve *ecc); + +void +_eddsa_public_key (const struct ecc_curve *ecc, + const mp_limb_t *k, uint8_t *pub, mp_limb_t *scratch); + + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_EDDSA_H */ diff --git a/include/nettle/gcm.h b/include/nettle/gcm.h new file mode 100644 index 0000000..766019a --- /dev/null +++ b/include/nettle/gcm.h @@ -0,0 +1,327 @@ +/* gcm.h + + Galois counter mode, specified by NIST, + http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf + + Copyright (C) 2011 Katholieke Universiteit Leuven + Copyright (C) 2011, 2014 Niels Möller + + Contributed by Nikos Mavrogiannopoulos + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_GCM_H_INCLUDED +#define NETTLE_GCM_H_INCLUDED + +#include "aes.h" +#include "camellia.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define gcm_set_key nettle_gcm_set_key +#define gcm_set_iv nettle_gcm_set_iv +#define gcm_update nettle_gcm_update +#define gcm_encrypt nettle_gcm_encrypt +#define gcm_decrypt nettle_gcm_decrypt +#define gcm_digest nettle_gcm_digest + +#define gcm_aes128_set_key nettle_gcm_aes128_set_key +#define gcm_aes128_set_iv nettle_gcm_aes128_set_iv +#define gcm_aes128_update nettle_gcm_aes128_update +#define gcm_aes128_encrypt nettle_gcm_aes128_encrypt +#define gcm_aes128_decrypt nettle_gcm_aes128_decrypt +#define gcm_aes128_digest nettle_gcm_aes128_digest + +#define gcm_aes192_set_key nettle_gcm_aes192_set_key +#define gcm_aes192_set_iv nettle_gcm_aes192_set_iv +#define gcm_aes192_update nettle_gcm_aes192_update +#define gcm_aes192_encrypt nettle_gcm_aes192_encrypt +#define gcm_aes192_decrypt nettle_gcm_aes192_decrypt +#define gcm_aes192_digest nettle_gcm_aes192_digest + +#define gcm_aes256_set_key nettle_gcm_aes256_set_key +#define gcm_aes256_set_iv nettle_gcm_aes256_set_iv +#define gcm_aes256_update nettle_gcm_aes256_update +#define gcm_aes256_encrypt nettle_gcm_aes256_encrypt +#define gcm_aes256_decrypt nettle_gcm_aes256_decrypt +#define gcm_aes256_digest nettle_gcm_aes256_digest + +#define gcm_aes_set_key nettle_gcm_aes_set_key +#define gcm_aes_set_iv nettle_gcm_aes_set_iv +#define gcm_aes_update nettle_gcm_aes_update +#define gcm_aes_encrypt nettle_gcm_aes_encrypt +#define gcm_aes_decrypt nettle_gcm_aes_decrypt +#define gcm_aes_digest nettle_gcm_aes_digest + +#define gcm_camellia128_set_key nettle_gcm_camellia128_set_key +#define gcm_camellia128_set_iv nettle_gcm_camellia128_set_iv +#define gcm_camellia128_update nettle_gcm_camellia128_update +#define gcm_camellia128_encrypt nettle_gcm_camellia128_encrypt +#define gcm_camellia128_decrypt nettle_gcm_camellia128_decrypt +#define gcm_camellia128_digest nettle_gcm_camellia128_digest + +#define gcm_camellia256_set_key nettle_gcm_camellia256_set_key +#define gcm_camellia256_set_iv nettle_gcm_camellia256_set_iv +#define gcm_camellia256_update nettle_gcm_camellia256_update +#define gcm_camellia256_encrypt nettle_gcm_camellia256_encrypt +#define gcm_camellia256_decrypt nettle_gcm_camellia256_decrypt +#define gcm_camellia256_digest nettle_gcm_camellia256_digest + +#define GCM_BLOCK_SIZE 16 +#define GCM_IV_SIZE (GCM_BLOCK_SIZE - 4) +#define GCM_DIGEST_SIZE 16 +#define GCM_TABLE_BITS 8 + +/* Hashing subkey */ +struct gcm_key +{ + union nettle_block16 h[1 << GCM_TABLE_BITS]; +}; + +/* Per-message state, depending on the iv */ +struct gcm_ctx { + /* Original counter block */ + union nettle_block16 iv; + /* Updated for each block. */ + union nettle_block16 ctr; + /* Hashing state */ + union nettle_block16 x; + uint64_t auth_size; + uint64_t data_size; +}; + +void +gcm_set_key(struct gcm_key *key, + const void *cipher, nettle_cipher_func *f); + +void +gcm_set_iv(struct gcm_ctx *ctx, const struct gcm_key *key, + size_t length, const uint8_t *iv); + +void +gcm_update(struct gcm_ctx *ctx, const struct gcm_key *key, + size_t length, const uint8_t *data); + +void +gcm_encrypt(struct gcm_ctx *ctx, const struct gcm_key *key, + const void *cipher, nettle_cipher_func *f, + size_t length, uint8_t *dst, const uint8_t *src); + +void +gcm_decrypt(struct gcm_ctx *ctx, const struct gcm_key *key, + const void *cipher, nettle_cipher_func *f, + size_t length, uint8_t *dst, const uint8_t *src); + +void +gcm_digest(struct gcm_ctx *ctx, const struct gcm_key *key, + const void *cipher, nettle_cipher_func *f, + size_t length, uint8_t *digest); + +/* Convenience macrology (not sure how useful it is) */ +/* All-in-one context, with hash subkey, message state, and cipher. */ +#define GCM_CTX(type) \ + { struct gcm_key key; struct gcm_ctx gcm; type cipher; } + +/* NOTE: Avoid using NULL, as we don't include anything defining it. */ +#define GCM_SET_KEY(ctx, set_key, encrypt, gcm_key) \ + do { \ + (set_key)(&(ctx)->cipher, (gcm_key)); \ + if (0) (encrypt)(&(ctx)->cipher, ~(size_t) 0, \ + (uint8_t *) 0, (const uint8_t *) 0); \ + gcm_set_key(&(ctx)->key, &(ctx)->cipher, \ + (nettle_cipher_func *) (encrypt)); \ + } while (0) + +#define GCM_SET_IV(ctx, length, data) \ + gcm_set_iv(&(ctx)->gcm, &(ctx)->key, (length), (data)) + +#define GCM_UPDATE(ctx, length, data) \ + gcm_update(&(ctx)->gcm, &(ctx)->key, (length), (data)) + +#define GCM_ENCRYPT(ctx, encrypt, length, dst, src) \ + (0 ? (encrypt)(&(ctx)->cipher, ~(size_t) 0, \ + (uint8_t *) 0, (const uint8_t *) 0) \ + : gcm_encrypt(&(ctx)->gcm, &(ctx)->key, &(ctx)->cipher, \ + (nettle_cipher_func *) (encrypt), \ + (length), (dst), (src))) + +#define GCM_DECRYPT(ctx, encrypt, length, dst, src) \ + (0 ? (encrypt)(&(ctx)->cipher, ~(size_t) 0, \ + (uint8_t *) 0, (const uint8_t *) 0) \ + : gcm_decrypt(&(ctx)->gcm, &(ctx)->key, &(ctx)->cipher, \ + (nettle_cipher_func *) (encrypt), \ + (length), (dst), (src))) + +#define GCM_DIGEST(ctx, encrypt, length, digest) \ + (0 ? (encrypt)(&(ctx)->cipher, ~(size_t) 0, \ + (uint8_t *) 0, (const uint8_t *) 0) \ + : gcm_digest(&(ctx)->gcm, &(ctx)->key, &(ctx)->cipher, \ + (nettle_cipher_func *) (encrypt), \ + (length), (digest))) + +struct gcm_aes128_ctx GCM_CTX(struct aes128_ctx); + +void +gcm_aes128_set_key(struct gcm_aes128_ctx *ctx, const uint8_t *key); + +/* FIXME: Define _update and _set_iv as some kind of aliaes, + there's nothing aes-specific. */ +void +gcm_aes128_update (struct gcm_aes128_ctx *ctx, + size_t length, const uint8_t *data); +void +gcm_aes128_set_iv (struct gcm_aes128_ctx *ctx, + size_t length, const uint8_t *iv); + +void +gcm_aes128_encrypt(struct gcm_aes128_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); + +void +gcm_aes128_decrypt(struct gcm_aes128_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); + +void +gcm_aes128_digest(struct gcm_aes128_ctx *ctx, + size_t length, uint8_t *digest); + +struct gcm_aes192_ctx GCM_CTX(struct aes192_ctx); + +void +gcm_aes192_set_key(struct gcm_aes192_ctx *ctx, const uint8_t *key); + +void +gcm_aes192_update (struct gcm_aes192_ctx *ctx, + size_t length, const uint8_t *data); +void +gcm_aes192_set_iv (struct gcm_aes192_ctx *ctx, + size_t length, const uint8_t *iv); + +void +gcm_aes192_encrypt(struct gcm_aes192_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); + +void +gcm_aes192_decrypt(struct gcm_aes192_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); + +void +gcm_aes192_digest(struct gcm_aes192_ctx *ctx, + size_t length, uint8_t *digest); + +struct gcm_aes256_ctx GCM_CTX(struct aes256_ctx); + +void +gcm_aes256_set_key(struct gcm_aes256_ctx *ctx, const uint8_t *key); + +void +gcm_aes256_update (struct gcm_aes256_ctx *ctx, + size_t length, const uint8_t *data); +void +gcm_aes256_set_iv (struct gcm_aes256_ctx *ctx, + size_t length, const uint8_t *iv); + +void +gcm_aes256_encrypt(struct gcm_aes256_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); + +void +gcm_aes256_decrypt(struct gcm_aes256_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); + +void +gcm_aes256_digest(struct gcm_aes256_ctx *ctx, + size_t length, uint8_t *digest); + +/* Old aes interface, for backwards compatibility */ +struct gcm_aes_ctx GCM_CTX(struct aes_ctx); + +void +gcm_aes_set_key(struct gcm_aes_ctx *ctx, + size_t length, const uint8_t *key); + +void +gcm_aes_set_iv(struct gcm_aes_ctx *ctx, + size_t length, const uint8_t *iv); + +void +gcm_aes_update(struct gcm_aes_ctx *ctx, + size_t length, const uint8_t *data); + +void +gcm_aes_encrypt(struct gcm_aes_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); + +void +gcm_aes_decrypt(struct gcm_aes_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); + +void +gcm_aes_digest(struct gcm_aes_ctx *ctx, size_t length, uint8_t *digest); + + +struct gcm_camellia128_ctx GCM_CTX(struct camellia128_ctx); + +void gcm_camellia128_set_key(struct gcm_camellia128_ctx *ctx, + const uint8_t *key); +void gcm_camellia128_set_iv(struct gcm_camellia128_ctx *ctx, + size_t length, const uint8_t *iv); +void gcm_camellia128_update(struct gcm_camellia128_ctx *ctx, + size_t length, const uint8_t *data); +void gcm_camellia128_encrypt(struct gcm_camellia128_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); +void gcm_camellia128_decrypt(struct gcm_camellia128_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); +void gcm_camellia128_digest(struct gcm_camellia128_ctx *ctx, + size_t length, uint8_t *digest); + + +struct gcm_camellia256_ctx GCM_CTX(struct camellia256_ctx); + +void gcm_camellia256_set_key(struct gcm_camellia256_ctx *ctx, + const uint8_t *key); +void gcm_camellia256_set_iv(struct gcm_camellia256_ctx *ctx, + size_t length, const uint8_t *iv); +void gcm_camellia256_update(struct gcm_camellia256_ctx *ctx, + size_t length, const uint8_t *data); +void gcm_camellia256_encrypt(struct gcm_camellia256_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); +void gcm_camellia256_decrypt(struct gcm_camellia256_ctx *ctx, + size_t length, uint8_t *dst, const uint8_t *src); +void gcm_camellia256_digest(struct gcm_camellia256_ctx *ctx, + size_t length, uint8_t *digest); + + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_GCM_H_INCLUDED */ diff --git a/include/nettle/gosthash94.h b/include/nettle/gosthash94.h new file mode 100644 index 0000000..8e9d49f --- /dev/null +++ b/include/nettle/gosthash94.h @@ -0,0 +1,98 @@ +/* gosthash94.h + + The GOST R 34.11-94 hash function, described in RFC 5831. + + Copyright (C) 2012 Nikos Mavrogiannopoulos, Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +/* Based on rhash gost.h. */ + +/* Copyright: 2009-2012 Aleksey Kravchenko + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +/* + * Ported to nettle by Nikos Mavrogiannopoulos. + */ + +#ifndef NETTLE_GOSTHASH94_H_INCLUDED +#define NETTLE_GOSTHASH94_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define gosthash94_init nettle_gosthash94_init +#define gosthash94_update nettle_gosthash94_update +#define gosthash94_digest nettle_gosthash94_digest + +#define GOSTHASH94_BLOCK_SIZE 32 +#define GOSTHASH94_DIGEST_SIZE 32 +/* For backwards compatibility */ +#define GOSTHASH94_DATA_SIZE GOSTHASH94_BLOCK_SIZE + +struct gosthash94_ctx +{ + uint32_t hash[8]; /* algorithm 256-bit state */ + uint32_t sum[8]; /* sum of processed message blocks */ + uint8_t message[GOSTHASH94_BLOCK_SIZE]; /* 256-bit buffer for leftovers */ + uint64_t length; /* number of processed bytes */ +}; + +void gosthash94_init(struct gosthash94_ctx *ctx); +void gosthash94_update(struct gosthash94_ctx *ctx, + size_t length, const uint8_t *msg); +void gosthash94_digest(struct gosthash94_ctx *ctx, + size_t length, uint8_t *result); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_GOSTHASH94_H_INCLUDED */ diff --git a/include/nettle/hkdf.h b/include/nettle/hkdf.h new file mode 100644 index 0000000..43b16ad --- /dev/null +++ b/include/nettle/hkdf.h @@ -0,0 +1,67 @@ +/* hkdf.h + + TLS PRF code (RFC-5246, RFC-2246). + + Copyright (C) 2017 Red Hat, Inc. + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_HKDF_H_INCLUDED +#define NETTLE_HKDF_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Namespace mangling */ +#define hkdf_extract nettle_hkdf_extract +#define hkdf_expand nettle_hkdf_expand + +void +hkdf_extract(void *mac_ctx, + nettle_hash_update_func *update, + nettle_hash_digest_func *digest, + size_t digest_size, + size_t secret_size, const uint8_t *secret, + uint8_t *dst); + +void +hkdf_expand(void *mac_ctx, + nettle_hash_update_func *update, + nettle_hash_digest_func *digest, + size_t digest_size, + size_t info_size, const uint8_t *info, + size_t length, uint8_t *dst); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_HKDF_H_INCLUDED */ diff --git a/include/nettle/hmac.h b/include/nettle/hmac.h new file mode 100644 index 0000000..40a8e77 --- /dev/null +++ b/include/nettle/hmac.h @@ -0,0 +1,210 @@ +/* hmac.h + + HMAC message authentication code (RFC-2104). + + Copyright (C) 2001, 2002 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_HMAC_H_INCLUDED +#define NETTLE_HMAC_H_INCLUDED + +#include "nettle-meta.h" + +#include "md5.h" +#include "ripemd160.h" +#include "sha1.h" +#include "sha2.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Namespace mangling */ +#define hmac_set_key nettle_hmac_set_key +#define hmac_update nettle_hmac_update +#define hmac_digest nettle_hmac_digest +#define hmac_md5_set_key nettle_hmac_md5_set_key +#define hmac_md5_update nettle_hmac_md5_update +#define hmac_md5_digest nettle_hmac_md5_digest +#define hmac_ripemd160_set_key nettle_hmac_ripemd160_set_key +#define hmac_ripemd160_update nettle_hmac_ripemd160_update +#define hmac_ripemd160_digest nettle_hmac_ripemd160_digest +#define hmac_sha1_set_key nettle_hmac_sha1_set_key +#define hmac_sha1_update nettle_hmac_sha1_update +#define hmac_sha1_digest nettle_hmac_sha1_digest +#define hmac_sha224_set_key nettle_hmac_sha224_set_key +#define hmac_sha224_digest nettle_hmac_sha224_digest +#define hmac_sha256_set_key nettle_hmac_sha256_set_key +#define hmac_sha256_update nettle_hmac_sha256_update +#define hmac_sha256_digest nettle_hmac_sha256_digest +#define hmac_sha384_set_key nettle_hmac_sha384_set_key +#define hmac_sha384_digest nettle_hmac_sha384_digest +#define hmac_sha512_set_key nettle_hmac_sha512_set_key +#define hmac_sha512_update nettle_hmac_sha512_update +#define hmac_sha512_digest nettle_hmac_sha512_digest + +void +hmac_set_key(void *outer, void *inner, void *state, + const struct nettle_hash *hash, + size_t length, const uint8_t *key); + +/* This function is not strictly needed, it's s just the same as the + * hash update function. */ +void +hmac_update(void *state, + const struct nettle_hash *hash, + size_t length, const uint8_t *data); + +void +hmac_digest(const void *outer, const void *inner, void *state, + const struct nettle_hash *hash, + size_t length, uint8_t *digest); + + +#define HMAC_CTX(type) \ +{ type outer; type inner; type state; } + +#define HMAC_SET_KEY(ctx, hash, length, key) \ + hmac_set_key( &(ctx)->outer, &(ctx)->inner, &(ctx)->state, \ + (hash), (length), (key) ) + +#define HMAC_DIGEST(ctx, hash, length, digest) \ + hmac_digest( &(ctx)->outer, &(ctx)->inner, &(ctx)->state, \ + (hash), (length), (digest) ) + +/* HMAC using specific hash functions */ + +/* hmac-md5 */ +struct hmac_md5_ctx HMAC_CTX(struct md5_ctx); + +void +hmac_md5_set_key(struct hmac_md5_ctx *ctx, + size_t key_length, const uint8_t *key); + +void +hmac_md5_update(struct hmac_md5_ctx *ctx, + size_t length, const uint8_t *data); + +void +hmac_md5_digest(struct hmac_md5_ctx *ctx, + size_t length, uint8_t *digest); + + +/* hmac-ripemd160 */ +struct hmac_ripemd160_ctx HMAC_CTX(struct ripemd160_ctx); + +void +hmac_ripemd160_set_key(struct hmac_ripemd160_ctx *ctx, + size_t key_length, const uint8_t *key); + +void +hmac_ripemd160_update(struct hmac_ripemd160_ctx *ctx, + size_t length, const uint8_t *data); + +void +hmac_ripemd160_digest(struct hmac_ripemd160_ctx *ctx, + size_t length, uint8_t *digest); + + +/* hmac-sha1 */ +struct hmac_sha1_ctx HMAC_CTX(struct sha1_ctx); + +void +hmac_sha1_set_key(struct hmac_sha1_ctx *ctx, + size_t key_length, const uint8_t *key); + +void +hmac_sha1_update(struct hmac_sha1_ctx *ctx, + size_t length, const uint8_t *data); + +void +hmac_sha1_digest(struct hmac_sha1_ctx *ctx, + size_t length, uint8_t *digest); + +/* hmac-sha256 */ +struct hmac_sha256_ctx HMAC_CTX(struct sha256_ctx); + +void +hmac_sha256_set_key(struct hmac_sha256_ctx *ctx, + size_t key_length, const uint8_t *key); + +void +hmac_sha256_update(struct hmac_sha256_ctx *ctx, + size_t length, const uint8_t *data); + +void +hmac_sha256_digest(struct hmac_sha256_ctx *ctx, + size_t length, uint8_t *digest); + +/* hmac-sha224 */ +#define hmac_sha224_ctx hmac_sha256_ctx + +void +hmac_sha224_set_key(struct hmac_sha224_ctx *ctx, + size_t key_length, const uint8_t *key); + +#define hmac_sha224_update nettle_hmac_sha256_update + +void +hmac_sha224_digest(struct hmac_sha224_ctx *ctx, + size_t length, uint8_t *digest); + +/* hmac-sha512 */ +struct hmac_sha512_ctx HMAC_CTX(struct sha512_ctx); + +void +hmac_sha512_set_key(struct hmac_sha512_ctx *ctx, + size_t key_length, const uint8_t *key); + +void +hmac_sha512_update(struct hmac_sha512_ctx *ctx, + size_t length, const uint8_t *data); + +void +hmac_sha512_digest(struct hmac_sha512_ctx *ctx, + size_t length, uint8_t *digest); + +/* hmac-sha384 */ +#define hmac_sha384_ctx hmac_sha512_ctx + +void +hmac_sha384_set_key(struct hmac_sha512_ctx *ctx, + size_t key_length, const uint8_t *key); + +#define hmac_sha384_update nettle_hmac_sha512_update + +void +hmac_sha384_digest(struct hmac_sha512_ctx *ctx, + size_t length, uint8_t *digest); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_HMAC_H_INCLUDED */ diff --git a/include/nettle/knuth-lfib.h b/include/nettle/knuth-lfib.h new file mode 100644 index 0000000..df0b495 --- /dev/null +++ b/include/nettle/knuth-lfib.h @@ -0,0 +1,80 @@ +/* knuth-lfib.h + + The "lagged fibonacci" pseudorandomness generator, described in + Knuth, TAoCP, 3.6 + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +/* NOTE: This generator is totally inappropriate for cryptographic + * applications. It is useful for generating deterministic but + * random-looking test data, and is used by the Nettle testsuite. */ +#ifndef NETTLE_KNUTH_LFIB_H_INCLUDED +#define NETTLE_KNUTH_LFIB_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Namespace mangling */ +#define knuth_lfib_init nettle_knuth_lfib_init +#define knuth_lfib_get nettle_knuth_lfib_get +#define knuth_lfib_get_array nettle_knuth_lfib_get_array +#define knuth_lfib_random nettle_knuth_lfib_random + +#define _KNUTH_LFIB_KK 100 + +struct knuth_lfib_ctx +{ + uint32_t x[_KNUTH_LFIB_KK]; + unsigned index; +}; + +void +knuth_lfib_init(struct knuth_lfib_ctx *ctx, uint32_t seed); + +/* Get's a single number in the range 0 ... 2^30-1 */ +uint32_t +knuth_lfib_get(struct knuth_lfib_ctx *ctx); + +/* Get an array of numbers */ +void +knuth_lfib_get_array(struct knuth_lfib_ctx *ctx, + size_t n, uint32_t *a); + +/* Get an array of octets. */ +void +knuth_lfib_random(struct knuth_lfib_ctx *ctx, + size_t n, uint8_t *dst); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_KNUTH_LFIB_H_INCLUDED */ diff --git a/include/nettle/macros.h b/include/nettle/macros.h new file mode 100644 index 0000000..990d32e --- /dev/null +++ b/include/nettle/macros.h @@ -0,0 +1,245 @@ +/* macros.h + + Copyright (C) 2001, 2010 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_MACROS_H_INCLUDED +#define NETTLE_MACROS_H_INCLUDED + +/* Reads a 64-bit integer, in network, big-endian, byte order */ +#define READ_UINT64(p) \ +( (((uint64_t) (p)[0]) << 56) \ + | (((uint64_t) (p)[1]) << 48) \ + | (((uint64_t) (p)[2]) << 40) \ + | (((uint64_t) (p)[3]) << 32) \ + | (((uint64_t) (p)[4]) << 24) \ + | (((uint64_t) (p)[5]) << 16) \ + | (((uint64_t) (p)[6]) << 8) \ + | ((uint64_t) (p)[7])) + +#define WRITE_UINT64(p, i) \ +do { \ + (p)[0] = ((i) >> 56) & 0xff; \ + (p)[1] = ((i) >> 48) & 0xff; \ + (p)[2] = ((i) >> 40) & 0xff; \ + (p)[3] = ((i) >> 32) & 0xff; \ + (p)[4] = ((i) >> 24) & 0xff; \ + (p)[5] = ((i) >> 16) & 0xff; \ + (p)[6] = ((i) >> 8) & 0xff; \ + (p)[7] = (i) & 0xff; \ +} while(0) + +/* Reads a 32-bit integer, in network, big-endian, byte order */ +#define READ_UINT32(p) \ +( (((uint32_t) (p)[0]) << 24) \ + | (((uint32_t) (p)[1]) << 16) \ + | (((uint32_t) (p)[2]) << 8) \ + | ((uint32_t) (p)[3])) + +#define WRITE_UINT32(p, i) \ +do { \ + (p)[0] = ((i) >> 24) & 0xff; \ + (p)[1] = ((i) >> 16) & 0xff; \ + (p)[2] = ((i) >> 8) & 0xff; \ + (p)[3] = (i) & 0xff; \ +} while(0) + +/* Analogous macros, for 24 and 16 bit numbers */ +#define READ_UINT24(p) \ +( (((uint32_t) (p)[0]) << 16) \ + | (((uint32_t) (p)[1]) << 8) \ + | ((uint32_t) (p)[2])) + +#define WRITE_UINT24(p, i) \ +do { \ + (p)[0] = ((i) >> 16) & 0xff; \ + (p)[1] = ((i) >> 8) & 0xff; \ + (p)[2] = (i) & 0xff; \ +} while(0) + +#define READ_UINT16(p) \ +( (((uint32_t) (p)[0]) << 8) \ + | ((uint32_t) (p)[1])) + +#define WRITE_UINT16(p, i) \ +do { \ + (p)[0] = ((i) >> 8) & 0xff; \ + (p)[1] = (i) & 0xff; \ +} while(0) + +/* And the other, little-endian, byteorder */ +#define LE_READ_UINT64(p) \ +( (((uint64_t) (p)[7]) << 56) \ + | (((uint64_t) (p)[6]) << 48) \ + | (((uint64_t) (p)[5]) << 40) \ + | (((uint64_t) (p)[4]) << 32) \ + | (((uint64_t) (p)[3]) << 24) \ + | (((uint64_t) (p)[2]) << 16) \ + | (((uint64_t) (p)[1]) << 8) \ + | ((uint64_t) (p)[0])) + +#define LE_WRITE_UINT64(p, i) \ +do { \ + (p)[7] = ((i) >> 56) & 0xff; \ + (p)[6] = ((i) >> 48) & 0xff; \ + (p)[5] = ((i) >> 40) & 0xff; \ + (p)[4] = ((i) >> 32) & 0xff; \ + (p)[3] = ((i) >> 24) & 0xff; \ + (p)[2] = ((i) >> 16) & 0xff; \ + (p)[1] = ((i) >> 8) & 0xff; \ + (p)[0] = (i) & 0xff; \ +} while (0) + +#define LE_READ_UINT32(p) \ +( (((uint32_t) (p)[3]) << 24) \ + | (((uint32_t) (p)[2]) << 16) \ + | (((uint32_t) (p)[1]) << 8) \ + | ((uint32_t) (p)[0])) + +#define LE_WRITE_UINT32(p, i) \ +do { \ + (p)[3] = ((i) >> 24) & 0xff; \ + (p)[2] = ((i) >> 16) & 0xff; \ + (p)[1] = ((i) >> 8) & 0xff; \ + (p)[0] = (i) & 0xff; \ +} while(0) + +/* Analogous macros, for 16 bit numbers */ +#define LE_READ_UINT16(p) \ + ( (((uint32_t) (p)[1]) << 8) \ + | ((uint32_t) (p)[0])) + +#define LE_WRITE_UINT16(p, i) \ + do { \ + (p)[1] = ((i) >> 8) & 0xff; \ + (p)[0] = (i) & 0xff; \ + } while(0) + +/* Macro to make it easier to loop over several blocks. */ +#define FOR_BLOCKS(length, dst, src, blocksize) \ + assert( !((length) % (blocksize))); \ + for (; (length); ((length) -= (blocksize), \ + (dst) += (blocksize), \ + (src) += (blocksize)) ) + +/* The masking of the right shift is needed to allow n == 0 (using + just 32 - n and 64 - n results in undefined behaviour). Most uses + of these macros use a constant and non-zero rotation count. */ +#define ROTL32(n,x) (((x)<<(n)) | ((x)>>((-(n)&31)))) + +#define ROTL64(n,x) (((x)<<(n)) | ((x)>>((-(n))&63))) + +/* Requires that size > 0 */ +#define INCREMENT(size, ctr) \ + do { \ + unsigned increment_i = (size) - 1; \ + if (++(ctr)[increment_i] == 0) \ + while (increment_i > 0 \ + && ++(ctr)[--increment_i] == 0 ) \ + ; \ + } while (0) + + +/* Helper macro for Merkle-DamgÃ¥rd hash functions. Assumes the context + structs includes the following fields: + + uint8_t block[...]; // Buffer holding one block + unsigned int index; // Index into block +*/ + +/* Currently used by sha512 (and sha384) only. */ +#define MD_INCR(ctx) ((ctx)->count_high += !++(ctx)->count_low) + +/* Takes the compression function f as argument. NOTE: also clobbers + length and data. */ +#define MD_UPDATE(ctx, length, data, f, incr) \ + do { \ + if ((ctx)->index) \ + { \ + /* Try to fill partial block */ \ + unsigned __md_left = sizeof((ctx)->block) - (ctx)->index; \ + if ((length) < __md_left) \ + { \ + memcpy((ctx)->block + (ctx)->index, (data), (length)); \ + (ctx)->index += (length); \ + goto __md_done; /* Finished */ \ + } \ + else \ + { \ + memcpy((ctx)->block + (ctx)->index, (data), __md_left); \ + \ + f((ctx), (ctx)->block); \ + (incr); \ + \ + (data) += __md_left; \ + (length) -= __md_left; \ + } \ + } \ + while ((length) >= sizeof((ctx)->block)) \ + { \ + f((ctx), (data)); \ + (incr); \ + \ + (data) += sizeof((ctx)->block); \ + (length) -= sizeof((ctx)->block); \ + } \ + memcpy ((ctx)->block, (data), (length)); \ + (ctx)->index = (length); \ + __md_done: \ + ; \ + } while (0) + +/* Pads the block to a block boundary with the bit pattern 1 0*, + leaving size octets for the length field at the end. If needed, + compresses the block and starts a new one. */ +#define MD_PAD(ctx, size, f) \ + do { \ + unsigned __md_i; \ + __md_i = (ctx)->index; \ + \ + /* Set the first char of padding to 0x80. This is safe since there \ + is always at least one byte free */ \ + \ + assert(__md_i < sizeof((ctx)->block)); \ + (ctx)->block[__md_i++] = 0x80; \ + \ + if (__md_i > (sizeof((ctx)->block) - (size))) \ + { /* No room for length in this block. Process it and \ + pad with another one */ \ + memset((ctx)->block + __md_i, 0, sizeof((ctx)->block) - __md_i); \ + \ + f((ctx), (ctx)->block); \ + __md_i = 0; \ + } \ + memset((ctx)->block + __md_i, 0, \ + sizeof((ctx)->block) - (size) - __md_i); \ + \ + } while (0) + +#endif /* NETTLE_MACROS_H_INCLUDED */ diff --git a/include/nettle/md2.h b/include/nettle/md2.h new file mode 100644 index 0000000..560b2cb --- /dev/null +++ b/include/nettle/md2.h @@ -0,0 +1,79 @@ +/* md2.h + + The MD2 hash function, described in RFC 1319. + + Copyright (C) 2003 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_MD2_H_INCLUDED +#define NETTLE_MD2_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define md2_init nettle_md2_init +#define md2_update nettle_md2_update +#define md2_digest nettle_md2_digest + +#define MD2_DIGEST_SIZE 16 +#define MD2_BLOCK_SIZE 16 +/* For backwards compatibility */ +#define MD2_DATA_SIZE MD2_BLOCK_SIZE + +struct md2_ctx +{ + uint8_t C[MD2_BLOCK_SIZE]; + uint8_t X[3 * MD2_BLOCK_SIZE]; + uint8_t block[MD2_BLOCK_SIZE]; /* Block buffer */ + unsigned index; /* Into buffer */ +}; + +void +md2_init(struct md2_ctx *ctx); + +void +md2_update(struct md2_ctx *ctx, + size_t length, + const uint8_t *data); + +void +md2_digest(struct md2_ctx *ctx, + size_t length, + uint8_t *digest); + + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_MD2_H_INCLUDED */ diff --git a/include/nettle/md4.h b/include/nettle/md4.h new file mode 100644 index 0000000..f199a80 --- /dev/null +++ b/include/nettle/md4.h @@ -0,0 +1,83 @@ +/* md4.h + + The MD4 hash function, described in RFC 1320. + + Copyright (C) 2003 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_MD4_H_INCLUDED +#define NETTLE_MD4_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define md4_init nettle_md4_init +#define md4_update nettle_md4_update +#define md4_digest nettle_md4_digest + +#define MD4_DIGEST_SIZE 16 +#define MD4_BLOCK_SIZE 64 +/* For backwards compatibility */ +#define MD4_DATA_SIZE MD4_BLOCK_SIZE + +/* Digest is kept internally as 4 32-bit words. */ +#define _MD4_DIGEST_LENGTH 4 + +/* FIXME: Identical to md5_ctx */ +struct md4_ctx +{ + uint32_t state[_MD4_DIGEST_LENGTH]; + uint64_t count; /* Block count */ + uint8_t block[MD4_BLOCK_SIZE]; /* Block buffer */ + unsigned index; /* Into buffer */ +}; + +void +md4_init(struct md4_ctx *ctx); + +void +md4_update(struct md4_ctx *ctx, + size_t length, + const uint8_t *data); + +void +md4_digest(struct md4_ctx *ctx, + size_t length, + uint8_t *digest); + + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_MD4_H_INCLUDED */ diff --git a/include/nettle/md5-compat.h b/include/nettle/md5-compat.h new file mode 100644 index 0000000..fd30982 --- /dev/null +++ b/include/nettle/md5-compat.h @@ -0,0 +1,58 @@ +/* md5-compat.h + + The md5 hash function, RFC 1321-style interface. + + Copyright (C) 2001 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_MD5_COMPAT_H_INCLUDED +#define NETTLE_MD5_COMPAT_H_INCLUDED + +#include "md5.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define MD5Init nettle_MD5Init +#define MD5Update nettle_MD5Update +#define MD5Final nettle_MD5Final + +typedef struct md5_ctx MD5_CTX; + +void MD5Init(MD5_CTX *ctx); +void MD5Update(MD5_CTX *ctx, const unsigned char *data, unsigned int length); +void MD5Final(unsigned char *out, MD5_CTX *ctx); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_MD5_COMPAT_H_INCLUDED */ diff --git a/include/nettle/md5.h b/include/nettle/md5.h new file mode 100644 index 0000000..040cf9d --- /dev/null +++ b/include/nettle/md5.h @@ -0,0 +1,86 @@ +/* md5.h + + The MD5 hash function, described in RFC 1321. + + Copyright (C) 2001 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_MD5_H_INCLUDED +#define NETTLE_MD5_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define md5_init nettle_md5_init +#define md5_update nettle_md5_update +#define md5_digest nettle_md5_digest + +#define MD5_DIGEST_SIZE 16 +#define MD5_BLOCK_SIZE 64 +/* For backwards compatibility */ +#define MD5_DATA_SIZE MD5_BLOCK_SIZE + +/* Digest is kept internally as 4 32-bit words. */ +#define _MD5_DIGEST_LENGTH 4 + +struct md5_ctx +{ + uint32_t state[_MD5_DIGEST_LENGTH]; + uint64_t count; /* Block count */ + uint8_t block[MD5_BLOCK_SIZE]; /* Block buffer */ + unsigned index; /* Into buffer */ +}; + +void +md5_init(struct md5_ctx *ctx); + +void +md5_update(struct md5_ctx *ctx, + size_t length, + const uint8_t *data); + +void +md5_digest(struct md5_ctx *ctx, + size_t length, + uint8_t *digest); + +/* Internal compression function. STATE points to 4 uint32_t words, + and DATA points to 64 bytes of input data, possibly unaligned. */ +void +_nettle_md5_compress(uint32_t *state, const uint8_t *data); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_MD5_H_INCLUDED */ diff --git a/include/nettle/memops.h b/include/nettle/memops.h new file mode 100644 index 0000000..815d547 --- /dev/null +++ b/include/nettle/memops.h @@ -0,0 +1,57 @@ +/* memops.h + + Copyright (C) 2016 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_MEMOPS_H_INCLUDED +#define NETTLE_MEMOPS_H_INCLUDED + +#include "memxor.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define cnd_memcpy nettle_cnd_memcpy +#define memeql_sec nettle_memeql_sec + +int +memeql_sec (const void *a, const void *b, size_t n); + +/* Side-channel silent conditional memcpy. cnd must be 0 (nop) or 1 + (copy). */ +void +cnd_memcpy(int cnd, volatile void *dst, const volatile void *src, size_t n); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_MEMOPS_H_INCLUDED */ diff --git a/include/nettle/memxor.h b/include/nettle/memxor.h new file mode 100644 index 0000000..b7bef09 --- /dev/null +++ b/include/nettle/memxor.h @@ -0,0 +1,25 @@ +/* memxor.h + * + */ + +#ifndef NETTLE_MEMXOR_H_INCLUDED +#define NETTLE_MEMXOR_H_INCLUDED + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define memxor nettle_memxor +#define memxor3 nettle_memxor3 + +void *memxor(void *dst, const void *src, size_t n); +void *memxor3(void *dst, const void *a, const void *b, size_t n); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_MEMXOR_H_INCLUDED */ diff --git a/include/nettle/nettle-meta.h b/include/nettle/nettle-meta.h new file mode 100644 index 0000000..0d16a2b --- /dev/null +++ b/include/nettle/nettle-meta.h @@ -0,0 +1,277 @@ +/* nettle-meta.h + + Information about algorithms. + + Copyright (C) 2002, 2014 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_META_H_INCLUDED +#define NETTLE_META_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +struct nettle_cipher +{ + const char *name; + + unsigned context_size; + + /* Zero for stream ciphers */ + unsigned block_size; + + /* Suggested key size; other sizes are sometimes possible. */ + unsigned key_size; + + nettle_set_key_func *set_encrypt_key; + nettle_set_key_func *set_decrypt_key; + + nettle_cipher_func *encrypt; + nettle_cipher_func *decrypt; +}; + +/* FIXME: Rename with leading underscore, but keep current name (and + size!) for now, for ABI compatibility with nettle-3.1, soname + libnettle.so.6. */ +/* null-terminated list of ciphers implemented by this version of nettle */ +extern const struct nettle_cipher * const nettle_ciphers[]; + +const struct nettle_cipher * const * +#ifdef __GNUC__ +__attribute__((pure)) +#endif +nettle_get_ciphers (void); + +#define nettle_ciphers (nettle_get_ciphers()) + +extern const struct nettle_cipher nettle_aes128; +extern const struct nettle_cipher nettle_aes192; +extern const struct nettle_cipher nettle_aes256; + +extern const struct nettle_cipher nettle_camellia128; +extern const struct nettle_cipher nettle_camellia192; +extern const struct nettle_cipher nettle_camellia256; + +extern const struct nettle_cipher nettle_cast128; + +extern const struct nettle_cipher nettle_serpent128; +extern const struct nettle_cipher nettle_serpent192; +extern const struct nettle_cipher nettle_serpent256; + +extern const struct nettle_cipher nettle_twofish128; +extern const struct nettle_cipher nettle_twofish192; +extern const struct nettle_cipher nettle_twofish256; + +extern const struct nettle_cipher nettle_arctwo40; +extern const struct nettle_cipher nettle_arctwo64; +extern const struct nettle_cipher nettle_arctwo128; +extern const struct nettle_cipher nettle_arctwo_gutmann128; + +struct nettle_hash +{ + const char *name; + + /* Size of the context struct */ + unsigned context_size; + + /* Size of digests */ + unsigned digest_size; + + /* Internal block size */ + unsigned block_size; + + nettle_hash_init_func *init; + nettle_hash_update_func *update; + nettle_hash_digest_func *digest; +}; + +#define _NETTLE_HASH(name, NAME) { \ + #name, \ + sizeof(struct name##_ctx), \ + NAME##_DIGEST_SIZE, \ + NAME##_BLOCK_SIZE, \ + (nettle_hash_init_func *) name##_init, \ + (nettle_hash_update_func *) name##_update, \ + (nettle_hash_digest_func *) name##_digest \ +} + +/* FIXME: Rename with leading underscore, but keep current name (and + size!) for now, for ABI compatibility with nettle-3.1, soname + libnettle.so.6. */ +/* null-terminated list of digests implemented by this version of nettle */ +extern const struct nettle_hash * const nettle_hashes[]; + +const struct nettle_hash * const * +#ifdef __GNUC__ +__attribute__((pure)) +#endif +nettle_get_hashes (void); + +#define nettle_hashes (nettle_get_hashes()) + +const struct nettle_hash * +nettle_lookup_hash (const char *name); + +extern const struct nettle_hash nettle_md2; +extern const struct nettle_hash nettle_md4; +extern const struct nettle_hash nettle_md5; +extern const struct nettle_hash nettle_gosthash94; +extern const struct nettle_hash nettle_ripemd160; +extern const struct nettle_hash nettle_sha1; +extern const struct nettle_hash nettle_sha224; +extern const struct nettle_hash nettle_sha256; +extern const struct nettle_hash nettle_sha384; +extern const struct nettle_hash nettle_sha512; +extern const struct nettle_hash nettle_sha512_224; +extern const struct nettle_hash nettle_sha512_256; +extern const struct nettle_hash nettle_sha3_224; +extern const struct nettle_hash nettle_sha3_256; +extern const struct nettle_hash nettle_sha3_384; +extern const struct nettle_hash nettle_sha3_512; + +struct nettle_aead +{ + const char *name; + + unsigned context_size; + /* Block size for encrypt and decrypt. */ + unsigned block_size; + unsigned key_size; + unsigned nonce_size; + unsigned digest_size; + + nettle_set_key_func *set_encrypt_key; + nettle_set_key_func *set_decrypt_key; + nettle_set_key_func *set_nonce; + nettle_hash_update_func *update; + nettle_crypt_func *encrypt; + nettle_crypt_func *decrypt; + /* FIXME: Drop length argument? */ + nettle_hash_digest_func *digest; +}; + +/* FIXME: Rename with leading underscore, but keep current name (and + size!) for now, for ABI compatibility with nettle-3.1, soname + libnettle.so.6. */ +/* null-terminated list of aead constructions implemented by this + version of nettle */ +extern const struct nettle_aead * const nettle_aeads[]; + +const struct nettle_aead * const * +#ifdef __GNUC__ +__attribute__((pure)) +#endif +nettle_get_aeads (void); + +#define nettle_aeads (nettle_get_aeads()) + +extern const struct nettle_aead nettle_gcm_aes128; +extern const struct nettle_aead nettle_gcm_aes192; +extern const struct nettle_aead nettle_gcm_aes256; +extern const struct nettle_aead nettle_gcm_camellia128; +extern const struct nettle_aead nettle_gcm_camellia256; +extern const struct nettle_aead nettle_eax_aes128; +extern const struct nettle_aead nettle_chacha_poly1305; + +struct nettle_armor +{ + const char *name; + unsigned encode_context_size; + unsigned decode_context_size; + + unsigned encode_final_length; + + nettle_armor_init_func *encode_init; + nettle_armor_length_func *encode_length; + nettle_armor_encode_update_func *encode_update; + nettle_armor_encode_final_func *encode_final; + + nettle_armor_init_func *decode_init; + nettle_armor_length_func *decode_length; + nettle_armor_decode_update_func *decode_update; + nettle_armor_decode_final_func *decode_final; +}; + +#define _NETTLE_ARMOR(name, NAME) { \ + #name, \ + sizeof(struct name##_encode_ctx), \ + sizeof(struct name##_decode_ctx), \ + NAME##_ENCODE_FINAL_LENGTH, \ + (nettle_armor_init_func *) name##_encode_init, \ + (nettle_armor_length_func *) name##_encode_length, \ + (nettle_armor_encode_update_func *) name##_encode_update, \ + (nettle_armor_encode_final_func *) name##_encode_final, \ + (nettle_armor_init_func *) name##_decode_init, \ + (nettle_armor_length_func *) name##_decode_length, \ + (nettle_armor_decode_update_func *) name##_decode_update, \ + (nettle_armor_decode_final_func *) name##_decode_final, \ +} + +#define _NETTLE_ARMOR_0(name, NAME) { \ + #name, \ + 0, \ + sizeof(struct name##_decode_ctx), \ + NAME##_ENCODE_FINAL_LENGTH, \ + (nettle_armor_init_func *) name##_encode_init, \ + (nettle_armor_length_func *) name##_encode_length, \ + (nettle_armor_encode_update_func *) name##_encode_update, \ + (nettle_armor_encode_final_func *) name##_encode_final, \ + (nettle_armor_init_func *) name##_decode_init, \ + (nettle_armor_length_func *) name##_decode_length, \ + (nettle_armor_decode_update_func *) name##_decode_update, \ + (nettle_armor_decode_final_func *) name##_decode_final, \ +} + +/* FIXME: Rename with leading underscore, but keep current name (and + size!) for now, for ABI compatibility with nettle-3.1, soname + libnettle.so.6. */ +/* null-terminated list of armor schemes implemented by this version of nettle */ +extern const struct nettle_armor * const nettle_armors[]; + +const struct nettle_armor * const * +#ifdef __GNUC__ +__attribute__((pure)) +#endif +nettle_get_armors (void); + +#define nettle_armors (nettle_get_armors()) + +extern const struct nettle_armor nettle_base64; +extern const struct nettle_armor nettle_base64url; +extern const struct nettle_armor nettle_base16; + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_META_H_INCLUDED */ diff --git a/include/nettle/nettle-stdint.h b/include/nettle/nettle-stdint.h new file mode 100644 index 0000000..e09af32 --- /dev/null +++ b/include/nettle/nettle-stdint.h @@ -0,0 +1,286 @@ +#ifndef __NETTLE_STDINT_H +#define __NETTLE_STDINT_H 1 +#ifndef _GENERATED_STDINT_H +#define _GENERATED_STDINT_H " " +/* generated using gnu compiler gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 */ +#define _STDINT_HAVE_STDINT_H 1 + +/* ................... shortcircuit part ........................... */ + +#if defined HAVE_STDINT_H || defined _STDINT_HAVE_STDINT_H +#include +#else +#include + +/* .................... configured part ............................ */ + +/* whether we have a C99 compatible stdint header file */ +/* #undef _STDINT_HEADER_INTPTR */ +/* whether we have a C96 compatible inttypes header file */ +/* #undef _STDINT_HEADER_UINT32 */ +/* whether we have a BSD compatible inet types header */ +/* #undef _STDINT_HEADER_U_INT32 */ + +/* which 64bit typedef has been found */ +/* #undef _STDINT_HAVE_UINT64_T */ +/* #undef _STDINT_HAVE_U_INT64_T */ + +/* which type model has been detected */ +/* #undef _STDINT_CHAR_MODEL // skipped */ +/* #undef _STDINT_LONG_MODEL // skipped */ + +/* whether int_least types were detected */ +/* #undef _STDINT_HAVE_INT_LEAST32_T */ +/* whether int_fast types were detected */ +/* #undef _STDINT_HAVE_INT_FAST32_T */ +/* whether intmax_t type was detected */ +/* #undef _STDINT_HAVE_INTMAX_T */ + +/* .................... detections part ............................ */ + +/* whether we need to define bitspecific types from compiler base types */ +#ifndef _STDINT_HEADER_INTPTR +#ifndef _STDINT_HEADER_UINT32 +#ifndef _STDINT_HEADER_U_INT32 +#define _STDINT_NEED_INT_MODEL_T +#else +#define _STDINT_HAVE_U_INT_TYPES +#endif +#endif +#endif + +#ifdef _STDINT_HAVE_U_INT_TYPES +#undef _STDINT_NEED_INT_MODEL_T +#endif + +#ifdef _STDINT_CHAR_MODEL +#if _STDINT_CHAR_MODEL+0 == 122 || _STDINT_CHAR_MODEL+0 == 124 +#ifndef _STDINT_BYTE_MODEL +#define _STDINT_BYTE_MODEL 12 +#endif +#endif +#endif + +#ifndef _STDINT_HAVE_INT_LEAST32_T +#define _STDINT_NEED_INT_LEAST_T +#endif + +#ifndef _STDINT_HAVE_INT_FAST32_T +#define _STDINT_NEED_INT_FAST_T +#endif + +#ifndef _STDINT_HEADER_INTPTR +#define _STDINT_NEED_INTPTR_T +#ifndef _STDINT_HAVE_INTMAX_T +#define _STDINT_NEED_INTMAX_T +#endif +#endif + + +/* .................... definition part ............................ */ + +/* some system headers have good uint64_t */ +#ifndef _HAVE_UINT64_T +#if defined _STDINT_HAVE_UINT64_T || defined HAVE_UINT64_T +#define _HAVE_UINT64_T +#elif defined _STDINT_HAVE_U_INT64_T || defined HAVE_U_INT64_T +#define _HAVE_UINT64_T +typedef u_int64_t uint64_t; +#endif +#endif + +#ifndef _HAVE_UINT64_T +/* .. here are some common heuristics using compiler runtime specifics */ +#if defined __STDC_VERSION__ && defined __STDC_VERSION__ >= 199901L +#define _HAVE_UINT64_T +typedef long long int64_t; +typedef unsigned long long uint64_t; + +#elif !defined __STRICT_ANSI__ +#if defined _MSC_VER || defined __WATCOMC__ || defined __BORLANDC__ +#define _HAVE_UINT64_T +typedef __int64 int64_t; +typedef unsigned __int64 uint64_t; + +#elif defined __GNUC__ || defined __MWERKS__ || defined __ELF__ +/* note: all ELF-systems seem to have loff-support which needs 64-bit */ +#if !defined _NO_LONGLONG +#define _HAVE_UINT64_T +typedef long long int64_t; +typedef unsigned long long uint64_t; +#endif + +#elif defined __alpha || (defined __mips && defined _ABIN32) +#if !defined _NO_LONGLONG +typedef long int64_t; +typedef unsigned long uint64_t; +#endif + /* compiler/cpu type to define int64_t */ +#endif +#endif +#endif + +#if defined _STDINT_HAVE_U_INT_TYPES +/* int8_t int16_t int32_t defined by inet code, redeclare the u_intXX types */ +typedef u_int8_t uint8_t; +typedef u_int16_t uint16_t; +typedef u_int32_t uint32_t; + +/* glibc compatibility */ +#ifndef __int8_t_defined +#define __int8_t_defined +#endif +#endif + +#ifdef _STDINT_NEED_INT_MODEL_T +/* we must guess all the basic types. Apart from byte-adressable system, */ +/* there a few 32-bit-only dsp-systems that we guard with BYTE_MODEL 8-} */ +/* (btw, those nibble-addressable systems are way off, or so we assume) */ + + +#if defined _STDINT_BYTE_MODEL +#if _STDINT_LONG_MODEL+0 == 242 +/* 2:4:2 = IP16 = a normal 16-bit system */ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned long uint32_t; +#ifndef __int8_t_defined +#define __int8_t_defined +typedef char int8_t; +typedef short int16_t; +typedef long int32_t; +#endif +#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL == 444 +/* 2:4:4 = LP32 = a 32-bit system derived from a 16-bit */ +/* 4:4:4 = ILP32 = a normal 32-bit system */ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +#ifndef __int8_t_defined +#define __int8_t_defined +typedef char int8_t; +typedef short int16_t; +typedef int int32_t; +#endif +#elif _STDINT_LONG_MODEL+0 == 484 || _STDINT_LONG_MODEL+0 == 488 +/* 4:8:4 = IP32 = a 32-bit system prepared for 64-bit */ +/* 4:8:8 = LP64 = a normal 64-bit system */ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +#ifndef __int8_t_defined +#define __int8_t_defined +typedef char int8_t; +typedef short int16_t; +typedef int int32_t; +#endif +/* this system has a "long" of 64bit */ +#ifndef _HAVE_UINT64_T +#define _HAVE_UINT64_T +typedef unsigned long uint64_t; +typedef long int64_t; +#endif +#elif _STDINT_LONG_MODEL+0 == 448 +/* LLP64 a 64-bit system derived from a 32-bit system */ +typedef unsigned char uint8_t; +typedef unsigned short uint16_t; +typedef unsigned int uint32_t; +#ifndef __int8_t_defined +#define __int8_t_defined +typedef char int8_t; +typedef short int16_t; +typedef int int32_t; +#endif +/* assuming the system has a "long long" */ +#ifndef _HAVE_UINT64_T +#define _HAVE_UINT64_T +typedef unsigned long long uint64_t; +typedef long long int64_t; +#endif +#else +#define _STDINT_NO_INT32_T +#endif +#else +#define _STDINT_NO_INT8_T +#define _STDINT_NO_INT32_T +#endif +#endif + +/* + * quote from SunOS-5.8 sys/inttypes.h: + * Use at your own risk. As of February 1996, the committee is squarely + * behind the fixed sized types; the "least" and "fast" types are still being + * discussed. The probability that the "fast" types may be removed before + * the standard is finalized is high enough that they are not currently + * implemented. + */ + +#if defined _STDINT_NEED_INT_LEAST_T +typedef int8_t int_least8_t; +typedef int16_t int_least16_t; +typedef int32_t int_least32_t; +#ifdef _HAVE_UINT64_T +typedef int64_t int_least64_t; +#endif + +typedef uint8_t uint_least8_t; +typedef uint16_t uint_least16_t; +typedef uint32_t uint_least32_t; +#ifdef _HAVE_UINT64_T +typedef uint64_t uint_least64_t; +#endif + /* least types */ +#endif + +#if defined _STDINT_NEED_INT_FAST_T +typedef int8_t int_fast8_t; +typedef int int_fast16_t; +typedef int32_t int_fast32_t; +#ifdef _HAVE_UINT64_T +typedef int64_t int_fast64_t; +#endif + +typedef uint8_t uint_fast8_t; +typedef unsigned uint_fast16_t; +typedef uint32_t uint_fast32_t; +#ifdef _HAVE_UINT64_T +typedef uint64_t uint_fast64_t; +#endif + /* fast types */ +#endif + +#ifdef _STDINT_NEED_INTMAX_T +#ifdef _HAVE_UINT64_T +typedef int64_t intmax_t; +typedef uint64_t uintmax_t; +#else +typedef long intmax_t; +typedef unsigned long uintmax_t; +#endif +#endif + +#ifdef _STDINT_NEED_INTPTR_T +#ifndef __intptr_t_defined +#define __intptr_t_defined +/* we encourage using "long" to store pointer values, never use "int" ! */ +#if _STDINT_LONG_MODEL+0 == 242 || _STDINT_LONG_MODEL+0 == 484 +typedef unsigned int uintptr_t; +typedef int intptr_t; +#elif _STDINT_LONG_MODEL+0 == 244 || _STDINT_LONG_MODEL+0 == 444 +typedef unsigned long uintptr_t; +typedef long intptr_t; +#elif _STDINT_LONG_MODEL+0 == 448 && defined _HAVE_UINT64_T +typedef uint64_t uintptr_t; +typedef int64_t intptr_t; +#else /* matches typical system types ILP32 and LP64 - but not IP16 or LLP64 */ +typedef unsigned long uintptr_t; +typedef long intptr_t; +#endif +#endif +#endif + + /* shortcircuit*/ +#endif + /* once */ +#endif +#endif diff --git a/include/nettle/nettle-types.h b/include/nettle/nettle-types.h new file mode 100644 index 0000000..84c375d --- /dev/null +++ b/include/nettle/nettle-types.h @@ -0,0 +1,110 @@ +/* nettle-types.h + + Copyright (C) 2005, 2014 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_TYPES_H +#define NETTLE_TYPES_H + +/* For size_t */ +#include + +/* Pretend these types always exists. Nettle doesn't use them. */ +#define _STDINT_HAVE_INT_FAST32_T 1 +#include "nettle-stdint.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* An aligned 16-byte block. */ +union nettle_block16 +{ + uint8_t b[16]; + unsigned long w[16 / sizeof(unsigned long)]; +}; + +/* Randomness. Used by key generation and dsa signature creation. */ +typedef void nettle_random_func(void *ctx, + size_t length, uint8_t *dst); + +/* Progress report function, mainly for key generation. */ +typedef void nettle_progress_func(void *ctx, int c); + +/* Realloc function, used by struct nettle_buffer. */ +typedef void *nettle_realloc_func(void *ctx, void *p, size_t length); + +/* Ciphers */ +typedef void nettle_set_key_func(void *ctx, const uint8_t *key); + +/* For block ciphers, const context. */ +typedef void nettle_cipher_func(const void *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); + + +/* Uses a void * for cipher contexts. Used for crypt operations where + the internal state changes during the encryption. */ +typedef void nettle_crypt_func(void *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); + +/* Hash algorithms */ +typedef void nettle_hash_init_func(void *ctx); +typedef void nettle_hash_update_func(void *ctx, + size_t length, + const uint8_t *src); +typedef void nettle_hash_digest_func(void *ctx, + size_t length, uint8_t *dst); + +/* ASCII armor codecs. NOTE: Experimental and subject to change. */ + +typedef size_t nettle_armor_length_func(size_t length); +typedef void nettle_armor_init_func(void *ctx); + +typedef size_t nettle_armor_encode_update_func(void *ctx, + char *dst, + size_t src_length, + const uint8_t *src); + +typedef size_t nettle_armor_encode_final_func(void *ctx, char *dst); + +typedef int nettle_armor_decode_update_func(void *ctx, + size_t *dst_length, + uint8_t *dst, + size_t src_length, + const char *src); + +typedef int nettle_armor_decode_final_func(void *ctx); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_TYPES_H */ diff --git a/include/nettle/pbkdf2.h b/include/nettle/pbkdf2.h new file mode 100644 index 0000000..7b1c4c9 --- /dev/null +++ b/include/nettle/pbkdf2.h @@ -0,0 +1,85 @@ +/* pbkdf2.h + + PKCS #5 password-based key derivation function PBKDF2, see RFC 2898. + + Copyright (C) 2012 Simon Josefsson + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_PBKDF2_H_INCLUDED +#define NETTLE_PBKDF2_H_INCLUDED + +#include "nettle-meta.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Namespace mangling */ +#define pbkdf2 nettle_pbkdf2 +#define pbkdf2_hmac_sha1 nettle_pbkdf2_hmac_sha1 +#define pbkdf2_hmac_sha256 nettle_pbkdf2_hmac_sha256 + +void +pbkdf2 (void *mac_ctx, + nettle_hash_update_func *update, + nettle_hash_digest_func *digest, + size_t digest_size, unsigned iterations, + size_t salt_length, const uint8_t *salt, + size_t length, uint8_t *dst); + +#define PBKDF2(ctx, update, digest, digest_size, \ + iterations, salt_length, salt, length, dst) \ + (0 ? ((update)((ctx), 0, (uint8_t *) 0), \ + (digest)((ctx), 0, (uint8_t *) 0)) \ + : pbkdf2 ((ctx), \ + (nettle_hash_update_func *)(update), \ + (nettle_hash_digest_func *)(digest), \ + (digest_size), (iterations), \ + (salt_length), (salt), (length), (dst))) + +/* PBKDF2 with specific PRFs. */ + +void +pbkdf2_hmac_sha1 (size_t key_length, const uint8_t *key, + unsigned iterations, + size_t salt_length, const uint8_t *salt, + size_t length, uint8_t *dst); + +void +pbkdf2_hmac_sha256 (size_t key_length, const uint8_t *key, + unsigned iterations, + size_t salt_length, const uint8_t *salt, + size_t length, uint8_t *dst); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_PBKDF2_H_INCLUDED */ diff --git a/include/nettle/pgp.h b/include/nettle/pgp.h new file mode 100644 index 0000000..4c2fd84 --- /dev/null +++ b/include/nettle/pgp.h @@ -0,0 +1,248 @@ +/* pgp.h + + PGP related functions. + + Copyright (C) 2001, 2002 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_PGP_H_INCLUDED +#define NETTLE_PGP_H_INCLUDED + +#include + +#include "nettle-types.h" +#include "bignum.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define pgp_put_uint32 nettle_pgp_put_uint32 +#define pgp_put_uint16 nettle_pgp_put_uint16 +#define pgp_put_mpi nettle_pgp_put_mpi +#define pgp_put_string nettle_pgp_put_string +#define pgp_put_length nettle_pgp_put_length +#define pgp_put_header nettle_pgp_put_header +#define pgp_put_header_length nettle_pgp_put_header_length +#define pgp_sub_packet_start nettle_pgp_sub_packet_start +#define pgp_put_sub_packet nettle_pgp_put_sub_packet +#define pgp_sub_packet_end nettle_pgp_sub_packet_end +#define pgp_put_public_rsa_key nettle_pgp_put_public_rsa_key +#define pgp_put_rsa_sha1_signature nettle_pgp_put_rsa_sha1_signature +#define pgp_put_userid nettle_pgp_put_userid +#define pgp_crc24 nettle_pgp_crc24 +#define pgp_armor nettle_pgp_armor + +struct nettle_buffer; +struct rsa_public_key; +struct rsa_private_key; +struct sha1_ctx; + +int +pgp_put_uint32(struct nettle_buffer *buffer, uint32_t i); + +int +pgp_put_uint16(struct nettle_buffer *buffer, unsigned i); + +int +pgp_put_mpi(struct nettle_buffer *buffer, const mpz_t x); + +int +pgp_put_string(struct nettle_buffer *buffer, + unsigned length, + const uint8_t *s); + +int +pgp_put_length(struct nettle_buffer *buffer, + unsigned length); + +int +pgp_put_header(struct nettle_buffer *buffer, + unsigned tag, unsigned length); + +void +pgp_put_header_length(struct nettle_buffer *buffer, + /* start of the header */ + unsigned start, + unsigned field_size); + +unsigned +pgp_sub_packet_start(struct nettle_buffer *buffer); + +int +pgp_put_sub_packet(struct nettle_buffer *buffer, + unsigned type, + unsigned length, + const uint8_t *data); + +void +pgp_sub_packet_end(struct nettle_buffer *buffer, unsigned start); + +int +pgp_put_public_rsa_key(struct nettle_buffer *, + const struct rsa_public_key *key, + time_t timestamp); + +int +pgp_put_rsa_sha1_signature(struct nettle_buffer *buffer, + const struct rsa_private_key *key, + const uint8_t *keyid, + unsigned type, + struct sha1_ctx *hash); + +int +pgp_put_userid(struct nettle_buffer *buffer, + unsigned length, + const uint8_t *name); + +uint32_t +pgp_crc24(unsigned length, const uint8_t *data); + +int +pgp_armor(struct nettle_buffer *buffer, + const char *tag, + unsigned length, + const uint8_t *data); + +/* Values that can be passed to pgp_put_header when the size of the + * length field, but not the length itself, is known. Also the minimum length + * for the given field size. */ +enum pgp_lengths + { + PGP_LENGTH_ONE_OCTET = 0, + PGP_LENGTH_TWO_OCTETS = 192, + PGP_LENGTH_FOUR_OCTETS = 8384, + }; + +enum pgp_public_key_algorithm + { + PGP_RSA = 1, + PGP_RSA_ENCRYPT = 2, + PGP_RSA_SIGN = 3, + PGP_EL_GAMAL_ENCRYPT = 16, + PGP_DSA = 17, + PGP_EL_GAMAL = 20, + }; + +enum pgp_symmetric_algorithm + { + PGP_PLAINTEXT = 0, + PGP_IDEA = 1, + PGP_3DES = 2, + PGP_CAST5 = 3, + PGP_BLOWFISH = 4, + PGP_SAFER_SK = 5, + PGP_AES128 = 7, + PGP_AES192 = 8, + PGP_AES256 = 9, + }; + +enum pgp_compression_algorithm + { + PGP_UNCOMPRESSED = 0, + PGP_ZIP = 1, + PGP_ZLIB = 2, + }; + +enum pgp_hash_algorithm + { + PGP_MD5 = 1, + PGP_SHA1 = 2, + PGP_RIPEMD = 3, + PGP_MD2 = 5, + PGP_TIGER192 = 6, + PGP_HAVAL = 7, + }; + +enum pgp_tag + { + PGP_TAG_PUBLIC_SESSION_KEY = 1, + PGP_TAG_SIGNATURE = 2, + PGP_TAG_SYMMETRIC_SESSION_KEY = 3, + PGP_TAG_ONE_PASS_SIGNATURE = 4, + PGP_TAG_SECRET_KEY = 5, + PGP_TAG_PUBLIC_KEY = 6, + PGP_TAG_SECRET_SUBKEY = 7, + PGP_TAG_COMPRESSED = 8, + PGP_TAG_ENCRYPTED = 9, + PGP_TAG_MARKER = 10, + PGP_TAG_LITERAL = 11, + PGP_TAG_TRUST = 12, + PGP_TAG_USERID = 13, + PGP_TAG_PUBLIC_SUBKEY = 14, + }; + +enum pgp_signature_type + { + PGP_SIGN_BINARY = 0, + PGP_SIGN_TEXT = 1, + PGP_SIGN_STANDALONE = 2, + PGP_SIGN_CERTIFICATION = 0x10, + PGP_SIGN_CERTIFICATION_PERSONA = 0x11, + PGP_SIGN_CERTIFICATION_CASUAL = 0x12, + PGP_SIGN_CERTIFICATION_POSITIVE = 0x13, + PGP_SIGN_SUBKEY = 0x18, + PGP_SIGN_KEY = 0x1f, + PGP_SIGN_REVOCATION = 0x20, + PGP_SIGN_REVOCATION_SUBKEY = 0x28, + PGP_SIGN_REVOCATION_CERTIFICATE = 0x30, + PGP_SIGN_TIMESTAMP = 0x40, + }; + +enum pgp_subpacket_tag + { + PGP_SUBPACKET_CREATION_TIME = 2, + PGP_SUBPACKET_SIGNATURE_EXPIRATION_TIME = 3, + PGP_SUBPACKET_EXPORTABLE_CERTIFICATION = 4, + PGP_SUBPACKET_TRUST_SIGNATURE = 5, + PGP_SUBPACKET_REGULAR_EXPRESSION = 6, + PGP_SUBPACKET_REVOCABLE = 7, + PGP_SUBPACKET_KEY_EXPIRATION_TIME = 9, + PGP_SUBPACKET_PLACEHOLDER = 10 , + PGP_SUBPACKET_PREFERRED_SYMMETRIC_ALGORITHMS = 11, + PGP_SUBPACKET_REVOCATION_KEY = 12, + PGP_SUBPACKET_ISSUER_KEY_ID = 16, + PGP_SUBPACKET_NOTATION_DATA = 20, + PGP_SUBPACKET_PREFERRED_HASH_ALGORITHMS = 21, + PGP_SUBPACKET_PREFERRED_COMPRESSION_ALGORITHMS = 22, + PGP_SUBPACKET_KEY_SERVER_PREFERENCES = 23, + PGP_SUBPACKET_PREFERRED_KEY_SERVER = 24, + PGP_SUBPACKET_PRIMARY_USER_ID = 25, + PGP_SUBPACKET_POLICY_URL = 26, + PGP_SUBPACKET_KEY_FLAGS = 27, + PGP_SUBPACKET_SIGNERS_USER_ID = 28, + PGP_SUBPACKET_REASON_FOR_REVOCATION = 29, + }; + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_PGP_H_INCLUDED */ diff --git a/include/nettle/pkcs1.h b/include/nettle/pkcs1.h new file mode 100644 index 0000000..70aa21f --- /dev/null +++ b/include/nettle/pkcs1.h @@ -0,0 +1,114 @@ +/* pkcs1.h + + PKCS1 embedding. + + Copyright (C) 2003 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_PKCS1_H_INCLUDED +#define NETTLE_PKCS1_H_INCLUDED + +#include "nettle-types.h" +#include "bignum.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define _pkcs1_signature_prefix _nettle_pkcs1_signature_prefix +#define pkcs1_rsa_digest_encode nettle_pkcs1_rsa_digest_encode +#define pkcs1_rsa_md5_encode nettle_pkcs1_rsa_md5_encode +#define pkcs1_rsa_md5_encode_digest nettle_pkcs1_rsa_md5_encode_digest +#define pkcs1_rsa_sha1_encode nettle_pkcs1_rsa_sha1_encode +#define pkcs1_rsa_sha1_encode_digest nettle_pkcs1_rsa_sha1_encode_digest +#define pkcs1_rsa_sha256_encode nettle_pkcs1_rsa_sha256_encode +#define pkcs1_rsa_sha256_encode_digest nettle_pkcs1_rsa_sha256_encode_digest +#define pkcs1_rsa_sha512_encode nettle_pkcs1_rsa_sha512_encode +#define pkcs1_rsa_sha512_encode_digest nettle_pkcs1_rsa_sha512_encode_digest +#define pkcs1_encrypt nettle_pkcs1_encrypt +#define pkcs1_decrypt nettle_pkcs1_decrypt + +struct md5_ctx; +struct sha1_ctx; +struct sha256_ctx; +struct sha512_ctx; + +uint8_t * +_pkcs1_signature_prefix(unsigned key_size, + uint8_t *buffer, + unsigned id_size, + const uint8_t *id, + unsigned digest_size); + +int +pkcs1_encrypt (size_t key_size, + /* For padding */ + void *random_ctx, nettle_random_func *random, + size_t length, const uint8_t *message, + mpz_t m); + +int +pkcs1_decrypt (size_t key_size, + const mpz_t m, + size_t *length, uint8_t *message); + +int +pkcs1_rsa_digest_encode(mpz_t m, size_t key_size, + size_t di_length, const uint8_t *digest_info); + +int +pkcs1_rsa_md5_encode(mpz_t m, size_t length, struct md5_ctx *hash); + +int +pkcs1_rsa_md5_encode_digest(mpz_t m, size_t length, const uint8_t *digest); + +int +pkcs1_rsa_sha1_encode(mpz_t m, size_t length, struct sha1_ctx *hash); + +int +pkcs1_rsa_sha1_encode_digest(mpz_t m, size_t length, const uint8_t *digest); + +int +pkcs1_rsa_sha256_encode(mpz_t m, size_t length, struct sha256_ctx *hash); + +int +pkcs1_rsa_sha256_encode_digest(mpz_t m, size_t length, const uint8_t *digest); + +int +pkcs1_rsa_sha512_encode(mpz_t m, size_t length, struct sha512_ctx *hash); + +int +pkcs1_rsa_sha512_encode_digest(mpz_t m, size_t length, const uint8_t *digest); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_PKCS1_H_INCLUDED */ diff --git a/include/nettle/poly1305.h b/include/nettle/poly1305.h new file mode 100644 index 0000000..eadc405 --- /dev/null +++ b/include/nettle/poly1305.h @@ -0,0 +1,128 @@ +/* poly1305.h + + Poly1305 message authentication code. + + Copyright (C) 2013 Nikos Mavrogiannopoulos + Copyright (C) 2013, 2014 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_POLY1305_H_INCLUDED +#define NETTLE_POLY1305_H_INCLUDED + +#include "aes.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define poly1305_set_key nettle_poly1305_set_key +#define poly1305_digest nettle_poly1305_digest +#define _poly1305_block _nettle_poly1305_block + +#define poly1305_aes_set_key nettle_poly1305_aes_set_key +#define poly1305_aes_set_nonce nettle_poly1305_aes_set_nonce +#define poly1305_aes_update nettle_poly1305_aes_update +#define poly1305_aes_digest nettle_poly1305_aes_digest + +/* Low level functions/macros for the poly1305 construction. */ + +#define POLY1305_DIGEST_SIZE 16 +#define POLY1305_BLOCK_SIZE 16 +#define POLY1305_KEY_SIZE 16 + +struct poly1305_ctx { + /* Key, 128-bit value and some cached multiples. */ + union + { + uint32_t r32[6]; + uint64_t r64[3]; + } r; + uint32_t s32[3]; + /* State, represented as words of 26, 32 or 64 bits, depending on + implementation. */ + /* High bits first, to maintain alignment. */ + uint32_t hh; + union + { + uint32_t h32[4]; + uint64_t h64[2]; + } h; +}; + +/* Low-level internal interface. */ +void poly1305_set_key(struct poly1305_ctx *ctx, const uint8_t key[POLY1305_KEY_SIZE]); +/* Extracts digest, and adds it to s, the encrypted nonce. */ +void poly1305_digest (struct poly1305_ctx *ctx, union nettle_block16 *s); +/* Internal function. Process one block. */ +void _poly1305_block (struct poly1305_ctx *ctx, const uint8_t *m, + unsigned high); + +/* poly1305-aes */ + +#define POLY1305_AES_KEY_SIZE 32 +#define POLY1305_AES_DIGEST_SIZE 16 +#define POLY1305_AES_NONCE_SIZE 16 + +struct poly1305_aes_ctx +{ + /* Keep aes context last, to make it possible to use a general + poly1305_update if other variants are added. */ + struct poly1305_ctx pctx; + uint8_t block[POLY1305_BLOCK_SIZE]; + unsigned index; + uint8_t nonce[POLY1305_BLOCK_SIZE]; + struct aes128_ctx aes; +}; + +/* Also initialize the nonce to zero. */ +void +poly1305_aes_set_key (struct poly1305_aes_ctx *ctx, const uint8_t *key); + +/* Optional, if not used, messages get incrementing nonces starting + from zero. */ +void +poly1305_aes_set_nonce (struct poly1305_aes_ctx *ctx, + const uint8_t *nonce); + +/* Update is not aes-specific, but since this is the only implemented + variant, we need no more general poly1305_update. */ +void +poly1305_aes_update (struct poly1305_aes_ctx *ctx, size_t length, const uint8_t *data); + +/* Also increments the nonce */ +void +poly1305_aes_digest (struct poly1305_aes_ctx *ctx, + size_t length, uint8_t *digest); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_POLY1305_H_INCLUDED */ diff --git a/include/nettle/pss-mgf1.h b/include/nettle/pss-mgf1.h new file mode 100644 index 0000000..4a29c10 --- /dev/null +++ b/include/nettle/pss-mgf1.h @@ -0,0 +1,58 @@ +/* pss-mgf1.h + + PKCS#1 mask generation function 1, used in RSA-PSS (RFC-3447). + + Copyright (C) 2017 Daiki Ueno + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_PSS_MGF1_H_INCLUDED +#define NETTLE_PSS_MGF1_H_INCLUDED + +#include "nettle-meta.h" + +#include "sha1.h" +#include "sha2.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Namespace mangling */ +#define pss_mgf1 nettle_pss_mgf1 + +void +pss_mgf1(const void *seed, const struct nettle_hash *hash, + size_t length, uint8_t *mask); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_PSS_MGF1_H_INCLUDED */ diff --git a/include/nettle/pss.h b/include/nettle/pss.h new file mode 100644 index 0000000..7627cfe --- /dev/null +++ b/include/nettle/pss.h @@ -0,0 +1,65 @@ +/* pss.h + + PKCS#1 RSA-PSS (RFC-3447). + + Copyright (C) 2017 Daiki Ueno + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_PSS_H_INCLUDED +#define NETTLE_PSS_H_INCLUDED + +#include "nettle-types.h" +#include "bignum.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +/* Namespace mangling */ +#define pss_encode_mgf1 nettle_pss_encode_mgf1 +#define pss_verify_mgf1 nettle_pss_verify_mgf1 + +int +pss_encode_mgf1(mpz_t m, size_t bits, + const struct nettle_hash *hash, + size_t salt_length, const uint8_t *salt, + const uint8_t *digest); + +int +pss_verify_mgf1(const mpz_t m, size_t bits, + const struct nettle_hash *hash, + size_t salt_length, + const uint8_t *digest); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_PSS_H_INCLUDED */ diff --git a/include/nettle/realloc.h b/include/nettle/realloc.h new file mode 100644 index 0000000..66d376f --- /dev/null +++ b/include/nettle/realloc.h @@ -0,0 +1,48 @@ +/* realloc.h + + Copyright (C) 2002 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_REALLOC_H_INCLUDED +#define NETTLE_REALLOC_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +nettle_realloc_func nettle_realloc; +nettle_realloc_func nettle_xrealloc; + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_REALLOC_H_INCLUDED */ diff --git a/include/nettle/ripemd160.h b/include/nettle/ripemd160.h new file mode 100644 index 0000000..80d1d8a --- /dev/null +++ b/include/nettle/ripemd160.h @@ -0,0 +1,88 @@ +/* ripemd160.h + + RIPEMD-160 hash function. + + Copyright (C) 2011 Andres Mejia + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_RIPEMD160_H_INCLUDED +#define NETTLE_RIPEMD160_H_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +#include "nettle-types.h" + +/* Name mangling */ +#define ripemd160_init nettle_ripemd160_init +#define ripemd160_update nettle_ripemd160_update +#define ripemd160_digest nettle_ripemd160_digest + +/* RIPEMD160 */ + +#define RIPEMD160_DIGEST_SIZE 20 +#define RIPEMD160_BLOCK_SIZE 64 +/* For backwards compatibility */ +#define RIPEMD160_DATA_SIZE RIPEMD160_BLOCK_SIZE + +/* Digest is kept internally as 5 32-bit words. */ +#define _RIPEMD160_DIGEST_LENGTH 5 + +struct ripemd160_ctx +{ + uint32_t state[_RIPEMD160_DIGEST_LENGTH]; + uint64_t count; /* 64-bit block count */ + uint8_t block[RIPEMD160_BLOCK_SIZE]; + unsigned int index; +}; + +void +ripemd160_init(struct ripemd160_ctx *ctx); + +void +ripemd160_update(struct ripemd160_ctx *ctx, + size_t length, + const uint8_t *data); + +void +ripemd160_digest(struct ripemd160_ctx *ctx, + size_t length, + uint8_t *digest); + +/* Internal compression function. STATE points to 5 uint32_t words, + and DATA points to 64 bytes of input data, possibly unaligned. */ +void +_nettle_ripemd160_compress(uint32_t *state, const uint8_t *data); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_RIPEMD160_H_INCLUDED */ diff --git a/include/nettle/rsa.h b/include/nettle/rsa.h new file mode 100644 index 0000000..0aac6a2 --- /dev/null +++ b/include/nettle/rsa.h @@ -0,0 +1,564 @@ +/* rsa.h + + The RSA publickey algorithm. + + Copyright (C) 2001, 2002 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_RSA_H_INCLUDED +#define NETTLE_RSA_H_INCLUDED + +#include "nettle-types.h" +#include "bignum.h" + +#include "md5.h" +#include "sha1.h" +#include "sha2.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define rsa_public_key_init nettle_rsa_public_key_init +#define rsa_public_key_clear nettle_rsa_public_key_clear +#define rsa_public_key_prepare nettle_rsa_public_key_prepare +#define rsa_private_key_init nettle_rsa_private_key_init +#define rsa_private_key_clear nettle_rsa_private_key_clear +#define rsa_private_key_prepare nettle_rsa_private_key_prepare +#define rsa_pkcs1_verify nettle_rsa_pkcs1_verify +#define rsa_pkcs1_sign nettle_rsa_pkcs1_sign +#define rsa_pkcs1_sign_tr nettle_rsa_pkcs1_sign_tr +#define rsa_md5_sign nettle_rsa_md5_sign +#define rsa_md5_sign_tr nettle_rsa_md5_sign_tr +#define rsa_md5_verify nettle_rsa_md5_verify +#define rsa_sha1_sign nettle_rsa_sha1_sign +#define rsa_sha1_sign_tr nettle_rsa_sha1_sign_tr +#define rsa_sha1_verify nettle_rsa_sha1_verify +#define rsa_sha256_sign nettle_rsa_sha256_sign +#define rsa_sha256_sign_tr nettle_rsa_sha256_sign_tr +#define rsa_sha256_verify nettle_rsa_sha256_verify +#define rsa_sha512_sign nettle_rsa_sha512_sign +#define rsa_sha512_sign_tr nettle_rsa_sha512_sign_tr +#define rsa_sha512_verify nettle_rsa_sha512_verify +#define rsa_md5_sign_digest nettle_rsa_md5_sign_digest +#define rsa_md5_sign_digest_tr nettle_rsa_md5_sign_digest_tr +#define rsa_md5_verify_digest nettle_rsa_md5_verify_digest +#define rsa_sha1_sign_digest nettle_rsa_sha1_sign_digest +#define rsa_sha1_sign_digest_tr nettle_rsa_sha1_sign_digest_tr +#define rsa_sha1_verify_digest nettle_rsa_sha1_verify_digest +#define rsa_sha256_sign_digest nettle_rsa_sha256_sign_digest +#define rsa_sha256_sign_digest_tr nettle_rsa_sha256_sign_digest_tr +#define rsa_sha256_verify_digest nettle_rsa_sha256_verify_digest +#define rsa_sha512_sign_digest nettle_rsa_sha512_sign_digest +#define rsa_sha512_sign_digest_tr nettle_rsa_sha512_sign_digest_tr +#define rsa_sha512_verify_digest nettle_rsa_sha512_verify_digest +#define rsa_pss_sha256_sign_digest_tr nettle_rsa_pss_sha256_sign_digest_tr +#define rsa_pss_sha256_verify_digest nettle_rsa_pss_sha256_verify_digest +#define rsa_pss_sha384_sign_digest_tr nettle_rsa_pss_sha384_sign_digest_tr +#define rsa_pss_sha384_verify_digest nettle_rsa_pss_sha384_verify_digest +#define rsa_pss_sha512_sign_digest_tr nettle_rsa_pss_sha512_sign_digest_tr +#define rsa_pss_sha512_verify_digest nettle_rsa_pss_sha512_verify_digest +#define rsa_encrypt nettle_rsa_encrypt +#define rsa_decrypt nettle_rsa_decrypt +#define rsa_decrypt_tr nettle_rsa_decrypt_tr +#define rsa_sec_decrypt nettle_rsa_sec_decrypt +#define rsa_compute_root nettle_rsa_compute_root +#define rsa_compute_root_tr nettle_rsa_compute_root_tr +#define rsa_generate_keypair nettle_rsa_generate_keypair +#define rsa_keypair_to_sexp nettle_rsa_keypair_to_sexp +#define rsa_keypair_from_sexp_alist nettle_rsa_keypair_from_sexp_alist +#define rsa_keypair_from_sexp nettle_rsa_keypair_from_sexp +#define rsa_public_key_from_der_iterator nettle_rsa_public_key_from_der_iterator +#define rsa_private_key_from_der_iterator nettle_rsa_private_key_from_der_iterator +#define rsa_keypair_from_der nettle_rsa_keypair_from_der +#define rsa_keypair_to_openpgp nettle_rsa_keypair_to_openpgp +#define _rsa_verify _nettle_rsa_verify +#define _rsa_verify_recover _nettle_rsa_verify_recover +#define _rsa_check_size _nettle_rsa_check_size +#define _rsa_blind _nettle_rsa_blind +#define _rsa_unblind _nettle_rsa_unblind + +/* This limit is somewhat arbitrary. Technically, the smallest modulo + which makes sense at all is 15 = 3*5, phi(15) = 8, size 4 bits. But + for ridiculously small keys, not all odd e are possible (e.g., for + 5 bits, the only possible modulo is 3*7 = 21, phi(21) = 12, and e = + 3 don't work). The smallest size that makes sense with pkcs#1, and + which allows RSA encryption of one byte messages, is 12 octets, 89 + bits. */ + +#define RSA_MINIMUM_N_OCTETS 12 +#define RSA_MINIMUM_N_BITS (8*RSA_MINIMUM_N_OCTETS - 7) + +struct rsa_public_key +{ + /* Size of the modulo, in octets. This is also the size of all + * signatures that are created or verified with this key. */ + size_t size; + + /* Modulo */ + mpz_t n; + + /* Public exponent */ + mpz_t e; +}; + +struct rsa_private_key +{ + size_t size; + + /* d is filled in by the key generation function; otherwise it's + * completely unused. */ + mpz_t d; + + /* The two factors */ + mpz_t p; mpz_t q; + + /* d % (p-1), i.e. a e = 1 (mod (p-1)) */ + mpz_t a; + + /* d % (q-1), i.e. b e = 1 (mod (q-1)) */ + mpz_t b; + + /* modular inverse of q , i.e. c q = 1 (mod p) */ + mpz_t c; +}; + +/* Signing a message works as follows: + * + * Store the private key in a rsa_private_key struct. + * + * Call rsa_private_key_prepare. This initializes the size attribute + * to the length of a signature. + * + * Initialize a hashing context, by callling + * md5_init + * + * Hash the message by calling + * md5_update + * + * Create the signature by calling + * rsa_md5_sign + * + * The signature is represented as a mpz_t bignum. This call also + * resets the hashing context. + * + * When done with the key and signature, don't forget to call + * mpz_clear. + */ + +/* Calls mpz_init to initialize bignum storage. */ +void +rsa_public_key_init(struct rsa_public_key *key); + +/* Calls mpz_clear to deallocate bignum storage. */ +void +rsa_public_key_clear(struct rsa_public_key *key); + +int +rsa_public_key_prepare(struct rsa_public_key *key); + +/* Calls mpz_init to initialize bignum storage. */ +void +rsa_private_key_init(struct rsa_private_key *key); + +/* Calls mpz_clear to deallocate bignum storage. */ +void +rsa_private_key_clear(struct rsa_private_key *key); + +int +rsa_private_key_prepare(struct rsa_private_key *key); + + +/* PKCS#1 style signatures */ +int +rsa_pkcs1_sign(const struct rsa_private_key *key, + size_t length, const uint8_t *digest_info, + mpz_t s); + +int +rsa_pkcs1_sign_tr(const struct rsa_public_key *pub, + const struct rsa_private_key *key, + void *random_ctx, nettle_random_func *random, + size_t length, const uint8_t *digest_info, + mpz_t s); +int +rsa_pkcs1_verify(const struct rsa_public_key *key, + size_t length, const uint8_t *digest_info, + const mpz_t signature); + +int +rsa_md5_sign(const struct rsa_private_key *key, + struct md5_ctx *hash, + mpz_t signature); + +int +rsa_md5_sign_tr(const struct rsa_public_key *pub, + const struct rsa_private_key *key, + void *random_ctx, nettle_random_func *random, + struct md5_ctx *hash, mpz_t s); + + +int +rsa_md5_verify(const struct rsa_public_key *key, + struct md5_ctx *hash, + const mpz_t signature); + +int +rsa_sha1_sign(const struct rsa_private_key *key, + struct sha1_ctx *hash, + mpz_t signature); + +int +rsa_sha1_sign_tr(const struct rsa_public_key *pub, + const struct rsa_private_key *key, + void *random_ctx, nettle_random_func *random, + struct sha1_ctx *hash, + mpz_t s); + +int +rsa_sha1_verify(const struct rsa_public_key *key, + struct sha1_ctx *hash, + const mpz_t signature); + +int +rsa_sha256_sign(const struct rsa_private_key *key, + struct sha256_ctx *hash, + mpz_t signature); + +int +rsa_sha256_sign_tr(const struct rsa_public_key *pub, + const struct rsa_private_key *key, + void *random_ctx, nettle_random_func *random, + struct sha256_ctx *hash, + mpz_t s); + +int +rsa_sha256_verify(const struct rsa_public_key *key, + struct sha256_ctx *hash, + const mpz_t signature); + +int +rsa_sha512_sign(const struct rsa_private_key *key, + struct sha512_ctx *hash, + mpz_t signature); + +int +rsa_sha512_sign_tr(const struct rsa_public_key *pub, + const struct rsa_private_key *key, + void *random_ctx, nettle_random_func *random, + struct sha512_ctx *hash, + mpz_t s); + +int +rsa_sha512_verify(const struct rsa_public_key *key, + struct sha512_ctx *hash, + const mpz_t signature); + +/* Variants taking the digest as argument. */ +int +rsa_md5_sign_digest(const struct rsa_private_key *key, + const uint8_t *digest, + mpz_t s); + +int +rsa_md5_sign_digest_tr(const struct rsa_public_key *pub, + const struct rsa_private_key *key, + void *random_ctx, nettle_random_func *random, + const uint8_t *digest, mpz_t s); + +int +rsa_md5_verify_digest(const struct rsa_public_key *key, + const uint8_t *digest, + const mpz_t signature); + +int +rsa_sha1_sign_digest(const struct rsa_private_key *key, + const uint8_t *digest, + mpz_t s); + +int +rsa_sha1_sign_digest_tr(const struct rsa_public_key *pub, + const struct rsa_private_key *key, + void *random_ctx, nettle_random_func *random, + const uint8_t *digest, + mpz_t s); + +int +rsa_sha1_verify_digest(const struct rsa_public_key *key, + const uint8_t *digest, + const mpz_t signature); + +int +rsa_sha256_sign_digest(const struct rsa_private_key *key, + const uint8_t *digest, + mpz_t s); + +int +rsa_sha256_sign_digest_tr(const struct rsa_public_key *pub, + const struct rsa_private_key *key, + void *random_ctx, nettle_random_func *random, + const uint8_t *digest, + mpz_t s); + +int +rsa_sha256_verify_digest(const struct rsa_public_key *key, + const uint8_t *digest, + const mpz_t signature); + +int +rsa_sha512_sign_digest(const struct rsa_private_key *key, + const uint8_t *digest, + mpz_t s); + +int +rsa_sha512_sign_digest_tr(const struct rsa_public_key *pub, + const struct rsa_private_key *key, + void *random_ctx, nettle_random_func *random, + const uint8_t *digest, + mpz_t s); + +int +rsa_sha512_verify_digest(const struct rsa_public_key *key, + const uint8_t *digest, + const mpz_t signature); + +/* PSS style signatures */ +int +rsa_pss_sha256_sign_digest_tr(const struct rsa_public_key *pub, + const struct rsa_private_key *key, + void *random_ctx, nettle_random_func *random, + size_t salt_length, const uint8_t *salt, + const uint8_t *digest, + mpz_t s); + +int +rsa_pss_sha256_verify_digest(const struct rsa_public_key *key, + size_t salt_length, + const uint8_t *digest, + const mpz_t signature); + +int +rsa_pss_sha384_sign_digest_tr(const struct rsa_public_key *pub, + const struct rsa_private_key *key, + void *random_ctx, nettle_random_func *random, + size_t salt_length, const uint8_t *salt, + const uint8_t *digest, + mpz_t s); + +int +rsa_pss_sha384_verify_digest(const struct rsa_public_key *key, + size_t salt_length, + const uint8_t *digest, + const mpz_t signature); + +int +rsa_pss_sha512_sign_digest_tr(const struct rsa_public_key *pub, + const struct rsa_private_key *key, + void *random_ctx, nettle_random_func *random, + size_t salt_length, const uint8_t *salt, + const uint8_t *digest, + mpz_t s); + +int +rsa_pss_sha512_verify_digest(const struct rsa_public_key *key, + size_t salt_length, + const uint8_t *digest, + const mpz_t signature); + + +/* RSA encryption, using PKCS#1 */ +/* These functions uses the v1.5 padding. What should the v2 (OAEP) + * functions be called? */ + +/* Returns 1 on success, 0 on failure, which happens if the + * message is too long for the key. */ +int +rsa_encrypt(const struct rsa_public_key *key, + /* For padding */ + void *random_ctx, nettle_random_func *random, + size_t length, const uint8_t *cleartext, + mpz_t cipher); + +/* Message must point to a buffer of size *LENGTH. KEY->size is enough + * for all valid messages. On success, *LENGTH is updated to reflect + * the actual length of the message. Returns 1 on success, 0 on + * failure, which happens if decryption failed or if the message + * didn't fit. */ +int +rsa_decrypt(const struct rsa_private_key *key, + size_t *length, uint8_t *cleartext, + const mpz_t ciphertext); + +/* Timing-resistant version, using randomized RSA blinding. */ +int +rsa_decrypt_tr(const struct rsa_public_key *pub, + const struct rsa_private_key *key, + void *random_ctx, nettle_random_func *random, + size_t *length, uint8_t *message, + const mpz_t gibberish); + +/* like rsa_decrypt_tr but with additional side-channel resistance. + * NOTE: the length of the final message must be known in advance. */ +int +rsa_sec_decrypt(const struct rsa_public_key *pub, + const struct rsa_private_key *key, + void *random_ctx, nettle_random_func *random, + size_t length, uint8_t *message, + const mpz_t gibberish); + +/* Compute x, the e:th root of m. Calling it with x == m is allowed. */ +void +rsa_compute_root(const struct rsa_private_key *key, + mpz_t x, const mpz_t m); + +/* Safer variant, using RSA blinding, and checking the result after + CRT. */ +int +rsa_compute_root_tr(const struct rsa_public_key *pub, + const struct rsa_private_key *key, + void *random_ctx, nettle_random_func *random, + mpz_t x, const mpz_t m); + +/* Key generation */ + +/* Note that the key structs must be initialized first. */ +int +rsa_generate_keypair(struct rsa_public_key *pub, + struct rsa_private_key *key, + + void *random_ctx, nettle_random_func *random, + void *progress_ctx, nettle_progress_func *progress, + + /* Desired size of modulo, in bits */ + unsigned n_size, + + /* Desired size of public exponent, in bits. If + * zero, the passed in value pub->e is used. */ + unsigned e_size); + + +#define RSA_SIGN(key, algorithm, ctx, length, data, signature) ( \ + algorithm##_update(ctx, length, data), \ + rsa_##algorithm##_sign(key, ctx, signature) \ +) + +#define RSA_VERIFY(key, algorithm, ctx, length, data, signature) ( \ + algorithm##_update(ctx, length, data), \ + rsa_##algorithm##_verify(key, ctx, signature) \ +) + + +/* Keys in sexp form. */ + +struct nettle_buffer; + +/* Generates a public-key expression if PRIV is NULL .*/ +int +rsa_keypair_to_sexp(struct nettle_buffer *buffer, + const char *algorithm_name, /* NULL means "rsa" */ + const struct rsa_public_key *pub, + const struct rsa_private_key *priv); + +struct sexp_iterator; + +int +rsa_keypair_from_sexp_alist(struct rsa_public_key *pub, + struct rsa_private_key *priv, + unsigned limit, + struct sexp_iterator *i); + +/* If PRIV is NULL, expect a public-key expression. If PUB is NULL, + * expect a private key expression and ignore the parts not needed for + * the public key. */ +/* Keys must be initialized before calling this function, as usual. */ +int +rsa_keypair_from_sexp(struct rsa_public_key *pub, + struct rsa_private_key *priv, + unsigned limit, + size_t length, const uint8_t *expr); + + +/* Keys in PKCS#1 format. */ +struct asn1_der_iterator; + +int +rsa_public_key_from_der_iterator(struct rsa_public_key *pub, + unsigned limit, + struct asn1_der_iterator *i); + +int +rsa_private_key_from_der_iterator(struct rsa_public_key *pub, + struct rsa_private_key *priv, + unsigned limit, + struct asn1_der_iterator *i); + +/* For public keys, use PRIV == NULL */ +int +rsa_keypair_from_der(struct rsa_public_key *pub, + struct rsa_private_key *priv, + unsigned limit, + size_t length, const uint8_t *data); + +/* OpenPGP format. Experimental interface, subject to change. */ +int +rsa_keypair_to_openpgp(struct nettle_buffer *buffer, + const struct rsa_public_key *pub, + const struct rsa_private_key *priv, + /* A single user id. NUL-terminated utf8. */ + const char *userid); + +/* Internal functions. */ +int +_rsa_verify(const struct rsa_public_key *key, + const mpz_t m, + const mpz_t s); + +int +_rsa_verify_recover(const struct rsa_public_key *key, + mpz_t m, + const mpz_t s); + +size_t +_rsa_check_size(mpz_t n); + +/* _rsa_blind and _rsa_unblind are deprecated, unused in the library, + and will likely be removed with the next ABI break. */ +void +_rsa_blind (const struct rsa_public_key *pub, + void *random_ctx, nettle_random_func *random, + mpz_t c, mpz_t ri); +void +_rsa_unblind (const struct rsa_public_key *pub, mpz_t c, const mpz_t ri); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_RSA_H_INCLUDED */ diff --git a/include/nettle/salsa20.h b/include/nettle/salsa20.h new file mode 100644 index 0000000..4301988 --- /dev/null +++ b/include/nettle/salsa20.h @@ -0,0 +1,114 @@ +/* salsa20.h + + The Salsa20 stream cipher. + + Copyright (C) 2012 Simon Josefsson + Copyright (C) 2001 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_SALSA20_H_INCLUDED +#define NETTLE_SALSA20_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define salsa20_set_key nettle_salsa20_set_key +#define salsa20_128_set_key nettle_salsa20_128_set_key +#define salsa20_256_set_key nettle_salsa20_256_set_key +#define salsa20_set_nonce nettle_salsa20_set_nonce +#define salsa20_crypt nettle_salsa20_crypt +#define _salsa20_core _nettle_salsa20_core + +#define salsa20r12_crypt nettle_salsa20r12_crypt + +/* Alias for backwards compatibility */ +#define salsa20_set_iv nettle_salsa20_set_nonce + +/* In octets.*/ +#define SALSA20_128_KEY_SIZE 16 +#define SALSA20_256_KEY_SIZE 32 +#define SALSA20_BLOCK_SIZE 64 +#define SALSA20_NONCE_SIZE 8 +#define SALSA20_IV_SIZE SALSA20_NONCE_SIZE + +/* Aliases */ +#define SALSA20_MIN_KEY_SIZE 16 +#define SALSA20_MAX_KEY_SIZE 32 +#define SALSA20_KEY_SIZE 32 + +#define _SALSA20_INPUT_LENGTH 16 + +struct salsa20_ctx +{ + /* Indices 1-4 and 11-14 holds the key (two identical copies for the + shorter key size), indices 0, 5, 10, 15 are constant, indices 6, 7 + are the IV, and indices 8, 9 are the block counter: + + C K K K + K C I I + B B C K + K K K C + */ + uint32_t input[_SALSA20_INPUT_LENGTH]; +}; + +void +salsa20_128_set_key(struct salsa20_ctx *ctx, const uint8_t *key); +void +salsa20_256_set_key(struct salsa20_ctx *ctx, const uint8_t *key); + +void +salsa20_set_key(struct salsa20_ctx *ctx, + size_t length, const uint8_t *key); + +void +salsa20_set_nonce(struct salsa20_ctx *ctx, const uint8_t *nonce); + +void +salsa20_crypt(struct salsa20_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); + +void +salsa20r12_crypt(struct salsa20_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); + +void +_salsa20_core(uint32_t *dst, const uint32_t *src, unsigned rounds); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_SALSA20_H_INCLUDED */ diff --git a/include/nettle/serpent.h b/include/nettle/serpent.h new file mode 100644 index 0000000..f1ab4b9 --- /dev/null +++ b/include/nettle/serpent.h @@ -0,0 +1,102 @@ +/* serpent.h + + The serpent block cipher. + + Copyright (C) 2001 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +/* Serpent is a 128-bit block cipher that accepts a key size of 256 + * bits, designed by Ross Anderson, Eli Biham, and Lars Knudsen. See + * http://www.cl.cam.ac.uk/~rja14/serpent.html for details. + */ + +#ifndef NETTLE_SERPENT_H_INCLUDED +#define NETTLE_SERPENT_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define serpent_set_key nettle_serpent_set_key +#define serpent128_set_key nettle_serpent128_set_key +#define serpent192_set_key nettle_serpent192_set_key +#define serpent256_set_key nettle_serpent256_set_key +#define serpent_encrypt nettle_serpent_encrypt +#define serpent_decrypt nettle_serpent_decrypt + +#define SERPENT_BLOCK_SIZE 16 + +/* Other key lengths are possible, but the design of Serpent makes + * smaller key lengths quite pointless; they cheated with the AES + * requirements, using a 256-bit key length exclusively and just + * padding it out if the desired key length was less, so there really + * is no advantage to using key lengths less than 256 bits. */ +#define SERPENT_KEY_SIZE 32 + +/* Allow keys of size 128 <= bits <= 256 */ + +#define SERPENT_MIN_KEY_SIZE 16 +#define SERPENT_MAX_KEY_SIZE 32 + +#define SERPENT128_KEY_SIZE 16 +#define SERPENT192_KEY_SIZE 24 +#define SERPENT256_KEY_SIZE 32 + +struct serpent_ctx +{ + uint32_t keys[33][4]; /* key schedule */ +}; + +void +serpent_set_key(struct serpent_ctx *ctx, + size_t length, const uint8_t *key); +void +serpent128_set_key(struct serpent_ctx *ctx, const uint8_t *key); +void +serpent192_set_key(struct serpent_ctx *ctx, const uint8_t *key); +void +serpent256_set_key(struct serpent_ctx *ctx, const uint8_t *key); + +void +serpent_encrypt(const struct serpent_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); +void +serpent_decrypt(const struct serpent_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_SERPENT_H_INCLUDED */ diff --git a/include/nettle/sexp.h b/include/nettle/sexp.h new file mode 100644 index 0000000..f6b3df6 --- /dev/null +++ b/include/nettle/sexp.h @@ -0,0 +1,213 @@ +/* sexp.h + + Parsing s-expressions. + Copyright (C) 2002 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_SEXP_H_INCLUDED +#define NETTLE_SEXP_H_INCLUDED + +#include +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define sexp_iterator_first nettle_sexp_iterator_first +#define sexp_transport_iterator_first nettle_sexp_transport_iterator_first +#define sexp_iterator_next nettle_sexp_iterator_next +#define sexp_iterator_enter_list nettle_sexp_iterator_enter_list +#define sexp_iterator_exit_list nettle_sexp_iterator_exit_list +#define sexp_iterator_subexpr nettle_sexp_iterator_subexpr +#define sexp_iterator_get_uint32 nettle_sexp_iterator_get_uint32 +#define sexp_iterator_check_type nettle_sexp_iterator_check_type +#define sexp_iterator_check_types nettle_sexp_iterator_check_types +#define sexp_iterator_assoc nettle_sexp_iterator_assoc +#define sexp_format nettle_sexp_format +#define sexp_vformat nettle_sexp_vformat +#define sexp_transport_format nettle_sexp_transport_format +#define sexp_transport_vformat nettle_sexp_transport_vformat +#define sexp_token_chars nettle_sexp_token_chars + +enum sexp_type + { SEXP_ATOM, SEXP_LIST, SEXP_END }; + +struct sexp_iterator +{ + size_t length; + const uint8_t *buffer; + + /* Points at the start of the current sub expression. */ + size_t start; + /* If type is SEXP_LIST, pos points at the start of the current + * element. Otherwise, it points at the end. */ + size_t pos; + unsigned level; + + enum sexp_type type; + + size_t display_length; + const uint8_t *display; + + size_t atom_length; + const uint8_t *atom; +}; + + +/* All these functions return 1 on success, 0 on failure */ + +/* Initializes the iterator. */ +int +sexp_iterator_first(struct sexp_iterator *iterator, + size_t length, const uint8_t *input); + +/* NOTE: Decodes the input string in place */ +int +sexp_transport_iterator_first(struct sexp_iterator *iterator, + size_t length, uint8_t *input); + +int +sexp_iterator_next(struct sexp_iterator *iterator); + +/* Current element must be a list. */ +int +sexp_iterator_enter_list(struct sexp_iterator *iterator); + +/* Skips the rest of the current list */ +int +sexp_iterator_exit_list(struct sexp_iterator *iterator); + +#if 0 +/* Skips out of as many lists as necessary to get back to the given + * level. */ +int +sexp_iterator_exit_lists(struct sexp_iterator *iterator, + unsigned level); +#endif + +/* Gets start and length of the current subexpression. Implies + * sexp_iterator_next. */ +const uint8_t * +sexp_iterator_subexpr(struct sexp_iterator *iterator, + size_t *length); + +int +sexp_iterator_get_uint32(struct sexp_iterator *iterator, + uint32_t *x); + + +/* Checks the type of the current expression, which should be a list + * + * ( ...) + */ +int +sexp_iterator_check_type(struct sexp_iterator *iterator, + const char *type); + +const char * +sexp_iterator_check_types(struct sexp_iterator *iterator, + unsigned ntypes, + const char * const *types); + +/* Current element must be a list. Looks up element of type + * + * (key rest...) + * + * For a matching key, the corresponding iterator is initialized + * pointing at the start of REST. + * + * On success, exits the current list. + */ +int +sexp_iterator_assoc(struct sexp_iterator *iterator, + unsigned nkeys, + const char * const *keys, + struct sexp_iterator *values); + + +/* Output functions. What is a reasonable API for this? It seems + * ugly to have to reimplement string streams. */ + +/* Declared for real in buffer.h */ +struct nettle_buffer; + +/* Returns the number of output characters, or 0 on out of memory. If + * buffer == NULL, just compute length. + * + * Format strings can contained matched parentheses, tokens ("foo" in + * the format string is formatted as "3:foo"), whitespace (which + * separates tokens but is otherwise ignored) and the following + * formatting specifiers: + * + * %s String represented as size_t length, const uint8_t *data. + * + * %t Optional display type, represented as + * size_t display_length, const uint8_t *display, + * display == NULL means no display type. + * + * %i Non-negative small integer, uint32_t. + * + * %b Non-negative bignum, mpz_t. + * + * %l Literal string (no length added), typically a balanced + * subexpression. Represented as size_t length, const uint8_t + * *data. + * + * %(, %) Allows insertion of unbalanced parenthesis. + * + * Modifiers: + * + * %0 For %s, %t and %l, says that there's no length argument, + * instead the string is NUL-terminated, and there's only one + * const uint8_t * argument. + */ + +size_t +sexp_format(struct nettle_buffer *buffer, + const char *format, ...); + +size_t +sexp_vformat(struct nettle_buffer *buffer, + const char *format, va_list args); + +size_t +sexp_transport_format(struct nettle_buffer *buffer, + const char *format, ...); + +size_t +sexp_transport_vformat(struct nettle_buffer *buffer, + const char *format, va_list args); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_SEXP_H_INCLUDED */ diff --git a/include/nettle/sha.h b/include/nettle/sha.h new file mode 100644 index 0000000..7d4afde --- /dev/null +++ b/include/nettle/sha.h @@ -0,0 +1,42 @@ +/* sha.h + + This file is deprecated, and provided only for backwards + compatibility with earlier versions of Nettle. Please use sha1.h + and/or sha2.h instead. + + Copyright (C) 2001 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_SHA_H_INCLUDED +#define NETTLE_SHA_H_INCLUDED + +#include "sha1.h" +#include "sha2.h" + +#endif /* NETTLE_SHA_H_INCLUDED */ diff --git a/include/nettle/sha1.h b/include/nettle/sha1.h new file mode 100644 index 0000000..7500d0c --- /dev/null +++ b/include/nettle/sha1.h @@ -0,0 +1,88 @@ +/* sha1.h + + The sha1 hash function. + + Copyright (C) 2001, 2012 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_SHA1_H_INCLUDED +#define NETTLE_SHA1_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define sha1_init nettle_sha1_init +#define sha1_update nettle_sha1_update +#define sha1_digest nettle_sha1_digest + +/* SHA1 */ + +#define SHA1_DIGEST_SIZE 20 +#define SHA1_BLOCK_SIZE 64 +/* For backwards compatibility */ +#define SHA1_DATA_SIZE SHA1_BLOCK_SIZE + +/* Digest is kept internally as 5 32-bit words. */ +#define _SHA1_DIGEST_LENGTH 5 + +struct sha1_ctx +{ + uint32_t state[_SHA1_DIGEST_LENGTH]; /* State variables */ + uint64_t count; /* 64-bit block count */ + uint8_t block[SHA1_BLOCK_SIZE]; /* SHA1 data buffer */ + unsigned int index; /* index into buffer */ +}; + +void +sha1_init(struct sha1_ctx *ctx); + +void +sha1_update(struct sha1_ctx *ctx, + size_t length, + const uint8_t *data); + +void +sha1_digest(struct sha1_ctx *ctx, + size_t length, + uint8_t *digest); + +/* Internal compression function. STATE points to 5 uint32_t words, + and DATA points to 64 bytes of input data, possibly unaligned. */ +void +_nettle_sha1_compress(uint32_t *state, const uint8_t *data); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_SHA1_H_INCLUDED */ diff --git a/include/nettle/sha2.h b/include/nettle/sha2.h new file mode 100644 index 0000000..6537c0e --- /dev/null +++ b/include/nettle/sha2.h @@ -0,0 +1,206 @@ +/* sha2.h + + The sha2 family of hash functions. + + Copyright (C) 2001, 2012 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_SHA2_H_INCLUDED +#define NETTLE_SHA2_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define sha224_init nettle_sha224_init +#define sha224_digest nettle_sha224_digest +#define sha256_init nettle_sha256_init +#define sha256_update nettle_sha256_update +#define sha256_digest nettle_sha256_digest +#define sha384_init nettle_sha384_init +#define sha384_digest nettle_sha384_digest +#define sha512_init nettle_sha512_init +#define sha512_update nettle_sha512_update +#define sha512_digest nettle_sha512_digest +#define sha512_224_init nettle_sha512_224_init +#define sha512_224_digest nettle_sha512_224_digest +#define sha512_256_init nettle_sha512_256_init +#define sha512_256_digest nettle_sha512_256_digest + +/* For backwards compatibility */ +#define SHA224_DATA_SIZE SHA256_BLOCK_SIZE +#define SHA256_DATA_SIZE SHA256_BLOCK_SIZE +#define SHA512_DATA_SIZE SHA512_BLOCK_SIZE +#define SHA384_DATA_SIZE SHA512_BLOCK_SIZE + +/* SHA256 */ + +#define SHA256_DIGEST_SIZE 32 +#define SHA256_BLOCK_SIZE 64 + +/* Digest is kept internally as 8 32-bit words. */ +#define _SHA256_DIGEST_LENGTH 8 + +struct sha256_ctx +{ + uint32_t state[_SHA256_DIGEST_LENGTH]; /* State variables */ + uint64_t count; /* 64-bit block count */ + uint8_t block[SHA256_BLOCK_SIZE]; /* SHA256 data buffer */ + unsigned int index; /* index into buffer */ +}; + +void +sha256_init(struct sha256_ctx *ctx); + +void +sha256_update(struct sha256_ctx *ctx, + size_t length, + const uint8_t *data); + +void +sha256_digest(struct sha256_ctx *ctx, + size_t length, + uint8_t *digest); + +/* Internal compression function. STATE points to 8 uint32_t words, + DATA points to 64 bytes of input data, possibly unaligned, and K + points to the table of constants. */ +void +_nettle_sha256_compress(uint32_t *state, const uint8_t *data, const uint32_t *k); + + +/* SHA224, a truncated SHA256 with different initial state. */ + +#define SHA224_DIGEST_SIZE 28 +#define SHA224_BLOCK_SIZE SHA256_BLOCK_SIZE +#define sha224_ctx sha256_ctx + +void +sha224_init(struct sha256_ctx *ctx); + +#define sha224_update nettle_sha256_update + +void +sha224_digest(struct sha256_ctx *ctx, + size_t length, + uint8_t *digest); + + +/* SHA512 */ + +#define SHA512_DIGEST_SIZE 64 +#define SHA512_BLOCK_SIZE 128 + +/* Digest is kept internally as 8 64-bit words. */ +#define _SHA512_DIGEST_LENGTH 8 + +struct sha512_ctx +{ + uint64_t state[_SHA512_DIGEST_LENGTH]; /* State variables */ + uint64_t count_low, count_high; /* 128-bit block count */ + uint8_t block[SHA512_BLOCK_SIZE]; /* SHA512 data buffer */ + unsigned int index; /* index into buffer */ +}; + +void +sha512_init(struct sha512_ctx *ctx); + +void +sha512_update(struct sha512_ctx *ctx, + size_t length, + const uint8_t *data); + +void +sha512_digest(struct sha512_ctx *ctx, + size_t length, + uint8_t *digest); + +/* Internal compression function. STATE points to 8 uint64_t words, + DATA points to 128 bytes of input data, possibly unaligned, and K + points to the table of constants. */ +void +_nettle_sha512_compress(uint64_t *state, const uint8_t *data, const uint64_t *k); + + +/* SHA384, a truncated SHA512 with different initial state. */ + +#define SHA384_DIGEST_SIZE 48 +#define SHA384_BLOCK_SIZE SHA512_BLOCK_SIZE +#define sha384_ctx sha512_ctx + +void +sha384_init(struct sha512_ctx *ctx); + +#define sha384_update nettle_sha512_update + +void +sha384_digest(struct sha512_ctx *ctx, + size_t length, + uint8_t *digest); + + +/* SHA512_224 and SHA512_256, two truncated versions of SHA512 + with different initial states. */ + +#define SHA512_224_DIGEST_SIZE 28 +#define SHA512_224_BLOCK_SIZE SHA512_BLOCK_SIZE +#define sha512_224_ctx sha512_ctx + +void +sha512_224_init(struct sha512_224_ctx *ctx); + +#define sha512_224_update nettle_sha512_update + +void +sha512_224_digest(struct sha512_224_ctx *ctx, + size_t length, + uint8_t *digest); + +#define SHA512_256_DIGEST_SIZE 32 +#define SHA512_256_BLOCK_SIZE SHA512_BLOCK_SIZE +#define sha512_256_ctx sha512_ctx + +void +sha512_256_init(struct sha512_256_ctx *ctx); + +#define sha512_256_update nettle_sha512_update + +void +sha512_256_digest(struct sha512_256_ctx *ctx, + size_t length, + uint8_t *digest); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_SHA2_H_INCLUDED */ diff --git a/include/nettle/sha3.h b/include/nettle/sha3.h new file mode 100644 index 0000000..0c65537 --- /dev/null +++ b/include/nettle/sha3.h @@ -0,0 +1,193 @@ +/* sha3.h + + The sha3 hash function (aka Keccak). + + Copyright (C) 2012 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_SHA3_H_INCLUDED +#define NETTLE_SHA3_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define sha3_permute nettle_sha3_permute +#define _sha3_update _nettle_sha3_update +#define _sha3_pad _nettle_sha3_pad +#define sha3_224_init nettle_sha3_224_init +#define sha3_224_update nettle_sha3_224_update +#define sha3_224_digest nettle_sha3_224_digest +#define sha3_256_init nettle_sha3_256_init +#define sha3_256_update nettle_sha3_256_update +#define sha3_256_digest nettle_sha3_256_digest +#define sha3_384_init nettle_sha3_384_init +#define sha3_384_update nettle_sha3_384_update +#define sha3_384_digest nettle_sha3_384_digest +#define sha3_512_init nettle_sha3_512_init +#define sha3_512_update nettle_sha3_512_update +#define sha3_512_digest nettle_sha3_512_digest + +/* Indicates that SHA3 is the NIST FIPS 202 version. */ +#define NETTLE_SHA3_FIPS202 1 + +/* The sha3 state is a 5x5 matrix of 64-bit words. In the notation of + Keccak description, S[x,y] is element x + 5*y, so if x is + interpreted as the row index and y the column index, it is stored + in column-major order. */ +#define SHA3_STATE_LENGTH 25 + +/* The "width" is 1600 bits or 200 octets */ +struct sha3_state +{ + uint64_t a[SHA3_STATE_LENGTH]; +}; + +void +sha3_permute (struct sha3_state *state); + +unsigned +_sha3_update (struct sha3_state *state, + unsigned block_size, uint8_t *block, + unsigned pos, + size_t length, const uint8_t *data); +void +_sha3_pad (struct sha3_state *state, + unsigned block_size, uint8_t *block, unsigned pos); + +/* The "capacity" is set to 2*(digest size), 512 bits or 64 octets. + The "rate" is the width - capacity, or width - 2 * (digest + size). */ + +#define SHA3_224_DIGEST_SIZE 28 +#define SHA3_224_BLOCK_SIZE 144 + +#define SHA3_256_DIGEST_SIZE 32 +#define SHA3_256_BLOCK_SIZE 136 + +#define SHA3_384_DIGEST_SIZE 48 +#define SHA3_384_BLOCK_SIZE 104 + +#define SHA3_512_DIGEST_SIZE 64 +#define SHA3_512_BLOCK_SIZE 72 + +/* For backwards compatibility */ +#define SHA3_224_DATA_SIZE SHA3_224_BLOCK_SIZE +#define SHA3_256_DATA_SIZE SHA3_256_BLOCK_SIZE +#define SHA3_384_DATA_SIZE SHA3_384_BLOCK_SIZE +#define SHA3_512_DATA_SIZE SHA3_512_BLOCK_SIZE + +struct sha3_224_ctx +{ + struct sha3_state state; + unsigned index; + uint8_t block[SHA3_224_BLOCK_SIZE]; +}; + +void +sha3_224_init (struct sha3_224_ctx *ctx); + +void +sha3_224_update (struct sha3_224_ctx *ctx, + size_t length, + const uint8_t *data); + +void +sha3_224_digest(struct sha3_224_ctx *ctx, + size_t length, + uint8_t *digest); + +struct sha3_256_ctx +{ + struct sha3_state state; + unsigned index; + uint8_t block[SHA3_256_BLOCK_SIZE]; +}; + +void +sha3_256_init (struct sha3_256_ctx *ctx); + +void +sha3_256_update (struct sha3_256_ctx *ctx, + size_t length, + const uint8_t *data); + +void +sha3_256_digest(struct sha3_256_ctx *ctx, + size_t length, + uint8_t *digest); + +struct sha3_384_ctx +{ + struct sha3_state state; + unsigned index; + uint8_t block[SHA3_384_BLOCK_SIZE]; +}; + +void +sha3_384_init (struct sha3_384_ctx *ctx); + +void +sha3_384_update (struct sha3_384_ctx *ctx, + size_t length, + const uint8_t *data); + +void +sha3_384_digest(struct sha3_384_ctx *ctx, + size_t length, + uint8_t *digest); + +struct sha3_512_ctx +{ + struct sha3_state state; + unsigned index; + uint8_t block[SHA3_512_BLOCK_SIZE]; +}; + +void +sha3_512_init (struct sha3_512_ctx *ctx); + +void +sha3_512_update (struct sha3_512_ctx *ctx, + size_t length, + const uint8_t *data); + +void +sha3_512_digest(struct sha3_512_ctx *ctx, + size_t length, + uint8_t *digest); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_SHA3_H_INCLUDED */ diff --git a/include/nettle/twofish.h b/include/nettle/twofish.h new file mode 100644 index 0000000..1056e59 --- /dev/null +++ b/include/nettle/twofish.h @@ -0,0 +1,98 @@ +/* twofish.h + + The twofish block cipher. + + Copyright (C) 2001, 2014 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +/* + * Twofish is a 128-bit block cipher that accepts a variable-length + * key up to 256 bits, designed by Bruce Schneier and others. See + * http://www.counterpane.com/twofish.html for details. + */ + +#ifndef NETTLE_TWOFISH_H_INCLUDED +#define NETTLE_TWOFISH_H_INCLUDED + +#include "nettle-types.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define twofish_set_key nettle_twofish_set_key +#define twofish128_set_key nettle_twofish128_set_key +#define twofish192_set_key nettle_twofish192_set_key +#define twofish256_set_key nettle_twofish256_set_key +#define twofish_encrypt nettle_twofish_encrypt +#define twofish_decrypt nettle_twofish_decrypt + +#define TWOFISH_BLOCK_SIZE 16 + +/* Variable key size between 128 and 256 bits. But the only valid + * values are 16 (128 bits), 24 (192 bits) and 32 (256 bits). */ +#define TWOFISH_MIN_KEY_SIZE 16 +#define TWOFISH_MAX_KEY_SIZE 32 + +#define TWOFISH_KEY_SIZE 32 +#define TWOFISH128_KEY_SIZE 16 +#define TWOFISH192_KEY_SIZE 24 +#define TWOFISH256_KEY_SIZE 32 + +struct twofish_ctx +{ + uint32_t keys[40]; + uint32_t s_box[4][256]; +}; + +void +twofish_set_key(struct twofish_ctx *ctx, + size_t length, const uint8_t *key); +void +twofish128_set_key(struct twofish_ctx *context, const uint8_t *key); +void +twofish192_set_key(struct twofish_ctx *context, const uint8_t *key); +void +twofish256_set_key(struct twofish_ctx *context, const uint8_t *key); + +void +twofish_encrypt(const struct twofish_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); +void +twofish_decrypt(const struct twofish_ctx *ctx, + size_t length, uint8_t *dst, + const uint8_t *src); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_TWOFISH_H_INCLUDED */ diff --git a/include/nettle/umac.h b/include/nettle/umac.h new file mode 100644 index 0000000..f4d3c7a --- /dev/null +++ b/include/nettle/umac.h @@ -0,0 +1,253 @@ +/* umac.h + + UMAC message authentication code (RFC-4418). + + Copyright (C) 2013 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_UMAC_H_INCLUDED +#define NETTLE_UMAC_H_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +/* Namespace mangling */ +#define umac32_set_key nettle_umac32_set_key +#define umac64_set_key nettle_umac64_set_key +#define umac96_set_key nettle_umac96_set_key +#define umac128_set_key nettle_umac128_set_key +#define umac32_set_nonce nettle_umac32_set_nonce +#define umac64_set_nonce nettle_umac64_set_nonce +#define umac96_set_nonce nettle_umac96_set_nonce +#define umac128_set_nonce nettle_umac128_set_nonce +#define umac32_update nettle_umac32_update +#define umac64_update nettle_umac64_update +#define umac96_update nettle_umac96_update +#define umac128_update nettle_umac128_update +#define umac32_digest nettle_umac32_digest +#define umac64_digest nettle_umac64_digest +#define umac96_digest nettle_umac96_digest +#define umac128_digest nettle_umac128_digest +#define _umac_set_key _nettle_umac_set_key +#define _umac_nh _nettle_umac_nh +#define _umac_nh_n _nettle_umac_nh_n +#define _umac_poly64 _nettle_umac_poly64 +#define _umac_poly128 _nettle_umac_poly128 +#define _umac_l2_init _nettle_umac_l2_init +#define _umac_l2 _nettle_umac_l2 +#define _umac_l2_final _nettle_umac_l2_final +#define _umac_l3_init _nettle_umac_l3_init +#define _umac_l3 _nettle_umac_l3 + +#include "nettle-types.h" +#include "aes.h" + +#define UMAC_KEY_SIZE AES128_KEY_SIZE +#define UMAC32_DIGEST_SIZE 4 +#define UMAC64_DIGEST_SIZE 8 +#define UMAC96_DIGEST_SIZE 12 +#define UMAC128_DIGEST_SIZE 16 +#define UMAC_BLOCK_SIZE 1024 +#define UMAC_MIN_NONCE_SIZE 1 +#define UMAC_MAX_NONCE_SIZE AES_BLOCK_SIZE +/* For backwards compatibility */ +#define UMAC_DATA_SIZE UMAC_BLOCK_SIZE + +/* Subkeys and state for UMAC with tag size 32*n bits. */ +#define _UMAC_STATE(n) \ + uint32_t l1_key[UMAC_BLOCK_SIZE/4 + 4*((n)-1)]; \ + /* Keys in 32-bit pieces, high first */ \ + uint32_t l2_key[6*(n)]; \ + uint64_t l3_key1[8*(n)]; \ + uint32_t l3_key2[(n)]; \ + /* AES cipher for encrypting the nonce */ \ + struct aes128_ctx pdf_key; \ + /* The l2_state consists of 2*n uint64_t, for poly64 \ + and poly128 hashing, followed by n additional \ + uint64_t used as an input buffer. */ \ + uint64_t l2_state[3*(n)]; \ + /* Input to the pdf_key, zero-padded and low bits \ + cleared if appropriate. */ \ + uint8_t nonce[AES_BLOCK_SIZE]; \ + unsigned short nonce_length /* For incrementing */ + + /* Buffering */ +#define _UMAC_BUFFER \ + unsigned index; \ + /* Complete blocks processed */ \ + uint64_t count; \ + uint8_t block[UMAC_BLOCK_SIZE] + +#define _UMAC_NONCE_CACHED 0x80 + +struct umac32_ctx +{ + _UMAC_STATE(1); + /* Low bits and cache flag. */ + unsigned short nonce_low; + /* Previous padding block */ + uint32_t pad_cache[AES_BLOCK_SIZE / 4]; + _UMAC_BUFFER; +}; + +struct umac64_ctx +{ + _UMAC_STATE(2); + /* Low bit and cache flag. */ + unsigned short nonce_low; + /* Previous padding block */ + uint32_t pad_cache[AES_BLOCK_SIZE/4]; + _UMAC_BUFFER; +}; + +struct umac96_ctx +{ + _UMAC_STATE(3); + _UMAC_BUFFER; +}; + +struct umac128_ctx +{ + _UMAC_STATE(4); + _UMAC_BUFFER; +}; + +/* The _set_key function initialize the nonce to zero. */ +void +umac32_set_key (struct umac32_ctx *ctx, const uint8_t *key); +void +umac64_set_key (struct umac64_ctx *ctx, const uint8_t *key); +void +umac96_set_key (struct umac96_ctx *ctx, const uint8_t *key); +void +umac128_set_key (struct umac128_ctx *ctx, const uint8_t *key); + +/* Optional, if not used, messages get incrementing nonces starting from zero. */ +void +umac32_set_nonce (struct umac32_ctx *ctx, + size_t nonce_length, const uint8_t *nonce); +void +umac64_set_nonce (struct umac64_ctx *ctx, + size_t nonce_length, const uint8_t *nonce); +void +umac96_set_nonce (struct umac96_ctx *ctx, + size_t nonce_length, const uint8_t *nonce); +void +umac128_set_nonce (struct umac128_ctx *ctx, + size_t nonce_length, const uint8_t *nonce); + +void +umac32_update (struct umac32_ctx *ctx, + size_t length, const uint8_t *data); +void +umac64_update (struct umac64_ctx *ctx, + size_t length, const uint8_t *data); +void +umac96_update (struct umac96_ctx *ctx, + size_t length, const uint8_t *data); +void +umac128_update (struct umac128_ctx *ctx, + size_t length, const uint8_t *data); + +/* The _digest functions increment the nonce */ +void +umac32_digest (struct umac32_ctx *ctx, + size_t length, uint8_t *digest); +void +umac64_digest (struct umac64_ctx *ctx, + size_t length, uint8_t *digest); +void +umac96_digest (struct umac96_ctx *ctx, + size_t length, uint8_t *digest); +void +umac128_digest (struct umac128_ctx *ctx, + size_t length, uint8_t *digest); + + +/* Internal functions */ +#define UMAC_POLY64_BLOCKS 16384 + +#define UMAC_P64_OFFSET 59 +#define UMAC_P64 (- (uint64_t) UMAC_P64_OFFSET) + +#define UMAC_P128_OFFSET 159 +#define UMAC_P128_HI (~(uint64_t) 0) +#define UMAC_P128_LO (-(uint64_t) UMAC_P128_OFFSET) + +void +_umac_set_key (uint32_t *l1_key, uint32_t *l2_key, + uint64_t *l3_key1, uint32_t *l3_key2, + struct aes128_ctx *pad, const uint8_t *key, unsigned n); + +uint64_t +_umac_nh (const uint32_t *key, unsigned length, const uint8_t *msg); + +/* Equivalent to + + for (i = 0; i < n; i++) + out[i] = _umac_nh (key + 4*i, length, msg); + + but processing input only once. +*/ +void +_umac_nh_n (uint64_t *out, unsigned n, const uint32_t *key, + unsigned length, const uint8_t *msg); + +/* Returns y*k + m (mod p), including "marker" processing. Return + value is *not* in canonical representation, and must be normalized + before the output is used. */ +uint64_t +_umac_poly64 (uint32_t kh, uint32_t kl, uint64_t y, uint64_t m); + +void +_umac_poly128 (const uint32_t *k, uint64_t *y, uint64_t mh, uint64_t ml); + +void +_umac_l2_init (unsigned size, uint32_t *k); + +void +_umac_l2(const uint32_t *key, uint64_t *state, unsigned n, + uint64_t count, const uint64_t *m); + +void +_umac_l2_final(const uint32_t *key, uint64_t *state, unsigned n, + uint64_t count); + +void +_umac_l3_init (unsigned size, uint64_t *k); + +uint32_t +_umac_l3 (const uint64_t *key, const uint64_t *m); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_UMAC_H_INCLUDED */ diff --git a/include/nettle/version.h b/include/nettle/version.h new file mode 100644 index 0000000..b202049 --- /dev/null +++ b/include/nettle/version.h @@ -0,0 +1,64 @@ +/* version.h + + Information about library version. + + Copyright (C) 2015 Red Hat, Inc. + Copyright (C) 2015 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_VERSION_H_INCLUDED +#define NETTLE_VERSION_H_INCLUDED + +#ifdef __cplusplus +extern "C" { +#endif + +/* Individual version numbers in decimal */ +#define NETTLE_VERSION_MAJOR 3 +#define NETTLE_VERSION_MINOR 4 + +#define NETTLE_USE_MINI_GMP 0 + +/* We need a preprocessor constant for GMP_NUMB_BITS, simply using + sizeof(mp_limb_t) * CHAR_BIT is not good enough. */ +#if NETTLE_USE_MINI_GMP +# define GMP_NUMB_BITS n/a +#endif + +int +nettle_version_major (void); + +int +nettle_version_minor (void); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_VERSION_H_INCLUDED */ diff --git a/include/nettle/yarrow.h b/include/nettle/yarrow.h new file mode 100644 index 0000000..808ac0a --- /dev/null +++ b/include/nettle/yarrow.h @@ -0,0 +1,145 @@ +/* yarrow.h + + The yarrow pseudo-randomness generator. + + Copyright (C) 2001 Niels Möller + + This file is part of GNU Nettle. + + GNU Nettle is free software: you can redistribute it and/or + modify it under the terms of either: + + * the GNU Lesser General Public License as published by the Free + Software Foundation; either version 3 of the License, or (at your + option) any later version. + + or + + * the GNU General Public License as published by the Free + Software Foundation; either version 2 of the License, or (at your + option) any later version. + + or both in parallel, as here. + + GNU Nettle is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received copies of the GNU General Public License and + the GNU Lesser General Public License along with this program. If + not, see http://www.gnu.org/licenses/. +*/ + +#ifndef NETTLE_YARROW_H_INCLUDED +#define NETTLE_YARROW_H_INCLUDED + +#include "aes.h" +#include "sha2.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Name mangling */ +#define yarrow256_init nettle_yarrow256_init +#define yarrow256_seed nettle_yarrow256_seed +#define yarrow256_update nettle_yarrow256_update +#define yarrow256_random nettle_yarrow256_random +#define yarrow256_is_seeded nettle_yarrow256_is_seeded +#define yarrow256_needed_sources nettle_yarrow256_needed_sources +#define yarrow256_fast_reseed nettle_yarrow256_fast_reseed +#define yarrow256_slow_reseed nettle_yarrow256_slow_reseed +#define yarrow_key_event_init nettle_yarrow_key_event_init +#define yarrow_key_event_estimate nettle_yarrow_key_event_estimate + +/* Obsolete alias for backwards compatibility. Will be deleted in some + later version. */ +#define yarrow256_force_reseed yarrow256_slow_reseed + +enum yarrow_pool_id { YARROW_FAST = 0, YARROW_SLOW = 1 }; + +struct yarrow_source +{ + /* Indexed by yarrow_pool_id */ + uint32_t estimate[2]; + + /* The pool next sample should go to. */ + enum yarrow_pool_id next; +}; + + +#define YARROW256_SEED_FILE_SIZE (2 * AES_BLOCK_SIZE) + +/* Yarrow-256, based on SHA-256 and AES-256 */ +struct yarrow256_ctx +{ + /* Indexed by yarrow_pool_id */ + struct sha256_ctx pools[2]; + + int seeded; + + /* The current key and counter block */ + struct aes256_ctx key; + uint8_t counter[AES_BLOCK_SIZE]; + + /* The entropy sources */ + unsigned nsources; + struct yarrow_source *sources; +}; + +void +yarrow256_init(struct yarrow256_ctx *ctx, + unsigned nsources, + struct yarrow_source *sources); + +void +yarrow256_seed(struct yarrow256_ctx *ctx, + size_t length, + const uint8_t *seed_file); + +/* Returns 1 on reseed */ +int +yarrow256_update(struct yarrow256_ctx *ctx, + unsigned source, unsigned entropy, + size_t length, const uint8_t *data); + +void +yarrow256_random(struct yarrow256_ctx *ctx, size_t length, uint8_t *dst); + +int +yarrow256_is_seeded(struct yarrow256_ctx *ctx); + +unsigned +yarrow256_needed_sources(struct yarrow256_ctx *ctx); + +void +yarrow256_fast_reseed(struct yarrow256_ctx *ctx); + +void +yarrow256_slow_reseed(struct yarrow256_ctx *ctx); + + +/* Key event estimator */ +#define YARROW_KEY_EVENT_BUFFER 16 + +struct yarrow_key_event_ctx +{ + /* Counter for initial priming of the state */ + unsigned index; + unsigned chars[YARROW_KEY_EVENT_BUFFER]; + unsigned previous; +}; + +void +yarrow_key_event_init(struct yarrow_key_event_ctx *ctx); + +unsigned +yarrow_key_event_estimate(struct yarrow_key_event_ctx *ctx, + unsigned key, unsigned time); + +#ifdef __cplusplus +} +#endif + +#endif /* NETTLE_YARROW_H_INCLUDED */ diff --git a/include/zip.h b/include/zip.h new file mode 100644 index 0000000..a90776d --- /dev/null +++ b/include/zip.h @@ -0,0 +1,479 @@ +#ifndef _HAD_ZIP_H +#define _HAD_ZIP_H + +/* + zip.h -- exported declarations. + Copyright (C) 1999-2020 Dieter Baron and Thomas Klausner + + This file is part of libzip, a library to manipulate ZIP archives. + The authors can be contacted at + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in + the documentation and/or other materials provided with the + distribution. + 3. The names of the authors may not be used to endorse or promote + products derived from this software without specific prior + written permission. + + THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS + OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE + GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR + OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +#ifdef __cplusplus +extern "C" { +#if 0 +} /* fix autoindent */ +#endif +#endif + +#include + +#ifndef ZIP_EXTERN +#ifndef ZIP_STATIC +#ifdef _WIN32 +#define ZIP_EXTERN __declspec(dllimport) +#elif defined(__GNUC__) && __GNUC__ >= 4 +#define ZIP_EXTERN __attribute__((visibility("default"))) +#else +#define ZIP_EXTERN +#endif +#else +#define ZIP_EXTERN +#endif +#endif + +#include +#include +#include + +/* flags for zip_open */ + +#define ZIP_CREATE 1 +#define ZIP_EXCL 2 +#define ZIP_CHECKCONS 4 +#define ZIP_TRUNCATE 8 +#define ZIP_RDONLY 16 + + +/* flags for zip_name_locate, zip_fopen, zip_stat, ... */ + +#define ZIP_FL_NOCASE 1u /* ignore case on name lookup */ +#define ZIP_FL_NODIR 2u /* ignore directory component */ +#define ZIP_FL_COMPRESSED 4u /* read compressed data */ +#define ZIP_FL_UNCHANGED 8u /* use original data, ignoring changes */ +#define ZIP_FL_RECOMPRESS 16u /* force recompression of data */ +#define ZIP_FL_ENCRYPTED 32u /* read encrypted data (implies ZIP_FL_COMPRESSED) */ +#define ZIP_FL_ENC_GUESS 0u /* guess string encoding (is default) */ +#define ZIP_FL_ENC_RAW 64u /* get unmodified string */ +#define ZIP_FL_ENC_STRICT 128u /* follow specification strictly */ +#define ZIP_FL_LOCAL 256u /* in local header */ +#define ZIP_FL_CENTRAL 512u /* in central directory */ +/* 1024u reserved for internal use */ +#define ZIP_FL_ENC_UTF_8 2048u /* string is UTF-8 encoded */ +#define ZIP_FL_ENC_CP437 4096u /* string is CP437 encoded */ +#define ZIP_FL_OVERWRITE 8192u /* zip_file_add: if file with name exists, overwrite (replace) it */ + +/* archive global flags flags */ + +#define ZIP_AFL_RDONLY 2u /* read only -- cannot be cleared */ + + +/* create a new extra field */ + +#define ZIP_EXTRA_FIELD_ALL ZIP_UINT16_MAX +#define ZIP_EXTRA_FIELD_NEW ZIP_UINT16_MAX + + +/* libzip error codes */ + +#define ZIP_ER_OK 0 /* N No error */ +#define ZIP_ER_MULTIDISK 1 /* N Multi-disk zip archives not supported */ +#define ZIP_ER_RENAME 2 /* S Renaming temporary file failed */ +#define ZIP_ER_CLOSE 3 /* S Closing zip archive failed */ +#define ZIP_ER_SEEK 4 /* S Seek error */ +#define ZIP_ER_READ 5 /* S Read error */ +#define ZIP_ER_WRITE 6 /* S Write error */ +#define ZIP_ER_CRC 7 /* N CRC error */ +#define ZIP_ER_ZIPCLOSED 8 /* N Containing zip archive was closed */ +#define ZIP_ER_NOENT 9 /* N No such file */ +#define ZIP_ER_EXISTS 10 /* N File already exists */ +#define ZIP_ER_OPEN 11 /* S Can't open file */ +#define ZIP_ER_TMPOPEN 12 /* S Failure to create temporary file */ +#define ZIP_ER_ZLIB 13 /* Z Zlib error */ +#define ZIP_ER_MEMORY 14 /* N Malloc failure */ +#define ZIP_ER_CHANGED 15 /* N Entry has been changed */ +#define ZIP_ER_COMPNOTSUPP 16 /* N Compression method not supported */ +#define ZIP_ER_EOF 17 /* N Premature end of file */ +#define ZIP_ER_INVAL 18 /* N Invalid argument */ +#define ZIP_ER_NOZIP 19 /* N Not a zip archive */ +#define ZIP_ER_INTERNAL 20 /* N Internal error */ +#define ZIP_ER_INCONS 21 /* N Zip archive inconsistent */ +#define ZIP_ER_REMOVE 22 /* S Can't remove file */ +#define ZIP_ER_DELETED 23 /* N Entry has been deleted */ +#define ZIP_ER_ENCRNOTSUPP 24 /* N Encryption method not supported */ +#define ZIP_ER_RDONLY 25 /* N Read-only archive */ +#define ZIP_ER_NOPASSWD 26 /* N No password provided */ +#define ZIP_ER_WRONGPASSWD 27 /* N Wrong password provided */ +#define ZIP_ER_OPNOTSUPP 28 /* N Operation not supported */ +#define ZIP_ER_INUSE 29 /* N Resource still in use */ +#define ZIP_ER_TELL 30 /* S Tell error */ +#define ZIP_ER_COMPRESSED_DATA 31 /* N Compressed data invalid */ +#define ZIP_ER_CANCELLED 32 /* N Operation cancelled */ + +/* type of system error value */ + +#define ZIP_ET_NONE 0 /* sys_err unused */ +#define ZIP_ET_SYS 1 /* sys_err is errno */ +#define ZIP_ET_ZLIB 2 /* sys_err is zlib error code */ + +/* compression methods */ + +#define ZIP_CM_DEFAULT -1 /* better of deflate or store */ +#define ZIP_CM_STORE 0 /* stored (uncompressed) */ +#define ZIP_CM_SHRINK 1 /* shrunk */ +#define ZIP_CM_REDUCE_1 2 /* reduced with factor 1 */ +#define ZIP_CM_REDUCE_2 3 /* reduced with factor 2 */ +#define ZIP_CM_REDUCE_3 4 /* reduced with factor 3 */ +#define ZIP_CM_REDUCE_4 5 /* reduced with factor 4 */ +#define ZIP_CM_IMPLODE 6 /* imploded */ +/* 7 - Reserved for Tokenizing compression algorithm */ +#define ZIP_CM_DEFLATE 8 /* deflated */ +#define ZIP_CM_DEFLATE64 9 /* deflate64 */ +#define ZIP_CM_PKWARE_IMPLODE 10 /* PKWARE imploding */ +/* 11 - Reserved by PKWARE */ +#define ZIP_CM_BZIP2 12 /* compressed using BZIP2 algorithm */ +/* 13 - Reserved by PKWARE */ +#define ZIP_CM_LZMA 14 /* LZMA (EFS) */ +/* 15-17 - Reserved by PKWARE */ +#define ZIP_CM_TERSE 18 /* compressed using IBM TERSE (new) */ +#define ZIP_CM_LZ77 19 /* IBM LZ77 z Architecture (PFS) */ +#define ZIP_CM_LZMA2 33 +#define ZIP_CM_XZ 95 /* XZ compressed data */ +#define ZIP_CM_JPEG 96 /* Compressed Jpeg data */ +#define ZIP_CM_WAVPACK 97 /* WavPack compressed data */ +#define ZIP_CM_PPMD 98 /* PPMd version I, Rev 1 */ + +/* encryption methods */ + +#define ZIP_EM_NONE 0 /* not encrypted */ +#define ZIP_EM_TRAD_PKWARE 1 /* traditional PKWARE encryption */ +#if 0 /* Strong Encryption Header not parsed yet */ +#define ZIP_EM_DES 0x6601 /* strong encryption: DES */ +#define ZIP_EM_RC2_OLD 0x6602 /* strong encryption: RC2, version < 5.2 */ +#define ZIP_EM_3DES_168 0x6603 +#define ZIP_EM_3DES_112 0x6609 +#define ZIP_EM_PKZIP_AES_128 0x660e +#define ZIP_EM_PKZIP_AES_192 0x660f +#define ZIP_EM_PKZIP_AES_256 0x6610 +#define ZIP_EM_RC2 0x6702 /* strong encryption: RC2, version >= 5.2 */ +#define ZIP_EM_RC4 0x6801 +#endif +#define ZIP_EM_AES_128 0x0101 /* Winzip AES encryption */ +#define ZIP_EM_AES_192 0x0102 +#define ZIP_EM_AES_256 0x0103 +#define ZIP_EM_UNKNOWN 0xffff /* unknown algorithm */ + +#define ZIP_OPSYS_DOS 0x00u +#define ZIP_OPSYS_AMIGA 0x01u +#define ZIP_OPSYS_OPENVMS 0x02u +#define ZIP_OPSYS_UNIX 0x03u +#define ZIP_OPSYS_VM_CMS 0x04u +#define ZIP_OPSYS_ATARI_ST 0x05u +#define ZIP_OPSYS_OS_2 0x06u +#define ZIP_OPSYS_MACINTOSH 0x07u +#define ZIP_OPSYS_Z_SYSTEM 0x08u +#define ZIP_OPSYS_CPM 0x09u +#define ZIP_OPSYS_WINDOWS_NTFS 0x0au +#define ZIP_OPSYS_MVS 0x0bu +#define ZIP_OPSYS_VSE 0x0cu +#define ZIP_OPSYS_ACORN_RISC 0x0du +#define ZIP_OPSYS_VFAT 0x0eu +#define ZIP_OPSYS_ALTERNATE_MVS 0x0fu +#define ZIP_OPSYS_BEOS 0x10u +#define ZIP_OPSYS_TANDEM 0x11u +#define ZIP_OPSYS_OS_400 0x12u +#define ZIP_OPSYS_OS_X 0x13u + +#define ZIP_OPSYS_DEFAULT ZIP_OPSYS_UNIX + + +enum zip_source_cmd { + ZIP_SOURCE_OPEN, /* prepare for reading */ + ZIP_SOURCE_READ, /* read data */ + ZIP_SOURCE_CLOSE, /* reading is done */ + ZIP_SOURCE_STAT, /* get meta information */ + ZIP_SOURCE_ERROR, /* get error information */ + ZIP_SOURCE_FREE, /* cleanup and free resources */ + ZIP_SOURCE_SEEK, /* set position for reading */ + ZIP_SOURCE_TELL, /* get read position */ + ZIP_SOURCE_BEGIN_WRITE, /* prepare for writing */ + ZIP_SOURCE_COMMIT_WRITE, /* writing is done */ + ZIP_SOURCE_ROLLBACK_WRITE, /* discard written changes */ + ZIP_SOURCE_WRITE, /* write data */ + ZIP_SOURCE_SEEK_WRITE, /* set position for writing */ + ZIP_SOURCE_TELL_WRITE, /* get write position */ + ZIP_SOURCE_SUPPORTS, /* check whether source supports command */ + ZIP_SOURCE_REMOVE, /* remove file */ + ZIP_SOURCE_RESERVED_1, /* previously used internally */ + ZIP_SOURCE_BEGIN_WRITE_CLONING, /* like ZIP_SOURCE_BEGIN_WRITE, but keep part of original file */ + ZIP_SOURCE_ACCEPT_EMPTY, /* whether empty files are valid archives */ + ZIP_SOURCE_GET_FILE_ATTRIBUTES /* get additional file attributes */ +}; +typedef enum zip_source_cmd zip_source_cmd_t; + +#define ZIP_SOURCE_MAKE_COMMAND_BITMASK(cmd) (((zip_int64_t)1) << (cmd)) + +/* clang-format off */ + +#define ZIP_SOURCE_SUPPORTS_READABLE (ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_OPEN) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_READ) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_CLOSE) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_STAT) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_ERROR) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_FREE)) + +#define ZIP_SOURCE_SUPPORTS_SEEKABLE (ZIP_SOURCE_SUPPORTS_READABLE \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SEEK) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_TELL) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SUPPORTS)) + +#define ZIP_SOURCE_SUPPORTS_WRITABLE (ZIP_SOURCE_SUPPORTS_SEEKABLE \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_BEGIN_WRITE) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_COMMIT_WRITE) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_ROLLBACK_WRITE) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_WRITE) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_SEEK_WRITE) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_TELL_WRITE) \ + | ZIP_SOURCE_MAKE_COMMAND_BITMASK(ZIP_SOURCE_REMOVE)) + +/* clang-format on */ + +/* for use by sources */ +struct zip_source_args_seek { + zip_int64_t offset; + int whence; +}; + +typedef struct zip_source_args_seek zip_source_args_seek_t; +#define ZIP_SOURCE_GET_ARGS(type, data, len, error) ((len) < sizeof(type) ? zip_error_set((error), ZIP_ER_INVAL, 0), (type *)NULL : (type *)(data)) + + +/* error information */ +/* use zip_error_*() to access */ +struct zip_error { + int zip_err; /* libzip error code (ZIP_ER_*) */ + int sys_err; /* copy of errno (E*) or zlib error code */ + char *_Nullable str; /* string representation or NULL */ +}; + +#define ZIP_STAT_NAME 0x0001u +#define ZIP_STAT_INDEX 0x0002u +#define ZIP_STAT_SIZE 0x0004u +#define ZIP_STAT_COMP_SIZE 0x0008u +#define ZIP_STAT_MTIME 0x0010u +#define ZIP_STAT_CRC 0x0020u +#define ZIP_STAT_COMP_METHOD 0x0040u +#define ZIP_STAT_ENCRYPTION_METHOD 0x0080u +#define ZIP_STAT_FLAGS 0x0100u + +struct zip_stat { + zip_uint64_t valid; /* which fields have valid values */ + const char *_Nullable name; /* name of the file */ + zip_uint64_t index; /* index within archive */ + zip_uint64_t size; /* size of file (uncompressed) */ + zip_uint64_t comp_size; /* size of file (compressed) */ + time_t mtime; /* modification time */ + zip_uint32_t crc; /* crc of file data */ + zip_uint16_t comp_method; /* compression method used */ + zip_uint16_t encryption_method; /* encryption method used */ + zip_uint32_t flags; /* reserved for future use */ +}; + +struct zip_buffer_fragment { + zip_uint8_t *_Nonnull data; + zip_uint64_t length; +}; + +struct zip_file_attributes { + zip_uint64_t valid; /* which fields have valid values */ + zip_uint8_t version; /* version of this struct, currently 1 */ + zip_uint8_t host_system; /* host system on which file was created */ + zip_uint8_t ascii; /* flag whether file is ASCII text */ + zip_uint8_t version_needed; /* minimum version needed to extract file */ + zip_uint32_t external_file_attributes; /* external file attributes (host-system specific) */ + zip_uint16_t general_purpose_bit_flags; /* general purpose big flags, only some bits are honored */ + zip_uint16_t general_purpose_bit_mask; /* which bits in general_purpose_bit_flags are valid */ +}; + +#define ZIP_FILE_ATTRIBUTES_HOST_SYSTEM 0x0001u +#define ZIP_FILE_ATTRIBUTES_ASCII 0x0002u +#define ZIP_FILE_ATTRIBUTES_VERSION_NEEDED 0x0004u +#define ZIP_FILE_ATTRIBUTES_EXTERNAL_FILE_ATTRIBUTES 0x0008u +#define ZIP_FILE_ATTRIBUTES_GENERAL_PURPOSE_BIT_FLAGS 0x0010u + +struct zip; +struct zip_file; +struct zip_source; + +typedef struct zip zip_t; +typedef struct zip_error zip_error_t; +typedef struct zip_file zip_file_t; +typedef struct zip_file_attributes zip_file_attributes_t; +typedef struct zip_source zip_source_t; +typedef struct zip_stat zip_stat_t; +typedef struct zip_buffer_fragment zip_buffer_fragment_t; + +typedef zip_uint32_t zip_flags_t; + +typedef zip_int64_t (*zip_source_callback)(void *_Nullable, void *_Nullable, zip_uint64_t, zip_source_cmd_t); +typedef void (*zip_progress_callback)(zip_t *_Nonnull, double, void *_Nullable); +typedef int (*zip_cancel_callback)(zip_t *_Nonnull, void *_Nullable); + +#ifndef ZIP_DISABLE_DEPRECATED +typedef void (*zip_progress_callback_t)(double); +ZIP_EXTERN void zip_register_progress_callback(zip_t *_Nonnull, zip_progress_callback_t _Nullable); /* use zip_register_progress_callback_with_state */ + +ZIP_EXTERN zip_int64_t zip_add(zip_t *_Nonnull, const char *_Nonnull, zip_source_t *_Nonnull); /* use zip_file_add */ +ZIP_EXTERN zip_int64_t zip_add_dir(zip_t *_Nonnull, const char *_Nonnull); /* use zip_dir_add */ +ZIP_EXTERN const char *_Nullable zip_get_file_comment(zip_t *_Nonnull, zip_uint64_t, int *_Nullable, int); /* use zip_file_get_comment */ +ZIP_EXTERN int zip_get_num_files(zip_t *_Nonnull); /* use zip_get_num_entries instead */ +ZIP_EXTERN int zip_rename(zip_t *_Nonnull, zip_uint64_t, const char *_Nonnull); /* use zip_file_rename */ +ZIP_EXTERN int zip_replace(zip_t *_Nonnull, zip_uint64_t, zip_source_t *_Nonnull); /* use zip_file_replace */ +ZIP_EXTERN int zip_set_file_comment(zip_t *_Nonnull, zip_uint64_t, const char *_Nullable, int); /* use zip_file_set_comment */ +ZIP_EXTERN int zip_error_get_sys_type(int); /* use zip_error_system_type */ +ZIP_EXTERN void zip_error_get(zip_t *_Nonnull, int *_Nullable, int *_Nullable); /* use zip_get_error, zip_error_code_zip / zip_error_code_system */ +ZIP_EXTERN int zip_error_to_str(char *_Nonnull, zip_uint64_t, int, int); /* use zip_error_init_with_code / zip_error_strerror */ +ZIP_EXTERN void zip_file_error_get(zip_file_t *_Nonnull, int *_Nullable, int *_Nullable); /* use zip_file_get_error, zip_error_code_zip / zip_error_code_system */ +#endif + +ZIP_EXTERN int zip_close(zip_t *_Nonnull); +ZIP_EXTERN int zip_delete(zip_t *_Nonnull, zip_uint64_t); +ZIP_EXTERN zip_int64_t zip_dir_add(zip_t *_Nonnull, const char *_Nonnull, zip_flags_t); +ZIP_EXTERN void zip_discard(zip_t *_Nonnull); + +ZIP_EXTERN zip_error_t *_Nonnull zip_get_error(zip_t *_Nonnull); +ZIP_EXTERN void zip_error_clear(zip_t *_Nonnull); +ZIP_EXTERN int zip_error_code_zip(const zip_error_t *_Nonnull); +ZIP_EXTERN int zip_error_code_system(const zip_error_t *_Nonnull); +ZIP_EXTERN void zip_error_fini(zip_error_t *_Nonnull); +ZIP_EXTERN void zip_error_init(zip_error_t *_Nonnull); +ZIP_EXTERN void zip_error_init_with_code(zip_error_t *_Nonnull, int); +ZIP_EXTERN void zip_error_set(zip_error_t *_Nullable, int, int); +ZIP_EXTERN const char *_Nonnull zip_error_strerror(zip_error_t *_Nonnull); +ZIP_EXTERN int zip_error_system_type(const zip_error_t *_Nonnull); +ZIP_EXTERN zip_int64_t zip_error_to_data(const zip_error_t *_Nonnull, void *_Nonnull, zip_uint64_t); + +ZIP_EXTERN int zip_fclose(zip_file_t *_Nonnull); +ZIP_EXTERN zip_t *_Nullable zip_fdopen(int, int, int *_Nullable); +ZIP_EXTERN zip_int64_t zip_file_add(zip_t *_Nonnull, const char *_Nonnull, zip_source_t *_Nonnull, zip_flags_t); +ZIP_EXTERN void zip_file_attributes_init(zip_file_attributes_t *_Nonnull); +ZIP_EXTERN void zip_file_error_clear(zip_file_t *_Nonnull); +ZIP_EXTERN int zip_file_extra_field_delete(zip_t *_Nonnull, zip_uint64_t, zip_uint16_t, zip_flags_t); +ZIP_EXTERN int zip_file_extra_field_delete_by_id(zip_t *_Nonnull, zip_uint64_t, zip_uint16_t, zip_uint16_t, zip_flags_t); +ZIP_EXTERN int zip_file_extra_field_set(zip_t *_Nonnull, zip_uint64_t, zip_uint16_t, zip_uint16_t, const zip_uint8_t *_Nullable, zip_uint16_t, zip_flags_t); +ZIP_EXTERN zip_int16_t zip_file_extra_fields_count(zip_t *_Nonnull, zip_uint64_t, zip_flags_t); +ZIP_EXTERN zip_int16_t zip_file_extra_fields_count_by_id(zip_t *_Nonnull, zip_uint64_t, zip_uint16_t, zip_flags_t); +ZIP_EXTERN const zip_uint8_t *_Nullable zip_file_extra_field_get(zip_t *_Nonnull, zip_uint64_t, zip_uint16_t, zip_uint16_t *_Nullable, zip_uint16_t *_Nullable, zip_flags_t); +ZIP_EXTERN const zip_uint8_t *_Nullable zip_file_extra_field_get_by_id(zip_t *_Nonnull, zip_uint64_t, zip_uint16_t, zip_uint16_t, zip_uint16_t *_Nullable, zip_flags_t); +ZIP_EXTERN const char *_Nullable zip_file_get_comment(zip_t *_Nonnull, zip_uint64_t, zip_uint32_t *_Nullable, zip_flags_t); +ZIP_EXTERN zip_error_t *_Nonnull zip_file_get_error(zip_file_t *_Nonnull); +ZIP_EXTERN int zip_file_get_external_attributes(zip_t *_Nonnull, zip_uint64_t, zip_flags_t, zip_uint8_t *_Nullable, zip_uint32_t *_Nullable); +ZIP_EXTERN int zip_file_rename(zip_t *_Nonnull, zip_uint64_t, const char *_Nonnull, zip_flags_t); +ZIP_EXTERN int zip_file_replace(zip_t *_Nonnull, zip_uint64_t, zip_source_t *_Nonnull, zip_flags_t); +ZIP_EXTERN int zip_file_set_comment(zip_t *_Nonnull, zip_uint64_t, const char *_Nullable, zip_uint16_t, zip_flags_t); +ZIP_EXTERN int zip_file_set_dostime(zip_t *_Nonnull, zip_uint64_t, zip_uint16_t, zip_uint16_t, zip_flags_t); +ZIP_EXTERN int zip_file_set_encryption(zip_t *_Nonnull, zip_uint64_t, zip_uint16_t, const char *_Nullable); +ZIP_EXTERN int zip_file_set_external_attributes(zip_t *_Nonnull, zip_uint64_t, zip_flags_t, zip_uint8_t, zip_uint32_t); +ZIP_EXTERN int zip_file_set_mtime(zip_t *_Nonnull, zip_uint64_t, time_t, zip_flags_t); +ZIP_EXTERN const char *_Nonnull zip_file_strerror(zip_file_t *_Nonnull); +ZIP_EXTERN zip_file_t *_Nullable zip_fopen(zip_t *_Nonnull, const char *_Nonnull, zip_flags_t); +ZIP_EXTERN zip_file_t *_Nullable zip_fopen_encrypted(zip_t *_Nonnull, const char *_Nonnull, zip_flags_t, const char *_Nullable); +ZIP_EXTERN zip_file_t *_Nullable zip_fopen_index(zip_t *_Nonnull, zip_uint64_t, zip_flags_t); +ZIP_EXTERN zip_file_t *_Nullable zip_fopen_index_encrypted(zip_t *_Nonnull, zip_uint64_t, zip_flags_t, const char *_Nullable); +ZIP_EXTERN zip_int64_t zip_fread(zip_file_t *_Nonnull, void *_Nonnull, zip_uint64_t); +ZIP_EXTERN zip_int8_t zip_fseek(zip_file_t *_Nonnull, zip_int64_t, int); +ZIP_EXTERN zip_int64_t zip_ftell(zip_file_t *_Nonnull); +ZIP_EXTERN const char *_Nullable zip_get_archive_comment(zip_t *_Nonnull, int *_Nullable, zip_flags_t); +ZIP_EXTERN int zip_get_archive_flag(zip_t *_Nonnull, zip_flags_t, zip_flags_t); +ZIP_EXTERN const char *_Nullable zip_get_name(zip_t *_Nonnull, zip_uint64_t, zip_flags_t); +ZIP_EXTERN zip_int64_t zip_get_num_entries(zip_t *_Nonnull, zip_flags_t); +ZIP_EXTERN const char *_Nonnull zip_libzip_version(void); +ZIP_EXTERN zip_int64_t zip_name_locate(zip_t *_Nonnull, const char *_Nonnull, zip_flags_t); +ZIP_EXTERN zip_t *_Nullable zip_open(const char *_Nonnull, int, int *_Nullable); +ZIP_EXTERN zip_t *_Nullable zip_open_from_source(zip_source_t *_Nonnull, int, zip_error_t *_Nullable); +ZIP_EXTERN int zip_register_progress_callback_with_state(zip_t *_Nonnull, double, zip_progress_callback _Nullable, void (*_Nullable)(void *_Nullable), void *_Nullable); +ZIP_EXTERN int zip_register_cancel_callback_with_state(zip_t *_Nonnull, zip_cancel_callback _Nullable, void (*_Nullable)(void *_Nullable), void *_Nullable); +ZIP_EXTERN int zip_set_archive_comment(zip_t *_Nonnull, const char *_Nullable, zip_uint16_t); +ZIP_EXTERN int zip_set_archive_flag(zip_t *_Nonnull, zip_flags_t, int); +ZIP_EXTERN int zip_set_default_password(zip_t *_Nonnull, const char *_Nullable); +ZIP_EXTERN int zip_set_file_compression(zip_t *_Nonnull, zip_uint64_t, zip_int32_t, zip_uint32_t); +ZIP_EXTERN int zip_source_begin_write(zip_source_t *_Nonnull); +ZIP_EXTERN int zip_source_begin_write_cloning(zip_source_t *_Nonnull, zip_uint64_t); +ZIP_EXTERN zip_source_t *_Nullable zip_source_buffer(zip_t *_Nonnull, const void *_Nullable, zip_uint64_t, int); +ZIP_EXTERN zip_source_t *_Nullable zip_source_buffer_create(const void *_Nullable, zip_uint64_t, int, zip_error_t *_Nullable); +ZIP_EXTERN zip_source_t *_Nullable zip_source_buffer_fragment(zip_t *_Nonnull, const zip_buffer_fragment_t *_Nonnull, zip_uint64_t, int); +ZIP_EXTERN zip_source_t *_Nullable zip_source_buffer_fragment_create(const zip_buffer_fragment_t *_Nullable, zip_uint64_t, int, zip_error_t *_Nullable); +ZIP_EXTERN int zip_source_close(zip_source_t *_Nonnull); +ZIP_EXTERN int zip_source_commit_write(zip_source_t *_Nonnull); +ZIP_EXTERN zip_error_t *_Nonnull zip_source_error(zip_source_t *_Nonnull); +ZIP_EXTERN zip_source_t *_Nullable zip_source_file(zip_t *_Nonnull, const char *_Nonnull, zip_uint64_t, zip_int64_t); +ZIP_EXTERN zip_source_t *_Nullable zip_source_file_create(const char *_Nonnull, zip_uint64_t, zip_int64_t, zip_error_t *_Nullable); +ZIP_EXTERN zip_source_t *_Nullable zip_source_filep(zip_t *_Nonnull, FILE *_Nonnull, zip_uint64_t, zip_int64_t); +ZIP_EXTERN zip_source_t *_Nullable zip_source_filep_create(FILE *_Nonnull, zip_uint64_t, zip_int64_t, zip_error_t *_Nullable); +ZIP_EXTERN void zip_source_free(zip_source_t *_Nullable); +ZIP_EXTERN zip_source_t *_Nullable zip_source_function(zip_t *_Nonnull, zip_source_callback _Nonnull, void *_Nullable); +ZIP_EXTERN zip_source_t *_Nullable zip_source_function_create(zip_source_callback _Nonnull, void *_Nullable, zip_error_t *_Nullable); +ZIP_EXTERN int zip_source_get_file_attributes(zip_source_t *_Nonnull, zip_file_attributes_t *_Nonnull); +ZIP_EXTERN int zip_source_is_deleted(zip_source_t *_Nonnull); +ZIP_EXTERN void zip_source_keep(zip_source_t *_Nonnull); +ZIP_EXTERN zip_int64_t zip_source_make_command_bitmap(zip_source_cmd_t, ...); +ZIP_EXTERN int zip_source_open(zip_source_t *_Nonnull); +ZIP_EXTERN zip_int64_t zip_source_read(zip_source_t *_Nonnull, void *_Nonnull, zip_uint64_t); +ZIP_EXTERN void zip_source_rollback_write(zip_source_t *_Nonnull); +ZIP_EXTERN int zip_source_seek(zip_source_t *_Nonnull, zip_int64_t, int); +ZIP_EXTERN zip_int64_t zip_source_seek_compute_offset(zip_uint64_t, zip_uint64_t, void *_Nonnull, zip_uint64_t, zip_error_t *_Nullable); +ZIP_EXTERN int zip_source_seek_write(zip_source_t *_Nonnull, zip_int64_t, int); +ZIP_EXTERN int zip_source_stat(zip_source_t *_Nonnull, zip_stat_t *_Nonnull); +ZIP_EXTERN zip_int64_t zip_source_tell(zip_source_t *_Nonnull); +ZIP_EXTERN zip_int64_t zip_source_tell_write(zip_source_t *_Nonnull); +#ifdef _WIN32 +ZIP_EXTERN zip_source_t *zip_source_win32a(zip_t *, const char *, zip_uint64_t, zip_int64_t); +ZIP_EXTERN zip_source_t *zip_source_win32a_create(const char *, zip_uint64_t, zip_int64_t, zip_error_t *); +ZIP_EXTERN zip_source_t *zip_source_win32handle(zip_t *, void *, zip_uint64_t, zip_int64_t); +ZIP_EXTERN zip_source_t *zip_source_win32handle_create(void *, zip_uint64_t, zip_int64_t, zip_error_t *); +ZIP_EXTERN zip_source_t *zip_source_win32w(zip_t *, const wchar_t *, zip_uint64_t, zip_int64_t); +ZIP_EXTERN zip_source_t *zip_source_win32w_create(const wchar_t *, zip_uint64_t, zip_int64_t, zip_error_t *); +#endif +ZIP_EXTERN zip_int64_t zip_source_write(zip_source_t *_Nonnull, const void *_Nullable, zip_uint64_t); +ZIP_EXTERN zip_source_t *_Nullable zip_source_zip(zip_t *_Nonnull, zip_t *_Nonnull, zip_uint64_t, zip_flags_t, zip_uint64_t, zip_int64_t); +ZIP_EXTERN int zip_stat(zip_t *_Nonnull, const char *_Nonnull, zip_flags_t, zip_stat_t *_Nonnull); +ZIP_EXTERN int zip_stat_index(zip_t *_Nonnull, zip_uint64_t, zip_flags_t, zip_stat_t *_Nonnull); +ZIP_EXTERN void zip_stat_init(zip_stat_t *_Nonnull); +ZIP_EXTERN const char *_Nonnull zip_strerror(zip_t *_Nonnull); +ZIP_EXTERN int zip_unchange(zip_t *_Nonnull, zip_uint64_t); +ZIP_EXTERN int zip_unchange_all(zip_t *_Nonnull); +ZIP_EXTERN int zip_unchange_archive(zip_t *_Nonnull); +ZIP_EXTERN int zip_compression_method_supported(zip_int32_t method, int compress); +ZIP_EXTERN int zip_encryption_method_supported(zip_uint16_t method, int encode); + +#ifdef __cplusplus +} +#endif + +#endif /* _HAD_ZIP_H */ diff --git a/include/zipconf.h b/include/zipconf.h new file mode 100644 index 0000000..861595a --- /dev/null +++ b/include/zipconf.h @@ -0,0 +1,51 @@ +#ifndef _HAD_ZIPCONF_H +#define _HAD_ZIPCONF_H + +/* + zipconf.h -- platform specific include file + + This file was generated automatically by CMake + based on ../cmake-zipconf.h.in. + */ + +#define LIBZIP_VERSION "1.7.3" +#define LIBZIP_VERSION_MAJOR 1 +#define LIBZIP_VERSION_MINOR 7 +#define LIBZIP_VERSION_MICRO 3 + +/* #undef ZIP_STATIC */ + +#define _Nullable +#define _Nonnull + +#if !defined(__STDC_FORMAT_MACROS) +#define __STDC_FORMAT_MACROS 1 +#endif +#include + +typedef int8_t zip_int8_t; +typedef uint8_t zip_uint8_t; +typedef int16_t zip_int16_t; +typedef uint16_t zip_uint16_t; +typedef int32_t zip_int32_t; +typedef uint32_t zip_uint32_t; +typedef int64_t zip_int64_t; +typedef uint64_t zip_uint64_t; + +#define ZIP_INT8_MIN (-ZIP_INT8_MAX-1) +#define ZIP_INT8_MAX 0x7f +#define ZIP_UINT8_MAX 0xff + +#define ZIP_INT16_MIN (-ZIP_INT16_MAX-1) +#define ZIP_INT16_MAX 0x7fff +#define ZIP_UINT16_MAX 0xffff + +#define ZIP_INT32_MIN (-ZIP_INT32_MAX-1L) +#define ZIP_INT32_MAX 0x7fffffffL +#define ZIP_UINT32_MAX 0xffffffffLU + +#define ZIP_INT64_MIN (-ZIP_INT64_MAX-1LL) +#define ZIP_INT64_MAX 0x7fffffffffffffffLL +#define ZIP_UINT64_MAX 0xffffffffffffffffULL + +#endif /* zipconf.h */ diff --git a/omc/config/NR.conf b/omc/config/NR.conf new file mode 100644 index 0000000..0a27d88 --- /dev/null +++ b/omc/config/NR.conf @@ -0,0 +1,45 @@ +# NR.conf + +# The local mcc +MCC=262 + +# The local mnc +MNC=09 + +# The local tag +LOCAL_TADIG=FEAKE + +# The time to make NRTRDE Delivery Report and Error Report +MAKE_REPORT_TIME=23 + +# The max value of CallEventDuration of a CDR +CallEventDurationMax=6000 + +# The version of the NRTRDE Delivery report +ND_VERSION=1.0 + +# The version of the NRTRDE Error report +NE_VERSION=1.0 + +# The specificationVersionNumber of the NRTRDE file +NR_SVN=2 + +# The ReleaseVersionNumber of the NRTRDE file +NR_RVN=1 + +# The backup directory +NR_RECV_BAK_DIR=/usr/local/omc/src/accountMgr/c_program/nrtrde/NR_RECV_BAK/ +NR_SEND_BAK_DIR=/usr/local/omc/src/accountMgr/c_program/nrtrde/NR_SEND_BAK/ +ND_RECV_BAK_DIR=/usr/local/omc/src/accountMgr/c_program/nrtrde/ND_RECV_BAK/ +ND_SEND_BAK_DIR=/usr/local/omc/src/accountMgr/c_program/nrtrde/ND_SEND_BAK/ +NE_RECV_BAK_DIR=/usr/local/omc/src/accountMgr/c_program/nrtrde/NE_RECV_BAK/ +NE_SEND_BAK_DIR=/usr/local/omc/src/accountMgr/c_program/nrtrde/NE_SEND_BAK/ +LOCAL_CSV_DIR=/usr/local/omc/src/accountMgr/c_program/nrtrde/LOCAL_CSV/ + +# The source directory to send the file +SEND_DIR=/usr/local/omc/src/accountMgr/c_program/nrtrde/SEND/ + +# The directory to receive the file +RECV_DIR=/usr/local/omc/src/accountMgr/c_program/nrtrde/RECV/ + + diff --git a/omc/config/cacert.pem b/omc/config/cacert.pem new file mode 100644 index 0000000..cb26195 --- /dev/null +++ b/omc/config/cacert.pem @@ -0,0 +1,21 @@ +-----BEGIN CERTIFICATE----- +MIIDbzCCAtigAwIBAgIJAJAlyiGqsbwfMA0GCSqGSIb3DQEBBQUAMIGCMQswCQYD +VQQGEwJDTjESMBAGA1UECBMJR3Vhbmdkb25nMREwDwYDVQQHEwhTaGVuemhlbjET +MBEGA1UEChMKYWx0b2JyaWRnZTENMAsGA1UECxMEYWNyZDEMMAoGA1UEAxMDb21j +MRowGAYJKoZIhvcNAQkBFgtvbWNAYWRjLmNvbTAeFw0xMDAzMDgxNDQ5MDZaFw0x +MTAzMDgxNDQ5MDZaMIGCMQswCQYDVQQGEwJDTjESMBAGA1UECBMJR3Vhbmdkb25n +MREwDwYDVQQHEwhTaGVuemhlbjETMBEGA1UEChMKYWx0b2JyaWRnZTENMAsGA1UE +CxMEYWNyZDEMMAoGA1UEAxMDb21jMRowGAYJKoZIhvcNAQkBFgtvbWNAYWRjLmNv +bTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA6g1IlzFYAUv6obDUEN83Khc4 +uslMGhLUI53LYR1v7i+AXP6HmFLV6fZeepIVJu4vuXUFdNUcA3HNnkpr7mGgIqgV +6y6oBAEYnjd4R3ee+1qWySRrBs1m4Jk1CA1WsOCth9Uf0mIIbp+0+b2gIWln7voz +1ANW96pcyja6+d4vm7MCAwEAAaOB6jCB5zAdBgNVHQ4EFgQUyXKRouQM9uBWS2vL +tlFT1MnVy3wwgbcGA1UdIwSBrzCBrIAUyXKRouQM9uBWS2vLtlFT1MnVy3yhgYik +gYUwgYIxCzAJBgNVBAYTAkNOMRIwEAYDVQQIEwlHdWFuZ2RvbmcxETAPBgNVBAcT +CFNoZW56aGVuMRMwEQYDVQQKEwphbHRvYnJpZGdlMQ0wCwYDVQQLEwRhY3JkMQww +CgYDVQQDEwNvbWMxGjAYBgkqhkiG9w0BCQEWC29tY0BhZGMuY29tggkAkCXKIaqx +vB8wDAYDVR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOBgQAGSvHDqCW65Y9oClJA +R47ruaOAu37Sfr8Lw5GCIzK9TRtdc7qWxfppGN6QC7a55GpwLHU5hingbbGUXGCV +UKLepKF2jGcDLAWAAr4Rc3Ex36XtyfyDVKL+seeNeYgWLMNUNsrGEgEVpFrUbB5G +Syj5OZgpL6NQFgn/MxkAqQZ4kg== +-----END CERTIFICATE----- diff --git a/omc/config/chkDb.conf b/omc/config/chkDb.conf new file mode 100644 index 0000000..3d7b336 --- /dev/null +++ b/omc/config/chkDb.conf @@ -0,0 +1 @@ +dbStopMode=0 diff --git a/omc/config/client.crt b/omc/config/client.crt new file mode 100644 index 0000000..0d56981 --- /dev/null +++ b/omc/config/client.crt @@ -0,0 +1,61 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 1 (0x1) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=CN, ST=Guangdong, L=Shenzhen, O=altobridge, OU=acrd, CN=omc/emailAddress=omc@adc.com + Validity + Not Before: Mar 8 14:59:26 2010 GMT + Not After : Mar 8 14:59:26 2011 GMT + Subject: C=CN, ST=Guangdong, O=altobridge, OU=acrd, CN=ems/emailAddress=ems@adc.com + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:cb:00:82:2a:e2:a7:c7:bb:67:0d:f7:a5:2c:db: + 49:63:2c:35:c8:88:d6:9a:ac:14:be:7b:da:e7:c2: + d5:8a:5e:cb:89:9a:65:8f:e2:39:a3:28:b7:0f:17: + 9b:95:f1:96:5a:1d:01:ec:14:6c:77:e1:84:e8:c5: + 01:a6:88:e2:9d:84:13:b0:1c:cb:3e:8d:bd:34:cd: + 9d:a7:d5:60:f4:92:1c:a5:0f:e9:21:cc:75:e5:11: + 26:77:11:cb:f1:5b:86:9a:7f:ea:4a:5f:16:57:fd: + b2:97:1a:73:a2:66:76:dd:40:f0:18:3c:5b:cf:82: + 16:fc:7b:07:7f:7a:ec:ad:bd + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Comment: + OpenSSL Generated Certificate + X509v3 Subject Key Identifier: + BD:85:E6:7D:1C:1E:7C:DE:57:9A:F5:8A:E6:3F:07:B5:3A:47:F3:35 + X509v3 Authority Key Identifier: + keyid:C9:72:91:A2:E4:0C:F6:E0:56:4B:6B:CB:B6:51:53:D4:C9:D5:CB:7C + + Signature Algorithm: sha1WithRSAEncryption + 86:89:a0:02:4f:bd:2e:14:db:88:da:d6:87:f6:cb:f6:b4:82: + 41:81:c6:56:ca:3a:0b:44:78:71:ba:b0:f2:20:d6:34:53:69: + 0d:02:85:4b:e7:30:91:b6:e2:5e:67:75:37:db:25:03:c1:e3: + 45:95:db:9a:2c:0d:4d:cc:65:34:39:b3:ab:c3:b5:c0:a8:e8: + 08:12:9a:d3:a7:85:78:10:7b:0e:fb:ae:37:1c:e0:44:48:44: + af:d6:fd:91:e8:0a:50:96:d0:c1:c2:73:0a:12:04:65:20:92: + 94:dc:f8:32:66:4f:cc:a1:cf:73:d6:0a:ba:57:69:3c:1c:d8: + c5:7a +-----BEGIN CERTIFICATE----- +MIIC4zCCAkygAwIBAgIBATANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCQ04x +EjAQBgNVBAgTCUd1YW5nZG9uZzERMA8GA1UEBxMIU2hlbnpoZW4xEzARBgNVBAoT +CmFsdG9icmlkZ2UxDTALBgNVBAsTBGFjcmQxDDAKBgNVBAMTA29tYzEaMBgGCSqG +SIb3DQEJARYLb21jQGFkYy5jb20wHhcNMTAwMzA4MTQ1OTI2WhcNMTEwMzA4MTQ1 +OTI2WjBvMQswCQYDVQQGEwJDTjESMBAGA1UECBMJR3Vhbmdkb25nMRMwEQYDVQQK +EwphbHRvYnJpZGdlMQ0wCwYDVQQLEwRhY3JkMQwwCgYDVQQDEwNlbXMxGjAYBgkq +hkiG9w0BCQEWC2Vtc0BhZGMuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB +gQDLAIIq4qfHu2cN96Us20ljLDXIiNaarBS+e9rnwtWKXsuJmmWP4jmjKLcPF5uV +8ZZaHQHsFGx34YToxQGmiOKdhBOwHMs+jb00zZ2n1WD0khylD+khzHXlESZ3Ecvx +W4aaf+pKXxZX/bKXGnOiZnbdQPAYPFvPghb8ewd/euytvQIDAQABo3sweTAJBgNV +HRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBDZXJ0aWZp +Y2F0ZTAdBgNVHQ4EFgQUvYXmfRwefN5XmvWK5j8HtTpH8zUwHwYDVR0jBBgwFoAU +yXKRouQM9uBWS2vLtlFT1MnVy3wwDQYJKoZIhvcNAQEFBQADgYEAhomgAk+9LhTb +iNrWh/bL9rSCQYHGVso6C0R4cbqw8iDWNFNpDQKFS+cwkbbiXmd1N9slA8HjRZXb +miwNTcxlNDmzq8O1wKjoCBKa06eFeBB7DvuuNxzgREhEr9b9kegKUJbQwcJzChIE +ZSCSlNz4MmZPzKHPc9YKuldpPBzYxXo= +-----END CERTIFICATE----- diff --git a/omc/config/client.csr b/omc/config/client.csr new file mode 100644 index 0000000..72cb224 --- /dev/null +++ b/omc/config/client.csr @@ -0,0 +1,13 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIB7TCCAVYCAQAwgYIxCzAJBgNVBAYTAkNOMRIwEAYDVQQIEwlHdWFuZ2Rvbmcx +ETAPBgNVBAcTCFNoZW56aGVuMRMwEQYDVQQKEwphbHRvYnJpZGdlMQ0wCwYDVQQL +EwRhY3JkMQwwCgYDVQQDEwNlbXMxGjAYBgkqhkiG9w0BCQEWC2Vtc0BhZGMuY29t +MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDLAIIq4qfHu2cN96Us20ljLDXI +iNaarBS+e9rnwtWKXsuJmmWP4jmjKLcPF5uV8ZZaHQHsFGx34YToxQGmiOKdhBOw +HMs+jb00zZ2n1WD0khylD+khzHXlESZ3EcvxW4aaf+pKXxZX/bKXGnOiZnbdQPAY +PFvPghb8ewd/euytvQIDAQABoCowEQYJKoZIhvcNAQkCMQQTAmFiMBUGCSqGSIb3 +DQEJBzEIEwYxMjM0NTYwDQYJKoZIhvcNAQEFBQADgYEAxlbRm0fe6AqUdhOwwqOg +VOv9cGqxFxaix405a4fWk2B2d3SfY404ofOXtkDCuJfbfNuqwmM4ufgzc73xsQcD +S5353PYq97sPT9idzh4JmZpgKb6E0ROneIdhVMLCxGKl/9cjfdf2HRZW9ot4JW1c +k/83fO1CfniarbibAgpzI7M= +-----END CERTIFICATE REQUEST----- diff --git a/omc/config/client.key b/omc/config/client.key new file mode 100644 index 0000000..ba2e890 --- /dev/null +++ b/omc/config/client.key @@ -0,0 +1,18 @@ +-----BEGIN RSA PRIVATE KEY----- +Proc-Type: 4,ENCRYPTED +DEK-Info: DES-EDE3-CBC,91508CD91BBB28B6 + +mh66h7RXJGa/9Nj5u+QP5wlEd2E/rZDjd4f9NqhSs5PqHMc6GgtBSk8tfpsOXgBC +2LA1ONn9B7y7q42GgTaz9XpL2rABZqjY3VyG7GKt+L8UtVjVYPo/3sB1hzMdrLLK +wZrqJjiOdJRD7awbZ+w1vb0qKSs7KkU85jmrwzI0HXe4lMUNMYQbcU/m7FdsEBtr +YIT0QgafiU3Awi25v2BPsa49oJWLO9qnWrPG1m/V1x1yRXNIrrE455ULGcqruLHH +h1TLe5xlDSDUcb4oRR0GgVWGqKDD/XhY8njT0k87COwIb6Fn+mbsljT4TzDbHFoa +auTgmrikmlZhYlTnBzZ7GNZGa7byY3GAAwbgfVYXJ9CVFi1NwZgXVGuiMGCtgHqF +V90/A6kERS7/C3EsAttLlxrR2IKMfDUzz304ociDtik6OoyCLdjZermkUYddLDJs +PlLtZCmTphh6HCPvSK1li11Y+fkNe57fkKhABhVjy5SY3rmLACLttKXxVCfrpIi/ +4NAWm/366mCl3InDcl+65z6mS5sPT66p102WbSk8iUHzrmr5liGnt8GAT9CNqEoy +Vuc0M/9GckOS7Q4sk3FekJha85x7X9mt5xRlqy2x5aFvvh4aCDoACAcw4e4ckFMS +WM0wxqDJEavc7FDr1EpdtFxQZ0WZkzLcX2Y4MfsOFhrjsHSOBX2/zyxt+UMOPHtP +F+zjf67dia3chYg3E0GExHD7OjTt0BlfN8cUxN18ed4sTp1NkZ9KBxEpRVxRTPmu +hNsrr8qg6TCEncWcRU540zJuxH2g1JEmg7x6JCuqjlaxrnPuxaYL8g== +-----END RSA PRIVATE KEY----- diff --git a/omc/config/conv_prefix.conf b/omc/config/conv_prefix.conf new file mode 100644 index 0000000000000000000000000000000000000000..559e81a387b6312d956b50e3fedb676b96d64cee GIT binary patch literal 23616 zcmeI(!E&205P)H=aV~ut3k*o-zChm~ryM%dQ=3C?ee_nq;COcl(3H${+Fut(tJO;S zFq6aylDfWa!)lY1(rQ8(l-!lJo+YU>bP$l5=}^Sx?8WK}7@*KmY**5I_I{1pXC)llvXE3MM3> z{E%Hf^tk)L;GweT7aRD4etdrV_Pjp-$mP~oViW-c5I_I{1Q2*d;OEqWeVxZaG z^6dDWxAi*D``y>Ay6-jq>Ff8$X7~fo!3)ggj;>3+Nfw63?qO5 z0tg_000IagfB*srAbWRHFV*h=u zGettGb=5M*JqGEjO#h`9UuKShY-```Z1~dd#SFi(TOReC)}0^CDS-**<@qZAu;cse z<&8&R8UhF)fB*srAb +# +# Do NOT simply read the instructions in here without understanding +# what they do. They're here only as hints or reminders. If you are unsure +# consult the online docs. You have been warned. +# + +# +# Pseudo Random Number Generator (PRNG): +# Configure one or more sources to seed the PRNG of the SSL library. +# The seed data should be of good random quality. +# WARNING! On some platforms /dev/random blocks if not enough entropy +# is available. This means you then cannot use the /dev/random device +# because it would lead to very long connection times (as long as +# it requires to make more entropy available). But usually those +# platforms additionally provide a /dev/urandom device which doesn't +# block. So, if available, use this one instead. Read the mod_ssl User +# Manual for more details. +# +#SSLRandomSeed startup file:/dev/random 512 +#SSLRandomSeed startup file:/dev/urandom 512 +#SSLRandomSeed connect file:/dev/random 512 +#SSLRandomSeed connect file:/dev/urandom 512 + + +# +# When we also provide SSL we have to listen to the +# standard HTTP port (see above) and to the HTTPS port +# +# Note: Configurations that use IPv6 but not IPv4-mapped addresses need two +# Listen directives: "Listen [::]:443" and "Listen 0.0.0.0:443" +# +Listen 443 + +## +## SSL Global Context +## +## All SSL configuration in this context applies both to +## the main server and all SSL-enabled virtual hosts. +## + +# +# Some MIME-types for downloading Certificates and CRLs +# +AddType application/x-x509-ca-cert .crt +AddType application/x-pkcs7-crl .crl + +# Pass Phrase Dialog: +# Configure the pass phrase gathering process. +# The filtering dialog program (`builtin' is a internal +# terminal dialog) has to provide the pass phrase on stdout. +SSLPassPhraseDialog builtin + +# Inter-Process Session Cache: +# Configure the SSL Session Cache: First the mechanism +# to use and second the expiring timeout (in seconds). +#SSLSessionCache "dbm:/etc/httpd/logs/ssl_scache" +SSLSessionCache "shmcb:/etc/httpd/logs/ssl_scache(512000)" +SSLSessionCacheTimeout 300 + +# Semaphore: +# Configure the path to the mutual exclusion semaphore the +# SSL engine uses internally for inter-process synchronization. +SSLMutex "file:/etc/httpd/logs/ssl_mutex" + +## +## SSL Virtual Host Context +## + + + +# General setup for the virtual host +DocumentRoot "/usr/local/apache/htdocs" +ServerName www.example.com:443 +ServerAdmin you@example.com +ErrorLog "/etc/httpd/logs/error_log" +TransferLog "/etc/httpd/logs/access_log" + +# SSL Engine Switch: +# Enable/Disable SSL for this virtual host. +SSLEngine on + +# SSL Cipher Suite: +# List the ciphers that the client is permitted to negotiate. +# See the mod_ssl documentation for a complete list. +SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL + +# Server Certificate: +# Point SSLCertificateFile at a PEM encoded certificate. If +# the certificate is encrypted, then you will be prompted for a +# pass phrase. Note that a kill -HUP will prompt again. Keep +# in mind that if you have both an RSA and a DSA certificate you +# can configure both in parallel (to also allow the use of DSA +# ciphers, etc.) +SSLCertificateFile "/etc/httpd/conf/server.crt" +#SSLCertificateFile "/etc/httpd/conf/server-dsa.crt" + +# Server Private Key: +# If the key is not combined with the certificate, use this +# directive to point at the key file. Keep in mind that if +# you've both a RSA and a DSA private key you can configure +# both in parallel (to also allow the use of DSA ciphers, etc.) +SSLCertificateKeyFile "/etc/httpd/conf/server.key" +#SSLCertificateKeyFile "/etc/httpd/conf/server-dsa.key" + +# Server Certificate Chain: +# Point SSLCertificateChainFile at a file containing the +# concatenation of PEM encoded CA certificates which form the +# certificate chain for the server certificate. Alternatively +# the referenced file can be the same as SSLCertificateFile +# when the CA certificates are directly appended to the server +# certificate for convinience. +#SSLCertificateChainFile "/etc/httpd/conf/server-ca.crt" + +# Certificate Authority (CA): +# Set the CA certificate verification path where to find CA +# certificates for client authentication or alternatively one +# huge file containing all of them (file must be PEM encoded) +# Note: Inside SSLCACertificatePath you need hash symlinks +# to point to the certificate files. Use the provided +# Makefile to update the hash symlinks after changes. +#SSLCACertificatePath "/etc/httpd/conf/ssl.crt" +SSLCACertificateFile "/etc/httpd/conf/cacert.pem" + +# Certificate Revocation Lists (CRL): +# Set the CA revocation path where to find CA CRLs for client +# authentication or alternatively one huge file containing all +# of them (file must be PEM encoded) +# Note: Inside SSLCARevocationPath you need hash symlinks +# to point to the certificate files. Use the provided +# Makefile to update the hash symlinks after changes. +#SSLCARevocationPath "/etc/httpd/conf/ssl.crl" +#SSLCARevocationFile "/etc/httpd/conf/ssl.crl/ca-bundle.crl" + +# Client Authentication (Type): +# Client certificate verification type and depth. Types are +# none, optional, require and optional_no_ca. Depth is a +# number which specifies how deeply to verify the certificate +# issuer chain before deciding the certificate is not valid. +SSLVerifyClient require +SSLVerifyDepth 1 + +# Access Control: +# With SSLRequire you can do per-directory access control based +# on arbitrary complex boolean expressions containing server +# variable checks and other lookup directives. The syntax is a +# mixture between C and Perl. See the mod_ssl documentation +# for more details. +# +#SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \ +# and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \ +# and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \ +# and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \ +# and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \ +# or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/ +# + +# SSL Engine Options: +# Set various options for the SSL engine. +# o FakeBasicAuth: +# Translate the client X.509 into a Basic Authorisation. This means that +# the standard Auth/DBMAuth methods can be used for access control. The +# user name is the `one line' version of the client's X.509 certificate. +# Note that no password is obtained from the user. Every entry in the user +# file needs this password: `xxj31ZMTZzkVA'. +# o ExportCertData: +# This exports two additional environment variables: SSL_CLIENT_CERT and +# SSL_SERVER_CERT. These contain the PEM-encoded certificates of the +# server (always existing) and the client (only existing when client +# authentication is used). This can be used to import the certificates +# into CGI scripts. +# o StdEnvVars: +# This exports the standard SSL/TLS related `SSL_*' environment variables. +# Per default this exportation is switched off for performance reasons, +# because the extraction step is an expensive operation and is usually +# useless for serving static content. So one usually enables the +# exportation for CGI and SSI requests only. +# o StrictRequire: +# This denies access when "SSLRequireSSL" or "SSLRequire" applied even +# under a "Satisfy any" situation, i.e. when it applies access is denied +# and no other module can change it. +# o OptRenegotiate: +# This enables optimized SSL connection renegotiation handling when SSL +# directives are used in per-directory context. +#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire + + SSLOptions +StdEnvVars + + + SSLOptions +StdEnvVars + + +# SSL Protocol Adjustments: +# The safe and default but still SSL/TLS standard compliant shutdown +# approach is that mod_ssl sends the close notify alert but doesn't wait for +# the close notify alert from client. When you need a different shutdown +# approach you can use one of the following variables: +# o ssl-unclean-shutdown: +# This forces an unclean shutdown when the connection is closed, i.e. no +# SSL close notify alert is send or allowed to received. This violates +# the SSL/TLS standard but is needed for some brain-dead browsers. Use +# this when you receive I/O errors because of the standard approach where +# mod_ssl sends the close notify alert. +# o ssl-accurate-shutdown: +# This forces an accurate shutdown when the connection is closed, i.e. a +# SSL close notify alert is send and mod_ssl waits for the close notify +# alert of the client. This is 100% SSL/TLS standard compliant, but in +# practice often causes hanging connections with brain-dead browsers. Use +# this only for browsers where you know that their SSL implementation +# works correctly. +# Notice: Most problems of broken clients are also related to the HTTP +# keep-alive facility, so you usually additionally want to disable +# keep-alive for those clients, too. Use variable "nokeepalive" for this. +# Similarly, one has to force some clients to use HTTP/1.0 to workaround +# their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and +# "force-response-1.0" for this. +BrowserMatch ".*MSIE.*" \ + nokeepalive ssl-unclean-shutdown \ + downgrade-1.0 force-response-1.0 + +# Per-Server Logging: +# The home of a custom SSL log file. Use this when you want a +# compact non-error SSL logfile on a virtual host basis. +CustomLog "|/usr/sbin/rotatelogs /etc/httpd/logs/ssl_request_log 10M" \ + "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b" + + +SSLProtocol TLSv1 diff --git a/omc/config/httpd.conf b/omc/config/httpd.conf new file mode 100644 index 0000000..e69de29 diff --git a/omc/config/httpd.conf_centos b/omc/config/httpd.conf_centos new file mode 100644 index 0000000..55ab729 --- /dev/null +++ b/omc/config/httpd.conf_centos @@ -0,0 +1,992 @@ +# +# This is the main Apache server configuration file. It contains the +# configuration directives that give the server its instructions. +# See for detailed information. +# In particular, see +# +# for a discussion of each configuration directive. +# +# +# Do NOT simply read the instructions in here without understanding +# what they do. They're here only as hints or reminders. If you are unsure +# consult the online docs. You have been warned. +# +# The configuration directives are grouped into three basic sections: +# 1. Directives that control the operation of the Apache server process as a +# whole (the 'global environment'). +# 2. Directives that define the parameters of the 'main' or 'default' server, +# which responds to requests that aren't handled by a virtual host. +# These directives also provide default values for the settings +# of all virtual hosts. +# 3. Settings for virtual hosts, which allow Web requests to be sent to +# different IP addresses or hostnames and have them handled by the +# same Apache server process. +# +# Configuration and logfile names: If the filenames you specify for many +# of the server's control files begin with "/" (or "drive:/" for Win32), the +# server will use that explicit path. If the filenames do *not* begin +# with "/", the value of ServerRoot is prepended -- so "logs/foo.log" +# with ServerRoot set to "/etc/httpd" will be interpreted by the +# server as "/etc/httpd/logs/foo.log". +# + +### Section 1: Global Environment +# +# The directives in this section affect the overall operation of Apache, +# such as the number of concurrent requests it can handle or where it +# can find its configuration files. +# + +# +# Don't give away too much information about all the subcomponents +# we are running. Comment out this line if you don't mind remote sites +# finding out what major optional modules you are running +ServerTokens OS + +# +# ServerRoot: The top of the directory tree under which the server's +# configuration, error, and log files are kept. +# +# NOTE! If you intend to place this on an NFS (or otherwise network) +# mounted filesystem then please read the LockFile documentation +# (available at ); +# you will save yourself a lot of trouble. +# +# Do NOT add a slash at the end of the directory path. +# +ServerRoot "/etc/httpd" + +# +# PidFile: The file in which the server should record its process +# identification number when it starts. +# +PidFile run/httpd.pid + +# +# Timeout: The number of seconds before receives and sends time out. +# +Timeout 300 + +# +# KeepAlive: Whether or not to allow persistent connections (more than +# one request per connection). Set to "Off" to deactivate. +# +KeepAlive On + +# +# MaxKeepAliveRequests: The maximum number of requests to allow +# during a persistent connection. Set to 0 to allow an unlimited amount. +# We recommend you leave this number high, for maximum performance. +# +MaxKeepAliveRequests 100 + +# +# KeepAliveTimeout: Number of seconds to wait for the next request from the +# same client on the same connection. +# +KeepAliveTimeout 15 + +## +## Server-Pool Size Regulation (MPM specific) +## + +# prefork MPM +# StartServers: number of server processes to start +# MinSpareServers: minimum number of server processes which are kept spare +# MaxSpareServers: maximum number of server processes which are kept spare +# ServerLimit: maximum value for MaxClients for the lifetime of the server +# MaxClients: maximum number of server processes allowed to start +# MaxRequestsPerChild: maximum number of requests a server process serves + +StartServers 8 +MinSpareServers 5 +MaxSpareServers 20 +ServerLimit 256 +MaxClients 256 +MaxRequestsPerChild 4000 + + +# worker MPM +# StartServers: initial number of server processes to start +# MaxClients: maximum number of simultaneous client connections +# MinSpareThreads: minimum number of worker threads which are kept spare +# MaxSpareThreads: maximum number of worker threads which are kept spare +# ThreadsPerChild: constant number of worker threads in each server process +# MaxRequestsPerChild: maximum number of requests a server process serves + +StartServers 2 +MaxClients 150 +MinSpareThreads 25 +MaxSpareThreads 75 +ThreadsPerChild 25 +MaxRequestsPerChild 0 + + +# +# Listen: Allows you to bind Apache to specific IP addresses and/or +# ports, in addition to the default. See also the +# directive. +# +# Change this to Listen on specific IP addresses as shown below to +# prevent Apache from glomming onto all bound IP addresses (0.0.0.0) +# +#Listen 12.34.56.78:80 +Listen 80 + +# +# Dynamic Shared Object (DSO) Support +# +# To be able to use the functionality of a module which was built as a DSO you +# have to place corresponding `LoadModule' lines at this location so the +# directives contained in it are actually available _before_ they are used. +# Statically compiled modules (those listed by `httpd -l') do not need +# to be loaded here. +# +# Example: +# LoadModule foo_module modules/mod_foo.so +# +LoadModule auth_basic_module modules/mod_auth_basic.so +LoadModule auth_digest_module modules/mod_auth_digest.so +LoadModule authn_file_module modules/mod_authn_file.so +LoadModule authn_alias_module modules/mod_authn_alias.so +LoadModule authn_anon_module modules/mod_authn_anon.so +LoadModule authn_dbm_module modules/mod_authn_dbm.so +LoadModule authn_default_module modules/mod_authn_default.so +LoadModule authz_host_module modules/mod_authz_host.so +LoadModule authz_user_module modules/mod_authz_user.so +LoadModule authz_owner_module modules/mod_authz_owner.so +LoadModule authz_groupfile_module modules/mod_authz_groupfile.so +LoadModule authz_dbm_module modules/mod_authz_dbm.so +LoadModule authz_default_module modules/mod_authz_default.so +LoadModule ldap_module modules/mod_ldap.so +LoadModule authnz_ldap_module modules/mod_authnz_ldap.so +LoadModule include_module modules/mod_include.so +LoadModule log_config_module modules/mod_log_config.so +LoadModule logio_module modules/mod_logio.so +LoadModule env_module modules/mod_env.so +LoadModule ext_filter_module modules/mod_ext_filter.so +LoadModule mime_magic_module modules/mod_mime_magic.so +LoadModule expires_module modules/mod_expires.so +LoadModule deflate_module modules/mod_deflate.so +LoadModule headers_module modules/mod_headers.so +LoadModule usertrack_module modules/mod_usertrack.so +LoadModule setenvif_module modules/mod_setenvif.so +LoadModule mime_module modules/mod_mime.so +LoadModule dav_module modules/mod_dav.so +LoadModule status_module modules/mod_status.so +LoadModule autoindex_module modules/mod_autoindex.so +LoadModule info_module modules/mod_info.so +LoadModule dav_fs_module modules/mod_dav_fs.so +LoadModule vhost_alias_module modules/mod_vhost_alias.so +LoadModule negotiation_module modules/mod_negotiation.so +LoadModule dir_module modules/mod_dir.so +LoadModule actions_module modules/mod_actions.so +LoadModule speling_module modules/mod_speling.so +LoadModule userdir_module modules/mod_userdir.so +LoadModule alias_module modules/mod_alias.so +LoadModule rewrite_module modules/mod_rewrite.so +LoadModule proxy_module modules/mod_proxy.so +LoadModule proxy_balancer_module modules/mod_proxy_balancer.so +LoadModule proxy_ftp_module modules/mod_proxy_ftp.so +LoadModule proxy_http_module modules/mod_proxy_http.so +LoadModule proxy_connect_module modules/mod_proxy_connect.so +LoadModule cache_module modules/mod_cache.so +LoadModule suexec_module modules/mod_suexec.so +LoadModule disk_cache_module modules/mod_disk_cache.so +LoadModule file_cache_module modules/mod_file_cache.so +LoadModule mem_cache_module modules/mod_mem_cache.so +LoadModule cgi_module modules/mod_cgi.so +LoadModule version_module modules/mod_version.so + +# +# The following modules are not loaded by default: +# +#LoadModule cern_meta_module modules/mod_cern_meta.so +#LoadModule asis_module modules/mod_asis.so + +# +# Load config files from the config directory "/etc/httpd/conf.d". +# +Include conf.d/*.conf + +# +# ExtendedStatus controls whether Apache will generate "full" status +# information (ExtendedStatus On) or just basic information (ExtendedStatus +# Off) when the "server-status" handler is called. The default is Off. +# +#ExtendedStatus On + +# +# If you wish httpd to run as a different user or group, you must run +# httpd as root initially and it will switch. +# +# User/Group: The name (or #number) of the user/group to run httpd as. +# . On SCO (ODT 3) use "User nouser" and "Group nogroup". +# . On HPUX you may not be able to use shared memory as nobody, and the +# suggested workaround is to create a user www and use that user. +# NOTE that some kernels refuse to setgid(Group) or semctl(IPC_SET) +# when the value of (unsigned)Group is above 60000; +# don't use Group #-1 on these systems! +# +User www +Group omc + +### Section 2: 'Main' server configuration +# +# The directives in this section set up the values used by the 'main' +# server, which responds to any requests that aren't handled by a +# definition. These values also provide defaults for +# any containers you may define later in the file. +# +# All of these directives may appear inside containers, +# in which case these default settings will be overridden for the +# virtual host being defined. +# + +# +# ServerAdmin: Your address, where problems with the server should be +# e-mailed. This address appears on some server-generated pages, such +# as error documents. e.g. admin@your-domain.com +# +ServerAdmin root@localhost + +# +# ServerName gives the name and port that the server uses to identify itself. +# This can often be determined automatically, but we recommend you specify +# it explicitly to prevent problems during startup. +# +# If this is not set to valid DNS name for your host, server-generated +# redirections will not work. See also the UseCanonicalName directive. +# +# If your host doesn't have a registered DNS name, enter its IP address here. +# You will have to access it by its address anyway, and this will make +# redirections work in a sensible way. +# +#ServerName www.example.com:80 + +# +# UseCanonicalName: Determines how Apache constructs self-referencing +# URLs and the SERVER_NAME and SERVER_PORT variables. +# When set "Off", Apache will use the Hostname and Port supplied +# by the client. When set "On", Apache will use the value of the +# ServerName directive. +# +UseCanonicalName Off + +# +# DocumentRoot: The directory out of which you will serve your +# documents. By default, all requests are taken from this directory, but +# symbolic links and aliases may be used to point to other locations. +# +#DocumentRoot "/var/www/html" +DocumentRoot "/usr/local/apache/htdocs" + +# +# Each directory to which Apache has access can be configured with respect +# to which services and features are allowed and/or disabled in that +# directory (and its subdirectories). +# +# First, we configure the "default" to be a very restrictive set of +# features. +# + + Options FollowSymLinks + AllowOverride None + + +# +# Note that from this point forward you must specifically allow +# particular features to be enabled - so if something's not working as +# you might expect, make sure that you have specifically enabled it +# below. +# + +# +# This should be changed to whatever you set DocumentRoot to. +# + + +# +# Possible values for the Options directive are "None", "All", +# or any combination of: +# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews +# +# Note that "MultiViews" must be named *explicitly* --- "Options All" +# doesn't give it to you. +# +# The Options directive is both complicated and important. Please see +# http://httpd.apache.org/docs/2.2/mod/core.html#options +# for more information. +# + Options Indexes FollowSymLinks MultiViews + +# +# AllowOverride controls what directives may be placed in .htaccess files. +# It can be "All", "None", or any combination of the keywords: +# Options FileInfo AuthConfig Limit +# + AllowOverride None + +# +# Controls who can get stuff from this server. +# + Order allow,deny + Allow from all + + + +# +# UserDir: The name of the directory that is appended onto a user's home +# directory if a ~user request is received. +# +# The path to the end user account 'public_html' directory must be +# accessible to the webserver userid. This usually means that ~userid +# must have permissions of 711, ~userid/public_html must have permissions +# of 755, and documents contained therein must be world-readable. +# Otherwise, the client will only receive a "403 Forbidden" message. +# +# See also: http://httpd.apache.org/docs/misc/FAQ.html#forbidden +# + + # + # UserDir is disabled by default since it can confirm the presence + # of a username on the system (depending on home directory + # permissions). + # + UserDir disable + + # + # To enable requests to /~user/ to serve the user's public_html + # directory, remove the "UserDir disable" line above, and uncomment + # the following line instead: + # + #UserDir public_html + + + +# +# Control access to UserDir directories. The following is an example +# for a site where these directories are restricted to read-only. +# +# +# AllowOverride FileInfo AuthConfig Limit +# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec +# +# Order allow,deny +# Allow from all +# +# +# Order deny,allow +# Deny from all +# +# + +# +# DirectoryIndex: sets the file that Apache will serve if a directory +# is requested. +# +# The index.html.var file (a type-map) is used to deliver content- +# negotiated documents. The MultiViews Option can be used for the +# same purpose, but it is much slower. +# +DirectoryIndex index.html index.html.var index.php + +# +# AccessFileName: The name of the file to look for in each directory +# for additional configuration directives. See also the AllowOverride +# directive. +# +AccessFileName .htaccess + +# +# The following lines prevent .htaccess and .htpasswd files from being +# viewed by Web clients. +# + + Order allow,deny + Deny from all + + +# +# TypesConfig describes where the mime.types file (or equivalent) is +# to be found. +# +TypesConfig /etc/mime.types + +# +# DefaultType is the default MIME type the server will use for a document +# if it cannot otherwise determine one, such as from filename extensions. +# If your server contains mostly text or HTML documents, "text/plain" is +# a good value. If most of your content is binary, such as applications +# or images, you may want to use "application/octet-stream" instead to +# keep browsers from trying to display binary files as though they are +# text. +# +DefaultType text/plain + +# +# The mod_mime_magic module allows the server to use various hints from the +# contents of the file itself to determine its type. The MIMEMagicFile +# directive tells the module where the hint definitions are located. +# + +# MIMEMagicFile /usr/share/magic.mime + MIMEMagicFile conf/magic + + +# +# HostnameLookups: Log the names of clients or just their IP addresses +# e.g., www.apache.org (on) or 204.62.129.132 (off). +# The default is off because it'd be overall better for the net if people +# had to knowingly turn this feature on, since enabling it means that +# each client request will result in AT LEAST one lookup request to the +# nameserver. +# +HostnameLookups Off + +# +# EnableMMAP: Control whether memory-mapping is used to deliver +# files (assuming that the underlying OS supports it). +# The default is on; turn this off if you serve from NFS-mounted +# filesystems. On some systems, turning it off (regardless of +# filesystem) can improve performance; for details, please see +# http://httpd.apache.org/docs/2.2/mod/core.html#enablemmap +# +#EnableMMAP off + +# +# EnableSendfile: Control whether the sendfile kernel support is +# used to deliver files (assuming that the OS supports it). +# The default is on; turn this off if you serve from NFS-mounted +# filesystems. Please see +# http://httpd.apache.org/docs/2.2/mod/core.html#enablesendfile +# +#EnableSendfile off + +# +# ErrorLog: The location of the error log file. +# If you do not specify an ErrorLog directive within a +# container, error messages relating to that virtual host will be +# logged here. If you *do* define an error logfile for a +# container, that host's errors will be logged there and not here. +# +ErrorLog logs/error_log + +# +# LogLevel: Control the number of messages logged to the error_log. +# Possible values include: debug, info, notice, warn, error, crit, +# alert, emerg. +# +LogLevel warn + +# +# The following directives define some format nicknames for use with +# a CustomLog directive (see below). +# +LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined +LogFormat "%h %l %u %t \"%r\" %>s %b" common +LogFormat "%{Referer}i -> %U" referer +LogFormat "%{User-agent}i" agent + +# "combinedio" includes actual counts of actual bytes received (%I) and sent (%O); this +# requires the mod_logio module to be loaded. +#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio + +# +# The location and format of the access logfile (Common Logfile Format). +# If you do not define any access logfiles within a +# container, they will be logged here. Contrariwise, if you *do* +# define per- access logfiles, transactions will be +# logged therein and *not* in this file. +# +#CustomLog logs/access_log common + +# +# If you would like to have separate agent and referer logfiles, uncomment +# the following directives. +# +#CustomLog logs/referer_log referer +#CustomLog logs/agent_log agent + +# +# For a single logfile with access, agent, and referer information +# (Combined Logfile Format), use the following directive: +# +CustomLog logs/access_log combined + +# +# Optionally add a line containing the server version and virtual host +# name to server-generated pages (internal error documents, FTP directory +# listings, mod_status and mod_info output etc., but not CGI generated +# documents or custom error documents). +# Set to "EMail" to also include a mailto: link to the ServerAdmin. +# Set to one of: On | Off | EMail +# +ServerSignature On + +# +# Aliases: Add here as many aliases as you need (with no limit). The format is +# Alias fakename realname +# +# Note that if you include a trailing / on fakename then the server will +# require it to be present in the URL. So "/icons" isn't aliased in this +# example, only "/icons/". If the fakename is slash-terminated, then the +# realname must also be slash terminated, and if the fakename omits the +# trailing slash, the realname must also omit it. +# +# We include the /icons/ alias for FancyIndexed directory listings. If you +# do not use FancyIndexing, you may comment this out. +# +Alias /icons/ "/var/www/icons/" + + + Options Indexes MultiViews + AllowOverride None + Order allow,deny + Allow from all + + +# +# WebDAV module configuration section. +# + + # Location of the WebDAV lock database. + DAVLockDB /var/lib/dav/lockdb + + +# +# ScriptAlias: This controls which directories contain server scripts. +# ScriptAliases are essentially the same as Aliases, except that +# documents in the realname directory are treated as applications and +# run by the server when requested rather than as documents sent to the client. +# The same rules about trailing "/" apply to ScriptAlias directives as to +# Alias. +# +ScriptAlias /cgi-bin/ "/var/www/cgi-bin/" + +# +# "/var/www/cgi-bin" should be changed to whatever your ScriptAliased +# CGI directory exists, if you have that configured. +# + + AllowOverride None + Options None + Order allow,deny + Allow from all + + +# +# Redirect allows you to tell clients about documents which used to exist in +# your server's namespace, but do not anymore. This allows you to tell the +# clients where to look for the relocated document. +# Example: +# Redirect permanent /foo http://www.example.com/bar + +# +# Directives controlling the display of server-generated directory listings. +# + +# +# IndexOptions: Controls the appearance of server-generated directory +# listings. +# +IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable + +# +# AddIcon* directives tell the server which icon to show for different +# files or filename extensions. These are only displayed for +# FancyIndexed directories. +# +AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip + +AddIconByType (TXT,/icons/text.gif) text/* +AddIconByType (IMG,/icons/image2.gif) image/* +AddIconByType (SND,/icons/sound2.gif) audio/* +AddIconByType (VID,/icons/movie.gif) video/* + +AddIcon /icons/binary.gif .bin .exe +AddIcon /icons/binhex.gif .hqx +AddIcon /icons/tar.gif .tar +AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv +AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip +AddIcon /icons/a.gif .ps .ai .eps +AddIcon /icons/layout.gif .html .shtml .htm .pdf +AddIcon /icons/text.gif .txt +AddIcon /icons/c.gif .c +AddIcon /icons/p.gif .pl .py +AddIcon /icons/f.gif .for +AddIcon /icons/dvi.gif .dvi +AddIcon /icons/uuencoded.gif .uu +AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl +AddIcon /icons/tex.gif .tex +AddIcon /icons/bomb.gif core + +AddIcon /icons/back.gif .. +AddIcon /icons/hand.right.gif README +AddIcon /icons/folder.gif ^^DIRECTORY^^ +AddIcon /icons/blank.gif ^^BLANKICON^^ + +# +# DefaultIcon is which icon to show for files which do not have an icon +# explicitly set. +# +DefaultIcon /icons/unknown.gif + +# +# AddDescription allows you to place a short description after a file in +# server-generated indexes. These are only displayed for FancyIndexed +# directories. +# Format: AddDescription "description" filename +# +#AddDescription "GZIP compressed document" .gz +#AddDescription "tar archive" .tar +#AddDescription "GZIP compressed tar archive" .tgz + +# +# ReadmeName is the name of the README file the server will look for by +# default, and append to directory listings. +# +# HeaderName is the name of a file which should be prepended to +# directory indexes. +ReadmeName README.html +HeaderName HEADER.html + +# +# IndexIgnore is a set of filenames which directory indexing should ignore +# and not include in the listing. Shell-style wildcarding is permitted. +# +IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t + +# +# DefaultLanguage and AddLanguage allows you to specify the language of +# a document. You can then use content negotiation to give a browser a +# file in a language the user can understand. +# +# Specify a default language. This means that all data +# going out without a specific language tag (see below) will +# be marked with this one. You probably do NOT want to set +# this unless you are sure it is correct for all cases. +# +# * It is generally better to not mark a page as +# * being a certain language than marking it with the wrong +# * language! +# +# DefaultLanguage nl +# +# Note 1: The suffix does not have to be the same as the language +# keyword --- those with documents in Polish (whose net-standard +# language code is pl) may wish to use "AddLanguage pl .po" to +# avoid the ambiguity with the common suffix for perl scripts. +# +# Note 2: The example entries below illustrate that in some cases +# the two character 'Language' abbreviation is not identical to +# the two character 'Country' code for its country, +# E.g. 'Danmark/dk' versus 'Danish/da'. +# +# Note 3: In the case of 'ltz' we violate the RFC by using a three char +# specifier. There is 'work in progress' to fix this and get +# the reference data for rfc1766 cleaned up. +# +# Catalan (ca) - Croatian (hr) - Czech (cs) - Danish (da) - Dutch (nl) +# English (en) - Esperanto (eo) - Estonian (et) - French (fr) - German (de) +# Greek-Modern (el) - Hebrew (he) - Italian (it) - Japanese (ja) +# Korean (ko) - Luxembourgeois* (ltz) - Norwegian Nynorsk (nn) +# Norwegian (no) - Polish (pl) - Portugese (pt) +# Brazilian Portuguese (pt-BR) - Russian (ru) - Swedish (sv) +# Simplified Chinese (zh-CN) - Spanish (es) - Traditional Chinese (zh-TW) +# +AddLanguage ca .ca +AddLanguage cs .cz .cs +AddLanguage da .dk +AddLanguage de .de +AddLanguage el .el +AddLanguage en .en +AddLanguage eo .eo +AddLanguage es .es +AddLanguage et .et +AddLanguage fr .fr +AddLanguage he .he +AddLanguage hr .hr +AddLanguage it .it +AddLanguage ja .ja +AddLanguage ko .ko +AddLanguage ltz .ltz +AddLanguage nl .nl +AddLanguage nn .nn +AddLanguage no .no +AddLanguage pl .po +AddLanguage pt .pt +AddLanguage pt-BR .pt-br +AddLanguage ru .ru +AddLanguage sv .sv +AddLanguage zh-CN .zh-cn +AddLanguage zh-TW .zh-tw + +# +# LanguagePriority allows you to give precedence to some languages +# in case of a tie during content negotiation. +# +# Just list the languages in decreasing order of preference. We have +# more or less alphabetized them here. You probably want to change this. +# +LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW + +# +# ForceLanguagePriority allows you to serve a result page rather than +# MULTIPLE CHOICES (Prefer) [in case of a tie] or NOT ACCEPTABLE (Fallback) +# [in case no accepted languages matched the available variants] +# +ForceLanguagePriority Prefer Fallback + +# +# Specify a default charset for all content served; this enables +# interpretation of all content as UTF-8 by default. To use the +# default browser choice (ISO-8859-1), or to allow the META tags +# in HTML content to override this choice, comment out this +# directive: +# +#AddDefaultCharset UTF-8 + +# +# AddType allows you to add to or override the MIME configuration +# file mime.types for specific file types. +# +#AddType application/x-tar .tgz + +# +# AddEncoding allows you to have certain browsers uncompress +# information on the fly. Note: Not all browsers support this. +# Despite the name similarity, the following Add* directives have nothing +# to do with the FancyIndexing customization directives above. +# +#AddEncoding x-compress .Z +#AddEncoding x-gzip .gz .tgz + +# If the AddEncoding directives above are commented-out, then you +# probably should define those extensions to indicate media types: +# +AddType application/x-compress .Z +AddType application/x-gzip .gz .tgz + +# +# AddHandler allows you to map certain file extensions to "handlers": +# actions unrelated to filetype. These can be either built into the server +# or added with the Action directive (see below) +# +# To use CGI scripts outside of ScriptAliased directories: +# (You will also need to add "ExecCGI" to the "Options" directive.) +# +#AddHandler cgi-script .cgi + +# +# For files that include their own HTTP headers: +# +#AddHandler send-as-is asis + +# +# For type maps (negotiated resources): +# (This is enabled by default to allow the Apache "It Worked" page +# to be distributed in multiple languages.) +# +AddHandler type-map var + +# +# Filters allow you to process content before it is sent to the client. +# +# To parse .shtml files for server-side includes (SSI): +# (You will also need to add "Includes" to the "Options" directive.) +# +AddType text/html .shtml +AddOutputFilter INCLUDES .shtml + +# +# Action lets you define media types that will execute a script whenever +# a matching file is called. This eliminates the need for repeated URL +# pathnames for oft-used CGI file processors. +# Format: Action media/type /cgi-script/location +# Format: Action handler-name /cgi-script/location +# + +# +# Customizable error responses come in three flavors: +# 1) plain text 2) local redirects 3) external redirects +# +# Some examples: +#ErrorDocument 500 "The server made a boo boo." +#ErrorDocument 404 /missing.html +#ErrorDocument 404 "/cgi-bin/missing_handler.pl" +#ErrorDocument 402 http://www.example.com/subscription_info.html +# + +# +# Putting this all together, we can internationalize error responses. +# +# We use Alias to redirect any /error/HTTP_.html.var response to +# our collection of by-error message multi-language collections. We use +# includes to substitute the appropriate text. +# +# You can modify the messages' appearance without changing any of the +# default HTTP_.html.var files by adding the line: +# +# Alias /error/include/ "/your/include/path/" +# +# which allows you to create your own set of files by starting with the +# /var/www/error/include/ files and +# copying them to /your/include/path/, even on a per-VirtualHost basis. +# + +Alias /error/ "/var/www/error/" + + + + + AllowOverride None + Options IncludesNoExec + AddOutputFilter Includes html + AddHandler type-map var + Order allow,deny + Allow from all + LanguagePriority en es de fr + ForceLanguagePriority Prefer Fallback + + +# ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var +# ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var +# ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var +# ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var +# ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var +# ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var +# ErrorDocument 410 /error/HTTP_GONE.html.var +# ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var +# ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var +# ErrorDocument 413 /error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var +# ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var +# ErrorDocument 415 /error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var +# ErrorDocument 500 /error/HTTP_INTERNAL_SERVER_ERROR.html.var +# ErrorDocument 501 /error/HTTP_NOT_IMPLEMENTED.html.var +# ErrorDocument 502 /error/HTTP_BAD_GATEWAY.html.var +# ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var +# ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var + + + + +# +# The following directives modify normal HTTP response behavior to +# handle known problems with browser implementations. +# +BrowserMatch "Mozilla/2" nokeepalive +BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0 +BrowserMatch "RealPlayer 4\.0" force-response-1.0 +BrowserMatch "Java/1\.0" force-response-1.0 +BrowserMatch "JDK/1\.0" force-response-1.0 + +# +# The following directive disables redirects on non-GET requests for +# a directory that does not include the trailing slash. This fixes a +# problem with Microsoft WebFolders which does not appropriately handle +# redirects for folders with DAV methods. +# Same deal with Apple's DAV filesystem and Gnome VFS support for DAV. +# +BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully +BrowserMatch "MS FrontPage" redirect-carefully +BrowserMatch "^WebDrive" redirect-carefully +BrowserMatch "^WebDAVFS/1.[0123]" redirect-carefully +BrowserMatch "^gnome-vfs/1.0" redirect-carefully +BrowserMatch "^XML Spy" redirect-carefully +BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully + +# +# Allow server status reports generated by mod_status, +# with the URL of http://servername/server-status +# Change the ".example.com" to match your domain to enable. +# +# +# SetHandler server-status +# Order deny,allow +# Deny from all +# Allow from .example.com +# + +# +# Allow remote server configuration reports, with the URL of +# http://servername/server-info (requires that mod_info.c be loaded). +# Change the ".example.com" to match your domain to enable. +# +# +# SetHandler server-info +# Order deny,allow +# Deny from all +# Allow from .example.com +# + +# +# Proxy Server directives. Uncomment the following lines to +# enable the proxy server: +# +# +#ProxyRequests On +# +# +# Order deny,allow +# Deny from all +# Allow from .example.com +# + +# +# Enable/disable the handling of HTTP/1.1 "Via:" headers. +# ("Full" adds the server version; "Block" removes all outgoing Via: headers) +# Set to one of: Off | On | Full | Block +# +#ProxyVia On + +# +# To enable a cache of proxied content, uncomment the following lines. +# See http://httpd.apache.org/docs/2.2/mod/mod_cache.html for more details. +# +# +# CacheEnable disk / +# CacheRoot "/var/cache/mod_proxy" +# +# + +# +# End of proxy directives. + +### Section 3: Virtual Hosts +# +# VirtualHost: If you want to maintain multiple domains/hostnames on your +# machine you can setup VirtualHost containers for them. Most configurations +# use only name-based virtual hosts so the server doesn't need to worry about +# IP addresses. This is indicated by the asterisks in the directives below. +# +# Please see the documentation at +# +# for further details before you try to setup virtual hosts. +# +# You may use the command line option '-S' to verify your virtual host +# configuration. + +# +# Use name-based virtual hosting. +# +#NameVirtualHost *:80 +# +# NOTE: NameVirtualHost cannot be used without a port specifier +# (e.g. :80) if mod_ssl is being used, due to the nature of the +# SSL protocol. +# + +# +# VirtualHost example: +# Almost any Apache directive may go into a VirtualHost container. +# The first VirtualHost section is used for requests without a known +# server name. +# +# +# ServerAdmin webmaster@dummy-host.example.com +# DocumentRoot /www/docs/dummy-host.example.com +# ServerName dummy-host.example.com +# ErrorLog logs/dummy-host.example.com-error_log +# CustomLog logs/dummy-host.example.com-access_log common +# diff --git a/omc/config/my.cnf b/omc/config/my.cnf new file mode 100644 index 0000000..579e3bf --- /dev/null +++ b/omc/config/my.cnf @@ -0,0 +1,90 @@ +# Example mysql config file for medium systems. +# +# This is for a system with little memory (32M - 64M) where MySQL plays +# a important part and systems up to 128M very MySQL is used together with +# other programs (like a web server) +# +# You can copy this file to +# /etc/mf.cnf to set global options, +# mysql-data-dir/my.cnf to set server-specific options (in this +# installation this directory is /usr/local/mysql/var) or +# ~/.my.cnf to set user-specific options. +# +# One can in this file use all long options that the program supports. +# If you want to know which options a program support, run the program +# with --help option. + +# The following options will be passed to all MySQL clients +[client] +#password = your_password +port = 3306 +#socket = /var/lib/mysql/mysql.sock +socket = /tmp/mysql.sock +# Here follows entries for some specific programs + +# The MySQL server +[mysqld] +port = 3306 +#socket = /var/lib/mysql/mysql.sock +socket = /tmp/mysql.sock +datadir = /usr/local/mysql +pid-file = /var/lib/mysql/mysqld.pid +log-error = /var/lib/mysql/mysqld.err +skip-locking +set-variable = key_buffer=16M +set-variable = max_allowed_packet=16M +set-variable = table_cache=64 +set-variable = sort_buffer=512K +set-variable = net_buffer_length=8K +set-variable = myisam_sort_buffer_size=8M +set-variable = max_connections=256 +set-variable = wait_timeout=1800 +set-variable = interactive_timeout=1800 + +#set-variable = max_binlog_size=32M +#master=====================> + +server-id = 0 + +#slave====================> +master-host = omc-1 +master-user = administrator +master-password = "*86#ROtartsinim" +master-port = 3306 + +#master-connect-retry = 30 +#slave-read-timeout = 10 + +#replicate-do-table =*.* + + +# Uncomment the following if you are using BDB tables +#set-variable = bdb_cache_size=4M +#set-variable = bdb_max_lock=10000 + +# Point the following paths to different dedicated disks +#tmpdir = /tmp/ +#log-update = /path-to-dedicated-directory/hostname + +[mysqldump] +quick +set-variable = max_allowed_packet=16M + +[mysql] +no-auto-rehash +#safe-updates # Remove the comment character if you are not familiar with SQL + +[isamchk] +set-variable = key_buffer=20M +set-variable = sort_buffer=20M +set-variable = read_buffer=2M +set-variable = write_buffer=2M + +[myisamchk] +set-variable = key_buffer=20M +set-variable = sort_buffer=20M +set-variable = read_buffer=2M +set-variable = write_buffer=2M + +[mysqlhotcopy] +interactive-timeout diff --git a/omc/config/my.cnf_omc-0 b/omc/config/my.cnf_omc-0 new file mode 100644 index 0000000..9b169e1 --- /dev/null +++ b/omc/config/my.cnf_omc-0 @@ -0,0 +1,94 @@ +# Example mysql config file for medium systems. +# +# This is for a system with little memory (32M - 64M) where MySQL plays +# a important part and systems up to 128M very MySQL is used together with +# other programs (like a web server) +# +# You can copy this file to +# /etc/mf.cnf to set global options, +# mysql-data-dir/my.cnf to set server-specific options (in this +# installation this directory is /usr/local/mysql/var) or +# ~/.my.cnf to set user-specific options. +# +# One can in this file use all long options that the program supports. +# If you want to know which options a program support, run the program +# with --help option. + +# The following options will be passed to all MySQL clients +[client] +#password = your_password +port = 3306 +socket = /var/lib/mysql/mysql.sock + +# Here follows entries for some specific programs + +# The MySQL server +[mysqld] +port = 3306 +socket = /var/lib/mysql/mysql.sock +skip-locking +slave-skip-errors = all +set-variable = key_buffer=16M +set-variable = max_allowed_packet=16M +set-variable = table_cache=64 +set-variable = sort_buffer=512K +set-variable = net_buffer_length=8K +set-variable = myisam_sort_buffer_size=8M +set-variable = max_binlog_size=2M +set-variable = max_connections=256 +set-variable = wait_timeout=1800 +set-variable = interactive_timeout=1800 +#master=====================> +log-bin +binlog-do-db = mysql +binlog-do-db = CDR_DB +binlog-do-db = CSTA_DB + +server-id = 0 + +#slave====================> +master-host = omc-1 +master-user = administrator +master-password = "*86#ROtartsinim" +master-port = 3306 + +#master-connect-retry = 30 +#slave-read-timeout = 10 + +replicate-do-db = mysql +replicate-do-db = CDR_DB +replicate-do-db = CSTA_DB + +#replicate-do-table =*.* + + +# Uncomment the following if you are using BDB tables +#set-variable = bdb_cache_size=4M +#set-variable = bdb_max_lock=10000 + +# Point the following paths to different dedicated disks +#tmpdir = /tmp/ +#log-update = /path-to-dedicated-directory/hostname + +[mysqldump] +quick +set-variable = max_allowed_packet=16M + +[mysql] +no-auto-rehash +#safe-updates # Remove the comment character if you are not familiar with SQL + +[isamchk] +set-variable = key_buffer=20M +set-variable = sort_buffer=20M +set-variable = read_buffer=2M +set-variable = write_buffer=2M + +[myisamchk] +set-variable = key_buffer=20M +set-variable = sort_buffer=20M +set-variable = read_buffer=2M +set-variable = write_buffer=2M + +[mysqlhotcopy] +interactive-timeout diff --git a/omc/config/my.cnf_omc-0.ES b/omc/config/my.cnf_omc-0.ES new file mode 100644 index 0000000..c559971 --- /dev/null +++ b/omc/config/my.cnf_omc-0.ES @@ -0,0 +1,98 @@ +# Example mysql config file for medium systems. +# +# This is for a system with little memory (32M - 64M) where MySQL plays +# a important part and systems up to 128M very MySQL is used together with +# other programs (like a web server) +# +# You can copy this file to +# /etc/mf.cnf to set global options, +# mysql-data-dir/my.cnf to set server-specific options (in this +# installation this directory is /usr/local/mysql/var) or +# ~/.my.cnf to set user-specific options. +# +# One can in this file use all long options that the program supports. +# If you want to know which options a program support, run the program +# with --help option. + +# The following options will be passed to all MySQL clients +[client] +#password = your_password +port = 3306 +#socket = /var/lib/mysql/mysql.sock +socket = /tmp/mysql.sock +# Here follows entries for some specific programs + +# The MySQL server +[mysqld] +port = 3306 +#socket = /var/lib/mysql/mysql.sock +socket = /tmp/mysql.sock +datadir = /usr/local/mysql +pid-file = /var/lib/mysql/mysqld.pid +log-error = /var/lib/mysql/mysqld.err +skip-locking +slave-skip-errors = all +set-variable = key_buffer=16M +set-variable = max_allowed_packet=16M +set-variable = table_cache=64 +set-variable = sort_buffer=512K +set-variable = net_buffer_length=8K +set-variable = myisam_sort_buffer_size=8M +set-variable = max_binlog_size=2M +set-variable = max_connections=256 +set-variable = wait_timeout=1800 +set-variable = interactive_timeout=1800 +#master=====================> +log-bin +binlog-do-db = mysql +binlog-do-db = CDR_DB +binlog-do-db = CSTA_DB + +server-id = 0 + +#slave====================> +master-host = omc-1 +master-user = administrator +master-password = "*86#ROtartsinim" +master-port = 3306 + +#master-connect-retry = 30 +#slave-read-timeout = 10 + +replicate-do-db = mysql +replicate-do-db = CDR_DB +replicate-do-db = CSTA_DB + +#replicate-do-table =*.* + + +# Uncomment the following if you are using BDB tables +#set-variable = bdb_cache_size=4M +#set-variable = bdb_max_lock=10000 + +# Point the following paths to different dedicated disks +#tmpdir = /tmp/ +#log-update = /path-to-dedicated-directory/hostname + +[mysqldump] +quick +set-variable = max_allowed_packet=16M + +[mysql] +no-auto-rehash +#safe-updates # Remove the comment character if you are not familiar with SQL + +[isamchk] +set-variable = key_buffer=20M +set-variable = sort_buffer=20M +set-variable = read_buffer=2M +set-variable = write_buffer=2M + +[myisamchk] +set-variable = key_buffer=20M +set-variable = sort_buffer=20M +set-variable = read_buffer=2M +set-variable = write_buffer=2M + +[mysqlhotcopy] +interactive-timeout diff --git a/omc/config/my.cnf_omc-1 b/omc/config/my.cnf_omc-1 new file mode 100644 index 0000000..4e40c1d --- /dev/null +++ b/omc/config/my.cnf_omc-1 @@ -0,0 +1,94 @@ +# Example mysql config file for medium systems. +# +# This is for a system with little memory (32M - 64M) where MySQL plays +# a important part and systems up to 128M very MySQL is used together with +# other programs (like a web server) +# +# You can copy this file to +# /etc/mf.cnf to set global options, +# mysql-data-dir/my.cnf to set server-specific options (in this +# installation this directory is /usr/local/mysql/var) or +# ~/.my.cnf to set user-specific options. +# +# One can in this file use all long options that the program supports. +# If you want to know which options a program support, run the program +# with --help option. + +# The following options will be passed to all MySQL clients +[client] +#password = your_password +port = 3306 +socket = /var/lib/mysql/mysql.sock + +# Here follows entries for some specific programs + +# The MySQL server +[mysqld] +port = 3306 +socket = /var/lib/mysql/mysql.sock +skip-locking +slave-skip-errors = all +set-variable = key_buffer=16M +set-variable = max_allowed_packet=16M +set-variable = table_cache=64 +set-variable = sort_buffer=512K +set-variable = net_buffer_length=8K +set-variable = myisam_sort_buffer_size=8M +set-variable = max_binlog_size=2M +set-variable = max_connections=256 +set-variable = wait_timeout=1800 +set-variable = interactive_timeout=1800 +#master=====================> +log-bin +binlog-do-db = mysql +binlog-do-db = CDR_DB +binlog-do-db = CSTA_DB + +server-id = 1 + +#slave====================> +master-host = omc-0 +master-user = administrator +master-password = "*86#ROtartsinim" +master-port = 3306 + +#master-connect-retry = 30 +#slave-read-timeout = 10 + +replicate-do-db = mysql +replicate-do-db = CDR_DB +replicate-do-db = CSTA_DB + +#replicate-do-table =*.* + + +# Uncomment the following if you are using BDB tables +#set-variable = bdb_cache_size=4M +#set-variable = bdb_max_lock=10000 + +# Point the following paths to different dedicated disks +#tmpdir = /tmp/ +#log-update = /path-to-dedicated-directory/hostname + +[mysqldump] +quick +set-variable = max_allowed_packet=16M + +[mysql] +no-auto-rehash +#safe-updates # Remove the comment character if you are not familiar with SQL + +[isamchk] +set-variable = key_buffer=20M +set-variable = sort_buffer=20M +set-variable = read_buffer=2M +set-variable = write_buffer=2M + +[myisamchk] +set-variable = key_buffer=20M +set-variable = sort_buffer=20M +set-variable = read_buffer=2M +set-variable = write_buffer=2M + +[mysqlhotcopy] +interactive-timeout diff --git a/omc/config/my.cnf_omc-1.ES b/omc/config/my.cnf_omc-1.ES new file mode 100644 index 0000000..e5fe549 --- /dev/null +++ b/omc/config/my.cnf_omc-1.ES @@ -0,0 +1,98 @@ +# Example mysql config file for medium systems. +# +# This is for a system with little memory (32M - 64M) where MySQL plays +# a important part and systems up to 128M very MySQL is used together with +# other programs (like a web server) +# +# You can copy this file to +# /etc/mf.cnf to set global options, +# mysql-data-dir/my.cnf to set server-specific options (in this +# installation this directory is /usr/local/mysql/var) or +# ~/.my.cnf to set user-specific options. +# +# One can in this file use all long options that the program supports. +# If you want to know which options a program support, run the program +# with --help option. + +# The following options will be passed to all MySQL clients +[client] +#password = your_password +port = 3306 +socket = /var/lib/mysql/mysql.sock + +# Here follows entries for some specific programs + +# The MySQL server +[mysqld] +port = 3306 +socket = /var/lib/mysql/mysql.sock +datadir = /usr/local/mysql +pid-file = /var/lib/mysql/mysqld.pid +log-error = /var/lib/mysql/mysqld.err +skip-locking +slave-skip-errors = all +set-variable = key_buffer=16M +set-variable = max_allowed_packet=16M +set-variable = table_cache=64 +set-variable = sort_buffer=512K +set-variable = net_buffer_length=8K +set-variable = myisam_sort_buffer_size=8M +set-variable = max_binlog_size=2M +set-variable = max_connections=256 +set-variable = wait_timeout=1800 +set-variable = interactive_timeout=1800 +#master=====================> +log-bin +binlog-do-db = mysql +binlog-do-db = CDR_DB +binlog-do-db = CSTA_DB + + +server-id = 1 + +#slave====================> +master-host = omc-0 +master-user = administrator +master-password = "*86#ROtartsinim" +master-port = 3306 + +#master-connect-retry = 30 +#slave-read-timeout = 10 + +replicate-do-db = mysql +replicate-do-db = CDR_DB +replicate-do-db = CSTA_DB + +#replicate-do-table =*.* + + +# Uncomment the following if you are using BDB tables +#set-variable = bdb_cache_size=4M +#set-variable = bdb_max_lock=10000 + +# Point the following paths to different dedicated disks +#tmpdir = /tmp/ +#log-update = /path-to-dedicated-directory/hostname + +[mysqldump] +quick +set-variable = max_allowed_packet=16M + +[mysql] +no-auto-rehash +#safe-updates # Remove the comment character if you are not familiar with SQL + +[isamchk] +set-variable = key_buffer=20M +set-variable = sort_buffer=20M +set-variable = read_buffer=2M +set-variable = write_buffer=2M + +[myisamchk] +set-variable = key_buffer=20M +set-variable = sort_buffer=20M +set-variable = read_buffer=2M +set-variable = write_buffer=2M + +[mysqlhotcopy] +interactive-timeout diff --git a/omc/config/my.cnf_single b/omc/config/my.cnf_single new file mode 100644 index 0000000..83d4d9d --- /dev/null +++ b/omc/config/my.cnf_single @@ -0,0 +1,72 @@ +# Example mysql config file for medium systems. +# +# This is for a system with little memory (32M - 64M) where MySQL plays +# a important part and systems up to 128M very MySQL is used together with +# other programs (like a web server) +# +# You can copy this file to +# /etc/mf.cnf to set global options, +# mysql-data-dir/my.cnf to set server-specific options (in this +# installation this directory is /usr/local/mysql/var) or +# ~/.my.cnf to set user-specific options. +# +# One can in this file use all long options that the program supports. +# If you want to know which options a program support, run the program +# with --help option. + +# The following options will be passed to all MySQL clients +[client] +#password = your_password +port = 3306 +socket = /var/lib/mysql/mysql.sock + +# Here follows entries for some specific programs + +# The MySQL server +[mysqld] +port = 3306 +socket = /var/lib/mysql/mysql.sock +skip-locking +set-variable = key_buffer=16M +set-variable = max_allowed_packet=16M +set-variable = table_cache=64 +set-variable = sort_buffer=512K +set-variable = net_buffer_length=8K +set-variable = myisam_sort_buffer_size=8M +set-variable = max_binlog_size=32M +set-variable = max_connections=256 +set-variable = wait_timeout=1800 +set-variable = interactive_timeout=1800 +#log-bin +#replicate-do-table =*.* + +# Uncomment the following if you are using BDB tables +#set-variable = bdb_cache_size=4M +#set-variable = bdb_max_lock=10000 + +# Point the following paths to different dedicated disks +#tmpdir = /tmp/ +#log-update = /path-to-dedicated-directory/hostname + +[mysqldump] +quick +set-variable = max_allowed_packet=16M + +[mysql] +no-auto-rehash +#safe-updates # Remove the comment character if you are not familiar with SQL + +[isamchk] +set-variable = key_buffer=20M +set-variable = sort_buffer=20M +set-variable = read_buffer=2M +set-variable = write_buffer=2M + +[myisamchk] +set-variable = key_buffer=20M +set-variable = sort_buffer=20M +set-variable = read_buffer=2M +set-variable = write_buffer=2M + +[mysqlhotcopy] +interactive-timeout diff --git a/omc/config/my.cnf_single.ES b/omc/config/my.cnf_single.ES new file mode 100644 index 0000000..8d938d6 --- /dev/null +++ b/omc/config/my.cnf_single.ES @@ -0,0 +1,77 @@ +# Example mysql config file for medium systems. +# +# This is for a system with little memory (32M - 64M) where MySQL plays +# a important part and systems up to 128M very MySQL is used together with +# other programs (like a web server) +# +# You can copy this file to +# /etc/mf.cnf to set global options, +# mysql-data-dir/my.cnf to set server-specific options (in this +# installation this directory is /usr/local/mysql/var) or +# ~/.my.cnf to set user-specific options. +# +# One can in this file use all long options that the program supports. +# If you want to know which options a program support, run the program +# with --help option. + +# The following options will be passed to all MySQL clients +[client] +#password = your_password +port = 3306 +#socket = /var/lib/mysql/mysql.sock +socket = /tmp/mysql.sock + +# Here follows entries for some specific programs + +# The MySQL server +[mysqld] +port = 3306 +#socket = /var/lib/mysql/mysql.sock +socket = /tmp/mysql.sock +datadir = /usr/local/mysql +pid-file = /var/lib/mysql/mysqld.pid +log-error = /var/lib/mysql/mysqld.err +skip-locking +set-variable = key_buffer=16M +set-variable = max_allowed_packet=16M +set-variable = table_cache=64 +set-variable = sort_buffer=512K +set-variable = net_buffer_length=8K +set-variable = myisam_sort_buffer_size=8M +set-variable = max_binlog_size=32M +set-variable = max_connections=256 +set-variable = wait_timeout=1800 +set-variable = interactive_timeout=1800 +#log-bin +#replicate-do-table =*.* + +# Uncomment the following if you are using BDB tables +#set-variable = bdb_cache_size=4M +#set-variable = bdb_max_lock=10000 + +# Point the following paths to different dedicated disks +#tmpdir = /tmp/ +#log-update = /path-to-dedicated-directory/hostname + +[mysqldump] +quick +set-variable = max_allowed_packet=16M + +[mysql] +no-auto-rehash +#safe-updates # Remove the comment character if you are not familiar with SQL + +[isamchk] +set-variable = key_buffer=20M +set-variable = sort_buffer=20M +set-variable = read_buffer=2M +set-variable = write_buffer=2M + +[myisamchk] +set-variable = key_buffer=20M +set-variable = sort_buffer=20M +set-variable = read_buffer=2M +set-variable = write_buffer=2M + +[mysqlhotcopy] +interactive-timeout diff --git a/omc/config/omc_db.conf b/omc/config/omc_db.conf new file mode 100644 index 0000000..3e1de57 --- /dev/null +++ b/omc/config/omc_db.conf @@ -0,0 +1,50 @@ +#omc_db.conf +#config file for database maintenance + +[backup] +#List the database that need to be backuped +#CDR_DB,CSTA_DB is not need to backup +#Format:database + +[clean] +#You can termly clean tables by defining condition according to +#Format:database,table,time field,timeout,max records +OMC_PUB,sysAlarmLog,alarmTime,7,10000 +OMC_PUB,sysOperLog,datetime,7,10000 +OMC_PUB,dbAlarm,alarmTime,7,5000 +PPS_DB,used_card_info,updated_date,1900,5000000 +BssOmcDb,OMCR_ALARMEVENT,EventTime,7,10000 +BssOmcDb,OMCR_BtsMeasurements,updateTime,7,10000 +BssOmcDb,OMCR_NETWORKEVENT,EventTime,7,10000 +[remove_log] +#You can termly remove log files by defining condition according to +#Format:path,keyword,timeout(unit:day) +/usr/local/mysql,-bin,2 +/usr/local/omc/bin/dual/cdr_data_proc,dat,1 +/usr/local/omc/bin/dual/cdr_io_proc,dat,1 +/usr/local/apache/logs,access_log,7 +/usr/local/apache/htdocs/db_backup/cdrsending,csv,7 +/usr/local/apache/htdocs/db_backup/cdr,csv,7 +/usr/local/apache/htdocs/db_backup/cdrsent,csv,7 +/usr/local/apache/htdocs/db_backup/cstasending,csv,7 +/usr/local/apache/htdocs/db_backup/csta,csv,7 +/usr/local/apache/htdocs/db_backup/cstasent,csv,7 +/usr/local/apache/htdocs/db_backup/subsData,csv,7 +/usr/local/apache/htdocs/db_backup/alarmLog,csv,7 +/usr/local/apache/htdocs/db_backup/operLog,csv,7 +/usr/local/apache/htdocs/db_backup/paramConf,csv,7 +/usr/local/omc/log,gz,7 +/usr/local/omc/log,log,7 +/usr/local/omc/log,dualsrv,7 +/var/log,tmp,7 +/var/log,log,7 +/var/log,messages,7 +/var/log,secure,7 +/usr/local/apache/htdocs/db_backup/nrtrde/LOCAL_CSV.cvs,7 +/usr/local/apache/htdocs/db_backup/nrtrde/ND_RECV_BAK,ND,7 +/usr/local/apache/htdocs/db_backup/nrtrde/ND_SEND_BAK,ND,7 +/usr/local/apache/htdocs/db_backup/nrtrde/NE_RECV_BAK,NE,7 +/usr/local/apache/htdocs/db_backup/nrtrde/NE_SEND_BAK,NE,7 +/usr/local/apache/htdocs/db_backup/nrtrde/NR_RECV_BAK,NR,7 +/usr/local/apache/htdocs/db_backup/nrtrde/NR_SEND_BAK,NR,7 + diff --git a/omc/config/omcd.conf b/omc/config/omcd.conf new file mode 100644 index 0000000..1ef7e25 --- /dev/null +++ b/omc/config/omcd.conf @@ -0,0 +1,20 @@ +### +#omcTypeNo: +# 0:WXC2 OMC +# 1:GMSC OMC +# 2:MSC OMC +# 3:HLR OMC +# 4:AUC OMC +# 5:SMS OMC +# 6:PPS OMC +# 7:BSS OMC +### +omcVersion=9.02.00 + +omcTypeNo=0 +omcSysNo=0 +omcSubSysNo=0 + + +#omc run mode 0:single omc 1:dual omc +omcRunMode=1 diff --git a/omc/config/omcd.conf_omc-0 b/omc/config/omcd.conf_omc-0 new file mode 100644 index 0000000..106dfb0 --- /dev/null +++ b/omc/config/omcd.conf_omc-0 @@ -0,0 +1,19 @@ +### +#omcTypeNo: +# 0:WXC2 OMC +# 1:GMSC OMC +# 2:MSC OMC +# 3:HLR OMC +# 4:AUC OMC +# 5:SMS OMC +# 6:PPS OMC +# 7:BSS OMC +### +omcVersion=9.02.00 + +omcTypeNo=0 +omcSysNo=0 +omcSubSysNo=0 + +#omc run mode 0:single omc 1:dual omc +omcRunMode=1 diff --git a/omc/config/omcd.conf_omc-1 b/omc/config/omcd.conf_omc-1 new file mode 100644 index 0000000..0946f83 --- /dev/null +++ b/omc/config/omcd.conf_omc-1 @@ -0,0 +1,19 @@ +### +#omcTypeNo: +# 0:WXC2 OMC +# 1:GMSC OMC +# 2:MSC OMC +# 3:HLR OMC +# 4:AUC OMC +# 5:SMS OMC +# 6:PPS OMC +# 7:BSS OMC +### +omcVersion=9.02.00 + +omcTypeNo=0 +omcSysNo=1 +omcSubSysNo=0 + +#omc run mode 0:single omc 1:dual omc +omcRunMode=1 diff --git a/omc/config/omcd.conf_single b/omc/config/omcd.conf_single new file mode 100644 index 0000000..03a66ed --- /dev/null +++ b/omc/config/omcd.conf_single @@ -0,0 +1,19 @@ +### +#omcTypeNo: +# 0:WXC2 OMC +# 1:GMSC OMC +# 2:MSC OMC +# 3:HLR OMC +# 4:AUC OMC +# 5:SMS OMC +# 6:PPS OMC +# 7:BSS OMC +### +omcVersion=9.02.00 + +omcTypeNo=0 +omcSysNo=0 +omcSubSysNo=0 + +#omc run mode 0:single omc 1:dual omc +omcRunMode=0 diff --git a/omc/config/php.ini b/omc/config/php.ini new file mode 100644 index 0000000..24e1582 --- /dev/null +++ b/omc/config/php.ini @@ -0,0 +1,1224 @@ +[PHP] + +;;;;;;;;;;;;;;;;;;; +; About php.ini ; +;;;;;;;;;;;;;;;;;;; +; This file controls many aspects of PHP's behavior. In order for PHP to +; read it, it must be named 'php.ini'. PHP looks for it in the current +; working directory, in the path designated by the environment variable +; PHPRC, and in the path that was defined in compile time (in that order). +; Under Windows, the compile-time path is the Windows directory. The +; path in which the php.ini file is looked for can be overridden using +; the -c argument in command line mode. +; +; The syntax of the file is extremely simple. Whitespace and Lines +; beginning with a semicolon are silently ignored (as you probably guessed). +; Section headers (e.g. [Foo]) are also silently ignored, even though +; they might mean something in the future. +; +; Directives are specified using the following syntax: +; directive = value +; Directive names are *case sensitive* - foo=bar is different from FOO=bar. +; +; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one +; of the INI constants (On, Off, True, False, Yes, No and None) or an expression +; (e.g. E_ALL & ~E_NOTICE), or a quoted string ("foo"). +; +; Expressions in the INI file are limited to bitwise operators and parentheses: +; | bitwise OR +; & bitwise AND +; ~ bitwise NOT +; ! boolean NOT +; +; Boolean flags can be turned on using the values 1, On, True or Yes. +; They can be turned off using the values 0, Off, False or No. +; +; An empty string can be denoted by simply not writing anything after the equal +; sign, or by using the None keyword: +; +; foo = ; sets foo to an empty string +; foo = none ; sets foo to an empty string +; foo = "none" ; sets foo to the string 'none' +; +; If you use constants in your value, and these constants belong to a +; dynamically loaded extension (either a PHP extension or a Zend extension), +; you may only use these constants *after* the line that loads the extension. +; +; +;;;;;;;;;;;;;;;;;;; +; About this file ; +;;;;;;;;;;;;;;;;;;; +; This is the recommended, PHP 5-style version of the php.ini-dist file. It +; sets some non standard settings, that make PHP more efficient, more secure, +; and encourage cleaner coding. +; +; The price is that with these settings, PHP may be incompatible with some +; applications, and sometimes, more difficult to develop with. Using this +; file is warmly recommended for production sites. As all of the changes from +; the standard settings are thoroughly documented, you can go over each one, +; and decide whether you want to use it or not. +; +; For general information about the php.ini file, please consult the php.ini-dist +; file, included in your PHP distribution. +; +; This file is different from the php.ini-dist file in the fact that it features +; different values for several directives, in order to improve performance, while +; possibly breaking compatibility with the standard out-of-the-box behavior of +; PHP. Please make sure you read what's different, and modify your scripts +; accordingly, if you decide to use this file instead. +; +; - register_globals = Off [Security, Performance] +; Global variables are no longer registered for input data (POST, GET, cookies, +; environment and other server variables). Instead of using $foo, you must use +; you can use $_REQUEST["foo"] (includes any variable that arrives through the +; request, namely, POST, GET and cookie variables), or use one of the specific +; $_GET["foo"], $_POST["foo"], $_COOKIE["foo"] or $_FILES["foo"], depending +; on where the input originates. Also, you can look at the +; import_request_variables() function. +; Note that register_globals is going to be depracated (i.e., turned off by +; default) in the next version of PHP, because it often leads to security bugs. +; Read http://php.net/manual/en/security.registerglobals.php for further +; information. +; - register_long_arrays = Off [Performance] +; Disables registration of the older (and deprecated) long predefined array +; variables ($HTTP_*_VARS). Instead, use the superglobals that were +; introduced in PHP 4.1.0 +; - display_errors = Off [Security] +; With this directive set to off, errors that occur during the execution of +; scripts will no longer be displayed as a part of the script output, and thus, +; will no longer be exposed to remote users. With some errors, the error message +; content may expose information about your script, web server, or database +; server that may be exploitable for hacking. Production sites should have this +; directive set to off. +; - log_errors = On [Security] +; This directive complements the above one. Any errors that occur during the +; execution of your script will be logged (typically, to your server's error log, +; but can be configured in several ways). Along with setting display_errors to off, +; this setup gives you the ability to fully understand what may have gone wrong, +; without exposing any sensitive information to remote users. +; - output_buffering = 4096 [Performance] +; Set a 4KB output buffer. Enabling output buffering typically results in less +; writes, and sometimes less packets sent on the wire, which can often lead to +; better performance. The gain this directive actually yields greatly depends +; on which Web server you're working with, and what kind of scripts you're using. +; - register_argc_argv = Off [Performance] +; Disables registration of the somewhat redundant $argv and $argc global +; variables. +; - magic_quotes_gpc = Off [Performance] +; Input data is no longer escaped with slashes so that it can be sent into +; SQL databases without further manipulation. Instead, you should use the +; function addslashes() on each input element you wish to send to a database. +; - variables_order = "GPCS" [Performance] +; The environment variables are not hashed into the $_ENV. To access +; environment variables, you can use getenv() instead. +; - error_reporting = E_ALL [Code Cleanliness, Security(?)] +; By default, PHP surpresses errors of type E_NOTICE. These error messages +; are emitted for non-critical errors, but that could be a symptom of a bigger +; problem. Most notably, this will cause error messages about the use +; of uninitialized variables to be displayed. +; - allow_call_time_pass_reference = Off [Code cleanliness] +; It's not possible to decide to force a variable to be passed by reference +; when calling a function. The PHP 4 style to do this is by making the +; function require the relevant argument by reference. + + +;;;;;;;;;;;;;;;;;;;; +; Language Options ; +;;;;;;;;;;;;;;;;;;;; + +; Enable the PHP scripting language engine under Apache. +engine = On + +; Enable compatibility mode with Zend Engine 1 (PHP 4.x) +zend.ze1_compatibility_mode = Off + +; Allow the tags are recognized. +; NOTE: Using short tags should be avoided when developing applications or +; libraries that are meant for redistribution, or deployment on PHP +; servers which are not under your control, because short tags may not +; be supported on the target server. For portable, redistributable code, +; be sure not to use short tags. +short_open_tag = On + +; Allow ASP-style <% %> tags. +asp_tags = Off + +; The number of significant digits displayed in floating point numbers. +precision = 14 + +; Enforce year 2000 compliance (will cause problems with non-compliant browsers) +y2k_compliance = On + +; Output buffering allows you to send header lines (including cookies) even +; after you send body content, at the price of slowing PHP's output layer a +; bit. You can enable output buffering during runtime by calling the output +; buffering functions. You can also enable output buffering for all files by +; setting this directive to On. If you wish to limit the size of the buffer +; to a certain size - you can use a maximum number of bytes instead of 'On', as +; a value for this directive (e.g., output_buffering=4096). +output_buffering = 128 + +; You can redirect all of the output of your scripts to a function. For +; example, if you set output_handler to "mb_output_handler", character +; encoding will be transparently converted to the specified encoding. +; Setting any output handler automatically turns on output buffering. +; Note: People who wrote portable scripts should not depend on this ini +; directive. Instead, explicitly set the output handler using ob_start(). +; Using this ini directive may cause problems unless you know what script +; is doing. +; Note: You cannot use both "mb_output_handler" with "ob_iconv_handler" +; and you cannot use both "ob_gzhandler" and "zlib.output_compression". +; Note: output_handler must be empty if this is set 'On' !!!! +; Instead you must use zlib.output_handler. +;output_handler = + +; Transparent output compression using the zlib library +; Valid values for this option are 'off', 'on', or a specific buffer size +; to be used for compression (default is 4KB) +; Note: Resulting chunk size may vary due to nature of compression. PHP +; outputs chunks that are few hundreds bytes each as a result of +; compression. If you prefer a larger chunk size for better +; performance, enable output_buffering in addition. +; Note: You need to use zlib.output_handler instead of the standard +; output_handler, or otherwise the output will be corrupted. +zlib.output_compression = Off + +; You cannot specify additional output handlers if zlib.output_compression +; is activated here. This setting does the same as output_handler but in +; a different order. +;zlib.output_handler = + +; Implicit flush tells PHP to tell the output layer to flush itself +; automatically after every output block. This is equivalent to calling the +; PHP function flush() after each and every call to print() or echo() and each +; and every HTML block. Turning this option on has serious performance +; implications and is generally recommended for debugging purposes only. +implicit_flush = Off + +; The unserialize callback function will be called (with the undefined class' +; name as parameter), if the unserializer finds an undefined class +; which should be instantiated. +; A warning appears if the specified function is not defined, or if the +; function doesn't include/implement the missing class. +; So only set this entry, if you really want to implement such a +; callback-function. +unserialize_callback_func= + +; When floats & doubles are serialized store serialize_precision significant +; digits after the floating point. The default value ensures that when floats +; are decoded with unserialize, the data will remain the same. +serialize_precision = 100 + +; Whether to enable the ability to force arguments to be passed by reference +; at function call time. This method is deprecated and is likely to be +; unsupported in future versions of PHP/Zend. The encouraged method of +; specifying which arguments should be passed by reference is in the function +; declaration. You're encouraged to try and turn this option Off and make +; sure your scripts work properly with it in order to ensure they will work +; with future versions of the language (you will receive a warning each time +; you use this feature, and the argument will be passed by value instead of by +; reference). +allow_call_time_pass_reference = Off + +; +; Safe Mode +; +safe_mode = Off + +; By default, Safe Mode does a UID compare check when +; opening files. If you want to relax this to a GID compare, +; then turn on safe_mode_gid. +safe_mode_gid = Off + +; When safe_mode is on, UID/GID checks are bypassed when +; including files from this directory and its subdirectories. +; (directory must also be in include_path or full path must +; be used when including) +safe_mode_include_dir = + +; When safe_mode is on, only executables located in the safe_mode_exec_dir +; will be allowed to be executed via the exec family of functions. +safe_mode_exec_dir = + +; Setting certain environment variables may be a potential security breach. +; This directive contains a comma-delimited list of prefixes. In Safe Mode, +; the user may only alter environment variables whose names begin with the +; prefixes supplied here. By default, users will only be able to set +; environment variables that begin with PHP_ (e.g. PHP_FOO=BAR). +; +; Note: If this directive is empty, PHP will let the user modify ANY +; environment variable! +safe_mode_allowed_env_vars = PHP_ + +; This directive contains a comma-delimited list of environment variables that +; the end user won't be able to change using putenv(). These variables will be +; protected even if safe_mode_allowed_env_vars is set to allow to change them. +safe_mode_protected_env_vars = LD_LIBRARY_PATH + +; open_basedir, if set, limits all file operations to the defined directory +; and below. This directive makes most sense if used in a per-directory +; or per-virtualhost web server configuration file. This directive is +; *NOT* affected by whether Safe Mode is turned On or Off. +;open_basedir = + +; This directive allows you to disable certain functions for security reasons. +; It receives a comma-delimited list of function names. This directive is +; *NOT* affected by whether Safe Mode is turned On or Off. +disable_functions = + +; This directive allows you to disable certain classes for security reasons. +; It receives a comma-delimited list of class names. This directive is +; *NOT* affected by whether Safe Mode is turned On or Off. +disable_classes = + +; Colors for Syntax Highlighting mode. Anything that's acceptable in +; would work. +highlight.string = #DD0000 +highlight.comment = #FF9900 +highlight.keyword = #007700 +highlight.bg = #FFFFFF +highlight.default = #0000BB +highlight.html = #000000 + +; If enabled, the request will be allowed to complete even if the user aborts +; the request. Consider enabling it if executing long request, which may end up +; being interrupted by the user or a browser timing out. +; ignore_user_abort = On + +; Determines the size of the realpath cache to be used by PHP. This value should +; be increased on systems where PHP opens many files to reflect the quantity of +; the file operations performed. +; realpath_cache_size=16k + +; Duration of time, in seconds for which to cache realpath information for a given +; file or directory. For systems with rarely changing files, consider increasing this +; value. +; realpath_cache_ttl=120 + +; +; Misc +; +; Decides whether PHP may expose the fact that it is installed on the server +; (e.g. by adding its signature to the Web server header). It is no security +; threat in any way, but it makes it possible to determine whether you use PHP +; on your server or not. +expose_php = On + + +;;;;;;;;;;;;;;;;;;; +; Resource Limits ; +;;;;;;;;;;;;;;;;;;; + +max_execution_time = 3600 ; Maximum execution time of each script, in seconds +max_input_time = 1024 ; Maximum amount of time each script may spend parsing request data +memory_limit = 256M ; Maximum amount of memory a script may consume + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Error handling and logging ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +; error_reporting is a bit-field. Or each number up to get desired error +; reporting level +; E_ALL - All errors and warnings (doesn't include E_STRICT) +; E_ERROR - fatal run-time errors +; E_WARNING - run-time warnings (non-fatal errors) +; E_PARSE - compile-time parse errors +; E_NOTICE - run-time notices (these are warnings which often result +; from a bug in your code, but it's possible that it was +; intentional (e.g., using an uninitialized variable and +; relying on the fact it's automatically initialized to an +; empty string) +; E_STRICT - run-time notices, enable to have PHP suggest changes +; to your code which will ensure the best interoperability +; and forward compatibility of your code +; E_CORE_ERROR - fatal errors that occur during PHP's initial startup +; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's +; initial startup +; E_COMPILE_ERROR - fatal compile-time errors +; E_COMPILE_WARNING - compile-time warnings (non-fatal errors) +; E_USER_ERROR - user-generated error message +; E_USER_WARNING - user-generated warning message +; E_USER_NOTICE - user-generated notice message +; +; Examples: +; +; - Show all errors, except for notices and coding standards warnings +; +;error_reporting = E_ALL & ~E_NOTICE +; +; - Show all errors, except for notices +; +;error_reporting = E_ALL & ~E_NOTICE | E_STRICT +; +; - Show only errors +; +;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR +; +; - Show all errors, except coding standards warnings +; +error_reporting = E_ALL & ~E_NOTICE + +; Print out errors (as a part of the output). For production web sites, +; you're strongly encouraged to turn this feature off, and use error logging +; instead (see below). Keeping display_errors enabled on a production web site +; may reveal security information to end users, such as file paths on your Web +; server, your database schema or other information. +display_errors = On + +; Even when display_errors is on, errors that occur during PHP's startup +; sequence are not displayed. It's strongly recommended to keep +; display_startup_errors off, except for when debugging. +display_startup_errors = Off + +; Log errors into a log file (server-specific log, stderr, or error_log (below)) +; As stated above, you're strongly advised to use error logging in place of +; error displaying on production web sites. +log_errors = Off + +; Set maximum length of log_errors. In error_log information about the source is +; added. The default is 1024 and 0 allows to not apply any maximum length at all. +log_errors_max_len = 1024 + +; Do not log repeated messages. Repeated errors must occur in same file on same +; line until ignore_repeated_source is set true. +ignore_repeated_errors = Off + +; Ignore source of message when ignoring repeated messages. When this setting +; is On you will not log errors with repeated messages from different files or +; sourcelines. +ignore_repeated_source = Off + +; If this parameter is set to Off, then memory leaks will not be shown (on +; stdout or in the log). This has only effect in a debug compile, and if +; error reporting includes E_WARNING in the allowed list +report_memleaks = On + +; Store the last error/warning message in $php_errormsg (boolean). +track_errors = Off + +; Disable the inclusion of HTML tags in error messages. +; Note: Never use this feature for production boxes. +;html_errors = Off + +; If html_errors is set On PHP produces clickable error messages that direct +; to a page describing the error or function causing the error in detail. +; You can download a copy of the PHP manual from http://www.php.net/docs.php +; and change docref_root to the base URL of your local copy including the +; leading '/'. You must also specify the file extension being used including +; the dot. +; Note: Never use this feature for production boxes. +;docref_root = "/phpmanual/" +;docref_ext = .html + +; String to output before an error message. +;error_prepend_string = "" + +; String to output after an error message. +;error_append_string = "" + +; Log errors to specified file. +;error_log = filename + +; Log errors to syslog (Event Log on NT, not valid in Windows 95). +;error_log = syslog + + +;;;;;;;;;;;;;;;;; +; Data Handling ; +;;;;;;;;;;;;;;;;; +; +; Note - track_vars is ALWAYS enabled as of PHP 4.0.3 + +; The separator used in PHP generated URLs to separate arguments. +; Default is "&". +;arg_separator.output = "&" + +; List of separator(s) used by PHP to parse input URLs into variables. +; Default is "&". +; NOTE: Every character in this directive is considered as separator! +;arg_separator.input = ";&" + +; This directive describes the order in which PHP registers GET, POST, Cookie, +; Environment and Built-in variables (G, P, C, E & S respectively, often +; referred to as EGPCS or GPC). Registration is done from left to right, newer +; values override older values. +variables_order = "EGPCS" + +; Whether or not to register the EGPCS variables as global variables. You may +; want to turn this off if you don't want to clutter your scripts' global scope +; with user data. This makes most sense when coupled with track_vars - in which +; case you can access all of the GPC variables through the $HTTP_*_VARS[], +; variables. +; +; You should do your best to write your scripts so that they do not require +; register_globals to be on; Using form variables as globals can easily lead +; to possible security problems, if the code is not very well thought of. +register_globals = On + +; Whether or not to register the old-style input arrays, HTTP_GET_VARS +; and friends. If you're not using them, it's recommended to turn them off, +; for performance reasons. +register_long_arrays = On + +; This directive tells PHP whether to declare the argv&argc variables (that +; would contain the GET information). If you don't use these variables, you +; should turn it off for increased performance. +register_argc_argv = On + +; When enabled, the SERVER and ENV variables are created when they're first +; used (Just In Time) instead of when the script starts. If these variables +; are not used within a script, having this directive on will result in a +; performance gain. The PHP directives register_globals, register_long_arrays, +; and register_argc_argv must be disabled for this directive to have any affect. +auto_globals_jit = On + +; Maximum size of POST data that PHP will accept. +post_max_size = 20M + +; Magic quotes +; + +; Magic quotes for incoming GET/POST/Cookie data. +magic_quotes_gpc = On + +; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc. +magic_quotes_runtime = Off + +; Use Sybase-style magic quotes (escape ' with '' instead of \'). +magic_quotes_sybase = Off + +; Automatically add files before or after any PHP document. +auto_prepend_file = +auto_append_file = + +; As of 4.0b4, PHP always outputs a character encoding by default in +; the Content-type: header. To disable sending of the charset, simply +; set it to be empty. +; +; PHP's built-in default is text/html +default_mimetype = "text/html" +;default_charset = "iso-8859-1" + +; Always populate the $HTTP_RAW_POST_DATA variable. +;always_populate_raw_post_data = On + + +;;;;;;;;;;;;;;;;;;;;;;;;; +; Paths and Directories ; +;;;;;;;;;;;;;;;;;;;;;;;;; + +; UNIX: "/path1:/path2" +;include_path = ".:/php/includes" +; +; Windows: "\path1;\path2" +;include_path = ".;c:\php\includes" + +; The root of the PHP pages, used only if nonempty. +; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root +; if you are running php as a CGI under any web server (other than IIS) +; see documentation for security issues. The alternate is to use the +; cgi.force_redirect configuration below +doc_root = + +; The directory under which PHP opens the script using /~username used only +; if nonempty. +user_dir = + +; Directory in which the loadable extensions (modules) reside. +extension_dir = "/usr/lib/php/modules" + +; Whether or not to enable the dl() function. The dl() function does NOT work +; properly in multithreaded servers, such as IIS or Zeus, and is automatically +; disabled on them. +enable_dl = On + +; cgi.force_redirect is necessary to provide security running PHP as a CGI under +; most web servers. Left undefined, PHP turns this on by default. You can +; turn it off here AT YOUR OWN RISK +; **You CAN safely turn this off for IIS, in fact, you MUST.** +; cgi.force_redirect = 1 + +; if cgi.nph is enabled it will force cgi to always sent Status: 200 with +; every request. +; cgi.nph = 1 + +; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape +; (iPlanet) web servers, you MAY need to set an environment variable name that PHP +; will look for to know it is OK to continue execution. Setting this variable MAY +; cause security issues, KNOW WHAT YOU ARE DOING FIRST. +; cgi.redirect_status_env = ; + +; FastCGI under IIS (on WINNT based OS) supports the ability to impersonate +; security tokens of the calling client. This allows IIS to define the +; security context that the request runs under. mod_fastcgi under Apache +; does not currently support this feature (03/17/2002) +; Set to 1 if running under IIS. Default is zero. +; fastcgi.impersonate = 1; + +; Disable logging through FastCGI connection +; fastcgi.log = 0 + +; cgi.rfc2616_headers configuration option tells PHP what type of headers to +; use when sending HTTP response code. If it's set 0 PHP sends Status: header that +; is supported by Apache. When this option is set to 1 PHP will send +; RFC2616 compliant header. +; Default is zero. +;cgi.rfc2616_headers = 0 + + +;;;;;;;;;;;;;;;; +; File Uploads ; +;;;;;;;;;;;;;;;; + +; Whether to allow HTTP file uploads. +file_uploads = On + +; Temporary directory for HTTP uploaded files (will use system default if not +; specified). +;upload_tmp_dir = + +; Maximum allowed size for uploaded files. +upload_max_filesize = 200M + + +;;;;;;;;;;;;;;;;;; +; Fopen wrappers ; +;;;;;;;;;;;;;;;;;; + +; Whether to allow the treatment of URLs (like http:// or ftp://) as files. +allow_url_fopen = On + +; Define the anonymous ftp password (your email address) +;from="john@doe.com" + +; Define the User-Agent string +; user_agent="PHP" + +; Default timeout for socket based streams (seconds) +default_socket_timeout = 60 + +; If your scripts have to deal with files from Macintosh systems, +; or you are running on a Mac and need to deal with files from +; unix or win32 systems, setting this flag will cause PHP to +; automatically detect the EOL character in those files so that +; fgets() and file() will work regardless of the source of the file. +; auto_detect_line_endings = Off + + +;;;;;;;;;;;;;;;;;;;;;; +; Dynamic Extensions ; +;;;;;;;;;;;;;;;;;;;;;; +; +; If you wish to have an extension loaded automatically, use the following +; syntax: +; +; extension=modulename.extension +; +; For example: +; +; extension=msql.so +; + extension=ssh2.so +; Note that it should be the name of the module only; no directory information +; needs to go here. Specify the location of the extension with the +; extension_dir directive above. + + +;;;; +; Note: packaged extension modules are now loaded via the .ini files +; found in the directory /etc/php.d; these are loaded by default. +;;;; + + +;;;;;;;;;;;;;;;;;;; +; Module Settings ; +;;;;;;;;;;;;;;;;;;; + +[Date] +; Defines the default timezone used by the date functions +;date.timezone = + +[Syslog] +; Whether or not to define the various syslog variables (e.g. $LOG_PID, +; $LOG_CRON, etc.). Turning it off is a good idea performance-wise. In +; runtime, you can define these variables by calling define_syslog_variables(). +define_syslog_variables = Off + +[mail function] +; For Win32 only. +SMTP = localhost +smtp_port = 25 + +; For Win32 only. +;sendmail_from = me@example.com + +; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). +sendmail_path = /usr/sbin/sendmail -t -i + +; Force the addition of the specified parameters to be passed as extra parameters +; to the sendmail binary. These parameters will always replace the value of +; the 5th parameter to mail(), even in safe mode. +;mail.force_extra_parameters = + +[SQL] +sql.safe_mode = Off + +[ODBC] +;odbc.default_db = Not yet implemented +;odbc.default_user = Not yet implemented +;odbc.default_pw = Not yet implemented + +; Allow or prevent persistent links. +odbc.allow_persistent = On + +; Check that a connection is still valid before reuse. +odbc.check_persistent = On + +; Maximum number of persistent links. -1 means no limit. +odbc.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +odbc.max_links = -1 + +; Handling of LONG fields. Returns number of bytes to variables. 0 means +; passthru. +odbc.defaultlrl = 4096 + +; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char. +; See the documentation on odbc_binmode and odbc_longreadlen for an explanation +; of uodbc.defaultlrl and uodbc.defaultbinmode +odbc.defaultbinmode = 1 + +[MySQL] +; Allow or prevent persistent links. +mysql.allow_persistent = On + +; Maximum number of persistent links. -1 means no limit. +mysql.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +mysql.max_links = -1 + +; Default port number for mysql_connect(). If unset, mysql_connect() will use +; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the +; compile-time value defined MYSQL_PORT (in that order). Win32 will only look +; at MYSQL_PORT. +mysql.default_port = + +; Default socket name for local MySQL connects. If empty, uses the built-in +; MySQL defaults. +mysql.default_socket = +;mysql.default_socket = /tmp/mysql.sock + +; Default host for mysql_connect() (doesn't apply in safe mode). +mysql.default_host = + +; Default user for mysql_connect() (doesn't apply in safe mode). +mysql.default_user = + +; Default password for mysql_connect() (doesn't apply in safe mode). +; Note that this is generally a *bad* idea to store passwords in this file. +; *Any* user with PHP access can run 'echo get_cfg_var("mysql.default_password") +; and reveal this password! And of course, any users with read access to this +; file will be able to reveal the password as well. +mysql.default_password = + +; Maximum time (in secondes) for connect timeout. -1 means no limit +mysql.connect_timeout = 60 + +; Trace mode. When trace_mode is active (=On), warnings for table/index scans and +; SQL-Errors will be displayed. +mysql.trace_mode = Off + +[MySQLi] + +; Maximum number of links. -1 means no limit. +mysqli.max_links = -1 + +; Default port number for mysqli_connect(). If unset, mysqli_connect() will use +; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the +; compile-time value defined MYSQL_PORT (in that order). Win32 will only look +; at MYSQL_PORT. +mysqli.default_port = 3306 + +; Default socket name for local MySQL connects. If empty, uses the built-in +; MySQL defaults. +mysqli.default_socket = + +; Default host for mysql_connect() (doesn't apply in safe mode). +mysqli.default_host = + +; Default user for mysql_connect() (doesn't apply in safe mode). +mysqli.default_user = + +; Default password for mysqli_connect() (doesn't apply in safe mode). +; Note that this is generally a *bad* idea to store passwords in this file. +; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw") +; and reveal this password! And of course, any users with read access to this +; file will be able to reveal the password as well. +mysqli.default_pw = + +; Allow or prevent reconnect +mysqli.reconnect = Off + +[mSQL] +; Allow or prevent persistent links. +msql.allow_persistent = On + +; Maximum number of persistent links. -1 means no limit. +msql.max_persistent = -1 + +; Maximum number of links (persistent+non persistent). -1 means no limit. +msql.max_links = -1 + +[PostgresSQL] +; Allow or prevent persistent links. +pgsql.allow_persistent = On + +; Detect broken persistent links always with pg_pconnect(). +; Auto reset feature requires a little overheads. +pgsql.auto_reset_persistent = Off + +; Maximum number of persistent links. -1 means no limit. +pgsql.max_persistent = -1 + +; Maximum number of links (persistent+non persistent). -1 means no limit. +pgsql.max_links = -1 + +; Ignore PostgreSQL backends Notice message or not. +; Notice message logging require a little overheads. +pgsql.ignore_notice = 0 + +; Log PostgreSQL backends Noitce message or not. +; Unless pgsql.ignore_notice=0, module cannot log notice message. +pgsql.log_notice = 0 + +[Sybase] +; Allow or prevent persistent links. +sybase.allow_persistent = On + +; Maximum number of persistent links. -1 means no limit. +sybase.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +sybase.max_links = -1 + +;sybase.interface_file = "/usr/sybase/interfaces" + +; Minimum error severity to display. +sybase.min_error_severity = 10 + +; Minimum message severity to display. +sybase.min_message_severity = 10 + +; Compatability mode with old versions of PHP 3.0. +; If on, this will cause PHP to automatically assign types to results according +; to their Sybase type, instead of treating them all as strings. This +; compatability mode will probably not stay around forever, so try applying +; whatever necessary changes to your code, and turn it off. +sybase.compatability_mode = Off + +[Sybase-CT] +; Allow or prevent persistent links. +sybct.allow_persistent = On + +; Maximum number of persistent links. -1 means no limit. +sybct.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +sybct.max_links = -1 + +; Minimum server message severity to display. +sybct.min_server_severity = 10 + +; Minimum client message severity to display. +sybct.min_client_severity = 10 + +[bcmath] +; Number of decimal digits for all bcmath functions. +bcmath.scale = 0 + +[browscap] +;browscap = extra/browscap.ini + +[Informix] +; Default host for ifx_connect() (doesn't apply in safe mode). +ifx.default_host = + +; Default user for ifx_connect() (doesn't apply in safe mode). +ifx.default_user = + +; Default password for ifx_connect() (doesn't apply in safe mode). +ifx.default_password = + +; Allow or prevent persistent links. +ifx.allow_persistent = On + +; Maximum number of persistent links. -1 means no limit. +ifx.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +ifx.max_links = -1 + +; If on, select statements return the contents of a text blob instead of its id. +ifx.textasvarchar = 0 + +; If on, select statements return the contents of a byte blob instead of its id. +ifx.byteasvarchar = 0 + +; Trailing blanks are stripped from fixed-length char columns. May help the +; life of Informix SE users. +ifx.charasvarchar = 0 + +; If on, the contents of text and byte blobs are dumped to a file instead of +; keeping them in memory. +ifx.blobinfile = 0 + +; NULL's are returned as empty strings, unless this is set to 1. In that case, +; NULL's are returned as string 'NULL'. +ifx.nullformat = 0 + +[Session] +; Handler used to store/retrieve data. +session.save_handler = files + +; Argument passed to save_handler. In the case of files, this is the path +; where data files are stored. Note: Windows users have to change this +; variable in order to use PHP's session functions. +; +; As of PHP 4.0.1, you can define the path as: +; +; session.save_path = "N;/path" +; +; where N is an integer. Instead of storing all the session files in +; /path, what this will do is use subdirectories N-levels deep, and +; store the session data in those directories. This is useful if you +; or your OS have problems with lots of files in one directory, and is +; a more efficient layout for servers that handle lots of sessions. +; +; NOTE 1: PHP will not create this directory structure automatically. +; You can use the script in the ext/session dir for that purpose. +; NOTE 2: See the section on garbage collection below if you choose to +; use subdirectories for session storage +; +; The file storage module creates files using mode 600 by default. +; You can change that by using +; +; session.save_path = "N;MODE;/path" +; +; where MODE is the octal representation of the mode. Note that this +; does not overwrite the process's umask. +;session.save_path = "/var/lib/php/session" +session.save_path = "/tmp" + +; Whether to use cookies. +session.use_cookies = 1 + +; This option enables administrators to make their users invulnerable to +; attacks which involve passing session ids in URLs; defaults to 0. +; session.use_only_cookies = 1 + +; Name of the session (used as cookie name). +session.name = PHPSESSID + +; Initialize session on request startup. +session.auto_start = 1 + +; Lifetime in seconds of cookie or, if 0, until browser is restarted. +session.cookie_lifetime = 0 + +; The path for which the cookie is valid. +session.cookie_path = / + +; The domain for which the cookie is valid. +session.cookie_domain = + +; Handler used to serialize data. php is the standard serializer of PHP. +session.serialize_handler = php + +; Define the probability that the 'garbage collection' process is started +; on every session initialization. +; The probability is calculated by using gc_probability/gc_divisor, +; e.g. 1/100 means there is a 1% chance that the GC process starts +; on each request. + +session.gc_probability = 20 +session.gc_divisor = 1000 + +; After this number of seconds, stored data will be seen as 'garbage' and +; cleaned up by the garbage collection process. +session.gc_maxlifetime = 1440 + +; NOTE: If you are using the subdirectory option for storing session files +; (see session.save_path above), then garbage collection does *not* +; happen automatically. You will need to do your own garbage +; collection through a shell script, cron entry, or some other method. +; For example, the following script would is the equivalent of +; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes): +; cd /path/to/sessions; find -cmin +24 | xargs rm + +; PHP 4.2 and less have an undocumented feature/bug that allows you to +; to initialize a session variable in the global scope, albeit register_globals +; is disabled. PHP 4.3 and later will warn you, if this feature is used. +; You can disable the feature and the warning separately. At this time, +; the warning is only displayed, if bug_compat_42 is enabled. + +session.bug_compat_42 = 0 +session.bug_compat_warn = 1 + +; Check HTTP Referer to invalidate externally stored URLs containing ids. +; HTTP_REFERER has to contain this substring for the session to be +; considered as valid. +session.referer_check = + +; How many bytes to read from the file. +session.entropy_length = 0 + +; Specified here to create the session id. +session.entropy_file = + +;session.entropy_length = 16 + +;session.entropy_file = /dev/urandom + +; Set to {nocache,private,public,} to determine HTTP caching aspects +; or leave this empty to avoid sending anti-caching headers. +session.cache_limiter = nocache + +; Document expires after n minutes. +session.cache_expire = 180 + +; trans sid support is disabled by default. +; Use of trans sid may risk your users security. +; Use this option with caution. +; - User may send URL contains active session ID +; to other person via. email/irc/etc. +; - URL that contains active session ID may be stored +; in publically accessible computer. +; - User may access your site with the same session ID +; always using URL stored in browser's history or bookmarks. +session.use_trans_sid = 0 + +; Select a hash function +; 0: MD5 (128 bits) +; 1: SHA-1 (160 bits) +session.hash_function = 0 + +; Define how many bits are stored in each character when converting +; the binary hash data to something readable. +; +; 4 bits: 0-9, a-f +; 5 bits: 0-9, a-v +; 6 bits: 0-9, a-z, A-Z, "-", "," +session.hash_bits_per_character = 5 + +; The URL rewriter will look for URLs in a defined set of HTML tags. +; form/fieldset are special; if you include them here, the rewriter will +; add a hidden field with the info which is otherwise appended +; to URLs. If you want XHTML conformity, remove the form entry. +; Note that all valid entries require a "=", even if no value follows. +url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry" + +[MSSQL] +; Allow or prevent persistent links. +mssql.allow_persistent = On + +; Maximum number of persistent links. -1 means no limit. +mssql.max_persistent = -1 + +; Maximum number of links (persistent+non persistent). -1 means no limit. +mssql.max_links = -1 + +; Minimum error severity to display. +mssql.min_error_severity = 10 + +; Minimum message severity to display. +mssql.min_message_severity = 10 + +; Compatability mode with old versions of PHP 3.0. +mssql.compatability_mode = Off + +; Connect timeout +;mssql.connect_timeout = 5 + +; Query timeout +;mssql.timeout = 60 + +; Valid range 0 - 2147483647. Default = 4096. +;mssql.textlimit = 4096 + +; Valid range 0 - 2147483647. Default = 4096. +;mssql.textsize = 4096 + +; Limits the number of records in each batch. 0 = all records in one batch. +;mssql.batchsize = 0 + +; Specify how datetime and datetim4 columns are returned +; On => Returns data converted to SQL server settings +; Off => Returns values as YYYY-MM-DD hh:mm:ss +;mssql.datetimeconvert = On + +; Use NT authentication when connecting to the server +mssql.secure_connection = Off + +; Specify max number of processes. -1 = library default +; msdlib defaults to 25 +; FreeTDS defaults to 4096 +;mssql.max_procs = -1 + +; Specify client character set. +; If empty or not set the client charset from freetds.comf is used +; This is only used when compiled with FreeTDS +;mssql.charset = "ISO-8859-1" + +[Assertion] +; Assert(expr); active by default. +;assert.active = On + +; Issue a PHP warning for each failed assertion. +;assert.warning = On + +; Don't bail out by default. +;assert.bail = Off + +; User-function to be called if an assertion fails. +;assert.callback = 0 + +; Eval the expression with current error_reporting(). Set to true if you want +; error_reporting(0) around the eval(). +;assert.quiet_eval = 0 + +[Verisign Payflow Pro] +; Default Payflow Pro server. +pfpro.defaulthost = "test-payflow.verisign.com" + +; Default port to connect to. +pfpro.defaultport = 443 + +; Default timeout in seconds. +pfpro.defaulttimeout = 30 + +; Default proxy IP address (if required). +;pfpro.proxyaddress = + +; Default proxy port. +;pfpro.proxyport = + +; Default proxy logon. +;pfpro.proxylogon = + +; Default proxy password. +;pfpro.proxypassword = + +[COM] +; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs +;com.typelib_file = +; allow Distributed-COM calls +;com.allow_dcom = true +; autoregister constants of a components typlib on com_load() +;com.autoregister_typelib = true +; register constants casesensitive +;com.autoregister_casesensitive = false +; show warnings on duplicate constat registrations +;com.autoregister_verbose = true + +[mbstring] +; language for internal character representation. +;mbstring.language = Japanese + +; internal/script encoding. +; Some encoding cannot work as internal encoding. +; (e.g. SJIS, BIG5, ISO-2022-*) +;mbstring.internal_encoding = EUC-JP + +; http input encoding. +;mbstring.http_input = auto + +; http output encoding. mb_output_handler must be +; registered as output buffer to function +;mbstring.http_output = SJIS + +; enable automatic encoding translation according to +; mbstring.internal_encoding setting. Input chars are +; converted to internal encoding by setting this to On. +; Note: Do _not_ use automatic encoding translation for +; portable libs/applications. +;mbstring.encoding_translation = Off + +; automatic encoding detection order. +; auto means +;mbstring.detect_order = auto + +; substitute_character used when character cannot be converted +; one from another +;mbstring.substitute_character = none; + +; overload(replace) single byte functions by mbstring functions. +; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(), +; etc. Possible values are 0,1,2,4 or combination of them. +; For example, 7 for overload everything. +; 0: No overload +; 1: Overload mail() function +; 2: Overload str*() functions +; 4: Overload ereg*() functions +;mbstring.func_overload = 0 + +; enable strict encoding detection. +;mbstring.strict_encoding = Off + +[FrontBase] +;fbsql.allow_persistent = On +;fbsql.autocommit = On +;fbsql.default_database = +;fbsql.default_database_password = +;fbsql.default_host = +;fbsql.default_password = +;fbsql.default_user = "_SYSTEM" +;fbsql.generate_warnings = Off +;fbsql.max_connections = 128 +;fbsql.max_links = 128 +;fbsql.max_persistent = -1 +;fbsql.max_results = 128 +;fbsql.batchSize = 1000 + +[gd] +; Tell the jpeg decode to libjpeg warnings and try to create +; a gd image. The warning will then be displayed as notices +; disabled by default +;gd.jpeg_ignore_warning = 0 + +[exif] +; Exif UNICODE user comments are handled as UCS-2BE/UCS-2LE and JIS as JIS. +; With mbstring support this will automatically be converted into the encoding +; given by corresponding encode setting. When empty mbstring.internal_encoding +; is used. For the decode settings you can distinguish between motorola and +; intel byte order. A decode setting cannot be empty. +;exif.encode_unicode = ISO-8859-15 +;exif.decode_unicode_motorola = UCS-2BE +;exif.decode_unicode_intel = UCS-2LE +;exif.encode_jis = +;exif.decode_jis_motorola = JIS +;exif.decode_jis_intel = JIS + +[Tidy] +; The path to a default tidy configuration file to use when using tidy +;tidy.default_config = /usr/local/lib/php/default.tcfg + +; Should tidy clean and repair output automatically? +; WARNING: Do not use this option if you are generating non-html content +; such as dynamic images +tidy.clean_output = Off + +[soap] +; Enables or disables WSDL caching feature. +soap.wsdl_cache_enabled=1 +; Sets the directory name where SOAP extension will put cache files. +soap.wsdl_cache_dir="/tmp" +; (time to live) Sets the number of second while cached file will be used +; instead of original one. +soap.wsdl_cache_ttl=86400 + +; Local Variables: +; tab-width: 4 +; End: diff --git a/omc/config/php.ini_old_plat b/omc/config/php.ini_old_plat new file mode 100644 index 0000000..ba54fb5 --- /dev/null +++ b/omc/config/php.ini_old_plat @@ -0,0 +1,1223 @@ +[PHP] + +;;;;;;;;;;;;;;;;;;; +; About php.ini ; +;;;;;;;;;;;;;;;;;;; +; This file controls many aspects of PHP's behavior. In order for PHP to +; read it, it must be named 'php.ini'. PHP looks for it in the current +; working directory, in the path designated by the environment variable +; PHPRC, and in the path that was defined in compile time (in that order). +; Under Windows, the compile-time path is the Windows directory. The +; path in which the php.ini file is looked for can be overridden using +; the -c argument in command line mode. +; +; The syntax of the file is extremely simple. Whitespace and Lines +; beginning with a semicolon are silently ignored (as you probably guessed). +; Section headers (e.g. [Foo]) are also silently ignored, even though +; they might mean something in the future. +; +; Directives are specified using the following syntax: +; directive = value +; Directive names are *case sensitive* - foo=bar is different from FOO=bar. +; +; The value can be a string, a number, a PHP constant (e.g. E_ALL or M_PI), one +; of the INI constants (On, Off, True, False, Yes, No and None) or an expression +; (e.g. E_ALL & ~E_NOTICE), or a quoted string ("foo"). +; +; Expressions in the INI file are limited to bitwise operators and parentheses: +; | bitwise OR +; & bitwise AND +; ~ bitwise NOT +; ! boolean NOT +; +; Boolean flags can be turned on using the values 1, On, True or Yes. +; They can be turned off using the values 0, Off, False or No. +; +; An empty string can be denoted by simply not writing anything after the equal +; sign, or by using the None keyword: +; +; foo = ; sets foo to an empty string +; foo = none ; sets foo to an empty string +; foo = "none" ; sets foo to the string 'none' +; +; If you use constants in your value, and these constants belong to a +; dynamically loaded extension (either a PHP extension or a Zend extension), +; you may only use these constants *after* the line that loads the extension. +; +; +;;;;;;;;;;;;;;;;;;; +; About this file ; +;;;;;;;;;;;;;;;;;;; +; This is the recommended, PHP 5-style version of the php.ini-dist file. It +; sets some non standard settings, that make PHP more efficient, more secure, +; and encourage cleaner coding. +; +; The price is that with these settings, PHP may be incompatible with some +; applications, and sometimes, more difficult to develop with. Using this +; file is warmly recommended for production sites. As all of the changes from +; the standard settings are thoroughly documented, you can go over each one, +; and decide whether you want to use it or not. +; +; For general information about the php.ini file, please consult the php.ini-dist +; file, included in your PHP distribution. +; +; This file is different from the php.ini-dist file in the fact that it features +; different values for several directives, in order to improve performance, while +; possibly breaking compatibility with the standard out-of-the-box behavior of +; PHP. Please make sure you read what's different, and modify your scripts +; accordingly, if you decide to use this file instead. +; +; - register_globals = Off [Security, Performance] +; Global variables are no longer registered for input data (POST, GET, cookies, +; environment and other server variables). Instead of using $foo, you must use +; you can use $_REQUEST["foo"] (includes any variable that arrives through the +; request, namely, POST, GET and cookie variables), or use one of the specific +; $_GET["foo"], $_POST["foo"], $_COOKIE["foo"] or $_FILES["foo"], depending +; on where the input originates. Also, you can look at the +; import_request_variables() function. +; Note that register_globals is going to be depracated (i.e., turned off by +; default) in the next version of PHP, because it often leads to security bugs. +; Read http://php.net/manual/en/security.registerglobals.php for further +; information. +; - register_long_arrays = Off [Performance] +; Disables registration of the older (and deprecated) long predefined array +; variables ($HTTP_*_VARS). Instead, use the superglobals that were +; introduced in PHP 4.1.0 +; - display_errors = Off [Security] +; With this directive set to off, errors that occur during the execution of +; scripts will no longer be displayed as a part of the script output, and thus, +; will no longer be exposed to remote users. With some errors, the error message +; content may expose information about your script, web server, or database +; server that may be exploitable for hacking. Production sites should have this +; directive set to off. +; - log_errors = On [Security] +; This directive complements the above one. Any errors that occur during the +; execution of your script will be logged (typically, to your server's error log, +; but can be configured in several ways). Along with setting display_errors to off, +; this setup gives you the ability to fully understand what may have gone wrong, +; without exposing any sensitive information to remote users. +; - output_buffering = 4096 [Performance] +; Set a 4KB output buffer. Enabling output buffering typically results in less +; writes, and sometimes less packets sent on the wire, which can often lead to +; better performance. The gain this directive actually yields greatly depends +; on which Web server you're working with, and what kind of scripts you're using. +; - register_argc_argv = Off [Performance] +; Disables registration of the somewhat redundant $argv and $argc global +; variables. +; - magic_quotes_gpc = Off [Performance] +; Input data is no longer escaped with slashes so that it can be sent into +; SQL databases without further manipulation. Instead, you should use the +; function addslashes() on each input element you wish to send to a database. +; - variables_order = "GPCS" [Performance] +; The environment variables are not hashed into the $_ENV. To access +; environment variables, you can use getenv() instead. +; - error_reporting = E_ALL [Code Cleanliness, Security(?)] +; By default, PHP surpresses errors of type E_NOTICE. These error messages +; are emitted for non-critical errors, but that could be a symptom of a bigger +; problem. Most notably, this will cause error messages about the use +; of uninitialized variables to be displayed. +; - allow_call_time_pass_reference = Off [Code cleanliness] +; It's not possible to decide to force a variable to be passed by reference +; when calling a function. The PHP 4 style to do this is by making the +; function require the relevant argument by reference. + + +;;;;;;;;;;;;;;;;;;;; +; Language Options ; +;;;;;;;;;;;;;;;;;;;; + +; Enable the PHP scripting language engine under Apache. +engine = On + +; Enable compatibility mode with Zend Engine 1 (PHP 4.x) +zend.ze1_compatibility_mode = Off + +; Allow the tags are recognized. +; NOTE: Using short tags should be avoided when developing applications or +; libraries that are meant for redistribution, or deployment on PHP +; servers which are not under your control, because short tags may not +; be supported on the target server. For portable, redistributable code, +; be sure not to use short tags. +short_open_tag = On + +; Allow ASP-style <% %> tags. +asp_tags = Off + +; The number of significant digits displayed in floating point numbers. +precision = 14 + +; Enforce year 2000 compliance (will cause problems with non-compliant browsers) +y2k_compliance = On + +; Output buffering allows you to send header lines (including cookies) even +; after you send body content, at the price of slowing PHP's output layer a +; bit. You can enable output buffering during runtime by calling the output +; buffering functions. You can also enable output buffering for all files by +; setting this directive to On. If you wish to limit the size of the buffer +; to a certain size - you can use a maximum number of bytes instead of 'On', as +; a value for this directive (e.g., output_buffering=4096). +output_buffering = 4096 + +; You can redirect all of the output of your scripts to a function. For +; example, if you set output_handler to "mb_output_handler", character +; encoding will be transparently converted to the specified encoding. +; Setting any output handler automatically turns on output buffering. +; Note: People who wrote portable scripts should not depend on this ini +; directive. Instead, explicitly set the output handler using ob_start(). +; Using this ini directive may cause problems unless you know what script +; is doing. +; Note: You cannot use both "mb_output_handler" with "ob_iconv_handler" +; and you cannot use both "ob_gzhandler" and "zlib.output_compression". +; Note: output_handler must be empty if this is set 'On' !!!! +; Instead you must use zlib.output_handler. +;output_handler = + +; Transparent output compression using the zlib library +; Valid values for this option are 'off', 'on', or a specific buffer size +; to be used for compression (default is 4KB) +; Note: Resulting chunk size may vary due to nature of compression. PHP +; outputs chunks that are few hundreds bytes each as a result of +; compression. If you prefer a larger chunk size for better +; performance, enable output_buffering in addition. +; Note: You need to use zlib.output_handler instead of the standard +; output_handler, or otherwise the output will be corrupted. +zlib.output_compression = Off + +; You cannot specify additional output handlers if zlib.output_compression +; is activated here. This setting does the same as output_handler but in +; a different order. +;zlib.output_handler = + +; Implicit flush tells PHP to tell the output layer to flush itself +; automatically after every output block. This is equivalent to calling the +; PHP function flush() after each and every call to print() or echo() and each +; and every HTML block. Turning this option on has serious performance +; implications and is generally recommended for debugging purposes only. +implicit_flush = Off + +; The unserialize callback function will be called (with the undefined class' +; name as parameter), if the unserializer finds an undefined class +; which should be instantiated. +; A warning appears if the specified function is not defined, or if the +; function doesn't include/implement the missing class. +; So only set this entry, if you really want to implement such a +; callback-function. +unserialize_callback_func= + +; When floats & doubles are serialized store serialize_precision significant +; digits after the floating point. The default value ensures that when floats +; are decoded with unserialize, the data will remain the same. +serialize_precision = 100 + +; Whether to enable the ability to force arguments to be passed by reference +; at function call time. This method is deprecated and is likely to be +; unsupported in future versions of PHP/Zend. The encouraged method of +; specifying which arguments should be passed by reference is in the function +; declaration. You're encouraged to try and turn this option Off and make +; sure your scripts work properly with it in order to ensure they will work +; with future versions of the language (you will receive a warning each time +; you use this feature, and the argument will be passed by value instead of by +; reference). +allow_call_time_pass_reference = Off + +; +; Safe Mode +; +safe_mode = Off + +; By default, Safe Mode does a UID compare check when +; opening files. If you want to relax this to a GID compare, +; then turn on safe_mode_gid. +safe_mode_gid = Off + +; When safe_mode is on, UID/GID checks are bypassed when +; including files from this directory and its subdirectories. +; (directory must also be in include_path or full path must +; be used when including) +safe_mode_include_dir = + +; When safe_mode is on, only executables located in the safe_mode_exec_dir +; will be allowed to be executed via the exec family of functions. +safe_mode_exec_dir = + +; Setting certain environment variables may be a potential security breach. +; This directive contains a comma-delimited list of prefixes. In Safe Mode, +; the user may only alter environment variables whose names begin with the +; prefixes supplied here. By default, users will only be able to set +; environment variables that begin with PHP_ (e.g. PHP_FOO=BAR). +; +; Note: If this directive is empty, PHP will let the user modify ANY +; environment variable! +safe_mode_allowed_env_vars = PHP_ + +; This directive contains a comma-delimited list of environment variables that +; the end user won't be able to change using putenv(). These variables will be +; protected even if safe_mode_allowed_env_vars is set to allow to change them. +safe_mode_protected_env_vars = LD_LIBRARY_PATH + +; open_basedir, if set, limits all file operations to the defined directory +; and below. This directive makes most sense if used in a per-directory +; or per-virtualhost web server configuration file. This directive is +; *NOT* affected by whether Safe Mode is turned On or Off. +;open_basedir = + +; This directive allows you to disable certain functions for security reasons. +; It receives a comma-delimited list of function names. This directive is +; *NOT* affected by whether Safe Mode is turned On or Off. +disable_functions = + +; This directive allows you to disable certain classes for security reasons. +; It receives a comma-delimited list of class names. This directive is +; *NOT* affected by whether Safe Mode is turned On or Off. +disable_classes = + +; Colors for Syntax Highlighting mode. Anything that's acceptable in +; would work. +highlight.string = #DD0000 +highlight.comment = #FF9900 +highlight.keyword = #007700 +highlight.bg = #FFFFFF +highlight.default = #0000BB +highlight.html = #000000 + +; If enabled, the request will be allowed to complete even if the user aborts +; the request. Consider enabling it if executing long request, which may end up +; being interrupted by the user or a browser timing out. +; ignore_user_abort = On + +; Determines the size of the realpath cache to be used by PHP. This value should +; be increased on systems where PHP opens many files to reflect the quantity of +; the file operations performed. +; realpath_cache_size=16k + +; Duration of time, in seconds for which to cache realpath information for a given +; file or directory. For systems with rarely changing files, consider increasing this +; value. +; realpath_cache_ttl=120 + +; +; Misc +; +; Decides whether PHP may expose the fact that it is installed on the server +; (e.g. by adding its signature to the Web server header). It is no security +; threat in any way, but it makes it possible to determine whether you use PHP +; on your server or not. +expose_php = On + + +;;;;;;;;;;;;;;;;;;; +; Resource Limits ; +;;;;;;;;;;;;;;;;;;; + +max_execution_time = 3600 ; Maximum execution time of each script, in seconds +max_input_time = 1024 ; Maximum amount of time each script may spend parsing request data +memory_limit = 20M ; Maximum amount of memory a script may consume + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +; Error handling and logging ; +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +; error_reporting is a bit-field. Or each number up to get desired error +; reporting level +; E_ALL - All errors and warnings (doesn't include E_STRICT) +; E_ERROR - fatal run-time errors +; E_WARNING - run-time warnings (non-fatal errors) +; E_PARSE - compile-time parse errors +; E_NOTICE - run-time notices (these are warnings which often result +; from a bug in your code, but it's possible that it was +; intentional (e.g., using an uninitialized variable and +; relying on the fact it's automatically initialized to an +; empty string) +; E_STRICT - run-time notices, enable to have PHP suggest changes +; to your code which will ensure the best interoperability +; and forward compatibility of your code +; E_CORE_ERROR - fatal errors that occur during PHP's initial startup +; E_CORE_WARNING - warnings (non-fatal errors) that occur during PHP's +; initial startup +; E_COMPILE_ERROR - fatal compile-time errors +; E_COMPILE_WARNING - compile-time warnings (non-fatal errors) +; E_USER_ERROR - user-generated error message +; E_USER_WARNING - user-generated warning message +; E_USER_NOTICE - user-generated notice message +; +; Examples: +; +; - Show all errors, except for notices and coding standards warnings +; +;error_reporting = E_ALL & ~E_NOTICE +; +; - Show all errors, except for notices +; +;error_reporting = E_ALL & ~E_NOTICE | E_STRICT +; +; - Show only errors +; +;error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR +; +; - Show all errors, except coding standards warnings +; +error_reporting = E_ALL & ~E_NOTICE + +; Print out errors (as a part of the output). For production web sites, +; you're strongly encouraged to turn this feature off, and use error logging +; instead (see below). Keeping display_errors enabled on a production web site +; may reveal security information to end users, such as file paths on your Web +; server, your database schema or other information. +display_errors = On + +; Even when display_errors is on, errors that occur during PHP's startup +; sequence are not displayed. It's strongly recommended to keep +; display_startup_errors off, except for when debugging. +display_startup_errors = Off + +; Log errors into a log file (server-specific log, stderr, or error_log (below)) +; As stated above, you're strongly advised to use error logging in place of +; error displaying on production web sites. +log_errors = Off + +; Set maximum length of log_errors. In error_log information about the source is +; added. The default is 1024 and 0 allows to not apply any maximum length at all. +log_errors_max_len = 1024 + +; Do not log repeated messages. Repeated errors must occur in same file on same +; line until ignore_repeated_source is set true. +ignore_repeated_errors = Off + +; Ignore source of message when ignoring repeated messages. When this setting +; is On you will not log errors with repeated messages from different files or +; sourcelines. +ignore_repeated_source = Off + +; If this parameter is set to Off, then memory leaks will not be shown (on +; stdout or in the log). This has only effect in a debug compile, and if +; error reporting includes E_WARNING in the allowed list +report_memleaks = On + +; Store the last error/warning message in $php_errormsg (boolean). +track_errors = Off + +; Disable the inclusion of HTML tags in error messages. +; Note: Never use this feature for production boxes. +;html_errors = Off + +; If html_errors is set On PHP produces clickable error messages that direct +; to a page describing the error or function causing the error in detail. +; You can download a copy of the PHP manual from http://www.php.net/docs.php +; and change docref_root to the base URL of your local copy including the +; leading '/'. You must also specify the file extension being used including +; the dot. +; Note: Never use this feature for production boxes. +;docref_root = "/phpmanual/" +;docref_ext = .html + +; String to output before an error message. +;error_prepend_string = "" + +; String to output after an error message. +;error_append_string = "" + +; Log errors to specified file. +;error_log = filename + +; Log errors to syslog (Event Log on NT, not valid in Windows 95). +;error_log = syslog + + +;;;;;;;;;;;;;;;;; +; Data Handling ; +;;;;;;;;;;;;;;;;; +; +; Note - track_vars is ALWAYS enabled as of PHP 4.0.3 + +; The separator used in PHP generated URLs to separate arguments. +; Default is "&". +;arg_separator.output = "&" + +; List of separator(s) used by PHP to parse input URLs into variables. +; Default is "&". +; NOTE: Every character in this directive is considered as separator! +;arg_separator.input = ";&" + +; This directive describes the order in which PHP registers GET, POST, Cookie, +; Environment and Built-in variables (G, P, C, E & S respectively, often +; referred to as EGPCS or GPC). Registration is done from left to right, newer +; values override older values. +variables_order = "EGPCS" + +; Whether or not to register the EGPCS variables as global variables. You may +; want to turn this off if you don't want to clutter your scripts' global scope +; with user data. This makes most sense when coupled with track_vars - in which +; case you can access all of the GPC variables through the $HTTP_*_VARS[], +; variables. +; +; You should do your best to write your scripts so that they do not require +; register_globals to be on; Using form variables as globals can easily lead +; to possible security problems, if the code is not very well thought of. +register_globals = On + +; Whether or not to register the old-style input arrays, HTTP_GET_VARS +; and friends. If you're not using them, it's recommended to turn them off, +; for performance reasons. +register_long_arrays = On + +; This directive tells PHP whether to declare the argv&argc variables (that +; would contain the GET information). If you don't use these variables, you +; should turn it off for increased performance. +register_argc_argv = On + +; When enabled, the SERVER and ENV variables are created when they're first +; used (Just In Time) instead of when the script starts. If these variables +; are not used within a script, having this directive on will result in a +; performance gain. The PHP directives register_globals, register_long_arrays, +; and register_argc_argv must be disabled for this directive to have any affect. +auto_globals_jit = On + +; Maximum size of POST data that PHP will accept. +post_max_size = 20M + +; Magic quotes +; + +; Magic quotes for incoming GET/POST/Cookie data. +magic_quotes_gpc = On + +; Magic quotes for runtime-generated data, e.g. data from SQL, from exec(), etc. +magic_quotes_runtime = Off + +; Use Sybase-style magic quotes (escape ' with '' instead of \'). +magic_quotes_sybase = Off + +; Automatically add files before or after any PHP document. +auto_prepend_file = +auto_append_file = + +; As of 4.0b4, PHP always outputs a character encoding by default in +; the Content-type: header. To disable sending of the charset, simply +; set it to be empty. +; +; PHP's built-in default is text/html +default_mimetype = "text/html" +;default_charset = "iso-8859-1" + +; Always populate the $HTTP_RAW_POST_DATA variable. +;always_populate_raw_post_data = On + + +;;;;;;;;;;;;;;;;;;;;;;;;; +; Paths and Directories ; +;;;;;;;;;;;;;;;;;;;;;;;;; + +; UNIX: "/path1:/path2" +;include_path = ".:/php/includes" +; +; Windows: "\path1;\path2" +;include_path = ".;c:\php\includes" + +; The root of the PHP pages, used only if nonempty. +; if PHP was not compiled with FORCE_REDIRECT, you SHOULD set doc_root +; if you are running php as a CGI under any web server (other than IIS) +; see documentation for security issues. The alternate is to use the +; cgi.force_redirect configuration below +doc_root = + +; The directory under which PHP opens the script using /~username used only +; if nonempty. +user_dir = + +; Directory in which the loadable extensions (modules) reside. +extension_dir = "/usr/lib/php/modules" + +; Whether or not to enable the dl() function. The dl() function does NOT work +; properly in multithreaded servers, such as IIS or Zeus, and is automatically +; disabled on them. +enable_dl = On + +; cgi.force_redirect is necessary to provide security running PHP as a CGI under +; most web servers. Left undefined, PHP turns this on by default. You can +; turn it off here AT YOUR OWN RISK +; **You CAN safely turn this off for IIS, in fact, you MUST.** +; cgi.force_redirect = 1 + +; if cgi.nph is enabled it will force cgi to always sent Status: 200 with +; every request. +; cgi.nph = 1 + +; if cgi.force_redirect is turned on, and you are not running under Apache or Netscape +; (iPlanet) web servers, you MAY need to set an environment variable name that PHP +; will look for to know it is OK to continue execution. Setting this variable MAY +; cause security issues, KNOW WHAT YOU ARE DOING FIRST. +; cgi.redirect_status_env = ; + +; FastCGI under IIS (on WINNT based OS) supports the ability to impersonate +; security tokens of the calling client. This allows IIS to define the +; security context that the request runs under. mod_fastcgi under Apache +; does not currently support this feature (03/17/2002) +; Set to 1 if running under IIS. Default is zero. +; fastcgi.impersonate = 1; + +; Disable logging through FastCGI connection +; fastcgi.log = 0 + +; cgi.rfc2616_headers configuration option tells PHP what type of headers to +; use when sending HTTP response code. If it's set 0 PHP sends Status: header that +; is supported by Apache. When this option is set to 1 PHP will send +; RFC2616 compliant header. +; Default is zero. +;cgi.rfc2616_headers = 0 + + +;;;;;;;;;;;;;;;; +; File Uploads ; +;;;;;;;;;;;;;;;; + +; Whether to allow HTTP file uploads. +file_uploads = On + +; Temporary directory for HTTP uploaded files (will use system default if not +; specified). +;upload_tmp_dir = + +; Maximum allowed size for uploaded files. +upload_max_filesize = 200M + + +;;;;;;;;;;;;;;;;;; +; Fopen wrappers ; +;;;;;;;;;;;;;;;;;; + +; Whether to allow the treatment of URLs (like http:// or ftp://) as files. +allow_url_fopen = On + +; Define the anonymous ftp password (your email address) +;from="john@doe.com" + +; Define the User-Agent string +; user_agent="PHP" + +; Default timeout for socket based streams (seconds) +default_socket_timeout = 60 + +; If your scripts have to deal with files from Macintosh systems, +; or you are running on a Mac and need to deal with files from +; unix or win32 systems, setting this flag will cause PHP to +; automatically detect the EOL character in those files so that +; fgets() and file() will work regardless of the source of the file. +; auto_detect_line_endings = Off + + +;;;;;;;;;;;;;;;;;;;;;; +; Dynamic Extensions ; +;;;;;;;;;;;;;;;;;;;;;; +; +; If you wish to have an extension loaded automatically, use the following +; syntax: +; +; extension=modulename.extension +; +; For example: +; +; extension=msql.so +; +; Note that it should be the name of the module only; no directory information +; needs to go here. Specify the location of the extension with the +; extension_dir directive above. + + +;;;; +; Note: packaged extension modules are now loaded via the .ini files +; found in the directory /etc/php.d; these are loaded by default. +;;;; + + +;;;;;;;;;;;;;;;;;;; +; Module Settings ; +;;;;;;;;;;;;;;;;;;; + +[Date] +; Defines the default timezone used by the date functions +;date.timezone = + +[Syslog] +; Whether or not to define the various syslog variables (e.g. $LOG_PID, +; $LOG_CRON, etc.). Turning it off is a good idea performance-wise. In +; runtime, you can define these variables by calling define_syslog_variables(). +define_syslog_variables = Off + +[mail function] +; For Win32 only. +SMTP = localhost +smtp_port = 25 + +; For Win32 only. +;sendmail_from = me@example.com + +; For Unix only. You may supply arguments as well (default: "sendmail -t -i"). +sendmail_path = /usr/sbin/sendmail -t -i + +; Force the addition of the specified parameters to be passed as extra parameters +; to the sendmail binary. These parameters will always replace the value of +; the 5th parameter to mail(), even in safe mode. +;mail.force_extra_parameters = + +[SQL] +sql.safe_mode = Off + +[ODBC] +;odbc.default_db = Not yet implemented +;odbc.default_user = Not yet implemented +;odbc.default_pw = Not yet implemented + +; Allow or prevent persistent links. +odbc.allow_persistent = On + +; Check that a connection is still valid before reuse. +odbc.check_persistent = On + +; Maximum number of persistent links. -1 means no limit. +odbc.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +odbc.max_links = -1 + +; Handling of LONG fields. Returns number of bytes to variables. 0 means +; passthru. +odbc.defaultlrl = 4096 + +; Handling of binary data. 0 means passthru, 1 return as is, 2 convert to char. +; See the documentation on odbc_binmode and odbc_longreadlen for an explanation +; of uodbc.defaultlrl and uodbc.defaultbinmode +odbc.defaultbinmode = 1 + +[MySQL] +; Allow or prevent persistent links. +mysql.allow_persistent = On + +; Maximum number of persistent links. -1 means no limit. +mysql.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +mysql.max_links = -1 + +; Default port number for mysql_connect(). If unset, mysql_connect() will use +; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the +; compile-time value defined MYSQL_PORT (in that order). Win32 will only look +; at MYSQL_PORT. +mysql.default_port = + +; Default socket name for local MySQL connects. If empty, uses the built-in +; MySQL defaults. +;mysql.default_socket = +mysql.default_socket = /tmp/mysql.sock + +; Default host for mysql_connect() (doesn't apply in safe mode). +mysql.default_host = + +; Default user for mysql_connect() (doesn't apply in safe mode). +mysql.default_user = + +; Default password for mysql_connect() (doesn't apply in safe mode). +; Note that this is generally a *bad* idea to store passwords in this file. +; *Any* user with PHP access can run 'echo get_cfg_var("mysql.default_password") +; and reveal this password! And of course, any users with read access to this +; file will be able to reveal the password as well. +mysql.default_password = + +; Maximum time (in secondes) for connect timeout. -1 means no limit +mysql.connect_timeout = 60 + +; Trace mode. When trace_mode is active (=On), warnings for table/index scans and +; SQL-Errors will be displayed. +mysql.trace_mode = Off + +[MySQLi] + +; Maximum number of links. -1 means no limit. +mysqli.max_links = -1 + +; Default port number for mysqli_connect(). If unset, mysqli_connect() will use +; the $MYSQL_TCP_PORT or the mysql-tcp entry in /etc/services or the +; compile-time value defined MYSQL_PORT (in that order). Win32 will only look +; at MYSQL_PORT. +mysqli.default_port = 3306 + +; Default socket name for local MySQL connects. If empty, uses the built-in +; MySQL defaults. +mysqli.default_socket = + +; Default host for mysql_connect() (doesn't apply in safe mode). +mysqli.default_host = + +; Default user for mysql_connect() (doesn't apply in safe mode). +mysqli.default_user = + +; Default password for mysqli_connect() (doesn't apply in safe mode). +; Note that this is generally a *bad* idea to store passwords in this file. +; *Any* user with PHP access can run 'echo get_cfg_var("mysqli.default_pw") +; and reveal this password! And of course, any users with read access to this +; file will be able to reveal the password as well. +mysqli.default_pw = + +; Allow or prevent reconnect +mysqli.reconnect = Off + +[mSQL] +; Allow or prevent persistent links. +msql.allow_persistent = On + +; Maximum number of persistent links. -1 means no limit. +msql.max_persistent = -1 + +; Maximum number of links (persistent+non persistent). -1 means no limit. +msql.max_links = -1 + +[PostgresSQL] +; Allow or prevent persistent links. +pgsql.allow_persistent = On + +; Detect broken persistent links always with pg_pconnect(). +; Auto reset feature requires a little overheads. +pgsql.auto_reset_persistent = Off + +; Maximum number of persistent links. -1 means no limit. +pgsql.max_persistent = -1 + +; Maximum number of links (persistent+non persistent). -1 means no limit. +pgsql.max_links = -1 + +; Ignore PostgreSQL backends Notice message or not. +; Notice message logging require a little overheads. +pgsql.ignore_notice = 0 + +; Log PostgreSQL backends Noitce message or not. +; Unless pgsql.ignore_notice=0, module cannot log notice message. +pgsql.log_notice = 0 + +[Sybase] +; Allow or prevent persistent links. +sybase.allow_persistent = On + +; Maximum number of persistent links. -1 means no limit. +sybase.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +sybase.max_links = -1 + +;sybase.interface_file = "/usr/sybase/interfaces" + +; Minimum error severity to display. +sybase.min_error_severity = 10 + +; Minimum message severity to display. +sybase.min_message_severity = 10 + +; Compatability mode with old versions of PHP 3.0. +; If on, this will cause PHP to automatically assign types to results according +; to their Sybase type, instead of treating them all as strings. This +; compatability mode will probably not stay around forever, so try applying +; whatever necessary changes to your code, and turn it off. +sybase.compatability_mode = Off + +[Sybase-CT] +; Allow or prevent persistent links. +sybct.allow_persistent = On + +; Maximum number of persistent links. -1 means no limit. +sybct.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +sybct.max_links = -1 + +; Minimum server message severity to display. +sybct.min_server_severity = 10 + +; Minimum client message severity to display. +sybct.min_client_severity = 10 + +[bcmath] +; Number of decimal digits for all bcmath functions. +bcmath.scale = 0 + +[browscap] +;browscap = extra/browscap.ini + +[Informix] +; Default host for ifx_connect() (doesn't apply in safe mode). +ifx.default_host = + +; Default user for ifx_connect() (doesn't apply in safe mode). +ifx.default_user = + +; Default password for ifx_connect() (doesn't apply in safe mode). +ifx.default_password = + +; Allow or prevent persistent links. +ifx.allow_persistent = On + +; Maximum number of persistent links. -1 means no limit. +ifx.max_persistent = -1 + +; Maximum number of links (persistent + non-persistent). -1 means no limit. +ifx.max_links = -1 + +; If on, select statements return the contents of a text blob instead of its id. +ifx.textasvarchar = 0 + +; If on, select statements return the contents of a byte blob instead of its id. +ifx.byteasvarchar = 0 + +; Trailing blanks are stripped from fixed-length char columns. May help the +; life of Informix SE users. +ifx.charasvarchar = 0 + +; If on, the contents of text and byte blobs are dumped to a file instead of +; keeping them in memory. +ifx.blobinfile = 0 + +; NULL's are returned as empty strings, unless this is set to 1. In that case, +; NULL's are returned as string 'NULL'. +ifx.nullformat = 0 + +[Session] +; Handler used to store/retrieve data. +session.save_handler = files + +; Argument passed to save_handler. In the case of files, this is the path +; where data files are stored. Note: Windows users have to change this +; variable in order to use PHP's session functions. +; +; As of PHP 4.0.1, you can define the path as: +; +; session.save_path = "N;/path" +; +; where N is an integer. Instead of storing all the session files in +; /path, what this will do is use subdirectories N-levels deep, and +; store the session data in those directories. This is useful if you +; or your OS have problems with lots of files in one directory, and is +; a more efficient layout for servers that handle lots of sessions. +; +; NOTE 1: PHP will not create this directory structure automatically. +; You can use the script in the ext/session dir for that purpose. +; NOTE 2: See the section on garbage collection below if you choose to +; use subdirectories for session storage +; +; The file storage module creates files using mode 600 by default. +; You can change that by using +; +; session.save_path = "N;MODE;/path" +; +; where MODE is the octal representation of the mode. Note that this +; does not overwrite the process's umask. +;session.save_path = "/var/lib/php/session" +session.save_path = "/tmp" + +; Whether to use cookies. +session.use_cookies = 1 + +; This option enables administrators to make their users invulnerable to +; attacks which involve passing session ids in URLs; defaults to 0. +; session.use_only_cookies = 1 + +; Name of the session (used as cookie name). +session.name = PHPSESSID + +; Initialize session on request startup. +session.auto_start = 1 + +; Lifetime in seconds of cookie or, if 0, until browser is restarted. +session.cookie_lifetime = 0 + +; The path for which the cookie is valid. +session.cookie_path = / + +; The domain for which the cookie is valid. +session.cookie_domain = + +; Handler used to serialize data. php is the standard serializer of PHP. +session.serialize_handler = php + +; Define the probability that the 'garbage collection' process is started +; on every session initialization. +; The probability is calculated by using gc_probability/gc_divisor, +; e.g. 1/100 means there is a 1% chance that the GC process starts +; on each request. + +session.gc_probability = 20 +session.gc_divisor = 1000 + +; After this number of seconds, stored data will be seen as 'garbage' and +; cleaned up by the garbage collection process. +session.gc_maxlifetime = 1440 + +; NOTE: If you are using the subdirectory option for storing session files +; (see session.save_path above), then garbage collection does *not* +; happen automatically. You will need to do your own garbage +; collection through a shell script, cron entry, or some other method. +; For example, the following script would is the equivalent of +; setting session.gc_maxlifetime to 1440 (1440 seconds = 24 minutes): +; cd /path/to/sessions; find -cmin +24 | xargs rm + +; PHP 4.2 and less have an undocumented feature/bug that allows you to +; to initialize a session variable in the global scope, albeit register_globals +; is disabled. PHP 4.3 and later will warn you, if this feature is used. +; You can disable the feature and the warning separately. At this time, +; the warning is only displayed, if bug_compat_42 is enabled. + +session.bug_compat_42 = 0 +session.bug_compat_warn = 1 + +; Check HTTP Referer to invalidate externally stored URLs containing ids. +; HTTP_REFERER has to contain this substring for the session to be +; considered as valid. +session.referer_check = + +; How many bytes to read from the file. +session.entropy_length = 0 + +; Specified here to create the session id. +session.entropy_file = + +;session.entropy_length = 16 + +;session.entropy_file = /dev/urandom + +; Set to {nocache,private,public,} to determine HTTP caching aspects +; or leave this empty to avoid sending anti-caching headers. +session.cache_limiter = nocache + +; Document expires after n minutes. +session.cache_expire = 180 + +; trans sid support is disabled by default. +; Use of trans sid may risk your users security. +; Use this option with caution. +; - User may send URL contains active session ID +; to other person via. email/irc/etc. +; - URL that contains active session ID may be stored +; in publically accessible computer. +; - User may access your site with the same session ID +; always using URL stored in browser's history or bookmarks. +session.use_trans_sid = 0 + +; Select a hash function +; 0: MD5 (128 bits) +; 1: SHA-1 (160 bits) +session.hash_function = 0 + +; Define how many bits are stored in each character when converting +; the binary hash data to something readable. +; +; 4 bits: 0-9, a-f +; 5 bits: 0-9, a-v +; 6 bits: 0-9, a-z, A-Z, "-", "," +session.hash_bits_per_character = 5 + +; The URL rewriter will look for URLs in a defined set of HTML tags. +; form/fieldset are special; if you include them here, the rewriter will +; add a hidden field with the info which is otherwise appended +; to URLs. If you want XHTML conformity, remove the form entry. +; Note that all valid entries require a "=", even if no value follows. +url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry" + +[MSSQL] +; Allow or prevent persistent links. +mssql.allow_persistent = On + +; Maximum number of persistent links. -1 means no limit. +mssql.max_persistent = -1 + +; Maximum number of links (persistent+non persistent). -1 means no limit. +mssql.max_links = -1 + +; Minimum error severity to display. +mssql.min_error_severity = 10 + +; Minimum message severity to display. +mssql.min_message_severity = 10 + +; Compatability mode with old versions of PHP 3.0. +mssql.compatability_mode = Off + +; Connect timeout +;mssql.connect_timeout = 5 + +; Query timeout +;mssql.timeout = 60 + +; Valid range 0 - 2147483647. Default = 4096. +;mssql.textlimit = 4096 + +; Valid range 0 - 2147483647. Default = 4096. +;mssql.textsize = 4096 + +; Limits the number of records in each batch. 0 = all records in one batch. +;mssql.batchsize = 0 + +; Specify how datetime and datetim4 columns are returned +; On => Returns data converted to SQL server settings +; Off => Returns values as YYYY-MM-DD hh:mm:ss +;mssql.datetimeconvert = On + +; Use NT authentication when connecting to the server +mssql.secure_connection = Off + +; Specify max number of processes. -1 = library default +; msdlib defaults to 25 +; FreeTDS defaults to 4096 +;mssql.max_procs = -1 + +; Specify client character set. +; If empty or not set the client charset from freetds.comf is used +; This is only used when compiled with FreeTDS +;mssql.charset = "ISO-8859-1" + +[Assertion] +; Assert(expr); active by default. +;assert.active = On + +; Issue a PHP warning for each failed assertion. +;assert.warning = On + +; Don't bail out by default. +;assert.bail = Off + +; User-function to be called if an assertion fails. +;assert.callback = 0 + +; Eval the expression with current error_reporting(). Set to true if you want +; error_reporting(0) around the eval(). +;assert.quiet_eval = 0 + +[Verisign Payflow Pro] +; Default Payflow Pro server. +pfpro.defaulthost = "test-payflow.verisign.com" + +; Default port to connect to. +pfpro.defaultport = 443 + +; Default timeout in seconds. +pfpro.defaulttimeout = 30 + +; Default proxy IP address (if required). +;pfpro.proxyaddress = + +; Default proxy port. +;pfpro.proxyport = + +; Default proxy logon. +;pfpro.proxylogon = + +; Default proxy password. +;pfpro.proxypassword = + +[COM] +; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs +;com.typelib_file = +; allow Distributed-COM calls +;com.allow_dcom = true +; autoregister constants of a components typlib on com_load() +;com.autoregister_typelib = true +; register constants casesensitive +;com.autoregister_casesensitive = false +; show warnings on duplicate constat registrations +;com.autoregister_verbose = true + +[mbstring] +; language for internal character representation. +;mbstring.language = Japanese + +; internal/script encoding. +; Some encoding cannot work as internal encoding. +; (e.g. SJIS, BIG5, ISO-2022-*) +;mbstring.internal_encoding = EUC-JP + +; http input encoding. +;mbstring.http_input = auto + +; http output encoding. mb_output_handler must be +; registered as output buffer to function +;mbstring.http_output = SJIS + +; enable automatic encoding translation according to +; mbstring.internal_encoding setting. Input chars are +; converted to internal encoding by setting this to On. +; Note: Do _not_ use automatic encoding translation for +; portable libs/applications. +;mbstring.encoding_translation = Off + +; automatic encoding detection order. +; auto means +;mbstring.detect_order = auto + +; substitute_character used when character cannot be converted +; one from another +;mbstring.substitute_character = none; + +; overload(replace) single byte functions by mbstring functions. +; mail(), ereg(), etc are overloaded by mb_send_mail(), mb_ereg(), +; etc. Possible values are 0,1,2,4 or combination of them. +; For example, 7 for overload everything. +; 0: No overload +; 1: Overload mail() function +; 2: Overload str*() functions +; 4: Overload ereg*() functions +;mbstring.func_overload = 0 + +; enable strict encoding detection. +;mbstring.strict_encoding = Off + +[FrontBase] +;fbsql.allow_persistent = On +;fbsql.autocommit = On +;fbsql.default_database = +;fbsql.default_database_password = +;fbsql.default_host = +;fbsql.default_password = +;fbsql.default_user = "_SYSTEM" +;fbsql.generate_warnings = Off +;fbsql.max_connections = 128 +;fbsql.max_links = 128 +;fbsql.max_persistent = -1 +;fbsql.max_results = 128 +;fbsql.batchSize = 1000 + +[gd] +; Tell the jpeg decode to libjpeg warnings and try to create +; a gd image. The warning will then be displayed as notices +; disabled by default +;gd.jpeg_ignore_warning = 0 + +[exif] +; Exif UNICODE user comments are handled as UCS-2BE/UCS-2LE and JIS as JIS. +; With mbstring support this will automatically be converted into the encoding +; given by corresponding encode setting. When empty mbstring.internal_encoding +; is used. For the decode settings you can distinguish between motorola and +; intel byte order. A decode setting cannot be empty. +;exif.encode_unicode = ISO-8859-15 +;exif.decode_unicode_motorola = UCS-2BE +;exif.decode_unicode_intel = UCS-2LE +;exif.encode_jis = +;exif.decode_jis_motorola = JIS +;exif.decode_jis_intel = JIS + +[Tidy] +; The path to a default tidy configuration file to use when using tidy +;tidy.default_config = /usr/local/lib/php/default.tcfg + +; Should tidy clean and repair output automatically? +; WARNING: Do not use this option if you are generating non-html content +; such as dynamic images +tidy.clean_output = Off + +[soap] +; Enables or disables WSDL caching feature. +soap.wsdl_cache_enabled=1 +; Sets the directory name where SOAP extension will put cache files. +soap.wsdl_cache_dir="/tmp" +; (time to live) Sets the number of second while cached file will be used +; instead of original one. +soap.wsdl_cache_ttl=86400 + +; Local Variables: +; tab-width: 4 +; End: diff --git a/omc/config/profile b/omc/config/profile new file mode 100644 index 0000000..5571da1 --- /dev/null +++ b/omc/config/profile @@ -0,0 +1,48 @@ +# /etc/profile + +# System wide environment and startup programs, for login setup +# Functions and aliases go in /etc/bashrc + + +# Path manipulation +if [ `id -u` = 0 ] && ! echo $PATH | /bin/grep -q "/sbin" ; then + PATH=/sbin:$PATH +fi + +if [ `id -u` = 0 ] && ! echo $PATH | /bin/grep -q "/usr/sbin" ; then + PATH=/usr/sbin:$PATH +fi + +if [ `id -u` = 0 ] && ! echo $PATH | /bin/grep -q "/usr/local/sbin" ; then + PATH=/usr/local/sbin:$PATH +fi + +if ! echo $PATH | /bin/grep -q "/usr/X11R6/bin" ; then + PATH="$PATH:/usr/X11R6/bin" +fi + +# No core files by default +#ulimit -S -c 0 > /dev/null 2>&1 +ulimit -c unlimited + +USER=`id -un` +LOGNAME=$USER +MAIL="/var/spool/mail/$USER" + +HOSTNAME=`/bin/hostname` +HISTSIZE=1000 + +if [ -z "$INPUTRC" -a ! -f "$HOME/.inputrc" ]; then + INPUTRC=/etc/inputrc +fi + +export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC + +for i in /etc/profile.d/*.sh ; do + if [ -r $i ]; then + . $i + fi +done + +unset i +PATH="/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/etc/rc.d/init.d" diff --git a/omc/config/rsyncd.conf b/omc/config/rsyncd.conf new file mode 100644 index 0000000..283a113 --- /dev/null +++ b/omc/config/rsyncd.conf @@ -0,0 +1,15 @@ +uid=mysql +gid=mysql +use chroot=no +max connections=4 +pid file=/var/run/rsyncd.pid +lock file=/var/run/rsync.lock +log file=/var/log/rsyncd.log + +[data] +path=/usr/local/mysql/data/ +list=true + +[conf] +path=/usr/local/omc/bin/conf/ +list=true diff --git a/omc/config/server.conf b/omc/config/server.conf new file mode 100644 index 0000000..bbc8f32 --- /dev/null +++ b/omc/config/server.conf @@ -0,0 +1,31 @@ +[host] +omc_master = omc-0 +mysql_master = omc-0 + +omc_slave = omc-1 +mysql_slave = omc-1 + +[master_task] +#processor option +iptrans -d +paraComm -d +subsComm -d +logCollector -d +omcCleaner -d +smcli -d +cdrCollector -d +subsDataBackup -d +ftpSend -d +alarmAgent -d +nrtrde -d +sftpSend -d +cstaCollector -d +[slave_task] +iptrans -d +paraComm -d +subsComm -d +logCollector -d +omcCleaner -d +smcli -d +cdrCollector -d + diff --git a/omc/config/server.crt b/omc/config/server.crt new file mode 100644 index 0000000..404427b --- /dev/null +++ b/omc/config/server.crt @@ -0,0 +1,61 @@ +Certificate: + Data: + Version: 3 (0x2) + Serial Number: 2 (0x2) + Signature Algorithm: sha1WithRSAEncryption + Issuer: C=CN, ST=Guangdong, L=Shenzhen, O=altobridge, OU=acrd, CN=omc/emailAddress=omc@adc.com + Validity + Not Before: Mar 8 15:10:28 2010 GMT + Not After : Mar 8 15:10:28 2011 GMT + Subject: C=CN, ST=Guangdong, O=altobridge, OU=acrd, CN=emsserver/emailAddress=ems@adc.com + Subject Public Key Info: + Public Key Algorithm: rsaEncryption + RSA Public Key: (1024 bit) + Modulus (1024 bit): + 00:d2:97:80:bc:58:94:01:44:2c:04:7a:60:7c:12: + 43:25:6c:60:3a:9f:b9:c2:09:f6:3d:63:34:07:45: + 40:3e:f9:45:3c:20:86:35:d7:89:77:22:73:f2:70: + cb:f7:7f:54:a0:16:d4:eb:b2:5c:f2:d1:95:ab:55: + 38:c6:30:46:c6:d0:76:02:0d:a7:e5:9f:49:3f:ee: + 0a:83:b0:9e:c1:61:78:2a:89:c1:67:93:c2:af:85: + 04:f5:61:ee:52:f1:e1:d0:1f:c7:22:80:54:91:1b: + 70:c4:bc:ad:f5:c7:17:a5:b1:cc:b5:71:1e:72:17: + aa:8a:50:37:b5:85:a0:f5:8b + Exponent: 65537 (0x10001) + X509v3 extensions: + X509v3 Basic Constraints: + CA:FALSE + Netscape Comment: + OpenSSL Generated Certificate + X509v3 Subject Key Identifier: + 09:3E:B8:08:1E:EB:8F:33:B1:E9:F8:88:E6:5C:52:A9:21:9A:2B:D8 + X509v3 Authority Key Identifier: + keyid:C9:72:91:A2:E4:0C:F6:E0:56:4B:6B:CB:B6:51:53:D4:C9:D5:CB:7C + + Signature Algorithm: sha1WithRSAEncryption + 9f:62:1a:23:1b:36:7a:62:95:f5:bd:bc:d4:a7:32:29:37:8d: + 17:55:1a:51:0d:99:c8:93:96:a3:60:ba:b0:92:74:52:41:1f: + bd:dc:35:78:5e:92:ba:61:81:77:76:49:7f:66:73:72:f5:8f: + bc:99:ac:3c:93:da:17:72:8d:9d:9d:74:fd:87:aa:9b:91:4a: + 17:37:49:e2:71:58:1e:2d:ec:5b:ee:49:e7:3b:90:c3:88:76: + f5:59:e8:7e:7f:e7:d3:55:f7:96:a5:9b:04:b9:e2:38:65:b0: + 99:29:14:d1:f2:b9:26:29:74:a1:f5:64:67:84:38:53:b1:ce: + 9e:6d +-----BEGIN CERTIFICATE----- +MIIC6TCCAlKgAwIBAgIBAjANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMCQ04x +EjAQBgNVBAgTCUd1YW5nZG9uZzERMA8GA1UEBxMIU2hlbnpoZW4xEzARBgNVBAoT +CmFsdG9icmlkZ2UxDTALBgNVBAsTBGFjcmQxDDAKBgNVBAMTA29tYzEaMBgGCSqG +SIb3DQEJARYLb21jQGFkYy5jb20wHhcNMTAwMzA4MTUxMDI4WhcNMTEwMzA4MTUx +MDI4WjB1MQswCQYDVQQGEwJDTjESMBAGA1UECBMJR3Vhbmdkb25nMRMwEQYDVQQK +EwphbHRvYnJpZGdlMQ0wCwYDVQQLEwRhY3JkMRIwEAYDVQQDEwllbXNzZXJ2ZXIx +GjAYBgkqhkiG9w0BCQEWC2Vtc0BhZGMuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GN +ADCBiQKBgQDSl4C8WJQBRCwEemB8EkMlbGA6n7nCCfY9YzQHRUA++UU8IIY114l3 +InPycMv3f1SgFtTrslzy0ZWrVTjGMEbG0HYCDafln0k/7gqDsJ7BYXgqicFnk8Kv +hQT1Ye5S8eHQH8cigFSRG3DEvK31xxelscy1cR5yF6qKUDe1haD1iwIDAQABo3sw +eTAJBgNVHRMEAjAAMCwGCWCGSAGG+EIBDQQfFh1PcGVuU1NMIEdlbmVyYXRlZCBD +ZXJ0aWZpY2F0ZTAdBgNVHQ4EFgQUCT64CB7rjzOx6fiI5lxSqSGaK9gwHwYDVR0j +BBgwFoAUyXKRouQM9uBWS2vLtlFT1MnVy3wwDQYJKoZIhvcNAQEFBQADgYEAn2Ia +Ixs2emKV9b281KcyKTeNF1UaUQ2ZyJOWo2C6sJJ0UkEfvdw1eF6SumGBd3ZJf2Zz +cvWPvJmsPJPaF3KNnZ10/Yeqm5FKFzdJ4nFYHi3sW+5J5zuQw4h29Vnofn/n01X3 +lqWbBLniOGWwmSkU0fK5Jil0ofVkZ4Q4U7HOnm0= +-----END CERTIFICATE----- diff --git a/omc/config/server.csr b/omc/config/server.csr new file mode 100644 index 0000000..5e3fc04 --- /dev/null +++ b/omc/config/server.csr @@ -0,0 +1,13 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIB8zCCAVwCAQAwgYgxCzAJBgNVBAYTAkNOMRIwEAYDVQQIEwlHdWFuZ2Rvbmcx +ETAPBgNVBAcTCFNoZW56aGVuMRMwEQYDVQQKEwphbHRvYnJpZGdlMQ0wCwYDVQQL +EwRhY3JkMRIwEAYDVQQDEwllbXNzZXJ2ZXIxGjAYBgkqhkiG9w0BCQEWC2Vtc0Bh +ZGMuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDSl4C8WJQBRCwEemB8 +EkMlbGA6n7nCCfY9YzQHRUA++UU8IIY114l3InPycMv3f1SgFtTrslzy0ZWrVTjG +MEbG0HYCDafln0k/7gqDsJ7BYXgqicFnk8KvhQT1Ye5S8eHQH8cigFSRG3DEvK31 +xxelscy1cR5yF6qKUDe1haD1iwIDAQABoCowEQYJKoZIhvcNAQkCMQQTAmFiMBUG +CSqGSIb3DQEJBzEIEwYxMjM0NTYwDQYJKoZIhvcNAQEFBQADgYEAnL/xEe7QAk8B +QOdb5imoP9KpW/5rGXTpKxbdH7SiiyysE8Qre42cdSfd707JU93ei6vNEqgrv8wA +YTgWnvGRYmDzRFTCtX04CoRprVFhfuPtR0pFCT/aPfX+7oLfP9sS1Dy1dkK82Ivs +S6gf1/rCzhe4HtOPisbDwQtyv7RW6bg= +-----END CERTIFICATE REQUEST----- diff --git a/omc/config/server.key b/omc/config/server.key new file mode 100644 index 0000000..650e936 --- /dev/null +++ b/omc/config/server.key @@ -0,0 +1,15 @@ +-----BEGIN RSA PRIVATE KEY----- +MIICWwIBAAKBgQDSl4C8WJQBRCwEemB8EkMlbGA6n7nCCfY9YzQHRUA++UU8IIY1 +14l3InPycMv3f1SgFtTrslzy0ZWrVTjGMEbG0HYCDafln0k/7gqDsJ7BYXgqicFn +k8KvhQT1Ye5S8eHQH8cigFSRG3DEvK31xxelscy1cR5yF6qKUDe1haD1iwIDAQAB +AoGAVZfoZiUmeuFHdsZ6otMVYYeMESfMa3Z7E/ZXNkFKXI4aOtcJVab2I2rob3iz +HjQtpCfDgMztBHB1Ab9QpRUIHpeFm5HFs8xv3rA1Z0ZRHjACaVd15ErbL/lO/w4u +e4Tp6CPM1I95kmTm2a32T5Q7AytfS3DJHUKFbGpINN4zUBECQQD3vJ5uDEn/djuw +igGQcQ0rN1kXNC2nx1ubZZEtLj8iymjD9BeMbBI/oAtf9mxmArpBXIMp2Deiy0/x +E2X2s7XpAkEA2Z21oLrMeWAF/4zzEr+lpod2hZ31+gSzKM24mIhvMXZd0W5C+HZe +rXD++WZvuRwnFs3zU95dezzAEZ2ztRlDUwJADKfiIBUYoqhTnE0wj0R3O8H0Fy9f +NbcFgwbJR9mY+BoHCBusKExNElsGubxJBV0WTsh/GuAk13gzeUlYaCX+IQJAKR4q +dl81SW3CVGHuf8lkZE3OMDsDgiUnMPuF+JQ25lKmMW8zCj1bcEwccUVQsNpH7IAn +jN5ELYfyBqIUlZBbbwJATpp3YTito8bYKyX6vTtuKRARSzxz7PY7lcwT5MiobIk+ +oHubU8eSARm9vDGqgZU4vFNcLjhTlTRuIynr4Gm4Pw== +-----END RSA PRIVATE KEY----- diff --git a/omc/config/snmp.conf b/omc/config/snmp.conf new file mode 100644 index 0000000..e83534c --- /dev/null +++ b/omc/config/snmp.conf @@ -0,0 +1,19 @@ +[version-3] +[engine-2] +engineType=0 +securityLevel=3 +userName=pierre +authPassword=maplesyrup +privacyPassword=maplesyrup +engineID=00000063000000A19BE2CAC5 +contextName= + +[engine-3] +engineType=1 +securityLevel=3 +userName=pierre +authPassword=maplesyrup +privacyPassword=maplesyrup +engineID=00000063000000A19BE2CAC5 +contextName= +contextEngineID= diff --git a/omc/plat/.copyarea.db b/omc/plat/.copyarea.db new file mode 100644 index 0000000..7bc0e0c --- /dev/null +++ b/omc/plat/.copyarea.db @@ -0,0 +1,29 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat +2 +19 +4:smpp|2|0|0|0|fc296eabbfa511dc866b001c23e19543|0 +4:isup|2|0|0|0|e6696767bfa411dc852a001c23e19543|0 +7:iptrans|2|0|0|0|d51966f0bfa411dc851a001c23e19543|0 +a:lost+found|2|0|0|0|63d949bbbfa011dc819a001c23e19543|0 +4:mtp3|2|0|0|0|49e96a03bfa511dc85a0001c23e19543|0 +4:xapp|2|0|0|0|3859703cbfa611dc86a4001c23e19543|0 +6:public|2|0|0|0|59696a6bbfa511dc85ad001c23e19543|0 +4:snmp|2|0|0|0|1e196f91bfa611dc868f001c23e19543|0 +4:isdn|2|0|0|0|fe87fa67808c11dd88a4001c23e19543|0 +6:haepub|2|0|0|0|ce8966c5bfa411dc8515001c23e19543|0 +3:sip|2|0|0|0|d437f94b808c11dd889f001c23e19543|0 +6:mgc_v2|2|0|0|0|7730c1eca0da11dd9cdb001c23e19543|0 +4:bicc|2|0|0|0|952644599a8511dd8b36001c23e19543|0 +4:mgcp|2|0|0|0|3cc969a9bfa511dc8595001c23e19543|0 +4:sccp|2|0|0|0|5e18819ac44711dc962e001c23e19543|0 +5:debug|2|0|0|0|c899669dbfa411dc8511001c23e19543|0 +4:tcap|2|0|0|0|2bd96fecbfa611dc869a001c23e19543|0 +3:mgc|2|0|0|0|30496955bfa511dc8589001c23e19543|0 +4:8ecp|2|0|0|0|a4d965b7bfa411dc84ed001c23e19543|0 +3:pal|2|0|0|0|731472cf6cf311dd91c7001c23e19543|0 +5:mgcv2|2|0|0|0|da0645189a8a11dd8b34001c23e19543|0 +4:m2ua|2|0|0|0|fb3967f0bfa411dc8544001c23e19543|0 +3:rtp|2|0|0|0|89b96bacbfa511dc85d9001c23e19543|0 +3:scf|2|0|0|0|f2996e6fbfa511dc8664001c23e19543|0 +3:aif|2|0|0|0|840d286ec9bd11dc8b49001c23e19543|0 diff --git a/omc/plat/8ecp/.copyarea.db b/omc/plat/8ecp/.copyarea.db new file mode 100644 index 0000000..2670287 --- /dev/null +++ b/omc/plat/8ecp/.copyarea.db @@ -0,0 +1,9 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\8ecp +2 +5 +3:doc|2|0|0|0|a56965d3bfa411dc84ed001c23e19543|0 +2:ut|2|0|0|0|a99966cfbfa411dc84ed001c23e19543|0 +3:src|2|0|0|0|a6996627bfa411dc84ed001c23e19543|0 +8:Makefile|1|11d70a3d83e|b3e|1818c81f|a609660bbfa411dc84ed001c23e19543|0 +3:lib|2|0|0|0|a56965efbfa411dc84ed001c23e19543|0 diff --git a/omc/plat/8ecp/Makefile b/omc/plat/8ecp/Makefile new file mode 100644 index 0000000..e1f1687 --- /dev/null +++ b/omc/plat/8ecp/Makefile @@ -0,0 +1,96 @@ + +##----------------------------------------------------------## +## ## +## Universal Makefile for module Version : V1.4 ## +## ## +## Created : Wei Liu 07/04/11 ## +## Revision: [Last]Wei Liu 07/06/18 ## +## ## +##----------------------------------------------------------## + +##---------------------------------------------------------------------## +##-------------------------------------- +## +## Project correlation(Customer define) +## +##-------------------------------------- + +## MODULE= [Module Name] +## TYPE = app/plat => Module Type + +## DBUG_FLAGS_ADD = [Module Define Gcc Flags for Debug ] +## DBUG_FLAGS_ADD = [Module Define Gcc Flags for Release] + +## BUILD = lib/exef => Output file format +## CFG = debug/release => Build Configuration + +## SRC_PATH = [Source file path] +## INC_PATH = [Include file path] +## APP_PATH = [App Module path] +## PLT_PATH = [Plat Module path] + +## PLT_LIB = [Needed plat lib for Link] => just for test or wxc2main +## APP_LIB = [Needed app lib for Link] => just for test or wxc2main +## LIB_ADD = [Needed Extend lib for Link] => just for test or wxc2main + +## PLT_LIB e.g. = haepub fsm mng proto kernel aif mgc mgcp sip rtp \ +## 8ecp bicc smpp xapp tcap mtp3 m2ua \ +## snmp iptrans debug sccp public +## +## APP_LIB e.g. = msc vlr ssf hlr ae pps mnp smsc vms aas +## LIB_ADD e.g. = -liba3a8 -lm + +## OBJ_ADD = [Extend third party object files needed] +## TEST_OBJ_PATH = [module object files Path for test ] => just for test +##---------------------------------------------------------------------## + + + +MODULE = 8ecp +TYPE = plat + +DBUG_FLAGS_ADD = +RELS_FLAGS_ADD = + +##Default commonly as below + +BUILD = lib +CFG = debug + +PLT_LIB = public debug iptrans snmp mtp3 +APP_LIB = +LIB_ADD = + +SRC_PATH = ./src +INC_PATH = ./src/include +PLT_PATH = ../../plat +APP_PATH = ../../mss + +OBJ_ADD = +TEST_OBJ_PATH = ../../obj + +##---------------------------------------------------------------------## +##-------------------------------------- +## +## Make configuration(Customer define) +## +##-------------------------------------- + +## CCFLAG_SWITCH = on/off => gcc flag show on/off +## COVER_NEED = yes/no => PTF cover report needed +## COVER_REPORT_PATH = [path ] => PTF cover report path + +CCFLAG_SWITCH = off +COVER_NEED = no +COVER_REPORT_PATH = ./ut/ut_doc/output + +##---------------------------------------------------------------------## + + +##-------------------------------------- +## +## include makefile.rules (Do not change) +## +##-------------------------------------- +include Makefile.rules + diff --git a/omc/plat/8ecp/lib/lib8ecp.a b/omc/plat/8ecp/lib/lib8ecp.a new file mode 100644 index 0000000000000000000000000000000000000000..8c6141e86a46308c553e6a4f924b50a970031c98 GIT binary patch literal 38998 zcmd^oeSFl_mG^IEa+AsH1QK3F7~T{WLV|!uL8BNQ@QuYcKy3)g z*ynlfCo}h+?>+b2bI*PG-QRES?_~0#hVI7JbBbn%GefmSnza2L4$rHe&m3!tJkOip zdH!=g-e<)fp7)o3t~hV`(%6E!CCj~deMh{-Yi#Ils*fkSlZ^?lenGUctA1@;tcjD! zm_;;pM;j8+OE2QQrf7RqlP%H2(&Y>`cE)1S#zcK%YpmUYni3t&4wUGOMHx!8bws

OmRL@)~W$ARS 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 literal 0 HcmV?d00001 diff --git a/omc/plat/8ecp/obj/8ecp_debug.o b/omc/plat/8ecp/obj/8ecp_debug.o new file mode 100644 index 0000000000000000000000000000000000000000..954e2320118781204f13bbd0fba1f5988a8e7842 GIT binary patch literal 17816 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 a@VQG%=e8fd+sdckceU0y!HN{y?f?G(fxtEZ literal 0 HcmV?d00001 diff --git a/omc/plat/8ecp/src/.copyarea.db b/omc/plat/8ecp/src/.copyarea.db new file mode 100644 index 0000000..ef0b6cc --- /dev/null +++ b/omc/plat/8ecp/src/.copyarea.db @@ -0,0 +1,7 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\8ecp\src +2 +3 +c:8ecp_debug.c|1|11d70a3d909|1e8c|adf63b13|a8696697bfa411dc84ed001c23e19543|0 +6:8ecp.c|1|11d70a3d957|201f|3c43c25e|a8f966b3bfa411dc84ed001c23e19543|0 +7:include|2|0|0|0|a6996643bfa411dc84ed001c23e19543|0 diff --git a/omc/plat/8ecp/src/8ecp.c b/omc/plat/8ecp/src/8ecp.c new file mode 100644 index 0000000..1c8f237 --- /dev/null +++ b/omc/plat/8ecp/src/8ecp.c @@ -0,0 +1,288 @@ +#include "./include/8ecp.h" +#include +#include +#include "./include/8ecp_debug.h" + +SAP_In_8ECP SAPIn8ECP; +//time_t t[_8KE1_NUM]; //save the time when the heartbeat message of a 8KE1 was received. +BYTE s_msg[128]; +Card_Struct card_struct[_8KE1_NUM]; +int _8ecp_bind (_8ECP_SAP * sap) +{ + if (SAPIn8ECP.inUse == InUse) + { + perror ("unable to bind a SAP, because the SAP is in use."); + return -1; + } + else //If bind successful, save the user name and the functions + { + SAPIn8ECP.inUse = InUse; + strcpy (SAPIn8ECP._8ecp_sap.name, (*sap).name); + SAPIn8ECP._8ecp_sap.update_mg_status = sap->update_mg_status; + SAPIn8ECP._8ecp_sap.update_trk_status = sap->update_trk_status; + return 0; + } +} +int _8ecp_unbind (BYTE sapIndex) +{ + if (sapIndex != 0) + { + perror ("unable to unbind the SAP, because the SAP is not in use"); + return -1; + } + else //If unbind successful, set the default value of SAPIn8ECP + { + SAPIn8ECP.inUse = NotInUse; + memset (SAPIn8ECP._8ecp_sap.name, 0, + strlen (SAPIn8ECP._8ecp_sap.name)); + SAPIn8ECP._8ecp_sap.update_mg_status = NULL; + SAPIn8ECP._8ecp_sap.update_trk_status = NULL; + return 0; + } +} + +int _8ecp_createMG(WORD mgNo, DWORD ip, BYTE cardNo) +{ + card_struct[cardNo].mgNo = mgNo; + card_struct[cardNo].ip = ip; + return 1; +} + + +int _8ecp_deleteMG(WORD mgNo, DWORD ip, BYTE cardNo) +{ + if(card_struct[cardNo].ip != ip) + { + printf("the ip is not correct, in 8ecp the ip of card %d is: %ld\n", cardNo, card_struct[cardNo].ip); + return 0; + } + if(card_struct[cardNo].mgNo != mgNo) + { + printf("the mgNo is not correct, in 8ecp the mgNo of card %d is: %d\n", cardNo, card_struct[cardNo].mgNo); + return 0; + } + card_struct[cardNo].ip = 0;; + card_struct[cardNo].mgNo = 0; + return 1; +} + + +/* +calcurate the IP address where the 8ECP PDU will be sent to +*/ +struct sockaddr_in getIP (WORD orgChnl) +{ + //char ip3, ip[16]; + //WORD mgNo; + BYTE cardNo; + struct sockaddr_in s; + /* ip3 = orgChnl / 256; //the ID of the 8KE1 + sprintf (ip, "172.18.%d.1", ip3); + */ + cardNo = orgChnl / 256; + memset (&s, 0, sizeof (struct sockaddr)); + s.sin_family = AF_INET; + s.sin_port = htons (PORT); + s.sin_addr.s_addr = card_struct[cardNo].ip; + bzero (&(s.sin_zero), 8); + return s; +} +void _8ecp_connect_chnl (WORD orgChnl, WORD dstChnl, BYTE ecDisable) +{ + //int i; + DWORD tempip; + _8ECP_PDU _8ecp_pdu; + message_list msg_list; + struct sockaddr_in sin_addr; + BYTE temstr[15]; + if (!SAPIn8ECP.inUse) + { + perror ("SAP is not bind!"); + return; + } + sin_addr = getIP (orgChnl); + memset (&_8ecp_pdu, 0, sizeof (struct _8ECP_PDU)); + _8ecp_pdu.CPC_IFA_Inf = 0x87; + if (ecDisable == 0) + _8ecp_pdu.type = 0; + else if (ecDisable == 1) + _8ecp_pdu.type = 06; + else + { + perror ("the value of ecDisable is error!"); + return; + } + _8ecp_pdu.sourceTimeSlotNo = orgChnl % 256; //the ID of the timeslot on the 8KE1 + _8ecp_pdu.dstModuleID = dstChnl / 256; + _8ecp_pdu.dstTimeSlotNo = dstChnl % 256; + msg_list.msgSrcPort = PORT; + msg_list.msgDstIP = sin_addr.sin_addr.s_addr; + tempip = ntohl(msg_list.msgDstIP); + msg_list.msgDstPort = PORT; + msg_list.msgLength = sizeof (_8ecp_pdu); + memcpy (msg_list.msgContent, &_8ecp_pdu, msg_list.msgLength); + memcpy(&temstr,&_8ecp_pdu, msg_list.msgLength); + log_procedure(0, temstr); //0:Send msg 1:recv msg + iptrPutMessage (msg_list); +} +void _8ecp_connect_dtmf (WORD orgChnl, WORD dstChnl, BYTE dtmfNo) +{ + struct sockaddr_in sin_addr; + //int i; + BYTE temstr[15]; + _8ECP_PDU _8ecp_pdu; + message_list msg_list; + if (!SAPIn8ECP.inUse) + { + perror ("SAP is not bind!"); + return; + } + sin_addr = getIP (orgChnl); + memset (&_8ecp_pdu, 0, sizeof (struct _8ECP_PDU)); + _8ecp_pdu.CPC_IFA_Inf = 0x87; + _8ecp_pdu.type = 03; + _8ecp_pdu.sourceTimeSlotNo = orgChnl % 256; //the ID of the timeslot on the 8KE1 + _8ecp_pdu.dstModuleID = dstChnl / 256; + _8ecp_pdu.dstTimeSlotNo = dstChnl % 256; + _8ecp_pdu.Value = dtmfNo; + msg_list.msgSrcPort = PORT; + msg_list.msgDstIP = sin_addr.sin_addr.s_addr; + msg_list.msgDstPort = PORT; + msg_list.msgLength = sizeof (_8ecp_pdu); + memcpy (msg_list.msgContent, &_8ecp_pdu, msg_list.msgLength); + memcpy(&temstr, &_8ecp_pdu, msg_list.msgLength); + log_procedure(0, temstr); + iptrPutMessage (msg_list); +} +void _8ecp_connect_tone (WORD orgChnl, WORD dstChnl, BYTE toneNo, WORD duration) +{ + struct sockaddr_in sin_addr; + //int i; + BYTE temstr[15]; + _8ECP_PDU _8ecp_pdu; + message_list msg_list; + sin_addr = getIP (orgChnl); + if (!SAPIn8ECP.inUse) + { + perror ("SAP is not bind!"); + return; + } + sin_addr = getIP (orgChnl); + memset (&_8ecp_pdu, 0, sizeof (struct _8ECP_PDU)); + _8ecp_pdu.CPC_IFA_Inf = 0x87; + _8ecp_pdu.type = 2; + _8ecp_pdu.sourceTimeSlotNo = orgChnl % 256; //the ID of the timeslot on the 8KE1 + _8ecp_pdu.dstModuleID = dstChnl / 256; + _8ecp_pdu.dstTimeSlotNo = dstChnl % 256; + _8ecp_pdu.Value = toneNo; + _8ecp_pdu.duration = duration; + msg_list.msgSrcPort = PORT; + msg_list.msgDstIP = sin_addr.sin_addr.s_addr; + msg_list.msgDstPort = PORT; + msg_list.msgLength = sizeof (_8ecp_pdu); + memcpy (msg_list.msgContent, &_8ecp_pdu, msg_list.msgLength); + memcpy(&temstr, &_8ecp_pdu, msg_list.msgLength); + log_procedure(0, temstr); + iptrPutMessage (msg_list); +} +void _8ecp_timer () +{ + + _8ecp_mon (); +} +int trap_proc (BYTE oid_len, DWORD * oid_ptr, BYTE * pdata, BYTE msg_len, + snmp_addr * addr) +{ + DWORD * oid_in; + WORD mgNo; + BYTE cardNo; + BYTE temstr[128]; + //int i, index; + //time_t now; + if(oid_ptr[10] != 1) + return 0; + if(oid_ptr[11] != 1) + return 0; + if(oid_ptr[12] != 4) + return 0; + + log_procedure(1, pdata); + + memset(&temstr, 0, sizeof(temstr)); + oid_in = oid_ptr + OID_Prefix; + cardNo = E1NumOnCSU * pdata[0] + pdata[1]; + mgNo = card_struct[cardNo].mgNo; + if ((SAPIn8ECP._8ecp_sap.update_mg_status == NULL)||(mgNo == 0)) + return 0; + else + SAPIn8ECP._8ecp_sap.update_mg_status (mgNo, 1); + if ((SAPIn8ECP._8ecp_sap.update_trk_status == NULL) || (mgNo ==0)) + return 0; + else + { + { + if(pdata[25]&0x01) + SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 0, 1); //trk on MG is nok + else + SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 0, 0); //trk on MG is nok + } + { + if(pdata[25]&0x02) + SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 1, 1); //trk on MG is nok + else + SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 1, 0); //trk on MG is nok + } + { + if(pdata[25]&0x04) + SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 2, 1); //trk on MG is nok + else + SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 2, 0); //trk on MG is nok + } + { + if(pdata[25]&0x08) + SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 3, 1); //trk on MG is nok + else + SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 3, 0); //trk on MG is nok + } + { + if(pdata[25]&0x10) + SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 4, 1); //trk on MG is nok + else + SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 4, 0); //trk on MG is nok + } + { + if(pdata[25]&0x20) + SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 5, 1); //trk on MG is nok + else + SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 5, 0); //trk on MG is nok + } + { + if(pdata[25]&0x40) + SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 6, 1); //trk on MG is nok + else + SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 6, 0); //trk on MG is nok + } + { + if(pdata[25]&0x80) + SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 7, 1); //trk on MG is nok + else + SAPIn8ECP._8ecp_sap.update_trk_status (mgNo, 7, 0); //trk on MG is nok + } + } + return 0; +} +void _8ecp_init () +{ + printf ("8ECP init start!\n"); + SAPIn8ECP.inUse = NotInUse; + memset (SAPIn8ECP._8ecp_sap.name, 0, sizeof (SAPIn8ECP._8ecp_sap.name)); + SAPIn8ECP._8ecp_sap.update_mg_status = NULL; + SAPIn8ECP._8ecp_sap.update_trk_status = NULL; + //memset (&t, 0, sizeof (t)); + memset(&card_struct, 0, sizeof(Card_Struct)); + _8ecp_debug_set (); + inquire_trapmsg ((void *) trap_proc); //register, get heartbeat msg + printf ("8ECP init complete!\n"); +} + + diff --git a/omc/plat/8ecp/src/8ecp_debug.c b/omc/plat/8ecp/src/8ecp_debug.c new file mode 100644 index 0000000..da966f5 --- /dev/null +++ b/omc/plat/8ecp/src/8ecp_debug.c @@ -0,0 +1,352 @@ +#include "./include/8ecp.h" + +#define _8ECP_DEBUG_ID 20 +#define _8ECP_VER_DEBUG "R9V0_01p1" + + +BYTE _8ecp_asciin_buf[MAX_ASCIIIN_LEN]; +BYTE _8ecp_asciout_buf[MAX_ASCIIOUT_LEN]; +WORD monitor_flag; +BYTE _8ecp_sg_mon_flag[MAX_MG_NO]; +BYTE _8ecp_trk_mon_flag[MAX_TRK_NO]; +BYTE _8ecp_chl_mon_flag[MAX_CHL_NO]; + +BYTE tempstr[128]; +BYTE tempstr1[256]; +static BYTE log_help[] = {"8ECP Debug Monitor Help:\n\r\ +1.[help]\n\r\ +2.[log all/none]\n\r\ +3.[log error on/off]\n\r\ +4.[log mg -mg_no on/off]\n\r\ +5.[log trk -mg_no -trk_no on/off]\n\r\ +6.[log chl -mg_no -trk_no -chnl_no on/off]\n\r\n\r"}; + +static WORD disp_page[128]; +static BYTE *disp_ptr = (BYTE *) disp_page; + +static DWORD debug_status_id[20] = + {1,3,6,1,4,1,1373,1,1,2,3,1,2, _8ECP_DEBUG_ID + 2, 1}; +static BYTE debug_status = 1; + +static DWORD debug_name_id[20] = + {1,3,6,1,4,1,1373,1,1,2,3,1,2,_8ECP_DEBUG_ID + 2,2}; + +static DWORD debug_ascin_id[20] = + {1, 3, 6, 1, 4, 1, 1373, 1, 1, 2, 3, 1, 2, _8ECP_DEBUG_ID + 2, 3}; + +static DWORD debug_ascout_id[20] = + {1, 3, 6, 1, 4, 1, 1373, 1, 1, 2, 3, 1, 2, _8ECP_DEBUG_ID + 2, 4}; + +static DWORD debug_page_title[20] = + {1,3,6,1,4,1,1373,1,1,2,3,1,2,_8ECP_DEBUG_ID + 2,1,1}; + +static DWORD debug_page_line[20] = + {1,3,6,1,4,1,1373,1,1,2,3,1,2,_8ECP_DEBUG_ID + 2, 1,2,1}; + +static BYTE title1_p[] = +{ + " 8ECP Page\n\r\ + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\ +Message Info\n\r\ +"}; + +BYTE _8ecp_disp_line(BYTE page, BYTE line) +{ + BYTE disp_length; + disp_length = 16; + disp_ptr = (BYTE *) disp_page; + switch (page) + { + case 1: + if (line == 0) + { + disp_ptr = (BYTE *) &disp_page[page]; + disp_length = 2; + } + else + { + if(tempstr != NULL) + disp_ptr = (BYTE *)tempstr; + } + + break; + default: + disp_length = 0; + break; + } + return disp_length; +} + +void _8ecp_disp_page(BYTE page) +{ + BYTE disp_line; + BYTE disp_length; + debug_page_line[PAGE_POINT] = page + 5; + for (disp_line = 0; disp_line < 22; disp_line++) + { + disp_length = _8ecp_disp_line(page, disp_line); + debug_page_line[LINE_POINT] = disp_line + 2; + debug_page_line[LINE_POINT + 1] = 2; // Data Pointer + debug_set_response(BASE_ID_LEN + 2, debug_page_line, disp_ptr, disp_length); + } +} + + +int _8ecp_asciout_proc (BYTE * out_ptr) +{ + int out_len; + out_len = strlen (out_ptr); + if (out_len + strlen (_8ecp_asciout_buf) > MAX_ASCIIOUT_LEN - 2) + { + strcpy (_8ecp_asciout_buf, out_ptr); + } + else + { + strcat (_8ecp_asciout_buf, out_ptr); + } + return 1; +} +int _8ecp_debug_set (void) +{ + BYTE page; + BYTE data[10]; + BYTE *ptr; + bzero(disp_page,128); + ptr = data; + bzero(_8ecp_sg_mon_flag,MAX_MG_NO); + bzero(_8ecp_trk_mon_flag,MAX_TRK_NO); + bzero(_8ecp_chl_mon_flag,MAX_CHL_NO); + bzero(tempstr, 40); + + debug_set_response(BASE_ID_LEN, debug_status_id, &debug_status, 1); + debug_set_response(BASE_ID_LEN, debug_name_id, _8ECP_VER_DEBUG, 10); + debug_set_response (BASE_ID_LEN, debug_ascin_id, _8ecp_asciin_buf, 4096); + debug_set_response (BASE_ID_LEN, debug_ascout_id, _8ecp_asciout_buf, 4096); + + for (page = 1; page < 2; page++) + { + switch (page) + { + case 1: //page 1 + ptr = title1_p; + break; + default: + break; + } + + debug_page_title[PAGE_POINT] = 5 + page; + debug_set_response(BASE_ID_LEN + 1, debug_page_title, ptr, strlen(ptr)); + _8ecp_disp_page(page); + } + return 1; +} + +void log_procedure(BYTE flag, BYTE* tempstr) +{ + int i; + if(flag == 0) + { + for(i = 0; i < 15; i ++) + sprintf(&tempstr1[3*i], " %02x",tempstr[i]); + } + else if(flag == 1) + { + for(i = 0; i < 41; i ++) + sprintf(&tempstr1[3*i], " %02x",tempstr[i]); + } + if(monitor_flag == MONITOR_ALL) + { + if(flag == 0) + { + _8ecp_asciout_proc("\33[32mSend:\33[0m"); + _8ecp_asciout_proc(tempstr1); + _8ecp_asciout_proc("\n"); + } + else if(flag == 1) + { + _8ecp_asciout_proc("\33[33mReceive:\33[0m"); + _8ecp_asciout_proc(tempstr1); + _8ecp_asciout_proc("\n"); + } + } + else + { + if(flag == 1) + { + for(i = 0; i < MAX_MG_NO; i ++) + { + if(_8ecp_sg_mon_flag[i] == 1) + { + if(tempstr[11] == i) + _8ecp_asciout_proc(tempstr); + } + } + for(i = 0; i < MAX_TRK_NO; i++) + { + if(_8ecp_trk_mon_flag[i] == 1) + if(tempstr[12] / 32 == i) + _8ecp_asciout_proc(tempstr); + } + for(i = 0; i < MAX_CHL_NO; i++) + { + if(_8ecp_chl_mon_flag[i] == 1) + if(tempstr[12] == i) + _8ecp_asciout_proc(tempstr); + } + } + } +} + + +void _8ecp_mon (void) +{ + WORD str_len; + BYTE * ascii_in_ptr = NULL; + BYTE * tmpStr; + DWORD mgNo = 0, trkNo = 0, chlNo = 0; + BYTE error_flag = 0; + if ((str_len = strlen (_8ecp_asciin_buf)) > 0) + { + ascii_in_ptr = _8ecp_asciin_buf + 1; + if (strcmp (ascii_in_ptr, "log all") == 0) + { + monitor_flag = MONITOR_ALL; + } + else if (strcmp (ascii_in_ptr, "log none") == 0) + { + monitor_flag = MONITOR_NONE; + } + else if (strcmp (ascii_in_ptr, "help") == 0) + { + _8ecp_asciout_proc (log_help); + } + else if (strcmp (ascii_in_ptr, "log error on") == 0) + { + monitor_flag = MONITOR_ERROR_ON; + } + else if (strcmp (ascii_in_ptr, "log error off") == 0) + { + monitor_flag = MONITOR_ERROR_OFF; + } + else if ((strstr (ascii_in_ptr, "log mg")) != NULL) + { + if ((tmpStr = strstr (ascii_in_ptr, "-")) != NULL) + { + mgNo = strtoul (tmpStr + 1, NULL, 10); + if (mgNo >= 0 && mgNo <= 31) + { + if (strstr (ascii_in_ptr, "on") != NULL) + { + _8ecp_sg_mon_flag[mgNo] = 1; + } + else if (strstr (ascii_in_ptr, "off") != NULL) + { + _8ecp_sg_mon_flag[mgNo] = 0; + } + } + else + error_flag = 1; //the format of command is error + } + else + error_flag = 1; + } + else if (strstr (ascii_in_ptr, "log trk")) + { + if ((tmpStr = strstr (ascii_in_ptr, "-")) != NULL) + { + mgNo = strtoul (tmpStr + 1, NULL, 10); + if (mgNo >= 0 && mgNo <= 31) + { + while (*++tmpStr != '\0') //get the next char '-' + { + if (*tmpStr == '-') + { + trkNo = strtoul (tmpStr + 1, NULL, 10); + if (trkNo >= 0 && trkNo <= 7) + { + if (strstr (tmpStr, "on") != NULL) + { + _8ecp_trk_mon_flag[mgNo * 8 + trkNo] = 1; + } + else if (strstr (tmpStr, "off") != NULL) + { + _8ecp_trk_mon_flag[mgNo * 8 + trkNo] = 0; + } + } + else + error_flag = 1; + break; + } + } + + } + else + error_flag = 1; + } + else + error_flag = 1; + } + else if (strstr (ascii_in_ptr, "log chl")) + { + if ((tmpStr = strstr (ascii_in_ptr, "-")) != NULL) + { + mgNo = strtoul (tmpStr + 1, NULL, 10); + if (mgNo >= 0 && mgNo <= 31) + { + while (*++tmpStr != '\0') //get the next char '-' + { + if (*tmpStr == '-') + { + trkNo = strtoul (tmpStr + 1, NULL, 10); + if (trkNo >= 0 && trkNo <= 7) + { + while (*++tmpStr != '\0') //get the next char '-' + { + if (*tmpStr == '-') + { + chlNo = strtoul (tmpStr + 1, NULL, 10); + if (chlNo >= 0 && chlNo <= 31) + { + if (strstr (tmpStr, "on") != NULL) + { + _8ecp_chl_mon_flag[mgNo * 8 * 32 + chlNo] = 1; + } + + else if (strstr (tmpStr, "off") != NULL) + { + _8ecp_chl_mon_flag[mgNo * 8 * 32 + chlNo] = 0; + } + } + + else + error_flag = 1; + break; + } + } + break; + } + else + error_flag = 1; + } + } + } + else + error_flag = 1; + } + else + { + error_flag = 1; + } + } + else + error_flag = 1; + + if (error_flag == 0) + _8ecp_asciout_proc("Command OK!\n\r"); + else + _8ecp_asciout_proc("Command Error!\n\r"); + + strcpy (_8ecp_asciin_buf, "\0"); + } + +} diff --git a/omc/plat/8ecp/src/include/.copyarea.db b/omc/plat/8ecp/src/include/.copyarea.db new file mode 100644 index 0000000..fe3eb84 --- /dev/null +++ b/omc/plat/8ecp/src/include/.copyarea.db @@ -0,0 +1,6 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\8ecp\src\include +2 +2 +c:8ecp_debug.h|1|11d70a3da32|29d|7b16c4f9|a7c9667bbfa411dc84ed001c23e19543|0 +6:8ecp.h|1|11d70a3d9f3|db8|3029f304|a739665fbfa411dc84ed001c23e19543|0 diff --git a/omc/plat/8ecp/src/include/8ecp.h b/omc/plat/8ecp/src/include/8ecp.h new file mode 100644 index 0000000..150ee8d --- /dev/null +++ b/omc/plat/8ecp/src/include/8ecp.h @@ -0,0 +1,149 @@ +#ifndef _8ECP__H +#define _8ECP__H + +#include +#include +#include +#include +#include +#include "../../../public/src/include/includes.h" +#include "../../../public/src/include/public.h" +#include "../../../iptrans/src/include/iptrans.h" +#include "../../../snmp/src/include/snmp.h" +#include "../../../debug/src/include/debug.h" + +#include "./8ecp_debug.h" + +extern BYTE s_msg[128]; + +#ifndef _8ECP_MAX_USER_NAME_LEN +#define _8ECP_MAX_USER_NAME_LEN 100 +#endif + +#ifndef _8KE1_NUM +#define _8KE1_NUM 32 +#endif + +#ifndef MAX_DELAY +#define MAX_DELAY 1 //the max delay time of heartbeat message +#endif + + +#ifndef PORT +#define PORT 4950 +#endif + +#ifndef OID_Prefix +#define OID_Prefix 8 +#endif + +#ifndef InUSE +#define InUse 1 +#endif + +#ifndef NotInUse +#define NotInUse 0 +#endif + +#ifndef TrkStartIndex +#define TrkStartIndex 8 //the first index of trkno in the heartbeat msg +#endif + +#ifndef E1NumOnCSU +#define E1NumOnCSU 16 +#endif + +#ifndef _T_BYTE +#define _T_BYTE +typedef unsigned char BYTE; +#endif + +#ifndef _T_WORD +#define _T_WORD +typedef unsigned short WORD; +#endif + +#ifndef _T_DWORD +#define _T_DWORD +typedef unsigned int DWORD; +#endif + + +typedef struct _8ECP_SAP +{ +char name[_8ECP_MAX_USER_NAME_LEN]; + +//8ECP module will use these callback functions to update 8E1 MG and trunk status +//Return 0 if success, return -1 if failure +int (*update_mg_status)(BYTE mgNo, BYTE status); +int (*update_trk_status)(BYTE mgNo, BYTE trkNo, BYTE status); + +}_8ECP_SAP; + + +typedef struct _8ECP_PDU //the message send to IPTRANS +{ + BYTE reserved; + BYTE lenInd; + BYTE CPC_IFA_Inf; //fixed value 0x87 + BYTE dstRef[2]; + BYTE reserved1; + BYTE sourceRef[2]; + BYTE reserved2; + BYTE type; //00=connect time slot with echo + //01=connect ack + //02=connect tone + //03=connect DTMF + //04=connect group + //05=disconnect group + //06=connect time slot without echo + BYTE sourceTimeSlotNo; + BYTE dstModuleID; + BYTE dstTimeSlotNo; + BYTE Value; /*when type=02, + 0=tone#0, 1=tone#1, 2=tone#2, 3=tone#3, + 4=tone#4, 5=tone#5/,6=tone#6, 7=tone#7 + + when type=03 + 0=DTMF1, 1=DTMF2, 2=DTMF3, 3=DTMF4, + 4=DTMF5, 5=DTMF6, 6=DTMF7, 7=DTMF8, + 8=DTMF9, 9=DTMF0, 10=DTMF*, 11=DTMF# + + */ + + BYTE duration; + + +}_8ECP_PDU; + + +// the struct of SAP in 8ecp +typedef struct _SAP_In_8ECP +{ + BYTE inUse; + _8ECP_SAP _8ecp_sap; +}SAP_In_8ECP; + +// the struct of MG in 8ecp +typedef struct Card_Struct +{ +// WORD mgNo; + DWORD ip; + BYTE mgNo; +}Card_Struct; + + + +//8ecp interface +int _8ecp_bind(_8ECP_SAP *sap); +int _8ecp_unbind(BYTE sapIndex); + +int _8ecp_createMG(WORD mgNo, DWORD ip, BYTE cardNo); //create or update MG +int _8ecp_deleteMG(WORD mgNo, DWORD ip, BYTE cardNo); //delete MG + +void _8ecp_connect_chnl(WORD orgChnl, WORD dstChnl, BYTE ecDisable); //ecDisable:0/1=enable/disable echo canceller +void _8ecp_connect_dtmf(WORD orgChnl, WORD dstChnl, BYTE dtmfNo); +void _8ecp_connect_tone(WORD orgChnl, WORD dstChnl, BYTE toneNo, WORD duration); +void _8ecp_init(); //called in the main program during initialization stage +void _8ecp_timer(); //called every 10ms in the main program +#endif diff --git a/omc/plat/8ecp/src/include/8ecp_debug.h b/omc/plat/8ecp/src/include/8ecp_debug.h new file mode 100644 index 0000000..a6f93b2 --- /dev/null +++ b/omc/plat/8ecp/src/include/8ecp_debug.h @@ -0,0 +1,33 @@ +#ifndef _8ECP_DEBUG_H +#define _8ECP_DEBUG_H + +#define BASE_ID_LEN 15 +#define PAGE_POINT 14 +#define LINE_POINT 15 +#define MAX_ASCIIIN_LEN 4096 +#define MAX_ASCIIOUT_LEN 4096 +#define MONITOR_ERROR_OFF 3 +#define MONITOR_ERROR_ON 2 +#define MONITOR_ALL 1 +#define MONITOR_NONE 0 +#define MAX_MG_NO 32 +#define MAX_TRK_NO MAX_MG_NO * 8 +#define MAX_CHL_NO MAX_TRK_NO * 32 + +#ifndef _T_BYTE +#define _T_BYTE +typedef unsigned char BYTE; +#endif + +#ifndef _T_WORD +#define _T_WORD +typedef unsigned short WORD; +#endif + + + +int _8ecp_debug_set(void); +int _8ecp_asciout_proc(BYTE* out_ptr); +void _8ecp_mon(void); +void log_procedure(BYTE flag, BYTE* tempstr); +#endif diff --git a/omc/plat/aif/.copyarea.db b/omc/plat/aif/.copyarea.db new file mode 100644 index 0000000..c438c34 --- /dev/null +++ b/omc/plat/aif/.copyarea.db @@ -0,0 +1,9 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\aif +2 +5 +3:doc|2|0|0|0|5eb881a3c44711dc962f001c23e19543|0 +2:ut|2|0|0|0|624881bac44711dc9633001c23e19543|0 +3:src|2|0|0|0|598baa37051f11dd8b58001c23e19543|0 +8:Makefile|1|11d70a3daed|b57|6a82d06f|ab596627bfa411dc84f1001c23e19543|0 +3:lib|2|0|0|0|ab59660bbfa411dc84f1001c23e19543|0 diff --git a/omc/plat/aif/Makefile b/omc/plat/aif/Makefile new file mode 100644 index 0000000..e56b564 --- /dev/null +++ b/omc/plat/aif/Makefile @@ -0,0 +1,95 @@ + +##----------------------------------------------------------## +## ## +## Universal Makefile for module Version : V1.4 ## +## ## +## Created : Wei Liu 07/04/11 ## +## Revision: [Last]Wei Liu 07/06/18 ## +## ## +##----------------------------------------------------------## + +##---------------------------------------------------------------------## +##-------------------------------------- +## +## Project correlation(Customer define) +## +##-------------------------------------- + +## MODULE= [Module Name] +## TYPE = app/plat => Module Type + +## DBUG_FLAGS_ADD = [Module Define Gcc Flags for Debug ] +## DBUG_FLAGS_ADD = [Module Define Gcc Flags for Release] + +## BUILD = lib/exef => Output file format +## CFG = debug/release => Build Configuration + +## SRC_PATH = [Source file path] +## INC_PATH = [Include file path] +## APP_PATH = [App Module path] +## PLT_PATH = [Plat Module path] + +## PLT_LIB = [Needed plat lib for Link] => just for test or wxc2main +## APP_LIB = [Needed app lib for Link] => just for test or wxc2main +## LIB_ADD = [Needed Extend lib for Link] => just for test or wxc2main + +## PLT_LIB e.g. = haepub fsm mng proto kernel aif mgc mgcp sip rtp \ +## 8ecp bicc smpp xapp tcap mtp3 m2ua \ +## snmp iptrans debug sccp public +## +## APP_LIB e.g. = msc vlr ssf hlr ae pps mnp smsc vms aas +## LIB_ADD e.g. = -liba3a8 -lm + +## OBJ_ADD = [Extend third party object files needed] +## TEST_OBJ_PATH = [module object files Path for test ] => just for test +##---------------------------------------------------------------------## + + + +MODULE = aif +TYPE = plat + +DBUG_FLAGS_ADD = -D_AIFG_DEBUG_ +RELS_FLAGS_ADD = + +##Default commonly as below + +BUILD = lib +CFG = debug + +PLT_LIB = cunit public debug iptrans snmp mtp3 sccp +APP_LIB = +LIB_ADD = + +SRC_PATH = ./src +INC_PATH = ./src/include +PLT_PATH = ../../plat +APP_PATH = ../../app + +OBJ_ADD = +TEST_OBJ_PATH = ../../obj + +##---------------------------------------------------------------------## +##-------------------------------------- +## +## Make configuration(Customer define) +## +##-------------------------------------- + +## CCFLAG_SWITCH = on/off => gcc flag show on/off +## COVER_NEED = yes/no => PTF cover report needed +## COVER_REPORT_PATH = [path ] => PTF cover report path + +CCFLAG_SWITCH = off +COVER_NEED = yes +COVER_REPORT_PATH = ./ut/ut_doc/output + +##---------------------------------------------------------------------## + + +##-------------------------------------- +## +## include makefile.rules (Do not change) +## +##-------------------------------------- +include Makefile.rules diff --git a/omc/plat/aif/doc/.copyarea.db b/omc/plat/aif/doc/.copyarea.db new file mode 100644 index 0000000..7c2da95 --- /dev/null +++ b/omc/plat/aif/doc/.copyarea.db @@ -0,0 +1,5 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\aif\doc +2 +1 +10:release_note.txt|1|11d70a3dbb8|15b|92ef5818|6d988209c44711dc963f001c23e19543|0 diff --git a/omc/plat/aif/doc/release_note.txt b/omc/plat/aif/doc/release_note.txt new file mode 100644 index 0000000..8934476 --- /dev/null +++ b/omc/plat/aif/doc/release_note.txt @@ -0,0 +1,21 @@ +ACRD Software Module Release Notes + +Module Name: AIFG + +#---------------------------------------------- +[Version] + R9V0_05P2 +[Release Date] + 2008-1-8 +[Author] + Roy Jiang +[Changes] + Bug fixed: + 1.NA + Improvements: + 1.NA + New features: + 1.NA +[Remark] + 1.Initial Clearcase release +#---------------------------------------------- \ No newline at end of file diff --git a/omc/plat/aif/lib/libaif.a b/omc/plat/aif/lib/libaif.a new file mode 100644 index 0000000000000000000000000000000000000000..8c09235506e0f790b93f7bb8b6167f810f975fe0 GIT binary patch literal 900178 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

>2VC2qXMyKP1$ztlfS`5IC&2yEFMk7E?Kuwo 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�N41g0Iv4m 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%0AKsu7n@%anOhGobDCldz+>28ZftRFt_E!` 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 Hxct8WRH0Vn literal 0 HcmV?d00001 diff --git a/omc/plat/aif/obj/aifg.o b/omc/plat/aif/obj/aifg.o new file mode 100644 index 0000000000000000000000000000000000000000..ee0588c48b68862bb3a6688f76bc2b9a59bb28ad GIT binary patch literal 102720 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 literal 0 HcmV?d00001 diff --git a/omc/plat/aif/obj/aifg_csta.o b/omc/plat/aif/obj/aifg_csta.o new file mode 100644 index 0000000000000000000000000000000000000000..c4b2c427c7ba95eb289d4625ec31b3d100bff327 GIT binary patch literal 17896 zcmeHPd2p1+mG5t6S{i92jV?f(8g2yE2+58Ewg7>U87`X&um-QagBXpZS)`FN^9@&V zIFd=2RmehW<2Vk%B$dRjn7Fc42_e2B$cDqQ6X9eD&SrN>f-7LWjvSILLfB>Bd;NO! zO(S`;mD>N(g}VFw-qEjLA76hxpS`zf)dMce5;|F8p%|hxD#UY(hUyJeZ4hHcg}CmY zbaQV9ziyJ%Rsk#4#Iu3XWrKtu=6kRG+&*EHDI;0Z+rLa{f~`}gk;oqQ)?ojQ5boj!T; z50zD~rO%)Ig{SI#)!Fo^-kX;H?|%wf{^O+oM8ALEkAMWX!G`xh!M+c+c=ASN`gD4r zYS22npA4`a|M7loKRpmSc_}w!Vd2&R1**5-`=Wp$2^}aT`{^I*t~m7j)?W!l&W6%w zl?^Q1q4dd+j&Qj}HiirPY4XLoma8h_e;bDM?khtLr<-o|?!G1VczQc;SrCXTeZ_rE zx8|R+{eA0iA)PM9{F)#0Gw8pd8T;7Ku!6l%I&}#Jps#ar#$(-oyurfA94Oaey%e%e z0p~_2y@rgk1Pni-)DUPk6o(G1@vvM4mVH8tFy7Zt;gAWC46(3L7c{EcNw4t&E91z? zOD@pDPJtr>eIk8|qw7Cj?m`>;*Ub7q%2%Pp}zGuLe^_(S1)M!k2eii{qvhH@A~$^gIW6l zOctIz>Gc=SG~H0D=x0Mfhbz1%|HN%bS6?T)#H{EOy*Dg7zxRgAo_!U!QV5UJ`%5&N zE}j-Hu!`H^)jlP3=R(Z{9JXv%XkRAcn=nA9g=Z-6cdqUO1$rV^`Hy3iak9So|D;$h^<1bZ#{Hs^+nR8ZENxE zfh@NJnE|A}!_L}2lF#|H9Ikf4=01Yk&T}u|ZyIRmNy{>b>E%=R&r(1}CwENqlWOvO}tmI7krJGq>M_ zF|qSc;A8yS{Dar5gJ=}Tst?T%rr-1*UsrsGcS=IQaDI{^o;6-`X_~=&fyYgH^`%wm zri-g+y4`~5c57&DuLfsu24@~sKtin7-@=~3oCJ#J+;9Ht_HA&pQVFODuzCQ5E{6J2 zmw4u0lQdz^eGj@aa&nETbbCst3E>HLBz7JdS@8ddV-;bfM@|-=nf{FQ7yBO^yuZZf zgX6OzPY5Y2FG`KYY$9gPGz}zl%29$ju3SWNJgV@j!oqXE$Z^rhahylS;x?Fu3$T~76fw$=-pm#5PXI=~=9X6kp-CZYg>&9T+jc&U? z0}^>@$X9}((j;Rp^Vj!8ER6-;$JPsV7Mh@Bwh^_ zQ`}H=qqmj09`vi=^F>k6$cL(sl)EYSQJzQnAm#6auaM@JzXkH}51JW8L1JPw5o$23 zF+`}ruqyJ<0Tq91ED;rfSgb`@PFj^EZ$pdjcOWa=11#27~&!Y3fPfBPOhA zG35}R3qq2W%?DnTc?(^Wq7NX;{AwnWR^={cp?;#`r3V{#sFniYOA z+3T@t^ZqmALS0!Sx}qAon;2e^huz45RYgj-IT-i2(2gI)@6ExG<^icv9twY0D}SS(y0m4I)1m0(WwCttG=KQ4Xg%-UeOY{ z`2H)zl8Ub*E92@^1oJ*-l{^pSRbW|I5yhD0&nd!LkOvFK!isesvu{JD_`dyRmB7P4 zYZ|U9H@?}spUUu8`Eg%bgnZ0|8%bq)0hw+=7MaEnE7Rpr6Zcwsku|g)ad`@2)mcwx zv%Zh4X{cq*wj>(TsgEnx;R@JoeMrr=#^Mxk9qM3m4$g1ap-oKA$NA|xv|&^iES%Za z1B$zbxeqCBh{;D3*&wE)Y0GUDI9vY)`i1!6t-5u$HNk1$ZB?=T(I_Y_6a-(0%ArN$ zI@B)QIFMsdV$f-y1_D6q@F1wsu0B|S5px}Sv;f^7oQWHP>(Cm-tHV9bbtt5$MT%;m zS@GL4Zked-Ww>0iWoq<-v(fxaryd47Wa`3HCB8vXHOjDR^g=y1N`^1ypeZm+)LTq- zz{MS;bC_XzUKP-u1fWCX~C*!T%5aGQ4Q4mxkglSA3CwOqQyfQ0d+7GKZ*B86ZRQExESUJ?^Oq~+u~v`)Bj?YbMmhf?(8JEa&IoqD-q9i9(o z0BZ0%?2HQecjj@(sfCv^JtSLSE5$(RU3r@D`4;-zMKBuDl=V&q`!!%N&$5=6Szs@J z7RXEh#HWQNHj0J|0P$uuRXEC;IacWv%^*+xS?(+vi+aUDYtdNkKg!pS#gANm-kIG_OO4syKS@3C@W6QFA za{UY57X2|d!k0+Bhb za&)~cP08^+vS5WA*DGsnIs2F_56WpNIq8@j=Pi{bXS0dCl(bgXN{@Gx%x{y0Tc!7i z^en)7WlH9Ge=GA>V&`9~m8ITuGQamFIr?1PAH3g!)Q5F+Wsu6 zUtpkC$pTxJJb}@4?UVkw65=PlGiBjy98+(P%-tXhH%hr=s*N(QU%+4DalUM@6KoBh?uX z!x^aq4iIfoJJQ_IA!6~C=yuVWYzu>m4Mt;;Br?MhphdF1D`5xlEj=0A84cSa8n+WW zw2gRlJIIk)(Hv`ST)S>DmdFlwC!(#f?b!IXmgXIzGuj#H-XQ?ps}~w5B>bw4*~_#Nsg< z1v|Uq;AFflKpBPyqZP)uLPwKPTXeVJC}r3>zN$wU-b6Inoe77I-tu@0ns4j0yINaC z*XF+s(+Dno_@R$1RiPKDxYOxKS1N8t6V6U!huiJ0cn4bA5rv)&d74p1ms614T?cW* z4&fM4AMmKjp`-bc739^c!59rvM|5knV`!)pStph~xIWNW`{6)sZSbDp+(31wor*^n zv_<35L@WYib0X5dVEep#tM9!hP~8@&Zf#EPh)3EJUGc6|vN{#t2Gg;c#xV&@h-qX? zH4MESjo4j@>ZA>VsHGT@j^<>$X2-hXz=*UuXhGwOy}}bSMgw~Z)>Tw-6mYiEM5i&1 z#v@%VQ3YU7VsTzHybiL$*WCz)(P}K&lC){wbKKO}Qq;3FTDnp=LBnBOpb&SQBIsE- zoEeG^;)zxW11+wPrkZhhVNh)7pr9}htqOBuFI)A{lEtfdjlyvl+sVk#_R!b}^BeXI z9z_~)wQQgx$!G+I9(D*l?}#0XbMG9&S>5XBf{8*+buR@`3@iHn5I9hiN+xQEU(?kY zsp;-$wre2LB3P45M6jk-cQEq7l8PIPM>aWIm7guCUw3RA}RKyP3olsY9BM6;_ zBBmr0v3MI$IN(rFE3oB2RV-_4ye}|o{btybQoI9H*QSW9-BVW=oO@3d!+4BSZ(evW zf=4^pIPetOj|V&$6bwuIc~oN zBE-Y%M@;mtm*MZp@E=udLGO^7?^=fHq`!;#^uDV3ZdXSCF!Ot{)O^>@jQ-2ae?E)< zr40Y)%%__Lt?#xn_HQwtt~)f}^+HB}0-ctHpz9XRcR!oauV;Q=R{K4q&!+DvP{kwO zzkLS-05_iQhe>Yr{(J|=tT-PTu50E3_OQh?R0loLxE*}NF6s$hOZ#nwjql58T^lk+2`P}dh#-X63FC+E?g?8#V zZu%^N5F56fagIx zhV!QwaBTNC98Y~GHIea~JTGZ&gY6o|ck{%gH4S*f2=<2_(C}b`4N{$8)nk?qY{6Q3 z4hQFEJuX2O&(L@Zy7m33Zm@b$Tw z&$3~BHHd5pN7}c9TbpAY$}qJ<$MT^AfIjB(YXl$qv(6NEo;=7+=g~`@Uinizh%*io zex`Q|KN5lTI@B@YaNwn}#(#<+B$S8in+$##K}aYMcUKu4=NTrH$JMUw{1<|dP#%Bp z)Oab3Hzvf#!Jo!I#5mf)sWXAs`N9$KwGKPD_h~y32aZ3nY8<~@!KCe1u>G$axZXeC zbKr1An6dNw5peZ8(w%XbiVZ@-ViNpme}ar-94a07haB?Gb{}@&&Nz2CaHoCSVc!}5 zoep`7b0x>2cLe-%4m-~Adch&@^z&Q1?vY*M=-1m09QP9)hm{xrNGOk0joTyO-)9_) zsSf#@BjCNfubc8OGmh;#xtYr~G~g?)2v=2kw-=;=rBqHypTAK7<21j6WM3xKsW)2kx|g!ht*GIs9}Ya$eTz zlMrGB@b?AQ*ESJH8QeoL(GPY|YMemGaIIm&?y(7?XH%}^eO$+))`4TYw>d8J3_Qi_ zaFKyOffEMO1F9f@(9Ux#zuLf8v3)#mVbcBWRHWF%rN-Z6J8=W2uigPm8aVy}kEvG` z8T)e>KVaZ)_UEX9Z({se1Ame295e9c9PASYzK!YA242VVZy30q-^P;Bz_ts|{SA`_~#cKEp6=H1Gnp z6E^U>+3!{Ze~0mp8aRH!fN76`&sVVMGjJW>rwsfLZ2v0;9_R7;u7N+o^y>!xB-{C! zf$wGdrh$Ko=}K-#$G?UBf6%}i^!zb!eq4%H1E0ciP8#?vrXM%(pK-ef4E$G&KW*U4 znSR#5^?TYk4g4;)^K%2A!uVAK{}#tHm;0gP<6^qZ!2g-$D;Y-;&sRFlGvq(ZjHM2F z=Uew?Lw+v%7k9`z-|w~=^1oyGUWdG16WH{Z4Ego!&#MNWV)`|Q9j=nbj}7^0Jg?p{ zaC~pZl+Wih9nV87H`~DHFy3U~&v2Zh1|DGiaRVR4{(RoRKg;oXmT^=^QT@LEsv-Xh zIuGd$1Am>{{kehvSc!|929DooV9Mi#qvP;L1&gr;ew5=dopJ4_zW=E=Gi- zh4i^y$64E{cY$9i9&2 zh=K2CJ1-fy{+8;Tfq$O;dC$O`7{9@|_DA3U`1zo$e5JM>{M+ z9R2LjgDl@-;GbhWX5h~;9yjoR zWISo$uQ0ydz)v&2+rZyoyvM-bWc(8b{x6Jw(!hVo_>+ty>70iF#u0Pk4F;~)*Cqqk z>-TX3*Zam%1K0aizk%z0^^$?>=YrsVXg~FHO`jt)uAj3FhP*x}h+uL@CtPnsX(v?K zu4{>CM|04IpMyn^zK95JP9{Y#(WMCDVl@c0Al)Ma6IJNv)Nm}`+69XE(`vYR^Je&X zB#YggXpXnRPr6PO_*porRlo^dMHsHJfsS-_cEVRIA{d9y3WD&vBYai>x7$p^@5w>9 z)b5VLmnLjC+8%CAG{Z0He{KqZ0SqBOrZeUmxTg0z&ERlrQjCWhZlw(wL{%!PRH^+(A5Yg(6DPt&KNf=69rnur^$AJBqa>iB8+-=KmvP5p|gN6~eUu literal 0 HcmV?d00001 diff --git a/omc/plat/aif/obj/aifg_debug.o b/omc/plat/aif/obj/aifg_debug.o new file mode 100644 index 0000000000000000000000000000000000000000..f93f0b4706f1ace4c9e90daad99bc3161ae3909c GIT binary patch literal 127864 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 MZ{b_%|MB<#A6tQ*q5uE@ literal 0 HcmV?d00001 diff --git a/omc/plat/aif/obj/aifg_ie.o b/omc/plat/aif/obj/aifg_ie.o new file mode 100644 index 0000000000000000000000000000000000000000..7b4191c05e725610c44ded8e1145e58e8a566290 GIT binary patch literal 130312 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 literal 0 HcmV?d00001 diff --git a/omc/plat/aif/obj/aifg_mpp.o b/omc/plat/aif/obj/aifg_mpp.o new file mode 100644 index 0000000000000000000000000000000000000000..d0f5d0d42e76c6a4ffcdadbac98d96ec7218ba55 GIT binary patch literal 366840 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 literal 0 HcmV?d00001 diff --git a/omc/plat/aif/src/.copyarea.db b/omc/plat/aif/src/.copyarea.db new file mode 100644 index 0000000..9a1ddc4 --- /dev/null +++ b/omc/plat/aif/src/.copyarea.db @@ -0,0 +1,11 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\aif\src +2 +7 +6:aifg.c|1|11d70a3dc93|1c81|3b10db20|adc96697bfa411dc84f1001c23e19543|0 +8:aifg_m.c|1|11d70a3dcd1|b6fe|6671c6c5|e0c481066cf311dd91a5001c23e19543|0 +b:aifg_csta.c|1|11d70a3dd8d|1bba|a93e11f0|6e8b63f2a4d211dd91b5001c23e19543|0 +9:aifg_ie.c|1|11d70a3dc54|13c03|30223d39|ad29667bbfa411dc84f1001c23e19543|0 +7:include|2|0|0|0|611881b1c44711dc9632001c23e19543|0 +c:aifg_debug.c|1|11d70a3dd1f|78cb|50dddc48|b45967cbbfa411dc84f1001c23e19543|0 +a:aifg_mpp.c|1|11d70a3dd4e|340f6|c3aecf7f|e154811e6cf311dd91a5001c23e19543|0 diff --git a/omc/plat/aif/src/aifg.c b/omc/plat/aif/src/aifg.c new file mode 100644 index 0000000..7f8f68d --- /dev/null +++ b/omc/plat/aif/src/aifg.c @@ -0,0 +1,265 @@ +/******************************************************************** +Copyright ?2007 LGC Wireless, Inc. All rights reserved +File Name: aifg_if.c +Description: Interface of AIFG +Version: v9.0.0 +Author: Roy Jiang +Create Date: 2007-3-12 + +History: +2007-3-6 v9.0.1 Create +*********************************************************************/ +#include "./include/aifg_var_ext.h" +#include "../../public/src/include/license_id.h" +/* +Name: aifg_bind +Purpose: Request to create a SAP in AIFG module. +Input: aifg_sap_type type: type of upper layer entity + int (*callback)(): pointer to call back function +Output: SAP id +*/ +int aifg_bind(aifg_sap_type type, int (*callback)(aifg_indication, aifg_msg_pre_decoded *)) +{ + //checking parameters + assert(type == AIFG_SAP_MSC || type == AIFG_SAP_BSC); + assert(callback != NULL); + assert(sap[type].enable == 0); + + if (wxc2_get_license(LIC_AIF) != 1) + return -1; + + sap[type].enable = 1; + sap[type].callback_func = callback; + + return (int)type; +} + +/* +Name: aifg_modify +Purpose: Request to modify the SAP parameter in AIFG module. +Input: aifg_sap_type type: type of upper layer entity + aifg_callback_func *callback: new callback functions, null if no need to modify +Output: None +*/ +void aifg_modify(int sapid, int (*callback)(aifg_indication, aifg_msg_pre_decoded*)) +{ + //checking parameters + assert(sapid == AIFG_SAP_MSC || sapid == AIFG_SAP_BSC); + assert(sap[sapid].enable == 1); + + sap[sapid].enable = 1; + if(callback != NULL) + sap[sapid].callback_func = callback; + + return; +} + +/* +Name: aifg_set_running_mode +Purpose: Set the running mode of AIFG module. +Input: enum aifg_run_mode mode: running mode, 0 - single, 1 - dual + int alter_ip:IP address of the alternative server, hex format +Output: None +*/ +void aifg_set_running_mode(aifg_run_mode mode) +{ + assert(mode == AIFG_RUN_MODE_SINGLE || mode == AIFG_RUN_MODE_DUAL); + + dual_server.mode = mode; + + return; +} + +/* +Name: aifg_createCircuitGroup +Purpose: Request to create a circuit group in AIFG module. +Input: int sapid: SAP ID of upper layer entity + int dpc: DPC of the circuit group. + aifg_ni ni: NI of the circuit group. +Output: Circuit Group ID - Upper layer entity should record this ID and pass it to AIFG module + whenever it request to send a message through this circuit group + AIFG_ERR_NO_RESOURCE: Create failed +*/ +int aifg_createCircuitGroup(int sapid, int dpc, aifg_ni ni, int tgid) +{ + int i; + + assert(sapid == AIFG_SAP_MSC || sapid == AIFG_SAP_BSC); + assert(ni >= 0 && ni <= 3); + assert(dpc >= 0); + + if (sap[sapid].enable == 0) + goto ERR_PROC; + + //check if there is a existing CG with the same dpc and ni + for(i=0; i < AIFG_MAX_CG; i++){ + if(cg[i].enable == 1 && cg[i].dpc == dpc && cg[i].ni == ni) + return i; + } + + //create a new circuit group + i = 0; + while(cg[i].enable == 1) + i++; + + if(i >= AIFG_MAX_CG){ + aifg_event = AIFG_ERR_OUT_OF_RESOURCE; + goto ERR_PROC; + } + + cg[i].enable = 1; + cg[i].dpc = dpc; + cg[i].ni = ni; + cg[i].sapid = sapid; + cg[i].tgid = tgid; + + return i; + +ERR_PROC: + return -1; +} + +/* +Name: aifg_delCircuitGroup +Purpose: Request to delete a circuit group in AIFG module. +Input: int sapid: SAP ID of upper layer entity + int cgid: Circuit Group ID +Output: None +*/ +void aifg_delCircuitGroup(int sapid, int cgid) +{ + assert(sapid == AIFG_SAP_MSC || sapid == AIFG_SAP_BSC); + assert(cgid >= 0 && cgid < AIFG_MAX_CG); + + cg[cgid].enable = 0; + cg[cgid].dpc = 0; + cg[cgid].ni = 0; + cg[cgid].sapid = 0; + cg[cgid].tgid = 0; + + return; +} + +/* +Name: aifg_modCircuitGroup +Purpose: Request to modify the parameter of a circuit group in AIFG module. +Input: int sapid: SAP ID of upper layer entity + int cgid: Circuit Group ID + int dpc: new DPC of the circuit group, -1 if no need to change. + enum aifg_ni: new NI of the circuit group, -1 if no need to change. +Output: Circuit Group ID - Upper layer entity should record this ID and pass it to AIFG module + whenever it request to send a message through this circuit group +*/ +int aifg_modCircuitGroup(int sapid, int cgid, int dpc, int ni) +{ + assert(sapid == AIFG_SAP_MSC || sapid == AIFG_SAP_BSC); + assert(cg[cgid].sapid == sapid); + assert(ni >= 0 && ni <= 3); + assert(dpc >= 0); + assert(cgid >= 0 && cgid < AIFG_MAX_CG); + + cg[cgid].enable = 1; + cg[cgid].dpc = dpc; + cg[cgid].ni = ni; + + return cgid; +} + +/* +Name: aifg_send +Purpose: Request to send a message through A-interface. +Input: int sapid: SAP ID of upper layer entity. + int cgid: Circuit Group ID + int u_port: process port of upper layer entity + aifg_msg *msg: content of assign request message +Output: 0 - succeed + -1 - failed, no free port available + -2 - failed, circuit group not ready +*/ +int aifg_send(int sapid, int cgid, int u_port, aifg_msg_t *msg) +{ + int protocol; + assert(sapid == AIFG_SAP_MSC || sapid == AIFG_SAP_BSC); + assert(cgid >= 0 && cgid < AIFG_MAX_CG); + assert(msg != NULL); + + if (sap[sapid].enable == 0){ + aifg_event = AIFG_ERR_SAP_NOT_CREATED; + goto ERR_PROC; + } + + //check message protocol and pd + msg->app_port = u_port; + if(msg->id <= AIFG_MSG_ID_RP_SMMA){ + if(msg->id <= AIFG_MSG_ID_MM_INFO) + msg->pd = AIFG_PD_DTAP_MM; + else if(msg->id <= AIFG_MSG_ID_FACILITY) + msg->pd = AIFG_PD_DTAP_CC; + else if(msg->id <= AIFG_MSG_ID_RELEASE_CMP_SS) + msg->pd = AIFG_PD_DTAP_SS; + else if(msg->id <= AIFG_MSG_ID_RP_SMMA) + msg->pd = AIFG_PD_DTAP_SMS; + else + assert(0); + protocol = AIFG_MSG_DTAP; + } + else{ + if(msg->id <= AIFG_MSG_ID_HO_CAN_RESP) + msg->pd = AIFG_PD_BSSMAP_GLOBAL; + else if(msg->id <= AIFG_MSG_ID_LSA_INFO) + msg->pd = AIFG_PD_BSSMAP_DEDICATED; + else + assert(0); + protocol = AIFG_MSG_BSSMAP; + } + + if(msg->aif_port == -1 || msg->pd == AIFG_PD_BSSMAP_GLOBAL){ + if(msg->pd != AIFG_PD_BSSMAP_GLOBAL || msg->id == AIFG_MSG_ID_PAGING){ + if((msg->aif_port = aifg_port_assign(sapid, cgid, -1)) < 0){ + aifg_event = AIFG_ERR_ASSIGN_PORT_FAIL; + goto ERR_PROC; + } + aifg_pcb[msg->aif_port].upper_port = u_port; + aifg_pcb[msg->aif_port].trace_flag = msg->trace_flag; + } + else{ + msg->aif_port = -1; //no port need + aifg_send_udt(cgid, msg, NULL); //global BSSMAP message needs no aifg port, except paging + } + } + else if (aifg_pcb[msg->aif_port].stat == AIFG_PORT_TRANSACTION && aifg_pcb[msg->aif_port].ti_type != AIFG_TRANS_UNKNOW){ + if((msg->id == AIFG_MSG_ID_SETUP + && (aifg_pcb[msg->aif_port].ti_stat > 0 || aifg_pcb[msg->aif_port].ti_type != AIFG_TRANS_CC)) + || (msg->id == AIFG_MSG_ID_RP_DATA + && aifg_pcb[msg->aif_port].ti_type != AIFG_TRANS_SMS)) + { + //new transaction + int new_port = aifg_port_assign(sapid, cgid, -1); + if (new_port < 0){ + aifg_event = AIFG_ERR_ASSIGN_PORT_FAIL; + goto ERR_PROC; + } + aifg_pcb[new_port].upper_port = u_port; + aifg_pcb[new_port].link_id = aifg_pcb[msg->aif_port].link_id; + aifg_pcb[new_port].trace_flag = msg->trace_flag; + msg->aif_port = new_port; + } + } + + if(msg->aif_port != -1){ + if (aifg_pcb[msg->aif_port].stat == AIFG_PORT_IDLE){ + aifg_event = AIFG_ERR_MSG_SD_TO_IDLE_PORT; + goto ERR_PROC; + } + aifg_pcb[msg->aif_port].cgid = cgid; + aifg_port_proc(&aifg_pcb[msg->aif_port], msg, NULL); + } + + aifg_debug_print(msg->aif_port, AIFG_EVENT_RV_REQ, msg, 0); + + return AIFG_SUCCEED; + +ERR_PROC: + aifg_debug_print(msg->aif_port, aifg_event, msg, u_port); + return AIFG_ERROR; +} diff --git a/omc/plat/aif/src/aifg_csta.c b/omc/plat/aif/src/aifg_csta.c new file mode 100644 index 0000000..e46f713 --- /dev/null +++ b/omc/plat/aif/src/aifg_csta.c @@ -0,0 +1,310 @@ +/******************************************************************** +Copyright ?2007 LGC Wireless, Inc. All rights reserved +File Name: aifg_csta.c +Description: CSTA of AIFG +Version: v9.0.0 +Author: XH Chen +Create Date: 2008-3-12 + +History: +2007-3-6 v9.0.1 Create +*********************************************************************/ +#include "../../../plat/public/src/include/includes.h" +#include "../../../plat/snmp/src/include/snmp.h" +#include "./include/aifg_type_def.h" + +#define NO_EXIST 0 +#define EXIST 1 +#define OID_OFFSET 14 +#define AIF_10SEC 1000 +struct obj_view { + int entry_oidlen; + int column_oidlen; + int full_oidlen; + DWORD *entry; + DWORD *column; + DWORD *iid; /* Instance ID */ + BYTE csta_pos; + BYTE csta_len; +}; + +typedef void *(*lookup_level_1)(u32 *oid_1); +typedef void *(*lookup_level_2)(u32 oid_1, u32 *oid_2); +typedef int (*get_csta)(struct obj_view *view, u8 *pdata, u8 *vartype); + +struct tab_view{ + BYTE exist_flag; + BYTE entry_id; + BYTE level; /* Three level: 1, 2*/ + lookup_level_1 lookup_1; + lookup_level_2 lookup_2; + get_csta get_aif_csta; + u8 next_column[16]; + struct obj_view view; +}; + +#define AIF_OID {1,3,6,1,4,1,1373,2,3,2,6} +#define AIF_OIDLEN 11 + +typedef struct{ + unsigned long timestamp; + int msg_stat[AIFG_MAX_MESSAGE*2]; +}aifg_csta; + +BYTE aifCSTAInd; +aifg_csta aifCSTA[96]; +//DTAP:RR MM CC SS SMS; BSSMAP:Global Dedicated +const BYTE cstaLen[8] = {0, 2, 21, 31, 3, 4, 18, 36}; +const BYTE postion[8] = {0, 0, 4, 46, 108, 114, 122, 158}; + +extern int msg_statistics[AIFG_MAX_MESSAGE][2]; +u32 *findnext_quater(u32 *id); +int get_aif_csta(struct obj_view *view, BYTE *pdata, BYTE *vartype); +int aifg_get_resp(BYTE oidlen, DWORD *oid, BYTE *pdata, BYTE *vartype); +int aif_getnext_resp(u8 prev_oidlen, u32 *prev_oid, u8 *oidlen, u32 *oid, u8 *pdata, u8 *vartype); + +static struct tab_view aif_csta_table[8]={ + {NO_EXIST}, + { + EXIST, OID_OFFSET, 1, + (void *)findnext_quater, NULL, + get_aif_csta, + {1, 2, 0} + }, + { + EXIST, OID_OFFSET, 1, + (void *)findnext_quater, NULL, + get_aif_csta, + {1, 2, 0} + }, + { + EXIST, OID_OFFSET, 1, + (void *)findnext_quater, NULL, + get_aif_csta, + {1, 2, 0} + }, + { + EXIST, OID_OFFSET, 1, + (void *)findnext_quater, NULL, + get_aif_csta, + {1, 2, 0} + }, + { + EXIST, OID_OFFSET, 1, + (void *)findnext_quater, NULL, + get_aif_csta, + {1, 2, 0} + }, + { + EXIST, OID_OFFSET, 1, + (void *)findnext_quater, NULL, + get_aif_csta, + {1, 2, 0} + }, + { + EXIST, OID_OFFSET, 1, + (void *)findnext_quater, NULL, + get_aif_csta, + {1, 2, 0} + }, +}; + +void aifg_csta_init(void) +{ + DWORD aif_oid_prefix[20] = AIF_OID; + + inquire_getmsg(AIF_OIDLEN, aif_oid_prefix, aifg_get_resp); + inquire_getnextmsg(AIF_OIDLEN, aif_oid_prefix, aif_getnext_resp); + + memset(aifCSTA, 0, sizeof(aifCSTA)); +} + +void aifg_csta_proc(void) +{ + static int counter = 0; + static BYTE flag = 0; + struct tm *t; + unsigned long l_time; + + if(counter ++ >= AIF_10SEC) + { + l_time = time(NULL); + t = localtime(&l_time); + counter = 0; + + if(t->tm_min % 15 < 2) //per 15 min + { + if(flag == 0) + { + /* get csta index */ + aifCSTAInd = t->tm_hour * 4 + t->tm_min / 15; + /* copy the msg statistic to the csta buffer */ + memcpy(aifCSTA[aifCSTAInd].msg_stat, msg_statistics, sizeof(msg_statistics)); + aifCSTA[aifCSTAInd].timestamp = l_time; + /* clear msg statistic */ + memset(msg_statistics, 0, sizeof(msg_statistics)); + flag = 1; + } + } + else + flag = 0; + } +} + +u32 *findnext_quater(u32 *id) +{ + int csta_inst = aifCSTAInd; + + //CHECKME: to make sure it can run across 24 hours + if(csta_inst > 0) + csta_inst -= 1; + if(*id != csta_inst) + { + *id = csta_inst; + return id; + } + *id = 0; + return NULL; +} + +struct obj_view *gen_obj_view(struct tab_view *table, u32 *oid) +{ + struct obj_view *view = &table->view; + + view->entry = oid + table->entry_id; + view->entry_oidlen = table->entry_id + 1; + view->column =view->entry + 1; + view->column_oidlen = view->entry_oidlen + 1; + view->iid = view->column + 1; + view->full_oidlen = view->column_oidlen + table->level; + view->csta_pos = postion[oid[table->entry_id-1]]; + view->csta_len = cstaLen[oid[table->entry_id-1]]; + return view; +} + +struct tab_view *lookup_csta_table(BYTE oidlen, DWORD *oid) +{ + int index; + + if(oidlen < AIF_OIDLEN +2) + return NULL; + + index = oid[AIF_OIDLEN]; + if(index >= 8) + return NULL; + else if(aif_csta_table[index].exist_flag == 0) + return NULL; + else + return &aif_csta_table[index]; +} + +void aifg_encode_csta(BYTE *pData, BYTE pos, BYTE Len, aifg_csta *pCsta) +{ + unsigned long *pDW = (unsigned long *)pData; + int *pSrc = (int *)&pCsta->msg_stat[2]; + int *pDst = (int *)(pData + 4); + int i; + + pDW[0] = htonl(pCsta->timestamp); + + for(i = 0; i < Len*2; i++) + pDst[i] = htonl(pSrc[pos + i]); +} + +int get_aif_csta(struct obj_view *view, BYTE *pdata, BYTE *vartype) +{ + int dataLen = 0; + int csta_inst; + + if((csta_inst = view->iid[0]) >= 96) + return -1; + switch(*(view->column)) + { + case 1: + *((int *)pdata) = htonl(csta_inst); + *vartype = 0x02; + dataLen = 4; + break; + case 2: + if(aifCSTA[csta_inst].timestamp == 0) + return 0; + *vartype = 0x04; + aifg_encode_csta(pdata,view->csta_pos, view->csta_len, &aifCSTA[csta_inst]); + dataLen = (view->csta_len*sizeof(int)*2+4); + break; + } + return dataLen; +} + + +int aifg_get_resp(BYTE oidlen, DWORD *oid, BYTE *pdata, BYTE *vartype) +{ + struct tab_view *table; + struct obj_view *view; + + if((table = lookup_csta_table(oidlen, oid)) == NULL) + return -1; + view = gen_obj_view(table, oid); + if(oidlen != view->full_oidlen) + return -1; + if(*(view->entry) != 1) + return -1; + if(table->get_aif_csta == NULL) + return -1; + else + return table->get_aif_csta(view, pdata, vartype); +} + + +static int get_nextOid(u8 *oidlen, u32 *oid) +{ + struct tab_view *table; + struct obj_view *view; + + if((table = lookup_csta_table(*oidlen, oid)) == NULL) + return 0; + view = gen_obj_view(table, oid); + if(*oidlen < view->full_oidlen) + { + memset(&oid[*oidlen], 0, view->full_oidlen-*oidlen); + if(*oidlen < view->entry_oidlen) + *view->entry = 1; + if(*oidlen < view->column_oidlen) + *view->column = table->next_column[0]; + if(*oidlen == view->full_oidlen-1) + { + *oidlen = view->full_oidlen; + } + *oidlen = view->full_oidlen; + } + + for(; *(view->column) != 0; *(view->column) = table->next_column[*(view->column)]) + { + switch(table->level) + { + case 1: + if(table->lookup_1(view->iid) != NULL) + return 1; + break; + case 2: + break; + case 3: + break; + } + } + return 0; +} + +int aif_getnext_resp(u8 prev_oidlen, u32 *prev_oid, u8 *oidlen, u32 *oid, u8 *pdata, u8 *vartype) +{ + memcpy(oid, prev_oid, prev_oidlen*sizeof(u32)); + *oidlen = prev_oidlen; + + if(get_nextOid(oidlen, oid)) + { + return aifg_get_resp(*oidlen, oid, pdata, vartype); + } + else + return -1; +} + diff --git a/omc/plat/aif/src/aifg_debug.c b/omc/plat/aif/src/aifg_debug.c new file mode 100644 index 0000000..f7eef47 --- /dev/null +++ b/omc/plat/aif/src/aifg_debug.c @@ -0,0 +1,1296 @@ +/******************************************************************** +Copyright ?2007 LGC Wireless, Inc. All rights reserved +File Name: aifg_debug.c +Description: Source file of debug submodule of AIFG +Version: v9.0.0 +Author: Roy Jiang +Create Date: 2007-3-22 + +History: +2007-3-22 v9.0.0 Create +*********************************************************************/ +#include "./include/aifg_msg.h" +#include "./include/aifg_var_ext.h" +#include "../../debug/src/include/debug.h" + +static char help_info[] = "AIFG debug help:\r\n\ +log all Turn on all debug information\r\n\ +log none Turn off all information\r\n\ +log error on/off Turn on/off error information\r\n\ +log event on/off Turn on/off event information\r\n\ +list circuit group Print circuit group Table\r\n\ +list sap Print SAP information\r\n\ +list port Print opened port\r\n\ +list link Print opened link\r\n\ +wa port x Watch port x\r\n\ +wa link x Watch link x\r\n\ +msg stat Show message statistics\r\n\ +clear msg stat Clear message statistics\r\n\ +"; + +const char *msg_name[] = { + "TRANSPARENT DTAP MESSAGE", + "PAGING RESPONSE", + "RR HANDOVER COMMAND", + "IMSI DETACH INDICATION", + "LOCATION UPDATING ACCEPT", + "LOCATION UPDATING REJECT", + "LOCATION UPDATING REQUEST", + "AUTHENTICATION REJECT", + "AUTHENTICATION REQUEST", + "AUTHENTICATION RESPONSE", + "IDENTITY REQUEST", + "IDENTITY RESPONSE", + "TMSI REALLOCATION COMMAND", + "TMSI REALLOCATION COMPLETE", + "CM SERVICE ACCEPT", + "CM SERVICE REJECT", + "CM SERVICE ABORT", + "CM SERVICE REQUEST", + "CM SERVICE PROMPT", + "CM RE-ESTABLISHMENT REQUEST", + "ABORT", + "MM NULL", + "MM STATUS", + "MM INFORMATION", + "ALERTING", + "CALL CONFIRMED", + "CALL PROCEEDING", + "CONNECT", + "CONNECT ACK", + "EMERGENCY SETUP", + "PROGRESS", + "SETUP", + "MODIFY", + "MODIFY COMPLETE", + "MODIFY REJECT", + "USER INFORMATION", + "HOLD", + "HOLD ACK", + "HOLD REJECT", + "RETRIEVE", + "RETRIEVE ACK", + "RETRIEVE REJECT", + "DISCONNECT", + "RELEASE", + "RELEASE COMPLETE", + "CONGESTION CONTROL", + "NOTIFY", + "STATUS", + "STATUS ENQUIRY", + "START DTMF", + "STOP DTMF", + "STOP DTMF ACK", + "START DTMF ACK", + "START DTMF REJECT", + "FACILITY", + "FACILITY SS", + "REGISTER", + "RELEASE COMPLETED SS", + "RP-DATA", + "RP-ACK", + "RP-ERROR", + "RP-SMMA", + "BLOCK", + "BLOCKING ACK", + "UNBLOCK", + "UNBLOCKING ACK", + "CIRCUIT GROUP BLOCK", + "CIRCUIT GROUP BLOCK ACK", + "CIRCUIT GROUP UNBLOCK", + "CIRCUIT GROUP UNBLOCK ACK", + "RESOURCE REQUEST", + "RESOURCE INDICATION", + "RESET", + "RESET ACK", + "PAGING", + "OVERLOAD", + "RESET CIRCUIT", + "RESET CIRCUIT ACK", + "HANDOVER CANDIDATE ENQUIRE", + "HANDOVER CANDIDATE RESPONSE", + "ASSIGN REQUEST", + "ASSIGN COMPLETE", + "ASSIGN FAILURE", + "HANDOVER REQUEST", + "HANDOVER REQUIRED", + "HANDOVER REQUEST ACK", + "HANDOVER COMMAND", + "HANDOVER COMPLETE", + "HANDOVER SUCCEEDED", + "HANDOVER FAILURE", + "HANDOVER PERFORMED", + "HANDOVER REQUIRED REJECT", + "HANDOVER DETECT", + "CLEAR COMMAND", + "CLEAR COMPLETE", + "CLEAR REQUEST", + "SAPI 'N' REJECT", + "CONFUSION", + "SUSPEND", + "RESUME", + "LOCATION INFORMATION COMMAND", + "LOCATION INFORMATION REPORT", + "MSC INVOKE TRACE", + "BSC INVOKE TRACE", + "UNEQUIPPED CIRCUIT", + "CHANGE CIRCUIT", + "CHANGE CIRCUIT ACK", + "CIPHER MODE COMMAND", + "CLASSMARK UPDATE", + "CIPHER MODE COMPLETE", + "QUEUEING INDICATION", + "COMPLETE LAYER 3 INFORMATION", + "CLASSMARK REQUEST", + "CIPHER MODE REJECT", + "LOAD INDICATION", + "LSA INFORMATION", + NULL,//reserved + NULL,//reserved + NULL,//reserved + NULL,//reserved + NULL,//reserved + NULL,//reserved + NULL,//reserved + NULL,//reserved + NULL,//reserved + NULL,//reserved + NULL,//reserved + NULL,//reserved + NULL,//reserved +}; + +const char *sap_name[] = { + "MSC", + "BSC" +}; + +const char *ni_name[] = { + "NATIONAL", + "NATIONAL SPARE", + "INTERNATIONAL", + "INTERNATIONAL SPARE", +}; + +static const char *normal = "\033[0m"; +static const char *red = "\033[0;31;40m"; +static const char *green = "\033[0;32;40m"; +static const char *yellow = "\033[0;33;40m"; +//static const char *blue = "\033[0;34;40m"; + +#define AIFG_DEBUG_MAX_LEN 8192 +static char debug_buf[AIFG_DEBUG_MAX_LEN]; +static char asc_in[256]; +static struct log_flag_t{ + BYTE all; + BYTE err; + BYTE evt; +}log_flag; + +int msg_statistics[AIFG_MAX_MESSAGE][2]; + +void aifg_parsecmd(); +char *sprint_msg_content(char *dst, BYTE *msg, int msg_len); + +void aifg_debug_init() +{ + char aifg_ver[] = "R9V0_05P2"; + DWORD ascout_id[20] = { 1, 3, 6, 1, 4, 1, 1373, 1, 3, 2, 3, 1, 2, 23, 4 }; + DWORD ascin_id[20] = { 1, 3, 6, 1, 4, 1, 1373, 1, 3, 2, 3, 1, 2, 23, 3 }; + DWORD status_id[20] = { 1, 3, 6, 1, 4, 1, 1373, 1, 3, 2, 3, 1, 2, 23, 1 }; + DWORD name_id[20] = { 1, 3, 6, 1, 4, 1, 1373, 1, 3, 2, 3, 1, 2, 23, 2 }; + BYTE debug_status = 1; + + debug_set_response (15, ascout_id, debug_buf, AIFG_DEBUG_MAX_LEN); + debug_set_response (15, ascin_id, asc_in, 1); + debug_set_response (15, status_id, &debug_status, 1); + debug_set_response (15, name_id, aifg_ver, strlen(aifg_ver)); + + memset(msg_statistics, 0, sizeof(msg_statistics)); +} + +void aifg_debug_timer() +{ + BYTE npage; + + if(strlen(asc_in) <= 1) + return; + + debug_buf[0] = '\0'; + npage = asc_in[0] - 1; + if(npage == 0){ + aifg_parsecmd(asc_in + 1); + asc_in[0] = '\0'; + return; + } + + switch (npage){ + default: + break; + } + asc_in[0] = '\0'; +} + +/* +Purpose: Print debug information +Input: aifg_event_code event: event code + void *msg: message pointer, will be convert to aifg_msg_t* or aifg_predecode_msg* + or SP_UiPriPara* according to different event + int o_info: other information, differ from event code +Outpur: none +*/ +void aifg_debug_print(int port, aifg_event_code event, void *msg, int o_info) +{ + char buffer[1024]; + struct timeval tv; + struct timezone tz; + struct tm *t; + char timestr[1024]; + + if(log_flag.all != 1){ + if (port == -1 || aifg_pcb[port].trace_flag == 0) + { + if((event >= 1024) && (log_flag.evt != 1)) + goto FINISH; + else if (log_flag.err != 1) + goto FINISH; + } + } + + gettimeofday ( &tv, &tz ); + t = localtime ( &tv.tv_sec ); + sprintf ( timestr, "(%d:%d:%d.%ld):", t->tm_hour, t->tm_min, t->tm_sec, tv.tv_usec ); + + switch(event){ + case AIFG_SUCCEED: + goto FINISH; + break; + case AIFG_ERROR: + sprintf(buffer, "%sUnknown error!%s\n",red, normal); + break; + //error + case AIFG_ERR_OUT_OF_RESOURCE: + sprintf(buffer, "%sAIFG ALARM: Out of resources!%s\n",red, normal); + break; + case AIFG_ERR_UNKNOW_MSG: + sprintf(buffer, "%sAIFG ERROR: Unknow message received!%s\n",red, normal); + break; + case AIFG_ERR_UNKNOW_IE: + sprintf(buffer, "%sAIFG ERROR: Unknow IE in received message!%s\n",red, normal); + break; + case AIFG_ERR_ERROR_MSG: + sprintf(buffer, "%sAIFG ERROR: Dameged message received!%s\n",red, normal); + break; + case AIFG_ERR_ERROR_IE: + sprintf(buffer, "%sERROR: Dameged IE in received message!%s\n",red, normal); + break; + case AIFG_ERR_UP_NOT_EXIST: + sprintf(buffer, "%sERROR: Can not find the request SAP for received message!%s\n",red, normal); + break; + case AIFG_ERR_NO_UD_IN_CR: + sprintf(buffer, "%sERROR: CR received without user data field%s\n",red, normal); + break; + case AIFG_ERR_UNEXPECTED_DT1: + sprintf(buffer, "%sERROR: Unexpected DT1 received!%s\n",red, normal); + break; + case AIFG_ERR_UNEXPECTED_UDT: + sprintf(buffer, "%sERROR: Unexpected UDT received!%s\n",red, normal); + break; + case AIFG_ERR_UNEXPECTED_PAGING_RESP: + sprintf(buffer, "%sERROR: Unexpected Paging Response received!%s\n",red, normal); + break; + case AIFG_ERR_INVALID_TI: + { + aifg_msg_pre_decoded *pMsg = (aifg_msg_pre_decoded *)msg; + sprintf(buffer, "%sERROR: Invalid TI in message %s, link %d! %s\n", + red, + msg_name[pMsg->id], + o_info, + normal); + } + break; + case AIFG_ERR_MISS_MANDATORY: + { + aifg_msg_pre_decoded *pMsg = (aifg_msg_pre_decoded *)msg; + sprintf(buffer, "%sERROR: Damaged message %s, missing mandatory! %s\n", + red, + msg_name[pMsg->id], + normal); + } + break; + case AIFG_ERR_MSG_RV_TO_IDLE_PORT: + { + aifg_msg_pre_decoded *pMsg = (aifg_msg_pre_decoded *)msg; + sprintf(buffer, "%sERROR: Message %s received from link %d for IDLE port %d!%s\n", + red, + msg_name[pMsg->id], + aifg_pcb[pMsg->aif_port].link_id, + pMsg->aif_port, + normal); + } + break; + case AIFG_ERR_MSG_SD_TO_IDLE_PORT: + { + aifg_msg_t *pMsg = (aifg_msg_t *)msg; + sprintf(buffer, "%sERROR: Application send message %s to IDLE port %d!%s\n", + red, + msg_name[pMsg->id], + pMsg->aif_port, + normal); + } + break; + case AIFG_ERR_ASSIGN_PORT_FAIL: + sprintf(buffer, "%sERROR: Port assign failed, resource limited! Upper port %d %s\n",red, o_info, normal); + break; + case AIFG_ERR_SAP_NOT_CREATED: + sprintf(buffer, "%sERROR: Upper port %d send message refused, SAP not created!%s\n",red, o_info, normal); + break; + case AIFG_ERR_PORT_TIMER_OUT: + sprintf(buffer, "%sERROR: PORT %d Protocol time out! Start release transaction.%s\n",red, o_info, normal); + break; + case AIFG_ERR_CAN_NOT_FIND_TI: + sprintf(buffer, "%sERROR: PORT %d Can not find TI for the transaction! Transaction released.%s\n",red, o_info, normal); + break; + case AIFG_ERR_PAGING_NOT_RESP: + sprintf(buffer, "%sERROR: PORT %d Paging no response!.%s\n",red, o_info, normal); + break; + case AIFG_ERR_PORT_RELEASED: + { + char tmp_cause_string[64]; + aifg_msg_pre_decoded *pMsg = (aifg_msg_pre_decoded *)msg; + + if (pMsg->cause == 0x09 || pMsg->cause == 0x0B) + goto FINISH; //normal release + else if (pMsg->cause == 0x66) + strcpy(tmp_cause_string, "Timer expired"); + else if (pMsg->cause == 0x6F) + strcpy(tmp_cause_string, "Protocol error"); + else + tmp_cause_string[0] = '\0'; + + sprintf(buffer, "%sERROR: Port %d, Cause: %d, %s, send release ind to app port %d %s\n", + red, + pMsg->aif_port, + pMsg->cause, + tmp_cause_string, + aifg_pcb[pMsg->aif_port].upper_port, + normal + ); + } + break; + + //event + case AIFG_EVENT_REDIR_MSG: + sprintf(buffer, "AIFG EVENT: Message directed to the other server!\n"); + break; + case AIFG_EVENT_LINK_RELEASE: + sprintf(buffer, "Link %d released!\n", o_info); + break; + case AIFG_EVENT_PORT_RELEASE: + sprintf(buffer, "Port %d released!\n", o_info); + break; + case AIFG_EVENT_RV_MSG: + { + aifg_msg_pre_decoded *pMsg = (aifg_msg_pre_decoded *)msg; + int msg_id = pMsg->id; + if (msg_id == AIFG_MSG_ID_L3_INFO) + msg_id = pMsg->msg.completeL3Info.l3msg.id; + + sprintf(buffer, "%sSCCP => AIFG: ID: %s, APP_PORT:%d, AIFG_PORT:%d, LINK_ID:%d%s\n", + green, + msg_name[msg_id], + aifg_pcb[pMsg->aif_port].upper_port, + pMsg->aif_port, + aifg_pcb[pMsg->aif_port].link_id, + normal + ); + } + break; + + case AIFG_EVENT_SD_MSG: + { + aifg_msg_t *pMsg = (aifg_msg_t *)msg; + sprintf(buffer, "%sAIFG => SCCP: ID: %s, APP_PORT:%d, AIFG_PORT:%d, LINK_ID:%d%s\n", + yellow, + msg_name[pMsg->id], + pMsg->app_port, + pMsg->aif_port, + aifg_pcb[pMsg->aif_port].link_id, + normal + ); + } + break; + default: + goto FINISH; + break; + } + aifg_log(strcat(timestr, buffer)); + +FINISH: + aifg_event = AIFG_SUCCEED; + return; +} + +void aifg_get_open_port(int flag) +{ + int i = 0, j = 0; + char tmp_buf[20]; + char buf[1024]; + buf[0] = '\0'; + + for (i=0; i < AIFG_MAX_PORT; i++){ + if(aifg_pcb[i].stat != 0){ + if(j % 16 == 0 && j != 0){ + aifg_log(buf); + buf[0] = '\0'; + } + sprintf(tmp_buf,"%d\t", i); + strcat(buf, tmp_buf); + j++; + } + } +} + +void aifg_get_open_link(int flag) +{ + int i = 0, j = 0; + char tmp_buf[20]; + char buf[1024]; + buf[0] = '\0'; + for (i = 0; i < SCCP_MAX_LINK; i++){ + if(link_info[i].en_flag != 0){ + if(j % 16 == 0 && j != 0){ + aifg_log(buf); + buf[0] = '\0'; + } + sprintf(tmp_buf,"%d\t", i); + strcat(buf, tmp_buf); + j++; + } + } +} + +void aifg_get_sap() +{ + char buf[1024]; + sprintf(buf, "Current opened SAP: \n"); + + if(sap[0].enable != 0) + strcat(buf, "MSC\t"); + if(sap[1].enable != 0) + strcat(buf, "BSC"); + + aifg_log(buf); + + return; +} + +void aifg_debug_get_cg() +{ + int i = 0; + char tmp_buf[20]; + char buf[1024]; + int flag = 0; + + sprintf(buf, "#\t\t SAP\t\t NI\t\t DPC\n"); + for (i = 0; i < AIFG_MAX_CG; i++){ + if(cg[i].enable != 0){ + sprintf(tmp_buf,"%03d\t\t", i); + strcat(buf, tmp_buf); + + if (cg[i].sapid == 0) + sprintf(tmp_buf,"MSC\t\t"); + else + sprintf(tmp_buf,"BSC\t\t"); + strcat(buf, tmp_buf); + + sprintf(tmp_buf,"%02d\t\t", cg[i].ni); + strcat(buf, tmp_buf); + + sprintf(tmp_buf,"%d\n", cg[i].dpc); + strcat(buf, tmp_buf); + + flag = 1; + } + } + if (flag == 0) + aifg_log("No Circuit Group enabled!"); + else + aifg_log(buf); + + return; +} + +void aifg_print_port_info(int i, int flag) +{ + char buf[1024]; + char imsi[32]; + + sprintf(buf, +"=======AIFG Port %d=======\r\n\ +stat: %d\r\n\ +sapid: %d\r\n\ +cgid: %d\r\n\ +linkid: %d\r\n\ +new_link: %d\r\r\ +app_port: \%d\r\n\ +timer: %d\r\n\ +ti: %d\r\n\ +ti_type: %d\r\n\ +ti_stat: %d\r\n\ +ho_stat: %d\r\n\ +app_ho_port: %d\r\n\ +rel_cause: %d\r\n\ +imsi: %s\r\n\ +pNextOpenPort: %d\r\n\ +pPrevOpenPort: %d\r\n\ +pNextPort: %d\r\n\ +pPrevPort: %d\r\n\ +==========================\n", + i, + aifg_pcb[i].stat, + aifg_pcb[i].sapid, + aifg_pcb[i].cgid, + aifg_pcb[i].link_id, + aifg_pcb[i].new_link, + aifg_pcb[i].upper_port, + aifg_pcb[i].timer, + aifg_pcb[i].ti, + aifg_pcb[i].ti_type, + aifg_pcb[i].ti_stat, + aifg_pcb[i].ho_stat, + aifg_pcb[i].app_ho_port, + aifg_pcb[i].rel_cause, + sprint_msg_content(imsi, aifg_pcb[i].imsi, aifg_pcb[i].imsi_len), + aifg_pcb[i].pNextOpenPort - aifg_pcb, + aifg_pcb[i].pPrevOpenPort - aifg_pcb, + aifg_pcb[i].pNextPort - aifg_pcb, + aifg_pcb[i].pPrevPort - aifg_pcb); + + if(flag == 0) + aifg_log(buf); + else + printf(buf); +} + +void aifg_print_link_info(int i, int flag){ + char buf[1024]; + + sprintf(buf, +"=======AIFG Link %d=======\r\n\ +en_flag: %d\r\n\ +sapid: %d\r\n\ +cur_port: \%d\r\n\ +ti_number: %d\r\n\ +==========================\n", + i, + link_info[i].en_flag, + link_info[i].sapid, + link_info[i].cur_port, + link_info[i].ti_number); + + if(flag == 0) + aifg_log(buf); + else + printf(buf); +} + +void aifg_print_msg_stat() +{ + char msg_str[32]; + char tmpbuf[1024]; + int i, j; + int max_name_length = 28; + + aifg_log("==========================AIFG Message Statistics==========================\r\n" + "Message \t\t Sent \t\t\t Received"); + + for(i=0; i < AIFG_MAX_MESSAGE; i++){ + if (msg_name[i] == NULL) + break; + + j = max_name_length - strlen(msg_name[i]); + sprintf(msg_str, "%s", msg_name[i]); + while(j-- > 0) + strcat(msg_str, " "); + + sprintf(tmpbuf, "%s\t %10d \t %10d", msg_str, msg_statistics[i][1], msg_statistics[i][0]); + aifg_log(tmpbuf); + } +} + +void aifg_parsecmd(char *cmdstr) +{ + if(strstr (cmdstr, "help") != NULL || strstr (cmdstr, "?") != NULL) + aifg_log(help_info); + else if(strstr (cmdstr, "log all") != NULL) + log_flag.all = 1; + else if(strstr (cmdstr, "log none") != NULL) + memset(&log_flag, 0, sizeof(log_flag)); + else if(strstr (cmdstr, "log event on") != NULL) + log_flag.evt = 1; + else if(strstr (cmdstr, "log event off") != NULL) + log_flag.evt = 0; + else if(strstr (cmdstr, "log error on") != NULL) + log_flag.err = 1; + else if(strstr (cmdstr, "log error off") != NULL) + log_flag.err = 0; + else if(strstr (cmdstr, "list port") != NULL) + aifg_get_open_port(0); + else if(strstr (cmdstr, "list link") != NULL) + aifg_get_open_link(0); + else if(strstr (cmdstr, "list sap") != NULL) + aifg_get_sap(); + else if(strstr (cmdstr, "list cg") != NULL) + aifg_debug_get_cg(); + else if(strstr (cmdstr, "wa port ") != NULL){ + int i = atoi(cmdstr+8); + if (i < AIFG_MAX_PORT) + aifg_print_port_info(i, 0); + } + else if(strstr (cmdstr, "wa link ") != NULL){ + int i = atoi(cmdstr+8); + if (i < SCCP_MAX_LINK) + aifg_print_link_info(i, 0); + } + else if (strstr (cmdstr, "clear msg stat") != NULL){ + memset(msg_statistics, 0, sizeof(msg_statistics)); + } + else if (strstr (cmdstr, "msg stat") != NULL){ + aifg_print_msg_stat(); + } + else{ + char tmp_buffer[100]; + sprintf(tmp_buffer, "%sInvalid Command!%s\n",red, normal); + aifg_log(tmp_buffer); + return; + } + + aifg_log("Command OK."); + return; +} + +void aifg_log(char *info) +{ + if(strlen(debug_buf) + strlen(info) > AIFG_DEBUG_MAX_LEN) + { +// aifgDebugFull = 1; + return; + } + + strncat(debug_buf, info, AIFG_DEBUG_MAX_LEN); + strcat(debug_buf, "\r\n"); + return; +} + +static u8 ascii[16] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46}; +char *sprint_msg_content(char *dst, BYTE *msg, int msg_len) +{ + int i = 0; + int j = 0; + + j += 9; + for (i = 0; i < msg_len; i++) + { + dst[j++] = ascii[msg[i] >> 4]; + dst[j++] = ascii[msg[i] & 0x0f]; + dst[j++] = ' '; + + if(i % 15 == 0 && i != 0){ + memcpy(dst+j, "\n ", 9); + j += 10; + } + else if(i % 7 == 0 && i != 0){ + dst[j++] = ' '; + } + } + dst[j++] = '\n'; + dst[j] = '\0'; + + return dst; +} + +#if 0 +/******************************************************************** +Copyright ?2007 LGC Wireless, Inc. All rights reserved +File Name: aifg_debug.c +Description: Source file of debug submodule of AIFG +Version: v9.0.0 +Author: Roy Jiang +Create Date: 2007-3-22 + +History: +2007-3-22 v9.0.0 Create +*********************************************************************/ +#include "./include/aifg_msg.h" +#include "./include/aifg_var_ext.h" +#include "../../debug/src/include/debug.h" +#include "../../debug/src/include/debug_r9.h" + +static char help_info[] = "AIFG debug help:\r\n\ + log all Turn on all debug information\r\n\ + log none Turn off all information\r\n\ + log error on/off Turn on/off error information\r\n\ + list circuit group Print circuit group Table\r\n\ + list sap Print SAP information\r\n\ + list port Print opened port\r\n\ + list link Print opened link\r\n\ + wa port x Watch port x\r\n\ + wa link x Watch link x\r\n\ + "; + +const char *msg_name[] = { + "", + "PAGING RESPONSE", + "RR HANDOVER COMMAND", + "IMSI DETACH INDICATION", + "LOCATION UPDATING ACCEPT", + "LOCATION UPDATING REJECT", + "LOCATION UPDATING REQUEST", + "AUTHENTICATION REJECT", + "AUTHENTICATION REQUEST", + "AUTHENTICATION RESPONSE", + "IDENTITY REQUEST", + "IDENTITY RESPONSE", + "TMSI REALLOCATION COMMAND", + "TMSI REALLOCATION COMPLETE", + "CM SERVICE ACCEPT", + "CM SERVICE REJECT", + "CM SERVICE ABORT", + "CM SERVICE REQUEST", + "CM SERVICE PROMPT", + "CM RE-ESTABLISHMENT REQUEST", + "ABORT", + "MM NULL", + "MM STATUS", + "MM INFORMATION", + "ALERTING", + "CALL CONFIRMED", + "CALL PROCEEDING", + "CONNECT", + "CONNECT ACK", + "EMERGENCY SETUP", + "PROGRESS", + "SETUP", + "MODIFY", + "MODIFY COMPLETE", + "MODIFY REJECT", + "USER INFORMATION", + "HOLD", + "HOLD ACK", + "HOLD REJECT", + "RETRIEVE", + "RETRIEVE ACK", + "RETRIEVE REJECT", + "DISCONNECT", + "RELEASE", + "RELEASE COMPLETE", + "CONGESTION CONTROL", + "NOTIFY", + "STATUS", + "STATUS ENQUIRY", + "START DTMF", + "STOP DTMF", + "STOP DTMF ACK", + "START DTMF ACK", + "START DTMF REJECT", + "FACILITY", + "FACILITY SS", + "REGISTER", + "RELEASE COMPLETED SS", + "RP-DATA", + "RP-ACK", + "RP-ERROR", + "RP-SMMA", + "BLOCK", + "BLOCKING ACK", + "UNBLOCK", + "UNBLOCKING ACK", + "CIRCUIT GROUP BLOCK", + "CIRCUIT GROUP BLOCK ACK", + "CIRCUIT GROUP UNBLOCK", + "CIRCUIT GROUP UNBLOCK ACK", + "RESOURCE REQUEST", + "RESOURCE INDICATION", + "RESET", + "RESET ACK", + "PAGING", + "OVERLOAD", + "RESET CIRCUIT", + "RESET CIRCUIT ACK", + "HANDOVER CANDIDATE ENQUIRE", + "HANDOVER CANDIDATE RESPONSE", + "ASSIGN REQUEST", + "ASSIGN COMPLETE", + "ASSIGN FAILURE", + "HANDOVER REQUEST", + "HANDOVER REQUIRED", + "HANDOVER REQUEST ACK", + "HANDOVER COMMAND", + "HANDOVER COMPLETE", + "HANDOVER SUCCEEDED", + "HANDOVER FAILURE", + "HANDOVER PERFORMED", + "HANDOVER REQUIRED REJECT", + "HANDOVER DETECT", + "CLEAR COMMAND", + "CLEAR COMPLETE", + "CLEAR REQUEST", + "SAPI 'N' REJECT", + "CONFUSION", + "SUSPEND", + "RESUME", + "LOCATION INFORMATION COMMAND", + "LOCATION INFORMATION REPORT", + "MSC INVOKE TRACE", + "BSC INVOKE TRACE", + "UNEQUIPPED CIRCUIT", + "CHANGE CIRCUIT", + "CHANGE CIRCUIT ACK", + "CIPHER MODE COMMAND", + "CLASSMARK UPDATE", + "CIPHER MODE COMPLETE", + "QUEUEING INDICATION", + "COMPLETE LAYER 3 INFORMATION", + "CLASSMARK REQUEST", + "CIPHER MODE REJECT", + "LOAD INDICATION", + "LSA INFORMATION", + }; + +const char *sap_name[] = { + "MSC", + "BSC" + }; + +const char *ni_name[] = { + "NATIONAL", + "NATIONAL SPARE", + "INTERNATIONAL", + "INTERNATIONAL SPARE", + }; + +char aifg_ver[] = "R9V0_03A"; + +static const char *normal = "\033[0m"; +static const char *red = "\033[0;31;40m"; +static const char *green = "\033[0;32;40m"; +static const char *yellow = "\033[0;33;40m"; +static const char *blue = "\033[0;34;40m"; + +static char debug_buf[4096]; +static char new_debug_buf[4096]; +static char asc_in[256]; + +static int LOG_ERR_ID; +static int AIFG_DBEUG_SAPID; + +void aifg_parsecmd(); +char *sprint_msg_content(char *dst, BYTE *msg, int msg_len); +void aifg_debug_r9_init(); + +void aifg_debug_init() + { + DWORD status_id[20] = { 1, 3, 6, 1, 4, 1, 1373, 1, 3, 2, 3, 1, 2, 23, 1 }; + DWORD name_id[20] = { 1, 3, 6, 1, 4, 1, 1373, 1, 3, 2, 3, 1, 2, 23, 2 }; + BYTE debug_status = 1; + + debug_set_response (15, status_id, &debug_status, 1); + debug_set_response (15, name_id, aifg_ver, strlen(aifg_ver)); + + aifg_debug_r9_init(); + } + +void aifg_debug_timer() + { + BYTE npage, nline; + + switch (npage){ + default: + break; + } + } + +/* +Purpose: Print debug information +Input: aifg_event_code event: event code +void *msg: message pointer, will be convert to aifg_msg_t* or aifg_predecode_msg* +or SP_UiPriPara* according to different event +int o_info: other information, differ from event code +Outpur: none +*/ +void aifg_debug_print(aifg_event_code event, void *msg, int o_info) + { + char buffer[1024]; + struct timeval tv; + struct timezone tz; + struct tm *t; + char timestr[1024]; + + gettimeofday ( &tv, &tz ); + t = localtime ( &tv.tv_sec ); + sprintf ( timestr, "(%d:%d:%d.%ld):", t->tm_hour, t->tm_min, t->tm_sec, tv.tv_usec ); + + switch(event){ + case AIFG_SUCCEED: + goto FINISH; + break; + case AIFG_ERROR: + sprintf(buffer, "%sUnknown error!%s\n",red, normal); + break; + //error + case AIFG_ERR_OUT_OF_RESOURCE: + sprintf(buffer, "%sAIFG ALARM: Out of resources!%s\n",red, normal); + break; + case AIFG_ERR_UNKNOW_MSG: + sprintf(buffer, "%sAIFG ERROR: Unknown message received!%s\n",red, normal); + break; + case AIFG_ERR_UNKNOW_IE: + sprintf(buffer, "%sAIFG ERROR: Unknown IE in received message!%s\n",red, normal); + break; + case AIFG_ERR_ERROR_MSG: + sprintf(buffer, "%sAIFG ERROR: Damaged message received!%s\n",red, normal); + break; + case AIFG_ERR_ERROR_IE: + sprintf(buffer, "%sERROR: Damaged IE in received message!%s\n",red, normal); + break; + case AIFG_ERR_UP_NOT_EXIST: + sprintf(buffer, "%sERROR: Can not find the request SAP for received message!%s\n",red, normal); + break; + case AIFG_ERR_NO_UD_IN_CR: + sprintf(buffer, "%sERROR: CR received without user data field%s\n",red, normal); + break; + case AIFG_ERR_UNEXPECTED_DT1: + sprintf(buffer, "%sERROR: Unexpected DT1 received!%s\n",red, normal); + break; + case AIFG_ERR_UNEXPECTED_UDT: + sprintf(buffer, "%sERROR: Unexpected UDT received!%s\n",red, normal); + break; + case AIFG_ERR_UNEXPECTED_PAGING_RESP: + sprintf(buffer, "%sERROR: Unexpected Paging Response received!%s\n",red, normal); + break; + case AIFG_ERR_INVALID_TI: + { + aifg_msg_pre_decoded *pMsg = (aifg_msg_pre_decoded *)msg; + sprintf(buffer, "%sERROR: Invalid TI in message %s, link %d! %s\n", + red, + msg_name[pMsg->id], + o_info, + normal); + } + break; + case AIFG_ERR_MISS_MANDATORY: + { + aifg_msg_pre_decoded *pMsg = (aifg_msg_pre_decoded *)msg; + sprintf(buffer, "%sERROR: Damaged message %s, missing mandatory! %s\n", + red, + msg_name[pMsg->id], + normal); + } + break; + case AIFG_ERR_MSG_RV_TO_IDLE_PORT: + { + aifg_msg_pre_decoded *pMsg = (aifg_msg_pre_decoded *)msg; + sprintf(buffer, "%sERROR: Message %s received from link %d for IDLE port %d!%s\n", + red, + msg_name[pMsg->id], + aifg_pcb[pMsg->aif_port].link_id, + pMsg->aif_port, + normal); + } + + break; + case AIFG_ERR_MSG_SD_TO_IDLE_PORT: + { + aifg_msg_t *pMsg = (aifg_msg_t *)msg; + sprintf(buffer, "%sERROR: Application send message %s to IDLE port %d!%s\n", + red, + msg_name[pMsg->id], + pMsg->aif_port, + normal); + } + + break; + + //event + case AIFG_EVENT_REDIR_MSG: + sprintf(buffer, "AIFG EVENT: Message directed to the other server!\n"); + break; + case AIFG_EVENT_LINK_RELEASE: + sprintf(buffer, "Link %d released!\n", o_info); + break; + case AIFG_EVENT_RV_MSG: + { + aifg_msg_pre_decoded *pMsg = (aifg_msg_pre_decoded *)msg; + sprintf(buffer, "%sSCCP => AIFG: ID: %s, APP_PORT:%d, AIFG_PORT:%d, LINK_ID:%d%s,\n", + green, + msg_name[pMsg->id], + aifg_pcb[pMsg->aif_port].upper_port, + pMsg->aif_port, + aifg_pcb[pMsg->aif_port].link_id, + normal + ); + } + break; + + case AIFG_EVENT_SD_MSG: + { + aifg_msg_t *pMsg = (aifg_msg_t *)msg; + sprintf(buffer, "%sAIFG => SCCP: ID: %s, APP_PORT:%d, AIFG_PORT:%d, LINK_ID:%d%s\n", + yellow, + msg_name[pMsg->id], + pMsg->app_port, + pMsg->aif_port, + aifg_pcb[pMsg->aif_port].link_id, + normal + ); + } + break; + default: + goto FINISH; + break; + } + debug_print_ascii(AIFG_DBEUG_SAPID, strcat(timestr, buffer)); + +FINISH: + aifg_event = AIFG_SUCCEED; + return; + } + +void aifg_print_error(int err_code) + { + + } + +char *aifg_get_open_port(int flag) + { + int i = 0, j = 0; + char tmp_buf[10]; + new_debug_buf[0] = '\0'; + while (i < AIFG_MAX_PORT){ + if(aifg_pcb[i].stat != 0){ + if(j % 16 == 15) + sprintf(tmp_buf,"\n%d\t", i); + else + sprintf(tmp_buf,"%d\t", i); + strcat(new_debug_buf, tmp_buf); + j++; + } + i++; + } + + // if(flag == 0) + // aifg_log(new_debug_buf); + + return new_debug_buf; + } + +char *aifg_get_open_link(int flag) + { + int i = 0, j = 0; + char tmp_buf[10]; + new_debug_buf[0] = '\0'; + while (i < SCCP_MAX_LINK){ + if(link_info[i].en_flag != 0){ + if(j % 16 == 15) + sprintf(tmp_buf,"\n%d\t", i); + else + sprintf(tmp_buf,"%d\t", i); + strcat(new_debug_buf, tmp_buf); + j++; + } + i++; + } + + // if(flag == 0) + // aifg_log(new_debug_buf); + + return new_debug_buf; + } + +char *aifg_print_port_info(int i, int flag) + { + char imsi[32]; + + sprintf(new_debug_buf, + "=======AIFG Port %d=======\r\n\ + stat: %d\r\n\ + sapid: %d\r\n\ + cgid: %d\r\n\ + linkid: %d\r\n\ + new_link: %d\r\r\ + app_port: \%d\r\n\ + timer: %d\r\n\ + ti: %d\r\n\ + ti_type: %d\r\n\ + ti_stat: %d\r\n\ + ho_stat: %d\r\n\ + app_ho_port: %d\r\n\ + rel_cause: %d\r\n\ + pNextOpenPort: %d\r\n\ + pPrevOpenPort: %d\r\n\ + pNextPort: %d\r\n\ + pPrevPort: %d\r\n\ + ==========================\n", + i, + aifg_pcb[i].stat, + aifg_pcb[i].sapid, + aifg_pcb[i].cgid, + aifg_pcb[i].link_id, + aifg_pcb[i].new_link, + aifg_pcb[i].upper_port, + aifg_pcb[i].timer, + aifg_pcb[i].ti, + aifg_pcb[i].ti_type, + aifg_pcb[i].ti_stat, + aifg_pcb[i].ho_stat, + aifg_pcb[i].app_ho_port, + aifg_pcb[i].rel_cause, + aifg_pcb[i].pNextOpenPort - aifg_pcb, + aifg_pcb[i].pPrevOpenPort - aifg_pcb, + aifg_pcb[i].pNextPort - aifg_pcb, + aifg_pcb[i].pPrevPort - aifg_pcb); + + // if(flag == 0) + // aifg_log(new_debug_buf); + + return new_debug_buf; + } + +char *aifg_print_link_info(int i, int flag){ + sprintf(new_debug_buf, + "=======AIFG Link %d=======\r\n\ + en_flag: %d\r\n\ + sapid: %d\r\n\ + cur_port: \%d\r\n\ + ti_number: %d\r\n\ + ti[0] port: %d\r\n\ + ti[1] port: %d\r\n\ + ti[2] port: %d\r\n\ + ti[3] port: %d\r\n\ + ti[4] port: %d\r\n\ + ti[5] port: %d\r\n\ + ti[6] port: %d\r\n\ + ti[7] port: %d\r\n\ + ti[8] port: %d\r\n\ + ti[9] port: %d\r\n\ + ti[10] port: %d\r\n\ + ti[11] port: %d\r\n\ + ti[12] port: %d\r\n\ + ti[13] port: %d\r\n\ + ti[14] port: %d\r\n\ + ti[15] port: %d\r\n\ + ==========================\n", + i, + link_info[i].en_flag, + link_info[i].sapid, + link_info[i].cur_port, + link_info[i].ti_number, + link_info[i].ti[0].port, + link_info[i].ti[1].port, + link_info[i].ti[2].port, + link_info[i].ti[3].port, + link_info[i].ti[4].port, + link_info[i].ti[5].port, + link_info[i].ti[6].port, + link_info[i].ti[7].port, + link_info[i].ti[8].port, + link_info[i].ti[9].port, + link_info[i].ti[10].port, + link_info[i].ti[11].port, + link_info[i].ti[12].port, + link_info[i].ti[13].port, + link_info[i].ti[14].port, + link_info[i].ti[15].port); + + //if(flag == 0) + // aifg_log(new_debug_buf); + + return new_debug_buf; + } + +char *aifg_print_cg() + { + int i; + char tmp_buf[256]; + sprintf(new_debug_buf, "Current enabled circuit group:\r\n"); + strcat(new_debug_buf, "CG_ID\t\tDPC\t\tNI\n"); + for (i=0; i < AIFG_MAX_CG; i++){ + if (cg[i].enable != 0){ + sprintf(tmp_buf, "%d\t\t%d\t\t%s\n", i, cg[i].dpc, ni_name[cg[i].ni]); + } + } + strcat(new_debug_buf, tmp_buf); + return new_debug_buf; + } +//DEBUG R9------------------------------------------------------------------------------------------------------------ +char *aifg_debug_help() + { + return help_info; + } + +static int watach_param_port; +static int watach_param_link; +char *aifg_debug_watch(int param_id, int value) + { + if (value < 0){ + sprintf(debug_buf, "Illegal parameter value!\n"); + return debug_buf; + } + + if (param_id == watach_param_port){ + return aifg_print_port_info(value, 1); + } + else if (param_id == watach_param_link){ + return aifg_print_link_info(value, 1); + } + else{ + assert(0); + return NULL; + } + } + +static int list_param_port; +static int list_param_link; +static int list_param_cg; +char *aifg_debug_list(int param_id, int value) + { + int i; + if (param_id == list_param_port){ + return aifg_get_open_port(1); + } + else if (param_id == list_param_link){ + return aifg_get_open_link(1); + } + else if (param_id == list_param_cg){ + return aifg_print_cg(); + } + else{ + assert(0); + return NULL; + } + } + +void aifg_debug_r9_init() + { + int cmdid, paramid; + AIFG_DBEUG_SAPID = debug_bind("AIF", "R9V03A"); + cmdid = debug_add_cmd(AIFG_DBEUG_SAPID, "help", aifg_debug_help); + + //cmd watch + cmdid = debug_add_cmd(AIFG_DBEUG_SAPID, "wa", aifg_debug_watch); + watach_param_port = debug_add_cmd_param(AIFG_DBEUG_SAPID, cmdid, "port"); + watach_param_link = debug_add_cmd_param(AIFG_DBEUG_SAPID, cmdid, "link"); + + //cmd list + cmdid = debug_add_cmd(AIFG_DBEUG_SAPID, "list", aifg_debug_list); + list_param_port = debug_add_cmd_param(AIFG_DBEUG_SAPID, cmdid, "port"); + list_param_link = debug_add_cmd_param(AIFG_DBEUG_SAPID, cmdid, "link"); + list_param_cg = debug_add_cmd_param(AIFG_DBEUG_SAPID, cmdid, "cg"); + + //add log + LOG_ERR_ID = debug_add_log(AIFG_DBEUG_SAPID, "error"); + } + +#endif diff --git a/omc/plat/aif/src/aifg_ie.c b/omc/plat/aif/src/aifg_ie.c new file mode 100644 index 0000000..f7fe169 --- /dev/null +++ b/omc/plat/aif/src/aifg_ie.c @@ -0,0 +1,2227 @@ +/******************************************************************** +Copyright ?2007 LGC Wireless, Inc. All rights reserved +File Name: aifg_ie.h +Description: Implementation of IE encode/decode functions +Version: v9.0.0 +Author: Roy Jiang +Create Date: 2007-3-21 + +History: +2007-3-21 v9.0.0 Create +*********************************************************************/ +#include "./include/aifg_var_ext.h" + +/* +Name: aifg_get_iei +Purpose:Convert local IE ID to protocol IEI +Input: aifg_msg_protocol protocol: BSSMAP or DTAP + aifg_pre_decoded_ie *pre_decoded: pre-decoded IE structure + aifg_ie *dst: pointer to a aifg_ie structure object in which the decoded message will be stored. +Output: Total length of decoded IE +*/ +int aifg_get_iei(int localId) +{ + switch(localId){ + case AIFG_IE_ID_BM_CIC: + return AIFG_IEI_BM_CIC; + break; + case AIFG_IE_ID_BM_CHANNELTYPE: + return AIFG_IEI_BM_CHANNELTYPE; + break; + case AIFG_IE_ID_BM_FORWARDIND: + return AIFG_IEI_BM_FORWARDIND; + break; + case AIFG_IE_ID_BM_RESOURCEAVAIL: + return AIFG_IEI_BM_RESOURCEAVAIL; + break; + case AIFG_IE_ID_BM_CAUSE: + return AIFG_IEI_BM_CAUSE; + break; + case AIFG_IE_ID_BM_CELLID: + return AIFG_IEI_BM_CELLID; + break; + case AIFG_IE_ID_BM_PRIORITY: + return AIFG_IEI_BM_PRIORITY; + break; + case AIFG_IE_ID_BM_L3HEADERINFO: + return AIFG_IEI_BM_L3HEADERINFO; + break; + case AIFG_IE_ID_BM_IMSI: + return AIFG_IEI_BM_IMSI; + break; + case AIFG_IE_ID_BM_TMSI: + return AIFG_IEI_BM_TMSI; + break; + case AIFG_IE_ID_BM_ENCRYPTINFO: + return AIFG_IEI_BM_ENCRYPTINFO; + break; + case AIFG_IE_ID_BM_PERIODICITY: + return AIFG_IEI_BM_PERIODICITY; + break; + case AIFG_IE_ID_BM_EXTRESOURCEIND: + return AIFG_IEI_BM_EXTRESOURCEIND; + break; + case AIFG_IE_ID_BM_MSNUM: + return AIFG_IEI_BM_MSNUM; + break; + case AIFG_IE_ID_BM_CLASSMARKINFO2: + return AIFG_IEI_BM_CLASSMARKINFO2; + break; + case AIFG_IE_ID_BM_CLASSMARKINFO3: + return AIFG_IEI_BM_CLASSMARKINFO3; + break; + case AIFG_IE_ID_BM_BANDUSED: + return AIFG_IEI_BM_BANDUSED; + break; + case AIFG_IE_ID_BM_RRCAUSE: + return AIFG_IEI_BM_RRCAUSE; + break; + case AIFG_IE_ID_BM_L3INFO: + return AIFG_IEI_BM_L3INFO; + break; + case AIFG_IE_ID_BM_DLCI: + return AIFG_IEI_BM_DLCI; + break; + case AIFG_IE_ID_BM_DTXFLAG: + return AIFG_IEI_BM_DTXFLAG; + break; + case AIFG_IE_ID_BM_CELLIDLIST: + return AIFG_IEI_BM_CELLIDLIST; + break; + case AIFG_IE_ID_BM_RESPREQ: + return AIFG_IEI_BM_RESPREQ; + break; + case AIFG_IE_ID_BM_RESOURCEINDMEHTOD: + return AIFG_IEI_BM_RESOURCEINDMEHTOD; + break; + case AIFG_IE_ID_BM_CLASSMARKINFO1: + return AIFG_IEI_BM_CLASSMARKINFO1; + break; + case AIFG_IE_ID_BM_CICLIST: + return AIFG_IEI_BM_CICLIST; + break; + case AIFG_IE_ID_BM_DIGNOSTIC: + return AIFG_IEI_BM_DIGNOSTIC; + break; + case AIFG_IE_ID_BM_L3MSGCONTENT: + return AIFG_IEI_BM_L3MSGCONTENT; + break; + case AIFG_IE_ID_BM_CHOSENCHANNEL: + return AIFG_IEI_BM_CHOSENCHANNEL; + break; + case AIFG_IE_ID_BM_TOTALRESOURCE: + return AIFG_IEI_BM_TOTALRESOURCE; + break; + case AIFG_IE_ID_BM_CIPHERRESPMODE: + return AIFG_IEI_BM_CIPHERRESPMODE; + break; + case AIFG_IE_ID_BM_CHANNELNEEDED: + return AIFG_IEI_BM_CHANNELNEEDED; + break; + case AIFG_IE_ID_BM_TRACETYPE: + return AIFG_IEI_BM_TRACETYPE; + break; + case AIFG_IE_ID_BM_TRIGGERID: + return AIFG_IEI_BM_TRIGGERID; + break; + case AIFG_IE_ID_BM_TRACEREF: + return AIFG_IEI_BM_TRACEREF; + break; + case AIFG_IE_ID_BM_TRANSACTIONID: + return AIFG_IEI_BM_TRANSACTIONID; + break; + case AIFG_IE_ID_BM_MOBILEID: + return AIFG_IEI_BM_MOBILEID; + break; + case AIFG_IE_ID_BM_OMCID: + return AIFG_IEI_BM_OMCID; + break; + case AIFG_IE_ID_BM_CHOSENENCRYPT: + return AIFG_IEI_BM_CHOSENENCRYPT; + break; + case AIFG_IE_ID_BM_CIRCUITPOOL: + return AIFG_IEI_BM_CIRCUITPOOL; + break; + case AIFG_IE_ID_BM_CIRCUITPOOLLIST: + return AIFG_IEI_BM_CIRCUITPOOLLIST; + break; + case AIFG_IE_ID_BM_TIMEIND: + return AIFG_IEI_BM_TIMEIND; + break; + case AIFG_IE_ID_BM_RESOURCESITUATION: + return AIFG_IEI_BM_RESOURCESITUATION; + break; + case AIFG_IE_ID_BM_CURCHANNELTYPE1: + return AIFG_IEI_BM_CURCHANNELTYPE1; + break; + case AIFG_IE_ID_BM_QUEUEIND: + return AIFG_IEI_BM_QUEUEIND; + break; + case AIFG_IE_ID_BM_SPEECHVER: + return AIFG_IEI_BM_SPEECHVER; + break; + case AIFG_IE_ID_BM_ASSIGNREQUIREMENT: + return AIFG_IEI_BM_ASSIGNREQUIREMENT; + break; + case AIFG_IE_ID_BM_TALKERFLAG: + return AIFG_IEI_BM_TALKERFLAG; + break; + case AIFG_IE_ID_BM_CONNRELREQ: + return AIFG_IEI_BM_CONNRELREQ; + break; + case AIFG_IE_ID_BM_GROUPCALLREF: + return AIFG_IEI_BM_GROUPCALLREF; + break; + case AIFG_IE_ID_BM_EMLPP: + return AIFG_IEI_BM_EMLPP; + break; + case AIFG_IE_ID_BM_CFGEVOIND: + return AIFG_IEI_BM_CFGEVOIND; + break; + case AIFG_IE_ID_BM_BSSOLDTONEW: + return AIFG_IEI_BM_BSSOLDTONEW; + break; + case AIFG_IE_ID_BM_LSAID: + return AIFG_IEI_BM_LSAID; + break; + case AIFG_IE_ID_BM_LSAIDLIST: + return AIFG_IEI_BM_LSAIDLIST; + break; + case AIFG_IE_ID_BM_LSAINFO: + return AIFG_IEI_BM_LSAINFO; + break; + case AIFG_IE_ID_BM_LOCATIONINFO: + return AIFG_IEI_BM_LOCATIONINFO; + break; +/////////dtap////////// + //common + case AIFG_IE_ID_DT_LAI: + return AIFG_IEI_DT_LAI; + break; + case AIFG_IE_ID_DT_MOBILEID: + return AIFG_IEI_DT_MOBILEID; + break; + case AIFG_IE_ID_DT_MSCM3: + return AIFG_IEI_DT_MSCM3; + break; + case AIFG_IE_ID_DT_PRIORITYLEVEL: + return AIFG_IEI_DT_PRIORITYLEVEL; + break; + + //mm + case AIFG_IE_ID_DT_FULL_NWNAME: + return AIFG_IEI_DT_FULL_NWNAME; + break; + case AIFG_IE_ID_DT_SHORT_NWNAME: + return AIFG_IEI_DT_SHORT_NWNAME; + break; + case AIFG_IE_ID_DT_FLONPROCEED: + return AIFG_IEI_DT_FLONPROCEED; + break; + case AIFG_IE_ID_DT_TIMEZONE: + return AIFG_IEI_DT_TIMEZONE; + break; + case AIFG_IE_ID_DT_TZTIME: + return AIFG_IEI_DT_TZTIME; + break; + case AIFG_IE_ID_DT_CTS: + return AIFG_IEI_DT_CTS; + break; + case AIFG_IE_ID_DT_LSAID: + return AIFG_IEI_DT_LSAID; + break; + //cc + case AIFG_IE_ID_DT_AUXSTAT: + return AIFG_IEI_DT_AUXSTAT; + break; + case AIFG_IE_ID_DT_BEARERCAP: + return AIFG_IEI_DT_BEARERCAP; + break; + case AIFG_IE_ID_DT_CCCAP: + return AIFG_IEI_DT_CCCAP; + break; + case AIFG_IE_ID_DT_CALLEDBCD: + return AIFG_IEI_DT_CALLEDBCD; + break; + case AIFG_IE_ID_DT_CALLEDSUBADDR: + return AIFG_IEI_DT_CALLEDSUBADDR; + break; + case AIFG_IE_ID_DT_CALLERBCD: + return AIFG_IEI_DT_CALLERBCD; + break; + case AIFG_IE_ID_DT_CALLERSUBADDR: + return AIFG_IEI_DT_CALLERSUBADDR; + break; + case AIFG_IE_ID_DT_CAUSE: + return AIFG_IEI_DT_CAUSE; + break; + case AIFG_IE_ID_DT_CLIRSUP: + return AIFG_IEI_DT_CLIRSUP; + break; + case AIFG_IE_ID_DT_CLIRIVO: + return AIFG_IEI_DT_CLIRIVO; + break; + case AIFG_IE_ID_DT_CONNNUM: + return AIFG_IEI_DT_CONNNUM; + break; + case AIFG_IE_ID_DT_CONNSUBADDR: + return AIFG_IEI_DT_CONNSUBADDR; + break; + case AIFG_IE_ID_DT_FACILITY: + return AIFG_IEI_DT_FACILITY; + break; + case AIFG_IE_ID_DT_HIGHCOM: + return AIFG_IEI_DT_HIGHCOM; + break; + case AIFG_IE_ID_DT_KEYPAD: + return AIFG_IEI_DT_KEYPAD; + break; + case AIFG_IE_ID_DT_LOWCOM: + return AIFG_IEI_DT_LOWCOM; + break; + case AIFG_IE_ID_DT_MOREDATA: + return AIFG_IEI_DT_MOREDATA; + break; + case AIFG_IE_ID_DT_PROGIND: + return AIFG_IEI_DT_PROGIND; + break; + case AIFG_IE_ID_DT_REDIRBCD: + return AIFG_IEI_DT_REDIRBCD; + break; + case AIFG_IE_ID_DT_REDIRSUBADDR: + return AIFG_IEI_DT_REDIRSUBADDR; + break; + case AIFG_IE_ID_DT_REPEATIND: + return AIFG_IEI_DT_REPEATIND; + break; + case AIFG_IE_ID_DT_REVCALLDIR: + return AIFG_IEI_DT_REVCALLDIR; + break; + case AIFG_IE_ID_DT_SIGNAL: + return AIFG_IEI_DT_SIGNAL; + break; + case AIFG_IE_ID_DT_SSVER: + return AIFG_IEI_DT_SSVER; + break; + case AIFG_IE_ID_DT_USERUSER: + return AIFG_IEI_DT_USERUSER; + break; + case AIFG_IE_ID_DT_ALERTPATTERN://zhugq + return AIFG_IEI_DT_ALERTPATTERN; + break; + case AIFG_IE_ID_DT_RP_UD: + return AIFG_IEI_DT_RP_UD; + break; + case AIFG_IE_ID_DT_RP_CAUSE: + return AIFG_IEI_DT_RP_CAUSE; + break; + default: + assert(0); + return AIFG_ERROR; + break; + } +} + +//Information element process functions definition------------------------------------ +/* +Name: aifg_ie_decode +Purpose: Information element decode function +Input: aifg_msg_protocol protocol: BSSMAP or DTAP + aifg_pre_decoded_ie *pre_decoded: pre-decoded IE structure + aifg_ie *dst: pointer to a aifg_ie structure object in which the decoded message will be stored. +Output: Total length of decoded IE +*/ +int aifg_ie_decode(aifg_ie_ptr *pre_decoded, aifg_ie *dst) +{ + int i, j; + int ie_len = 0, offset = 0; + BYTE hi_lo_flag; + BYTE *src; + + memset(dst, 0, sizeof(aifg_ie)); + + //checking parameter + if (pre_decoded == NULL || pre_decoded->ptr == NULL || dst == NULL){ + assert(0); + goto ERR_PROC; + } + + src = pre_decoded->ptr; + hi_lo_flag = pre_decoded->hi_lo_flag; + dst->iei = pre_decoded->iei; + + switch(dst->iei){ + /*the usage of these IEs are uncertain yet + case AIFG_IE_ID_DT_CODESETEXT: + //TODO + break; + case AIFG_IE_ID_DT_SHIFT: + //TODO + break; + */ + case AIFG_IE_ID_DT_CLIRSUP: + //TODO + break; + case AIFG_IE_ID_DT_CLIRIVO: + //TODO + break; + case AIFG_IE_ID_DT_FACILITY: + dst->param.dt_facility.component_len = src[offset]; + ie_len = src[offset++]+1; + + memcpy(dst->param.dt_facility.component, src + offset, dst->param.dt_facility.component_len); +/* + ie_len = src[offset++]+1; + + if(src[offset] == 0xa1)//invoke + { + dst->param.dt_facility.components.invoke.tag = src[offset++]; + dst->param.dt_facility.components.invoke.len = src[offset++]; + + //invoke_id - M + dst->param.dt_facility.components.invoke.invoke_id.tag = src[offset++]; + assert(src[offset++] == 1); + dst->param.dt_facility.components.invoke.invoke_id.len = 1; + dst->param.dt_facility.components.invoke.invoke_id.id = src[offset++]; + + if(src[offset] == 0x80)//linked_id - O + { + dst->param.dt_facility.components.invoke.linked_id.flag = 1; + dst->param.dt_facility.components.invoke.linked_id.tag = src[offset++]; + assert(src[offset++] == 1); + dst->param.dt_facility.components.invoke.linked_id.len = 1; + dst->param.dt_facility.components.invoke.linked_id.id = src[offset++]; + i = 3; + } + + //operation code -M + dst->param.dt_facility.components.invoke.opCode.tag = src[offset++]; + dst->param.dt_facility.components.invoke.opCode.len = src[offset++]; + memcpy(dst->param.dt_facility.components.invoke.opCode.op,&src[offset],dst->param.dt_facility.components.invoke.opCode.len); + offset += dst->param.dt_facility.components.invoke.opCode.len; + + //parameters - O + j = dst->param.dt_facility.components.invoke.len - (3+i+2+dst->param.dt_facility.components.invoke.opCode.len); + assert(j == 1 || j == 0); + if(j == 1) + { + dst->param.dt_facility.components.invoke.param.flag = 1; + dst->param.dt_facility.components.invoke.param.param = src[offset++]; + } + } + //retrun result + if((offset < ie_len) && (src[offset] == 0xa2)) + { + dst->param.dt_facility.components.return_result.tag = src[offset++]; + dst->param.dt_facility.components.return_result.len = src[offset++]; + + //invoke_id - M + dst->param.dt_facility.components.return_result.invoke_id.tag = src[offset++]; + assert(src[offset++] == 1); + dst->param.dt_facility.components.return_result.invoke_id.len = 1; + dst->param.dt_facility.components.return_result.invoke_id.id = src[offset++]; + + //sequence - O + if(src[offset] == 0x30) + { + dst->param.dt_facility.components.return_result.sequence.flag = 1; + dst->param.dt_facility.components.return_result.sequence.tag = src[offset++]; + dst->param.dt_facility.components.return_result.sequence.len = src[offset++]; + } + + //operation code - O + if(src[offset] == 0x02) + { + dst->param.dt_facility.components.return_result.opCode.flag = 1; + dst->param.dt_facility.components.return_result.opCode.tag = src[offset++]; + dst->param.dt_facility.components.return_result.opCode.len = src[offset++]; + memcpy(dst->param.dt_facility.components.return_result.opCode.op,&src[offset] + ,dst->param.dt_facility.components.invoke.opCode.len); + offset += dst->param.dt_facility.components.return_result.opCode.len; + } + //parameters - O + j = dst->param.dt_facility.components.return_result.len - + (3+2+dst->param.dt_facility.components.return_result.opCode.len); + if(1 == dst->param.dt_facility.components.return_result.sequence.flag) + { + dst->param.dt_facility.components.return_result.param.flag = 1; + memcpy(&dst->param.dt_facility.components.return_result.param.param,&src[offset], + dst->param.dt_facility.components.return_result.sequence.len); + offset += dst->param.dt_facility.components.return_result.sequence.len; + } + else if(j == 1) + { + dst->param.dt_facility.components.return_result.param.flag = 1; + dst->param.dt_facility.components.return_result.param.param[0] = src[offset++]; + } + } + //return error + if((offset < ie_len) && (src[offset] == 0xa3)) + { + dst->param.dt_facility.components.return_error.tag = src[offset++]; + dst->param.dt_facility.components.return_error.len = src[offset++]; + + //invoke_id - M + dst->param.dt_facility.components.return_error.invoke_id.tag = src[offset++]; + assert(src[offset++] == 1); + dst->param.dt_facility.components.return_error.invoke_id.len = 1; + dst->param.dt_facility.components.return_error.invoke_id.id = src[offset++]; + + //error code -M + dst->param.dt_facility.components.return_error.error.tag = src[offset++]; + dst->param.dt_facility.components.return_error.error.len = src[offset++]; + memcpy(dst->param.dt_facility.components.return_error.error.er,&src[offset],dst->param.dt_facility.components.return_error.error.len); + offset += dst->param.dt_facility.components.return_error.error.len; + + //parameters - O + j = dst->param.dt_facility.components.return_error.len - (3+2+dst->param.dt_facility.components.return_error.error.len); + assert(j == 1 || j == 0); + if(j == 1) + { + dst->param.dt_facility.components.return_error.param.flag = 1; + dst->param.dt_facility.components.return_error.param.param = src[offset++]; + } + } + // reject + if((offset < ie_len) && (src[offset] == 0xa4)) + { + + dst->param.dt_facility.components.reject.tag = src[offset++]; + dst->param.dt_facility.components.reject.len = src[offset++]; + + //invoke_id - M + dst->param.dt_facility.components.reject.invoke_id.tag = src[offset++]; + assert(src[offset++] == 1); + dst->param.dt_facility.components.reject.invoke_id.len = 1; + dst->param.dt_facility.components.reject.invoke_id.id = src[offset++]; + + //problem code -M + dst->param.dt_facility.components.reject.problem.tag = src[offset++]; + dst->param.dt_facility.components.reject.problem.len = src[offset++]; + memcpy(dst->param.dt_facility.components.reject.problem.pro,&src[offset],dst->param.dt_facility.components.reject.problem.len); + offset += dst->param.dt_facility.components.reject.problem.len; + } +*/ + break; + case AIFG_IE_ID_DT_BEARERCAP: + ie_len = src[offset++] + 1; + //octet 3 + dst->param.dt_bc.channel_require = (src[offset] & 0x60) >> 5; + dst->param.dt_bc.coding_std = (src[offset] & 0x10) >> 4; + dst->param.dt_bc.trans_mode = (src[offset] & 0x08) >> 3; + dst->param.dt_bc.info_trans_cap= src[offset] & 0x07; + if((0 == dst->param.dt_bc.info_trans_cap)){ + if(0 == (src[offset++] & 0x80)){ + //extended - octet 3a optional + aifg_set_field(dst->param.dt_bc.coding, (src[offset] & 0x40) >> 6); + aifg_set_field(dst->param.dt_bc.speech_ver, src[offset] & 0x0F); + } + } + else{ + if((offset < ie_len) && (0 != dst->param.dt_bc.info_trans_cap)){ + //not speech + //octet 4 + offset++; + aifg_set_field(dst->param.dt_bc.compress, (src[offset] & 0x40) >> 6); + aifg_set_field(dst->param.dt_bc.structure, (src[offset] & 0x30) >> 4); + aifg_set_field(dst->param.dt_bc.dupl_mode, (src[offset] & 0x08) >> 3); + aifg_set_field(dst->param.dt_bc.confiure, (src[offset] & 0x04) >> 2); + aifg_set_field(dst->param.dt_bc.nirr, (src[offset] & 0x02) >> 1); + aifg_set_field(dst->param.dt_bc.establishment, src[offset++]&0x01); + + //octet 5 + aifg_set_field(dst->param.dt_bc.rate_adaption, (src[offset] & 0x18) >> 3); + aifg_set_field(dst->param.dt_bc.signal_protocol, src[offset] & 0x07); + if(0 == (src[offset++] & 0x80)){ + //extended - octet 5a optional + aifg_set_field(dst->param.dt_bc.o_itc, (src[offset] & 0x60) >> 5); + aifg_set_field(dst->param.dt_bc.o_rate_adaption, (src[offset] & 0x18) >> 3); + + if(0 == (src[offset++] & 0x80)){ + //extended - octet 5b optional + aifg_set_field(dst->param.dt_bc.hdr_nohdr, (src[offset] & 0x40) >> 6); + aifg_set_field(dst->param.dt_bc.multi_frame, (src[offset] & 0x20) >> 5); + aifg_set_field(dst->param.dt_bc.mode, (src[offset] & 0x10) >> 4); + aifg_set_field(dst->param.dt_bc.lli, (src[offset] & 0x08) >> 3); + aifg_set_field(dst->param.dt_bc.assign_or_e, (src[offset] & 0x04) >> 2); + aifg_set_field(dst->param.dt_bc.inb_neg, (src[offset++] & 0x02) >> 1); + } + } + + //octet 6 + aifg_set_field(dst->param.dt_bc.layer1_id, 1); + aifg_set_field(dst->param.dt_bc.user_info1_protocol, (src[offset] & 0x1E) >> 1); + aifg_set_field(dst->param.dt_bc.sync_async, src[offset++] & 0x01); + + //extended - octet 6a mandatory + aifg_set_field(dst->param.dt_bc.num_stop_bits, (src[offset] & 0x40) >> 6); + aifg_set_field(dst->param.dt_bc.negotiation, (src[offset] & 0x20) >> 5); + aifg_set_field(dst->param.dt_bc.num_data_bits, (src[offset] & 0x10) >> 4); + aifg_set_field(dst->param.dt_bc.user_rate, src[offset++] & 0x0F); + + //extended - octet 6b mandatory + aifg_set_field(dst->param.dt_bc.intermed_rate, (src[offset] & 0x60) >> 5); + aifg_set_field(dst->param.dt_bc.nic_on_tx, (src[offset] & 0x10) >> 4); + aifg_set_field(dst->param.dt_bc.nic_on_rx, (src[offset] & 0x08) >> 3); + aifg_set_field(dst->param.dt_bc.parity, src[offset++] & 0x07); + + //extended - octet 6c mandatory + aifg_set_field(dst->param.dt_bc.connection_element, (src[offset] & 0x60) >> 5); + aifg_set_field(dst->param.dt_bc.modem_type, src[offset] & 0x1F); + + if(0 == (src[offset++] & 0x80)){ + //extended - octet 6d optional + aifg_set_field(dst->param.dt_bc.o_modem_type, (src[offset] & 0x60) >> 5); + aifg_set_field(dst->param.dt_bc.fixed_nw_user_rate, src[offset] & 0x1F); + + if(0 == (src[offset++] & 0x80)){ + //extended - octet 6e optional + aifg_set_field(dst->param.dt_bc.acceptable_chennel_code, (src[offset] & 0xF8) >> 3); + aifg_set_field(dst->param.dt_bc.max_traffic_channel, src[offset] & 0x07); + + if(0 == (src[offset++] & 0x80)){ + //extended - octet 6f optional + aifg_set_field(dst->param.dt_bc.uimi, (src[offset] & 0x70) >> 4); + aifg_set_field(dst->param.dt_bc.wanted_air_if_user_rate, src[offset] & 0x0F); + } + } + } + + if(++offset < ie_len){ + //extended - octet 7 optional + aifg_set_field(dst->param.dt_bc.layer2_id, 2); + aifg_set_field(dst->param.dt_bc.user_info2_protocol, src[offset] & 0x1F); + } + } + } + break; + case AIFG_IE_ID_DT_CIPHERKEY: + if(hi_lo_flag == AIFG_LOW_BITS) //At low 4 bits + dst->param.dt_cipherKey.value = src[offset] & 0x0F; + else //At high 4 bits + dst->param.dt_cipherKey.value = (src[offset] & 0xF0) >> 4; + break; + case AIFG_IE_ID_DT_LAI: + dst->param.dt_lai.mcc[0] = src[offset] & 0x0F; + dst->param.dt_lai.mcc[1] = (src[offset++] & 0xF0) >> 4; + dst->param.dt_lai.mcc[2] = src[offset] & 0x0F; + dst->param.dt_lai.mnc[2] = (src[offset++] & 0xF0) >> 4; + dst->param.dt_lai.mnc[1] = (src[offset] & 0xF0) >> 4; + dst->param.dt_lai.mnc[0] = src[offset++] & 0x0F; + dst->param.dt_lai.LAC = (src[offset] << 8) | src[offset+1]; + break; + case AIFG_IE_ID_DT_MOBILEID: + MOBILE_ID: + ie_len = src[offset++] + 1; + dst->param.mobileId.type = src[offset] & 0x07; + dst->param.mobileId.odd_even_flag = (src[offset] & 0x08) >> 3; + i = 0; + if(dst->param.mobileId.type == 4)//TMSI + offset++; + else + dst->param.mobileId.id[i++] = (src[offset++] & 0xf0)>>4; + + while(offset < ie_len){ + dst->param.mobileId.id[i++] = src[offset] & 0x0F; + dst->param.mobileId.id[i++] = (src[offset] & 0xF0) >> 4; + offset++; + } + if(0 == dst->param.mobileId.odd_even_flag) + dst->param.mobileId.id_len = i-1; + else + dst->param.mobileId.id_len = i; + break; + case AIFG_IE_ID_DT_MSCM1: + CLASSMARK_TYPE_1: + dst->param.dt_cmInfo2.rev_level = (src[offset] & 0x60) >> 5; + dst->param.dt_cmInfo2.es_ind = (src[offset] & 0x10) >> 4; + dst->param.dt_cmInfo2.a5_1 = (src[offset] & 0x08) >> 3; + dst->param.dt_cmInfo2.rf_power_cap = src[offset] & 0x07; + break; + case AIFG_IE_ID_DT_MSCM2: + CLASSMARK_TYPE_2: + offset++; + dst->param.dt_cmInfo2.rev_level = (src[offset] & 0x60) >> 5; + dst->param.dt_cmInfo2.es_ind = (src[offset] & 0x10) >> 4; + dst->param.dt_cmInfo2.a5_1 = (src[offset] & 0x08) >> 3; + dst->param.dt_cmInfo2.rf_power_cap = src[offset++] & 0x07; + dst->param.dt_cmInfo2.ps_cap = (src[offset] & 0x40) >> 6; + dst->param.dt_cmInfo2.ss_screen_ind = (src[offset] & 0x30) >> 4; + dst->param.dt_cmInfo2.sm_cap = (src[offset] & 0x08) >> 3; + dst->param.dt_cmInfo2.vbs = (src[offset] & 0x04) >> 2; + dst->param.dt_cmInfo2.vgcs = (src[offset] & 0x02) >> 1; + dst->param.dt_cmInfo2.fc = src[offset++] & 0x01; + dst->param.dt_cmInfo2.cm3 = (src[offset] & 0x80) >> 7; + dst->param.dt_cmInfo2.lcsva_cap = (src[offset] & 0x20) >> 5; + dst->param.dt_cmInfo2.so_lsa = (src[offset] & 0x08) >> 3; + dst->param.dt_cmInfo2.cmsp = (src[offset] & 0x04) >> 2; + dst->param.dt_cmInfo2.a5_3= (src[offset] & 0x02) >> 1; + dst->param.dt_cmInfo2.a5_2= src[offset++] & 0x01; + break; + case AIFG_IE_ID_DT_MSCM3: + //Not implemented yet + CLASSMARK_TYPE_3: + break; + case AIFG_IE_ID_DT_GROUPREF: + GROUP_CALL_REF: + + i = src[offset++]; + i = (i << 8) | src[offset++]; + i = (i << 8) | src[offset++]; + i = (i << 3) | ((src[offset] & 0xE0) >> 5); + dst->param.dt_broadcastRef.binary_code = i; + dst->param.dt_broadcastRef.sf = (src[offset] & 0x10) >> 4; + dst->param.dt_broadcastRef.af = (src[offset] & 0x08) >> 3; + dst->param.dt_broadcastRef.call_priority = src[offset++] & 0x07; + dst->param.dt_broadcastRef.cipher_info = (src[offset] & 0xF0) >> 4; + break; + case AIFG_IE_ID_DT_PRIORITYLEVEL: + if(hi_lo_flag == AIFG_LOW_BITS) //At low 4 bits + dst->param.dt_priority.value = src[offset] & 0x07; + else //At high 4 bits + dst->param.dt_priority.value = (src[offset] & 0x70) >> 4; + break; + case AIFG_IE_ID_DT_AUTHRAND: + memcpy(dst->param.dt_authRAND.value, &(src[offset]), 16); + break; + case AIFG_IE_ID_DT_AUTHSRES: + memcpy(dst->param.dt_authSRES.value, &(src[offset]), 4); + break; + case AIFG_IE_ID_DT_CMTYPE: + if(hi_lo_flag == AIFG_LOW_BITS) //At low 4 bits + dst->param.dt_cmType.value = src[offset] & 0x0F; + else //At high 4 bits + dst->param.dt_cmType.value = (src[offset] & 0xF0) >> 4; + break; + case AIFG_IE_ID_DT_IDTYPE: + if(hi_lo_flag == AIFG_LOW_BITS) //At low 4 bits + dst->param.dt_idType.value = src[offset] & 0x07; + else //At high 4 bits + dst->param.dt_idType.value = (src[offset] & 0x70) >> 4; + break; + case AIFG_IE_ID_DT_LUTYPE: + if(hi_lo_flag == AIFG_LOW_BITS){ + //at low 4 bits + dst->param.dt_luType.fo_req = (src[offset] & 0x08) >> 3; + dst->param.dt_luType.lut = src[offset] & 0x03; + } + else{ + //at high 4 bits + dst->param.dt_luType.fo_req = (src[offset] & 0x80) >> 7; + dst->param.dt_luType.lut = (src[offset] & 0x30) >> 4; + } + break; + case AIFG_IE_ID_DT_FULL_NWNAME: + case AIFG_IE_ID_DT_SHORT_NWNAME: + ie_len = src[offset++] + 1; + dst->param.dt_nwName.code_scheme = (src[offset] & 0x70) >> 4; + dst->param.dt_nwName.add_ci = (src[offset] & 0x08) >> 4; + dst->param.dt_nwName.spare_num = src[offset++] & 0x07; + dst->param.dt_nwName.text_len = ie_len - offset; + memcpy(dst->param.dt_nwName.text, &(src[offset]), dst->param.dt_nwName.text_len); + break; + case AIFG_IE_ID_DT_REJCAUSE: + dst->param.dt_rejectCause.value = src[offset]; + break; + case AIFG_IE_ID_DT_FLONPROCEED: +// dst->param.dt_followOnProceed.value = 1; + break; + case AIFG_IE_ID_DT_TIMEZONE: + dst->param.dt_timeZone.value = src[offset]; + break; + case AIFG_IE_ID_DT_TZTIME: + dst->param.dt_tzTime.year = src[offset++]; + dst->param.dt_tzTime.month = src[offset++]; + dst->param.dt_tzTime.day = src[offset++]; + dst->param.dt_tzTime.hour = src[offset++]; + dst->param.dt_tzTime.minute = src[offset++]; + dst->param.dt_tzTime.second= src[offset++]; + dst->param.dt_tzTime.time_zone = src[offset++]; + break; + case AIFG_IE_ID_DT_CTS: +// dst->param.dt_CTSPermission.value = 1; + break; + case AIFG_IE_ID_DT_LSAID: + LSAID: + offset++; + dst->param.dt_lsaId.value[0] = src[offset++]; + dst->param.dt_lsaId.value[1] = src[offset++]; + dst->param.dt_lsaId.value[2] = src[offset++]; + break; + case AIFG_IE_ID_DT_AUXSTAT: + offset++; + dst->param.dt_auxStat.hold_stat = (src[offset] & 0x0C) >> 2; + dst->param.dt_auxStat.mpty_stat = src[offset] & 0x03; + break; + case AIFG_IE_ID_DT_CCCAP: + offset++; + dst->param.dt_ccCap.pcp = (src[offset] & 0x02) >> 1; + dst->param.dt_ccCap.dtmf = src[offset] & 0x01; + break; + case AIFG_IE_ID_DT_CALLSTAT: + dst->param.dt_callStat.coding_std = (src[offset] & 0xC0) >> 6; + dst->param.dt_callStat.value = src[offset] & 0x3F; + break; + case AIFG_IE_ID_DT_CALLEDBCD: + case AIFG_IE_ID_DT_CALLERBCD: + case AIFG_IE_ID_DT_CONNNUM: + case AIFG_IE_ID_DT_REDIRBCD: + ie_len = src[offset++] + 1; + dst->param.dt_callingNum.type = (src[offset] & 0x70) >> 4; + dst->param.dt_callingNum.num_plan= src[offset] & 0x0F; + if(0x00 == (src[offset++] & 0x80)){ + //ext == 0 + dst->param.dt_callingNum.presentation_ind.flag = 1; + dst->param.dt_callingNum.presentation_ind.value = (src[offset] & 0x60) >> 5; + dst->param.dt_callingNum.screen_ind.flag = 1; + dst->param.dt_callingNum.screen_ind.value = src[offset++] & 0x03; + } + i = 0; + while(offset < ie_len){ + int j; + assert(offset < 43); //43 is the max length + dst->param.dt_callingNum.number[i] = src[offset] & 0x0F; + if (dst->param.dt_callingNum.number[i] == 10 || dst->param.dt_callingNum.number[i] == 11){ + //convert '*' & '#' to the ISUP code standard + dst->param.dt_callingNum.number[i]++; + } + i++; + + j = (src[offset++] & 0xF0) >> 4; + if(j != 0x0F){ + dst->param.dt_callingNum.number[i] = j; + if (dst->param.dt_callingNum.number[i] == 10 || dst->param.dt_callingNum.number[i] == 11){ + //convert '*' & '#' to the ISUP code standard + dst->param.dt_callingNum.number[i]++; + } + i++; + } + } + dst->param.dt_callingNum.num_len = i; + break; + case AIFG_IE_ID_DT_CALLEDSUBADDR: + case AIFG_IE_ID_DT_CALLERSUBADDR: + case AIFG_IE_ID_DT_CONNSUBADDR: + case AIFG_IE_ID_DT_REDIRSUBADDR: + ie_len = src[offset++] + 1; + dst->param.dt_callingSubAddr.type = (src[offset] & 0x70) >> 4; + dst->param.dt_callingSubAddr.odd_even_ind = (src[offset++] & 0x08) >> 3; + dst->param.dt_callingSubAddr.info_len = ie_len - offset; + memcpy(dst->param.dt_callingSubAddr.info, &(src[offset]), dst->param.dt_callingSubAddr.info_len); + break; + case AIFG_IE_ID_DT_CAUSE: + ie_len = src[offset++] + 1; + dst->param.dt_cause.coding_std = (src[offset] & 0x60) >> 5; + dst->param.dt_cause.location = src[offset] & 0x0F; + if(0x00 == (src[offset++] & 0x80)){ + //ext == 0 + dst->param.dt_cause.recommendation.flag = 1; + dst->param.dt_cause.recommendation.value = src[offset++]; + } + dst->param.dt_cause.cause_value = src[offset++] & 0x7F; + dst->param.dt_cause.diag_len = ie_len - offset; + memcpy(dst->param.dt_cause.diagnostic, &(src[offset]), dst->param.dt_cause.diag_len); + break; + case AIFG_IE_ID_DT_CONGESTLEVEL: + if(hi_lo_flag == AIFG_LOW_BITS) //At low 4 bits + dst->param.dt_congestLevel.value = src[offset] & 0x0F; + else //At high 4 bits + dst->param.dt_congestLevel.value = (src[offset] & 0xF0) >> 4; + break; + case AIFG_IE_ID_DT_HIGHCOM: + ie_len = src[offset++] + 1; + if(offset < ie_len){ + aifg_set_field(dst->param.dt_hiComp.coding_std, (src[offset] & 0x60) >> 5); + aifg_set_field(dst->param.dt_hiComp.interpret, (src[offset] & 0x1C) >> 2); + aifg_set_field(dst->param.dt_hiComp.presentat_method, src[offset++] & 0x03); + aifg_set_field(dst->param.dt_hiComp.high_layer_id, src[offset]&0x7f); + if(0x00 == (src[offset++] & 0x80)){ + //ext == 0 + aifg_set_field(dst->param.dt_hiComp.ext_high_layer_id, src[offset]&0x7f); + } + } + break; + case AIFG_IE_ID_DT_KEYPAD: + dst->param.dt_keypad.value = src[offset] & 0x7F; + break; + case AIFG_IE_ID_DT_LOWCOM: + ie_len = src[offset++] + 1; + dst->param.dt_loComp.data_len = ie_len - offset; + memcpy(dst->param.dt_loComp.data, &(src[offset]), dst->param.dt_loComp.data_len); + break; + case AIFG_IE_ID_DT_MOREDATA: +// dst->param.dt_moreData.value = 1; + break; + case AIFG_IE_ID_DT_NOTIIND: + dst->param.dt_notificationInd.value = src[offset] & 0x7F; + break; + case AIFG_IE_ID_DT_PROGIND: + offset++; //skip length + dst->param.dt_progInd.coding_standard = (src[offset] & 0x60) >> 5; + dst->param.dt_progInd.location = src[offset++] & 0x0F; + dst->param.dt_progInd.desc = src[offset] & 0x7F; + break; + case AIFG_IE_ID_DT_REPEATIND: + if(hi_lo_flag == AIFG_LOW_BITS) + //low 4 bits + dst->param.dt_rpInd.value = src[offset] & 0x0F; + else + //high 4 bits + dst->param.dt_rpInd.value = (src[offset] & 0xF0) >> 4; + break; + case AIFG_IE_ID_DT_REVCALLDIR: +// dst->param.dt_revCallDir.value = 1; + break; + case AIFG_IE_ID_DT_SIGNAL: + dst->param.dt_signal.value = src[offset]; + break; + case AIFG_IE_ID_DT_SSVER: + ie_len = src[offset++] + 1; + dst->param.dt_ssVer.info_len = ie_len - offset; + memcpy(dst->param.dt_ssVer.info, &(src[offset]), dst->param.dt_ssVer.info_len); + break; + case AIFG_IE_ID_DT_USERUSER: + ie_len = src[offset++] + 1; + dst->param.dt_uu.pd = src[offset++]; + dst->param.dt_uu.info_len = ie_len - offset; + memcpy(dst->param.dt_uu.info, &(src[offset]), dst->param.dt_uu.info_len); + break; + case AIFG_IE_ID_DT_ALERTPATTERN: + offset++; + dst->param.dt_alertPattern.value = src[offset] & 0x0F; + break; + case AIFG_IE_ID_DT_RP_MO_ADDR: + case AIFG_IE_ID_DT_RP_MT_ADDR: + ie_len = src[offset++] + 1; + if (0 != ie_len){ + dst->param.dt_rpAddr.flag = 1; + dst->param.dt_rpAddr.number_type = (src[offset] & 0x70) >> 4; + dst->param.dt_rpAddr.number_plan = src[offset++] & 0x0F; + dst->param.dt_rpAddr.number_len = ie_len - offset; + memcpy(dst->param.dt_rpAddr.number, src+offset, dst->param.dt_rpAddr.number_len); + } + break; + case AIFG_IE_ID_DT_RP_UD: + dst->param.dt_rpUD.len = src[offset]; + ie_len = src[offset++] + 1 ; + memcpy(dst->param.dt_rpUD.content, src+offset, dst->param.dt_rpUD.len); + break; + case AIFG_IE_ID_DT_RP_CAUSE: + ie_len = src[offset++] + 1; + dst->param.dt_rpCause.cause = src[offset++] & 0x7F; + if(ie_len - offset > 0){ + dst->param.dt_rpCause.diag_len = ie_len - offset; + memcpy(dst->param.dt_rpCause.diagnostic, src+offset, dst->param.dt_rpCause.diag_len); + } + break ; + + //BSSMAP + case AIFG_IE_ID_BM_BSSOLDTONEW: + ie_len = src[offset++] + 1; + dst->param.bm_bssOldtoNew.len = ie_len - offset; + memcpy(dst->param.bm_bssOldtoNew.content, &(src[offset]), dst->param.bm_bssOldtoNew.len); + break; + case AIFG_IE_ID_BM_OMCID: + ie_len = src[offset++] + 1; + dst->param.bm_omcId.len = ie_len - offset; + memcpy(dst->param.bm_omcId.id, &(src[offset]), dst->param.bm_omcId.len); + break; + case AIFG_IE_ID_BM_CIC: + dst->param.bm_cic.pcm = (src[offset] << 3) | ((src[offset+1] & 0xE0) >> 5); + dst->param.bm_cic.timeslot = src[++offset] & 0x1F; + break; + case AIFG_IE_ID_BM_RESOURCEAVAIL: + i = 0; + while(i < 5){ + dst->param.bm_resrcAvail.full_rate_channel[i] = (src[offset] << 8) | src[offset+1]; + offset += 2; + dst->param.bm_resrcAvail.half_rate_channel[i] = (src[offset] << 8) | src[offset+1]; + offset += 2; + i++; + } + break; + case AIFG_IE_ID_BM_CAUSE: + offset++; //skip length + dst->param.bm_cause.value = src[offset] & 0x7F; + if(0x80 == (src[offset] & 0x80)){ + //has ext value + aifg_set_field(dst->param.bm_cause.ext_value, src[++offset]); + } + break; + case AIFG_IE_ID_BM_CELLID: + offset++; //skip length + dst->param.bm_cellId.discriminator = src[offset++] & 0x0F; + switch(dst->param.bm_cellId.discriminator){ + case 0x00: //The whole Cell Global Identification, CGI, is used to identify the cell + dst->param.bm_cellId.mcc[0] = src[offset] & 0x0F; + dst->param.bm_cellId.mcc[1] = (src[offset++] & 0xF0) >> 4; + dst->param.bm_cellId.mcc[2] = src[offset] & 0x0F; + dst->param.bm_cellId.mnc[2] = (src[offset++] & 0xF0) >> 4; + dst->param.bm_cellId.mnc[1] = (src[offset] & 0xF0) >> 4; + dst->param.bm_cellId.mnc[0] = src[offset++]& 0x0F; + dst->param.bm_cellId.LAC = (src[offset] << 8) | src[offset+1]; + offset += 2; + dst->param.bm_cellId.CI = (src[offset] << 8) | src[offset+1]; + offset += 2; + break; + case 0x01: //Location Area Code, LAC, and Cell Identity, CI, is used to identify the cell + dst->param.bm_cellId.LAC = (src[offset] << 8) | src[offset+1]; + offset += 2; + dst->param.bm_cellId.CI = (src[offset] << 8) | src[offset+1]; + offset += 2; + break; + case 0x02: //Cell Identity, CI, is used to identify the cell + dst->param.bm_cellId.CI = (src[offset] << 8) | src[offset+1]; + offset += 2; + break; + case 0x03: //No cell is associated with the transaction + break; + default: //Error IE + aifg_event = AIFG_ERR_ERROR_IE; + goto ERR_PROC; + break; + } + break; + case AIFG_IE_ID_BM_PRIORITY: + offset++; + dst->param.bm_priority.pci = (src[offset] & 0x40) >> 6; + dst->param.bm_priority.level = (src[offset] & 0x3C) >> 2; + dst->param.bm_priority.qa = (src[offset] & 0x02) >> 1; + dst->param.bm_priority.pvi = src[offset] & 0x01; + break; + case AIFG_IE_ID_BM_L3HEADERINFO: + offset++; + dst->param.bm_L3HeaderInfo.pd = src[offset++]; + dst->param.bm_L3HeaderInfo.ti = src[offset]; + break; + case AIFG_IE_ID_BM_IMSI: + case AIFG_IE_ID_BM_MOBILEID: + goto MOBILE_ID; //The same as Mobile ID of DTAP + break; + case AIFG_IE_ID_BM_TMSI: + offset++; //skip length + memcpy(dst->param.bm_tmsi.value, &(src[offset]), 4); + break; + case AIFG_IE_ID_BM_ENCRYPTINFO: + offset++; //skip length + dst->param.bm_encryptInfo.algorithm = src[offset++]; + if(dst->param.bm_encryptInfo.algorithm > 1){ + //at least one of the A5 encryption algorithms is permitted + memcpy(dst->param.bm_encryptInfo.key, &(src[offset]), 8); + } + break; + case AIFG_IE_ID_BM_CHANNELTYPE: + offset++; //skip length + dst->param.bm_channelType.speech_data_ind = src[offset++] & 0x0F; + dst->param.bm_channelType.channel_rate_type = src[offset++]; + if(0x01 == dst->param.bm_channelType.speech_data_ind){ + //Speech + j = 0; + do{ + i = src[offset] & 0x80; //ext flag + dst->param.bm_channelType.ext.speech.ver[j++] = src[offset++] & 0x7F; + }while(0x80 == i && j < 6); + dst->param.bm_channelType.ext.speech.len = j; + } + else if(0x02 == dst->param.bm_channelType.speech_data_ind){ + //data + dst->param.bm_channelType.ext.data_cfg.t_nt = src[offset] & 0x40 >> 6; + dst->param.bm_channelType.ext.data_cfg.rate = src[offset] & 0x3F; + if(0x80==(src[offset++]&0x80)) + aifg_set_field(dst->param.bm_channelType.ext.data_cfg.allowed_data_rate,src[offset] & 0x0F); + } + break; + case AIFG_IE_ID_BM_PERIODICITY: + dst->param.bm_periodicity.value = src[offset]; + break; + case AIFG_IE_ID_BM_EXTRESOURCEIND: + dst->param.bm_extResrcInd.sm = (src[offset] & 0x02) >> 1; + dst->param.bm_extResrcInd.tarr = src[offset] & 0x01; + break; + case AIFG_IE_ID_BM_MSNUM: + dst->param.bm_msNum.value = src[offset]; + break; + case AIFG_IE_ID_BM_CLASSMARKINFO1: + goto CLASSMARK_TYPE_1; + break; + case AIFG_IE_ID_BM_CLASSMARKINFO2: + goto CLASSMARK_TYPE_2; + break; + case AIFG_IE_ID_BM_CLASSMARKINFO3: + goto CLASSMARK_TYPE_3; + break; + case AIFG_IE_ID_BM_BANDUSED: + dst->param.bm_bandUsed.value = src[offset]; + break; + case AIFG_IE_ID_BM_RRCAUSE: + dst->param.bm_rrCause.value = src[offset]; + break; + case AIFG_IE_ID_BM_L3INFO: + case AIFG_IE_ID_BM_L3MSGCONTENT: + //Nothing to do + break; + case AIFG_IE_ID_BM_DLCI: + dst->param.bm_dlci.value = src[offset]; + break; + case AIFG_IE_ID_BM_DTXFLAG: + dst->param.bm_dtx.value = src[offset]; + break; + case AIFG_IE_ID_BM_CELLIDLIST: + ie_len = src[offset++] + 2; + dst->param.bm_cellIdList.discriminator = src[offset++] & 0x0F; + i = 0; + while(offset < ie_len){ + switch(dst->param.bm_cellId.discriminator){ + case 0x00: //The whole Cell Global Identification, CGI, is used to identify the cell + dst->param.bm_cellIdList.cell_id[i].mcc[0] = src[offset] & 0x0F; + dst->param.bm_cellIdList.cell_id[i].mcc[1] = (src[offset++] & 0xF0) >> 4; + dst->param.bm_cellIdList.cell_id[i].mcc[2] = src[offset] & 0x0F; + dst->param.bm_cellIdList.cell_id[i].mnc[2] = (src[offset++] & 0xF0) >> 4; + dst->param.bm_cellIdList.cell_id[i].mnc[1] = (src[offset] & 0xF0) >> 4; + dst->param.bm_cellIdList.cell_id[i].mnc[0] = src[offset++] & 0x0F; + dst->param.bm_cellIdList.cell_id[i].LAC = (src[offset] << 8) | src[offset+1]; + offset += 2; + dst->param.bm_cellIdList.cell_id[i].CI = (src[offset] << 8) | src[offset+1]; + offset += 2; + dst->param.bm_cellIdList.cid_num=(ie_len-3)/7; + break; + case 0x01: //Location Area Code, LAC, and Cell Identity, CI, is used to identify the cell + dst->param.bm_cellIdList.cell_id[i].LAC = (src[offset] << 8) | src[offset+1]; + offset += 2; + dst->param.bm_cellIdList.cell_id[i].CI = (src[offset] << 8) | src[offset+1]; + offset += 2; + dst->param.bm_cellIdList.cid_num=(ie_len-3)/4; + break; + case 0x02: //Cell Identity, CI, is used to identify the cell + dst->param.bm_cellIdList.cell_id[i].CI = (src[offset] << 8) | src[offset+1]; + offset += 2; + dst->param.bm_cellIdList.cid_num=(ie_len-3)/2; + break; + case 0x04: + dst->param.bm_cellIdList.cell_id[i].mcc[0] = src[offset] & 0x0F; + dst->param.bm_cellIdList.cell_id[i].mcc[1] = (src[offset++] & 0xF0) >> 4; + dst->param.bm_cellIdList.cell_id[i].mcc[2] = src[offset] & 0x0F; + dst->param.bm_cellIdList.cell_id[i].mnc[2] = (src[offset++] & 0xF0) >> 4; + dst->param.bm_cellIdList.cell_id[i].mnc[1] = (src[offset] & 0xF0) >> 4; + dst->param.bm_cellIdList.cell_id[i].mnc[0] = src[offset++] & 0x0F; + dst->param.bm_cellIdList.cell_id[i].LAC = (src[offset] << 8) | src[offset+1]; + offset += 2; + dst->param.bm_cellIdList.cid_num=(ie_len-3)/5; + break; + case 0x05: + dst->param.bm_cellIdList.cell_id[i].LAC = (src[offset] << 8) | src[offset+1]; + offset += 2; + dst->param.bm_cellIdList.cid_num=(ie_len-3)/2; + break; + case 0x03: //No cell is associated with the transaction + //Should never get into this while loop, fatal error if the program gets here + assert(0); + break; + default: //Error IE + aifg_event = AIFG_ERR_ERROR_IE; + goto ERR_PROC; + break; + } + i++; + } + break; + case AIFG_IE_ID_BM_RESPREQ: +// dst->param.bm_respReq.value = 1; + break; + case AIFG_IE_ID_BM_RESOURCEINDMEHTOD: + dst->param.bm_resrcIndMethod.value = src[offset] & 0x0F; + break; + case AIFG_IE_ID_BM_CICLIST: + ie_len = src[offset++] + 1; + dst->param.bm_cicList.range = src[offset++]; + dst->param.bm_cicList.status.len = ie_len - offset; + memcpy(dst->param.bm_cicList.status.content, &(src[offset]), dst->param.bm_cicList.status.len); + break; + case AIFG_IE_ID_BM_DIGNOSTIC: + ie_len = src[offset++] + 1; + dst->param.bm_diagnostics.err_pointer = src[offset++]; + dst->param.bm_diagnostics.bit_pointer = src[offset++] & 0x0F; + dst->param.bm_diagnostics.err_msg.len = ie_len - offset; + memcpy(dst->param.bm_diagnostics.err_msg.msg, &(src[offset]), dst->param.bm_diagnostics.err_msg.len); + break; + case AIFG_IE_ID_BM_CHOSENCHANNEL: + dst->param.bm_chosenChannel.mode = (src[offset] & 0xF0) >> 4; + dst->param.bm_chosenChannel.channel = src[offset] & 0x0F; + break; + case AIFG_IE_ID_BM_TOTALRESOURCE: + dst->param.bm_totalResrc.full_rate_channel = (src[0] << 8) | src[1]; + dst->param.bm_totalResrc.half_rate_channel = (src[2] << 8) | src[3]; + break; + case AIFG_IE_ID_BM_CIPHERRESPMODE: + dst->param.bm_cipherRespMode.value = src[offset]; + break; + case AIFG_IE_ID_BM_CHANNELNEEDED: + dst->param.bm_channelNeeded.value = src[offset] & 0x03; + break; + case AIFG_IE_ID_BM_TRACETYPE: + dst->param.bm_traceType.value = src[offset]; + break; + case AIFG_IE_ID_BM_TRIGGERID: + ie_len = src[offset++] + 1; + dst->param.bm_triggerId.len = ie_len - offset; + memcpy(dst->param.bm_triggerId.content, &(src[offset]), dst->param.bm_triggerId.len); + break; + case AIFG_IE_ID_BM_TRACEREF: + dst->param.bm_traceRef.value = (src[0] << 8) | src[1]; + break; + case AIFG_IE_ID_BM_TRANSACTIONID: + ie_len = src[offset++] + 1; + dst->param.bm_transId.value = src[offset++]; + dst->param.bm_transId.value = (dst->param.bm_transId.value << 8) | src[offset]; + break; + case AIFG_IE_ID_BM_FORWARDIND: + dst->param.bm_fowardInd.value = src[offset] & 0x0F; + break; + case AIFG_IE_ID_BM_CHOSENENCRYPT: + dst->param.bm_chosenEncrypt.value = src[offset]; + break; + case AIFG_IE_ID_BM_CIRCUITPOOL: + dst->param.bm_circuitPool.value = src[offset]; + break; + case AIFG_IE_ID_BM_CIRCUITPOOLLIST: + ie_len = src[offset++] + 1; + dst->param.bm_circuitPoolList.num = ie_len - offset; + memcpy(dst->param.bm_circuitPoolList.circuit, &(src[offset]), + dst->param.bm_circuitPoolList.num); + break; + case AIFG_IE_ID_BM_TIMEIND: + dst->param.bm_timeId.value = src[offset]; + break; + case AIFG_IE_ID_BM_RESOURCESITUATION: + ie_len = src[offset++] + 1; + i = 0; + while(offset < ie_len){ + dst->param.bm_resrcSit.band[i].band_ind = (src[offset] & 0xF0) >> 4; + dst->param.bm_resrcSit.band[i].channel_type = src[offset++] & 0x0F; + dst->param.bm_resrcSit.band[i].channel_num = src[offset] & 0x7F; + if(0x80 == (src[offset] & 0x80)){ + //two octets + dst->param.bm_resrcSit.band[i].channel_num = + (dst->param.bm_resrcSit.band[i].channel_num << 8) | src[++offset]; + } + i++; + offset++; + } + dst->param.bm_resrcSit.band_num = i; + break; + case AIFG_IE_ID_BM_CURCHANNELTYPE1: + dst->param.bm_curChannelType1.channel_mode = (src[offset] & 0xF0) >> 4; + dst->param.bm_curChannelType1.channel = src[offset] & 0x0F; + break; + case AIFG_IE_ID_BM_QUEUEIND: + dst->param.bm_queuingInd.value = (src[offset] & 0x02) >> 1; + break; + case AIFG_IE_ID_BM_SPEECHVER: + dst->param.bm_speechVer.value = src[offset] & 0x7F; + break; + case AIFG_IE_ID_BM_ASSIGNREQUIREMENT: + dst->param.bm_assignReq.value = src[offset]; + break; + case AIFG_IE_ID_BM_TALKERFLAG: +// dst->param.bm_talkerFlag.value = 1; + break; + case AIFG_IE_ID_BM_CONNRELREQ: +// dst->param.bm_connRelReq.value = 1; + break; + case AIFG_IE_ID_BM_GROUPCALLREF: + offset++; + goto GROUP_CALL_REF; //The same as Group call refernce of DTAP + break; + case AIFG_IE_ID_BM_EMLPP: + dst->param.bm_eMLPP.value = src[offset] & 0x07; + break; + case AIFG_IE_ID_BM_CFGEVOIND: + dst->param.bm_cfgEvoInd.value = src[offset] & 0x0F; + break; + case AIFG_IE_ID_BM_LSAID: + goto LSAID; + break; + case AIFG_IE_ID_BM_LSAIDLIST: + ie_len = src[offset++] + 1; + dst->param.bm_lsaIdList.ep = src[offset++] & 0x01; + i = 0; + while(offset < ie_len){ + dst->param.bm_lsaIdList.list[i].id[0] = src[offset++]; + dst->param.bm_lsaIdList.list[i].id[1] = src[offset++]; + dst->param.bm_lsaIdList.list[i++].id[2] = src[offset++]; + } + dst->param.bm_lsaIdList.lsa_num = i; + break; + case AIFG_IE_ID_BM_LSAINFO: + ie_len = src[offset++] + 1; + dst->param.bm_lsaInfo.lsa_only= src[offset++] & 0x01; + i = 0; + while(offset < ie_len){ + dst->param.bm_lsaInfo.info[i].priority = src[offset++] & 0x0F; + dst->param.bm_lsaInfo.info[i].id[0] = src[offset++]; + dst->param.bm_lsaInfo.info[i].id[1] = src[offset++]; + dst->param.bm_lsaInfo.info[i++].id[2] = src[offset++]; + } + dst->param.bm_lsaInfo.lsa_num = i; + break; + case AIFG_IE_ID_BM_LOCATIONINFO: + ie_len = src[offset++] + 1; + dst->param.bm_locInfo.len = ie_len - offset; + memcpy(dst->param.bm_locInfo.info, &(src[offset]), dst->param.bm_locInfo.len); + break; + default: //Unknow IE + aifg_event = AIFG_ERR_UNKNOW_IE; + goto ERR_PROC; + break; + } + + return AIFG_SUCCEED; + +ERR_PROC: +// aifg_debug_print(aifg_event, (void*)src, NULL); + return AIFG_ERROR; +} + +/* +Name: aifg_ie_encode +Purpose: Information element encode function +Input: aifg_msg_protocol protocol: BSSMAP or DTAP + aifg_ie *src: pointer to a aifg_ie structure object in which the decoded message will be encoded. + BYTE *dst: pointer to the first byte of encode buffer + int m_o_flag: flag used when encode DTAP IEs that indicates whether the ie is mandatory or optional, + and if mandatory, the value part presents at high 4bits or low 4bits or not care. + 0 - BSSMAP IE or Mandatory DTAP IE, low bits or whole byte + 1 - Mandatory, high bits + 2 - Optional +Output: Total length of decoded IE +*/ +int aifg_ie_encode(aifg_msg_protocol protocol, int ie_id, ie_u *src, BYTE *dst, int m_o_flag) +{ + int i, j, k, offset = 0; + int length_position; + //checking parameter + if((protocol != AIFG_MSG_BSSMAP && protocol != AIFG_MSG_DTAP) + || src == NULL || dst == NULL) + { + assert(0); + goto ERR_PROC; + } + + switch(protocol){ + case AIFG_MSG_DTAP: + if(m_o_flag == 2){ + //Optional ie, iei must present + //convert program ie_id to protocol iei + dst[offset++] = aifg_get_iei(ie_id); + } + + switch(ie_id){ + case AIFG_IE_ID_DT_MOBILEID: + MOBILE_ID: + src->mobileId.odd_even_flag = src->mobileId.id_len & 0x01; //set odd/even flag + dst[offset++]=(src->mobileId.id_len/2)+1; + if (src->mobileId.type == 4)//TMSI + { + dst[offset++]= 0xf0|(src->mobileId.odd_even_flag<<3)|(src->mobileId.type); + i=0; + } + else + { + dst[offset++]=(src->mobileId.id[0]<<4)|(src->mobileId.odd_even_flag<<3)|(src->mobileId.type); + i=1; + } + + if(src->mobileId.odd_even_flag==0){ + while(imobileId.id_len-1){ + dst[offset++] = (src->mobileId.id[i+1]<<4)|src->mobileId.id[i]; + i += 2; + } + dst[offset++] = 0xf0|src->mobileId.id[i]; + } + else{ + while(imobileId.id_len){ + dst[offset++] = (src->mobileId.id[i+1]<<4)|src->mobileId.id[i]; + i += 2; + } + } + break; + case AIFG_IE_ID_DT_LAI: + dst[offset++] = (src->dt_lai.mcc[1] << 4) | src->dt_lai.mcc[0]; + dst[offset++] = (src->dt_lai.mnc[2] << 4) | src->dt_lai.mcc[2]; + dst[offset++] = (src->dt_lai.mnc[1] << 4) | src->dt_lai.mnc[0]; + dst[offset++] = src->dt_lai.LAC >> 8; + dst[offset++] = src->dt_lai.LAC; + break; + case AIFG_IE_ID_DT_CIPHERKEY: + case AIFG_IE_ID_DT_PRIORITYLEVEL: + case AIFG_IE_ID_DT_CMTYPE: + case AIFG_IE_ID_DT_IDTYPE: + case AIFG_IE_ID_DT_REPEATIND: + if(m_o_flag == 2){ + offset--; //the iei of this ie has only half-octet + dst[offset] = dst[offset] | src->dt_cipherKey.value; + offset++; + } + else if(m_o_flag == 0) + dst[offset] = src->dt_cipherKey.value; + else if(m_o_flag == 1){ + dst[offset] = (dst[offset] & 0x0F) | src->dt_cipherKey.value << 4; + offset++; + } + break; + case AIFG_IE_ID_DT_MSCM1: + dst[offset++] = (src->dt_cmInfo1.rev_level<<5)|(src->dt_cmInfo1.es_ind<<4)|(src->dt_cmInfo1.a5_1<<3)|(src->dt_cmInfo1.rf_power_cap); + break; + case AIFG_IE_ID_DT_MSCM2: + goto classmarkinfo2; + break; + case AIFG_IE_ID_DT_GROUPREF: + goto groupref; + break; +// case AIFG_IE_ID_DT_PRIORITYLEVEL: +// dst[offset++]=src->dt_priority.value;//iei half octet lost +// break; + case AIFG_IE_ID_DT_AUTHRAND: + memcpy(&dst[offset],src->dt_authRAND.value,16); + offset+=16; + break; + case AIFG_IE_ID_DT_AUTHSRES: + memcpy(&dst[offset],src->dt_authSRES.value,4); + offset+=4; + break; +// case AIFG_IE_ID_DT_CMTYPE: +// dst[offset++]=src->dt_cmType.value;//iei half octet lost +// break; +// case AIFG_IE_ID_DT_IDTYPE: +// dst[offset++]=src->dt_idType.value;//iei half octet lost +// break; + case AIFG_IE_ID_DT_LUTYPE://zhugq,in case of 'O' + if(m_o_flag == 2){ + offset--; //the iei of this ie has only half-octet + dst[offset] = dst[offset] | (src->dt_luType.fo_req<<3) | src->dt_luType.lut; + offset++; + } + else if(m_o_flag == 0) + dst[offset] = (src->dt_luType.fo_req<<3) | src->dt_luType.lut; + else if(m_o_flag == 1){ + dst[offset] = (dst[offset] & 0x0F) | (src->dt_luType.fo_req<<7) | src->dt_luType.lut<<4; + offset++; + } + break; + case AIFG_IE_ID_DT_FULL_NWNAME: + case AIFG_IE_ID_DT_SHORT_NWNAME: + length_position = offset++; + dst[offset++]=0x80|(src->dt_nwName.code_scheme<<4)|(src->dt_nwName.add_ci<<3)|(src->dt_nwName.spare_num); + memcpy(&dst[offset],src->dt_nwName.text,src->dt_nwName.text_len); + offset+=src->dt_nwName.text_len; + if(length_position == 1)//zhugq, in case of "M" + dst[1] = offset-2; + else + dst[0] = offset-1; + break; + case AIFG_IE_ID_DT_REJCAUSE: + dst[offset++]=src->dt_rejectCause.value; + break; + case AIFG_IE_ID_DT_FLONPROCEED://do nothing + break; + case AIFG_IE_ID_DT_TIMEZONE: + dst[offset++]=src->dt_timeZone.value; + break; + case AIFG_IE_ID_DT_TZTIME: + dst[offset++]=src->dt_tzTime.year; + dst[offset++]=src->dt_tzTime.month; + dst[offset++]=src->dt_tzTime.day; + dst[offset++]=src->dt_tzTime.hour; + dst[offset++]=src->dt_tzTime.minute; + dst[offset++]=src->dt_tzTime.second; + dst[offset++]=src->dt_tzTime.time_zone; + break; + case AIFG_IE_ID_DT_CTS://do nothing + break; + case AIFG_IE_ID_DT_LSAID: + dst[offset++]=3; + dst[offset++]=src->dt_lsaId.value[0]; + dst[offset++]=src->dt_lsaId.value[1]; + dst[offset++]=src->dt_lsaId.value[2]; + break; + case AIFG_IE_ID_DT_AUXSTAT: + dst[offset++]=1; + dst[offset++]=0x80|(src->dt_auxStat.hold_stat<<2)|src->dt_auxStat.mpty_stat; + break; + case AIFG_IE_ID_DT_BEARERCAP: + length_position=offset++; + if(1==src->dt_bc.coding.flag){ + //octet3 and 3a + dst[offset++]=(src->dt_bc.channel_require<<5) + |(src->dt_bc.coding_std<<4) + |(src->dt_bc.trans_mode<<3) + |src->dt_bc.info_trans_cap; + dst[offset++]=(src->dt_bc.coding.value<<6) + |src->dt_bc.speech_ver.value; + } + else{ + //octet3 without 3a + dst[offset++]=0x80|(src->dt_bc.channel_require<<5)|(src->dt_bc.coding_std<<4) + |(src->dt_bc.trans_mode<<3)|src->dt_bc.info_trans_cap; + + if(0!=src->dt_bc.info_trans_cap){ + ///////////octet4/////// + dst[offset++]=0x80|(src->dt_bc.compress.value<<6)|(src->dt_bc.structure.value<<4) + |(src->dt_bc.dupl_mode.value<<3)|(src->dt_bc.confiure.value<<2) + |(src->dt_bc.nirr.value<<1)|src->dt_bc.establishment.value; + + //////octet5 and 5a,5b/////// + if(1==src->dt_bc.o_itc.flag){//octet5`s ext==0 + dst[offset++]=(src->dt_bc.access_id.value<<5)|(src->dt_bc.rate_adaption.value<<3) + |src->dt_bc.signal_protocol.value;//octet5 with first bit "0" + if(1==src->dt_bc.hdr_nohdr.flag){//5a and 5b + dst[offset++]=(src->dt_bc.o_itc.value<<5)|(src->dt_bc.o_rate_adaption.value<<3); + dst[offset++]=0x80|(src->dt_bc.hdr_nohdr.value<<6)|(src->dt_bc.multi_frame.value<<5) + |(src->dt_bc.mode.value<<4)|(src->dt_bc.lli.value<<3) + |(src->dt_bc.assign_or_e.value<<2)|(src->dt_bc.inb_neg.value<<1);} + else//only 5a + dst[offset++]=0x80|(src->dt_bc.o_itc.value<<5)|(src->dt_bc.o_rate_adaption.value<<3); + } + + else//octet5`s ext==1 + dst[offset++]=0x80|(src->dt_bc.access_id.value<<5)|(src->dt_bc.rate_adaption.value<<3) + |src->dt_bc.signal_protocol.value;//octet5 with first bit "1" + + ///////octet6,6a,6b,6c///// + dst[offset++]=(src->dt_bc.layer1_id.value<<5)|(src->dt_bc.user_info1_protocol.value<<1) + |src->dt_bc.sync_async.value;//octet6 + dst[offset++]=(src->dt_bc.num_stop_bits.value<<6)|(src->dt_bc.negotiation.value<<5) + |(src->dt_bc.num_data_bits.value<<4)|src->dt_bc.user_rate.value;//6a + dst[offset++]=(src->dt_bc.intermed_rate.value<<5)|(src->dt_bc.nic_on_tx.value<<4) + |(src->dt_bc.nic_on_rx.value<<3)|src->dt_bc.parity.value;//6b + + if(1==src->dt_bc.o_modem_type.flag){//6c with first bit "0" + dst[offset++]=(src->dt_bc.connection_element.value<<5)|src->dt_bc.modem_type.value;//6c + /////octet6d,6e,6f,7////// + if(1==src->dt_bc.acceptable_chennel_code.flag){//6d with first bit "0" + dst[offset++]=(src->dt_bc.o_modem_type.value<<5)|src->dt_bc.fixed_nw_user_rate.value; + if(1==src->dt_bc.uimi.flag){//6e with first bit "0" + dst[offset++]=(src->dt_bc.acceptable_chennel_code.value<<3)|src->dt_bc.max_traffic_channel.value; + if(1==src->dt_bc.layer2_id.flag)//6f with first bit "0" + dst[offset++]=(src->dt_bc.uimi.value<<4)|src->dt_bc.wanted_air_if_user_rate.value; + else //6f with first bit "1" and 7 + dst[offset++]=0x80|(src->dt_bc.uimi.value<<4)|src->dt_bc.wanted_air_if_user_rate.value; + dst[offset++]=0x80|(src->dt_bc.layer2_id.value<<5)|src->dt_bc.user_info2_protocol.value;//7 + } + else //6e with first bit "1" + dst[offset++]=0x80|(src->dt_bc.acceptable_chennel_code.value<<3)|src->dt_bc.max_traffic_channel.value;} + else //6d with first bit "1" + dst[offset++]=0x80|(src->dt_bc.o_modem_type.value<<5)|src->dt_bc.fixed_nw_user_rate.value;} + else//6c with first bit "1" + dst[offset++]=0x80|(src->dt_bc.connection_element.value<<5)|src->dt_bc.modem_type.value;//6c with first bit "1" + + + } + } + if(length_position == 1)//zhugq,in case of "M" + dst[1]=offset-2; + else + dst[0]=offset-1; + break; + case AIFG_IE_ID_DT_CCCAP: + dst[offset++]=1; + dst[offset++]=(src->dt_ccCap.pcp<<1)|src->dt_ccCap.dtmf; + break; + case AIFG_IE_ID_DT_CALLSTAT: + dst[offset++]=(src->dt_callStat.coding_std<<6)|src->dt_callStat.value; + break; + case AIFG_IE_ID_DT_CALLEDBCD: + dst[offset++]=(src->dt_calledNum.num_len+1)/2+1; + dst[offset++]=0x80|(src->dt_calledNum.type<<4)|src->dt_calledNum.num_plan; + i=0; + while(i < src->dt_calledNum.num_len-1){ + dst[offset++]=(src->dt_calledNum.number[i+1]<<4)|src->dt_calledNum.number[i]; + i+=2; + } + if(1==(src->dt_calledNum.num_len%2)) + dst[offset++]=0xf0|src->dt_calledNum.number[i]; + break; + case AIFG_IE_ID_DT_CALLEDSUBADDR: + connsubaddr: + dst[offset++]=src->dt_calledSubAddr.info_len+1; + dst[offset++]=0x80|(src->dt_calledSubAddr.type<<4)|(src->dt_calledSubAddr.odd_even_ind<<3); + memcpy(&dst[offset],src->dt_calledSubAddr.info,src->dt_calledSubAddr.info_len); + offset+=src->dt_calledSubAddr.info_len; + break; + case AIFG_IE_ID_DT_CALLERBCD: + connnum: + length_position = offset++; + if(1==src->dt_callingNum.presentation_ind.flag){ + dst[offset++]=(src->dt_callingNum.type<<4)|src->dt_callingNum.num_plan; + dst[offset++]=0x80|(src->dt_callingNum.presentation_ind.value<<5)|src->dt_callingNum.screen_ind.value; + //dst[1]=(src->dt_callingNum.num_len+1)/2+2; + } + else{ + dst[offset++]=0x80|(src->dt_callingNum.type<<4)|src->dt_callingNum.num_plan; + //dst[1]=(src->dt_callingNum.num_len+1)/2+1; + } + i=0; + while(idt_callingNum.num_len-1){ + dst[offset++]=(src->dt_callingNum.number[i+1]<<4)|src->dt_callingNum.number[i]; + i+=2;} + if(1==src->dt_callingNum.num_len%2) + dst[offset++]=0xf0|src->dt_callingNum.number[i]; + if(length_position == 1)//zhugq,in case of "M" + dst[1] = offset-2; + else + dst[0] = offset-1; + break; + case AIFG_IE_ID_DT_CALLERSUBADDR: + goto connsubaddr; + break; + case AIFG_IE_ID_DT_CONNNUM: + goto connnum; + break; + case AIFG_IE_ID_DT_CONNSUBADDR: + goto connsubaddr; + break; + case AIFG_IE_ID_DT_REDIRBCD: + goto connnum; + break; + case AIFG_IE_ID_DT_REDIRSUBADDR: + goto connsubaddr; + break; + case AIFG_IE_ID_DT_CAUSE: + if(1==src->dt_cause.recommendation.flag){//octet3 and 3a + dst[offset++]=src->dt_cause.diag_len+3; + dst[offset++]=(src->dt_cause.coding_std<<5)|src->dt_cause.location; + dst[offset++]=0x80|src->dt_cause.recommendation.value;} + else{// octet3 + dst[offset++]=src->dt_cause.diag_len+2; + dst[offset++]=0x80|(src->dt_cause.coding_std<<5)|src->dt_cause.location; + } + dst[offset++]=0x80|src->dt_cause.cause_value; + memcpy(&dst[offset],src->dt_cause.diagnostic,src->dt_cause.diag_len); + offset+=src->dt_cause.diag_len; + break; + case AIFG_IE_ID_DT_CONGESTLEVEL: + dst[offset]=src->dt_congestLevel.value; + break; + case AIFG_IE_ID_DT_HIGHCOM: + length_position = offset++; + if(1==src->dt_hiComp.coding_std.flag){ + dst[offset++]=0x80|(src->dt_hiComp.coding_std.value<<5)//octet3 + |(src->dt_hiComp.interpret.value<<2)|src->dt_hiComp.presentat_method.value; + if(1==src->dt_hiComp.high_layer_id.flag){ + if(1==src->dt_hiComp.ext_high_layer_id.flag){ + dst[offset++]=src->dt_hiComp.high_layer_id.value; // 4 with first bit "0" + dst[offset++]=0x80|src->dt_hiComp.ext_high_layer_id.value;}// 4a + else + dst[offset++]=0x80|src->dt_hiComp.high_layer_id.value;}// 4 with first bit "1" + } + if(length_position == 1)//zhugq,in case of "M" + dst[1] = offset-2; + else + dst[0] = offset-1; + break; + case AIFG_IE_ID_DT_KEYPAD: + dst[offset++] = src->dt_keypad.value; + break; + case AIFG_IE_ID_DT_LOWCOM: + dst[offset++]=src->dt_loComp.data_len; + memcpy(&dst[offset],src->dt_loComp.data,src->dt_loComp.data_len); + offset+=src->dt_loComp.data_len; + break; + case AIFG_IE_ID_DT_MOREDATA://do nothing + break; + case AIFG_IE_ID_DT_NOTIIND: + dst[offset++]=0x80|src->dt_notificationInd.value; + break; + case AIFG_IE_ID_DT_PROGIND: + dst[offset++]=2; + dst[offset++]=0x80|(src->dt_progInd.coding_standard<<5)|src->dt_progInd.location; + dst[offset++]=0x80|src->dt_progInd.desc; + break; +// case AIFG_IE_ID_DT_REPEATIND: +// dst[offset++]=src->dt_rpInd.value;//iei half octet lost +// break; + case AIFG_IE_ID_DT_REVCALLDIR://do nothing + break; + case AIFG_IE_ID_DT_SIGNAL: + dst[offset++]=src->dt_signal.value; + break; + case AIFG_IE_ID_DT_SSVER: + dst[offset++]=src->dt_ssVer.info_len; + memcpy(&dst[offset],src->dt_ssVer.info,src->dt_ssVer.info_len); + offset+=src->dt_ssVer.info_len; + break; + case AIFG_IE_ID_DT_USERUSER: + dst[offset++]=src->dt_uu.info_len+1; + dst[offset++]=src->dt_uu.pd; + memcpy(&dst[offset],src->dt_uu.info,src->dt_uu.info_len); + offset+=src->dt_uu.info_len; + break; + case AIFG_IE_ID_DT_ALERTPATTERN: + dst[offset++]=1; + dst[offset++]=src->dt_alertPattern.value; + break; + + /*case AIFG_IE_ID_DT_CODESETEXT: + //to do + break; + case AIFG_IE_ID_DT_SHIFT: + //to do + break;*/ + case AIFG_IE_ID_DT_CLIRSUP: + //to do + break; + case AIFG_IE_ID_DT_CLIRIVO: + //to do + break; + case AIFG_IE_ID_DT_FACILITY: + dst[offset++] = src->dt_facility.component_len; + memcpy(dst+offset, src->dt_facility.component, src->dt_facility.component_len); + offset += src->dt_facility.component_len; + + /* + length_position = offset++; + if(src->dt_facility.components.invoke.tag == 0xa1) + { + dst[offset++] = src->dt_facility.components.invoke.tag; + dst[offset++] = src->dt_facility.components.invoke.len; + //invoke_id - M + dst[offset++] = src->dt_facility.components.invoke.invoke_id.tag; + dst[offset++] = src->dt_facility.components.invoke.invoke_id.len; + dst[offset++] = src->dt_facility.components.invoke.invoke_id.id; + //linked_id - O + if(1 == src->dt_facility.components.invoke.linked_id.flag) + { + dst[offset++] = src->dt_facility.components.invoke.linked_id.tag; + dst[offset++] = src->dt_facility.components.invoke.linked_id.len; + dst[offset++] = src->dt_facility.components.invoke.linked_id.id; + } + //operatin code - M + dst[offset++] = src->dt_facility.components.invoke.opCode.tag; + dst[offset++] = src->dt_facility.components.invoke.opCode.len; + memcpy(&dst[offset],src->dt_facility.components.invoke.opCode.op,src->dt_facility.components.invoke.opCode.len); + offset += src->dt_facility.components.invoke.opCode.len; + //parameters - O + if(1 == src->dt_facility.components.invoke.param.flag) + dst[offset++] = src->dt_facility.components.invoke.param.param; + } + if(src->dt_facility.components.return_result.tag == 0xa2) + { + dst[offset++] = src->dt_facility.components.return_result.tag; + dst[offset++] = src->dt_facility.components.return_result.len; + //invoke_id - M + dst[offset++] = src->dt_facility.components.return_result.invoke_id.tag; + dst[offset++] = src->dt_facility.components.return_result.invoke_id.len; + dst[offset++] = src->dt_facility.components.return_result.invoke_id.id; + //sequence - O + if(1 == src->dt_facility.components.return_result.sequence.flag) + { + dst[offset++] = src->dt_facility.components.return_result.sequence.tag; + dst[offset++] = src->dt_facility.components.return_result.sequence.len; + } + //operation code - O + if(1 == src->dt_facility.components.return_result.opCode.flag) + { + dst[offset++] = src->dt_facility.components.return_result.opCode.tag; + dst[offset++] = src->dt_facility.components.return_result.opCode.len; + memcpy(&dst[offset],src->dt_facility.components.return_result.opCode.op,src->dt_facility.components.return_result.opCode.len); + offset += src->dt_facility.components.return_result.opCode.len; + } + //parameters - O + if(1 == src->dt_facility.components.return_result.param.flag) + { + if(1 == src->dt_facility.components.return_result.sequence.flag) + { + memcpy(&dst[offset],src->dt_facility.components.return_result.param.param,src->dt_facility.components.return_result.sequence.len); + offset += src->dt_facility.components.return_result.sequence.len; + } + else + dst[offset++] = src->dt_facility.components.return_result.param.param[0]; + } + } + if(src->dt_facility.components.return_error.tag == 0xa3) + { + dst[offset++] = src->dt_facility.components.return_error.tag; + dst[offset++] = src->dt_facility.components.return_error.len; + //invoke_id - M + dst[offset++] = src->dt_facility.components.return_error.invoke_id.tag; + dst[offset++] = src->dt_facility.components.return_error.invoke_id.len; + dst[offset++] = src->dt_facility.components.return_error.invoke_id.id; + //error code - M + dst[offset++] = src->dt_facility.components.return_error.error.tag; + dst[offset++] = src->dt_facility.components.return_error.error.len; + memcpy(&dst[offset],src->dt_facility.components.return_error.error.er,src->dt_facility.components.return_error.error.len); + offset += src->dt_facility.components.return_error.error.len; + //parameters - O + if(1 == src->dt_facility.components.return_error.param.flag) + dst[offset++] = src->dt_facility.components.return_error.param.param; + } + if(src->dt_facility.components.reject.tag == 0xa4) + { + dst[offset++] = src->dt_facility.components.reject.tag; + dst[offset++] = src->dt_facility.components.reject.len; + //invoke_id - M + dst[offset++] = src->dt_facility.components.reject.invoke_id.tag; + dst[offset++] = src->dt_facility.components.reject.invoke_id.len; + dst[offset++] = src->dt_facility.components.reject.invoke_id.id; + //problem code - M + dst[offset++] = src->dt_facility.components.reject.problem.tag; + dst[offset++] = src->dt_facility.components.reject.problem.len; + memcpy(&dst[offset],src->dt_facility.components.reject.problem.pro,src->dt_facility.components.reject.problem.len); + offset += src->dt_facility.components.reject.problem.len; + } + if(length_position == 0)//zhugq,in case of "M" + dst[0] = offset-1; + else + dst[1] = offset-2; + */ + break; + case AIFG_IE_ID_DT_RP_MO_ADDR: + case AIFG_IE_ID_DT_RP_MT_ADDR: + if(src->dt_rpAddr.number_len == 0) + { + dst[offset] = 0; + offset++; + } + else + { + dst[offset++] = src->dt_rpAddr.number_len + 1; //length + dst[offset++] = 0x80 | src->dt_rpAddr.number_type | src->dt_rpAddr.number_plan; + if(src->dt_rpAddr.number_len > 0) + { + memcpy(dst+offset, src->dt_rpAddr.number, src->dt_rpAddr.number_len); + offset += src->dt_rpAddr.number_len; + } + } + break; + case AIFG_IE_ID_DT_RP_UD: + if (0 == m_o_flag){ + dst[offset++] = AIFG_IEI_DT_RP_UD; + } + dst[offset++] = src->dt_rpUD.len; + memcpy(dst+offset, src->dt_rpUD.content, src->dt_rpUD.len); + offset += src->dt_rpUD.len; + break; + case AIFG_IE_ID_DT_RP_CAUSE: + dst[offset++] = src->dt_rpCause.diag_len + 1; + dst[offset++] = src->dt_rpCause.cause; + if(src->dt_rpCause.diag_len > 0) + memcpy(dst+offset, src->dt_rpCause.diagnostic, src->dt_rpCause.diag_len); + break; + case AIFG_IE_ID_DT_CELLID: + //to do + break; + case AIFG_IE_ID_DT_MSCM3: + //to do + break; + case AIFG_IE_ID_DT_GROUPCIPHERKEY: + //to do + break; + + + } + break; +/////////////////////////////bssmap////////////////////////////////////////////////// + case AIFG_MSG_BSSMAP: + dst[offset++] = aifg_get_iei(ie_id); + switch(ie_id){ + case AIFG_IE_ID_BM_CIC: + dst[offset++] = src->bm_cic.pcm >> 3; + dst[offset] = src->bm_cic.pcm; + dst[offset] = (dst[offset] << 5) | (src->bm_cic.timeslot & 0x1F); + offset++; + break; + case AIFG_IE_ID_BM_RESOURCEAVAIL: + i = 0; + while(i < 5){ + dst[offset++] = src->bm_resrcAvail.full_rate_channel[i] >>8; + dst[offset++] = src->bm_resrcAvail.full_rate_channel[i] ; + dst[offset++] = src->bm_resrcAvail.half_rate_channel[i] >>8; + dst[offset++] = src->bm_resrcAvail.half_rate_channel[i] ; + i++; + } + break; + case AIFG_IE_ID_BM_CONNRELREQ: + //Nothing to do + break; + case AIFG_IE_ID_BM_CAUSE: + if(src->bm_cause.ext_value.flag == 1){ + dst[offset++] = 2; + dst[offset++] = src->bm_cause.value|0x80; + dst[offset++] = src->bm_cause.ext_value.value; + + } + else{ + dst[offset++] = 1; + dst[offset++] = src->bm_cause.value; + } + break; + case AIFG_IE_ID_BM_IMSI: + case AIFG_IE_ID_BM_MOBILEID: + goto MOBILE_ID; //The same as Mobile ID of DTAP + break; + case AIFG_IE_ID_BM_TMSI: + dst[offset++] = 4; //length + memcpy(&(dst[offset]), src->bm_tmsi.value, 4); + offset += 4; + break; + case AIFG_IE_ID_BM_MSNUM: + dst[offset++] = src->bm_msNum.value; + break; + case AIFG_IE_ID_BM_L3HEADERINFO: + dst[offset++] = 2; + dst[offset++] = src->bm_L3HeaderInfo.pd & 0x0F; + dst[offset++] = src->bm_L3HeaderInfo.ti & 0x0F; + break; + case AIFG_IE_ID_BM_ENCRYPTINFO: + length_position = offset++; //this byte is ie length which will be set later + dst[offset++] = src->bm_encryptInfo.algorithm; + if(src->bm_encryptInfo.algorithm > 1){ + //key + memcpy(&(dst[offset]), src->bm_encryptInfo.key, 8); + offset += 8; + } + if(length_position == 0)//zhugq,in case of "M" + dst[0] = offset-1; + else + dst[1] = offset-2; + break; + case AIFG_IE_ID_BM_CHANNELTYPE: + length_position = offset++; //skip length + dst[offset++] = src->bm_channelType.speech_data_ind; + dst[offset++] = src->bm_channelType.channel_rate_type; + switch(src->bm_channelType.speech_data_ind){ + case 0x01: //speech + i = 0; + while(i < src->bm_channelType.ext.speech.len){ + dst[offset++] = src->bm_channelType.ext.speech.ver[i++] | 0x80; + } + dst[offset-1] = src->bm_channelType.ext.speech.ver[i-1] & 0x7F; //set ext flag of last extended byte to 0 + if(length_position == 0)//zhugq,in case of "M" + dst[0] = offset-1; + else + dst[1] = offset-2; + break; + case 0x02: //data + dst[offset] = src->bm_channelType.ext.data_cfg.t_nt; + dst[offset] = (dst[offset] << 6) | src->bm_channelType.ext.data_cfg.rate; + if(1==src->bm_channelType.ext.data_cfg.allowed_data_rate.flag){ + dst[offset] = dst[offset] | 0x80; //set ext flag to 1 + offset++; + dst[offset] = src->bm_channelType.ext.data_cfg.allowed_data_rate.value; + } + if(length_position == 0)//zhugq,in case of "M" + dst[0] = offset; + else + dst[1] = offset-1; + break; + case 0x03: //signalling + + break; + } + break; + case AIFG_IE_ID_BM_PERIODICITY: + dst[offset++] = src->bm_periodicity.value; + break; + case AIFG_IE_ID_BM_EXTRESOURCEIND: + dst[offset] = src->bm_extResrcInd.sm & 0x01; + dst[offset] = (dst[offset] << 1) | (src->bm_extResrcInd.tarr & 0x01); + offset++; + break; + case AIFG_IE_ID_BM_TOTALRESOURCE: + dst[offset++] = src->bm_totalResrc.full_rate_channel >> 8; + dst[offset++] = src->bm_totalResrc.full_rate_channel ; + dst[offset++] = src->bm_totalResrc.half_rate_channel >> 8; + dst[offset++] = src->bm_totalResrc.half_rate_channel ; + break; + case AIFG_IE_ID_BM_LSAID: + dst[offset++] = 3; + dst[offset++] = src->bm_lsaId.value[0]; + dst[offset++] = src->bm_lsaId.value[1]; + dst[offset++] = src->bm_lsaId.value[2]; + break; + ////////////////////////// + case AIFG_IE_ID_BM_LSAIDLIST: + length_position = offset++; + dst[offset++]=src->bm_lsaIdList.ep; + i=0; + while (ibm_lsaIdList.lsa_num) + { + dst[offset++]=src->bm_lsaIdList.list[i].id[0]; + dst[offset++]=src->bm_lsaIdList.list[i].id[1]; + dst[offset++]=src->bm_lsaIdList.list[i].id[2]; + i++; + } + //in case of "M'' + dst[length_position]=src->bm_lsaIdList.lsa_num*3+1; + break; + case AIFG_IE_ID_BM_PRIORITY: + dst[offset++]=1; + dst[offset++]=(src->bm_priority.pci<<6)|(src->bm_priority.level<<2)|(src->bm_priority.qa<<1)|(src->bm_priority.pvi); + break; + case AIFG_IE_ID_BM_CELLID: + length_position = offset++; + dst[offset++]=src->bm_cellId.discriminator; + switch(src->bm_cellId.discriminator){ + case 0: + dst[offset++]=(src->bm_cellId.mcc[1]<<4)|src->bm_cellId.mcc[0]; + dst[offset++]=(src->bm_cellId.mnc[2]<<4)|src->bm_cellId.mcc[2]; + dst[offset++]=(src->bm_cellId.mnc[1]<<4)|src->bm_cellId.mnc[0]; + dst[offset++]=src->bm_cellId.LAC>>8; + dst[offset++]=src->bm_cellId.LAC; + dst[offset++]=src->bm_cellId.CI>>8; + dst[offset++]=src->bm_cellId.CI; + dst[length_position]=8;//zhugq,in case of "M" + break; + case 1: + dst[offset++]=src->bm_cellId.LAC>>8; + dst[offset++]=src->bm_cellId.LAC; + dst[offset++]=src->bm_cellId.CI>>8; + dst[offset++]=src->bm_cellId.CI; + dst[length_position]=5;//zhugq + break; + case 2: + dst[offset++]=src->bm_cellId.CI>>8; + dst[offset++]=src->bm_cellId.CI; + dst[length_position]=3;//zhugq + break; + default:break; + } + break; + case AIFG_IE_ID_BM_BANDUSED: + dst[offset++]=src->bm_bandUsed.value; + break; + case AIFG_IE_ID_BM_RRCAUSE: + dst[offset++]=src->bm_rrCause.value; + break; + case AIFG_IE_ID_BM_DLCI: + dst[offset++]=src->bm_dlci.value; + break; + case AIFG_IE_ID_BM_DTXFLAG: + dst[offset++]=src->bm_dtx.value; + break; + case AIFG_IE_ID_BM_RESPREQ://do nothing + break; + case AIFG_IE_ID_BM_RESOURCEINDMEHTOD: + dst[offset++]=src->bm_resrcIndMethod.value; + break; + case AIFG_IE_ID_BM_CICLIST: + dst[offset++]=src->bm_cicList.status.len+1; + dst[offset++]=src->bm_cicList.range; + memcpy(&dst[offset],src->bm_cicList.status.content,src->bm_cicList.status.len); + offset+=src->bm_cicList.status.len; + break; + case AIFG_IE_ID_BM_DIGNOSTIC: + dst[offset++]=src->bm_diagnostics.err_msg.len+2; + dst[offset++]=src->bm_diagnostics.err_pointer; + dst[offset++]=src->bm_diagnostics.bit_pointer; + memcpy(&dst[offset],src->bm_diagnostics.err_msg.msg,src->bm_diagnostics.err_msg.len); + offset+=src->bm_diagnostics.err_msg.len; + break; + case AIFG_IE_ID_BM_CHOSENCHANNEL: + dst[offset++]=(src->bm_chosenChannel.mode<<4)|src->bm_chosenChannel.channel; + break; + case AIFG_IE_ID_BM_CIPHERRESPMODE: + dst[offset++]=src->bm_cipherRespMode.value; + break; + case AIFG_IE_ID_BM_CHANNELNEEDED: + dst[offset++]=src->bm_channelNeeded.value; + break; + case AIFG_IE_ID_BM_TRACETYPE: + dst[offset++]=src->bm_traceType.value; + break; + case AIFG_IE_ID_BM_TRIGGERID: + dst[offset++]=src->bm_triggerId.len; + memcpy(&dst[offset],src->bm_triggerId.content,src->bm_triggerId.len); + offset+=src->bm_triggerId.len; + break; + case AIFG_IE_ID_BM_TRACEREF: + dst[offset++]=src->bm_traceRef.value>>8; + dst[offset++]=src->bm_traceRef.value; + break; + case AIFG_IE_ID_BM_TRANSACTIONID: + dst[offset++]=2; + dst[offset++]=src->bm_transId.value>>8; + dst[offset++]=src->bm_transId.value; + break; + case AIFG_IE_ID_BM_OMCID: + dst[offset++]=src->bm_omcId.len; + memcpy(&dst[offset],src->bm_omcId.id,src->bm_omcId.len); + offset+=src->bm_omcId.len; + break; + case AIFG_IE_ID_BM_FORWARDIND: + dst[offset++]=src->bm_fowardInd.value; + break; + case AIFG_IE_ID_BM_CHOSENENCRYPT: + dst[offset++]=src->bm_chosenEncrypt.value; + break; + case AIFG_IE_ID_BM_CIRCUITPOOL: + dst[offset++]=src->bm_circuitPool.value; + break; + case AIFG_IE_ID_BM_CIRCUITPOOLLIST: + dst[offset++]=src->bm_circuitPoolList.num; + memcpy(&dst[offset],src->bm_circuitPoolList.circuit,src->bm_circuitPoolList.num); + offset+=src->bm_circuitPoolList.num; + break; + case AIFG_IE_ID_BM_TIMEIND: + dst[offset++]=src->bm_timeId.value; + break; + case AIFG_IE_ID_BM_RESOURCESITUATION: + length_position = offset++; + i=0; + while(ibm_resrcSit.band_num){ + dst[offset++]=(src->bm_resrcSit.band[i].band_ind<<4)|src->bm_resrcSit.band[i].channel_type; + if(src->bm_resrcSit.band[i].channel_num>127){ + dst[offset++]=(src->bm_resrcSit.band[i].channel_num>>8)|0x80; + dst[offset++]=src->bm_resrcSit.band[i].channel_num;} + else + dst[offset++]=src->bm_resrcSit.band[i].channel_num; + i++;} + if(length_position == 0)//zhugq,in case of "M" + dst[0] = offset-1; + else + dst[1] = offset-2; + break; + case AIFG_IE_ID_BM_CURCHANNELTYPE1: + dst[offset++]=(src->bm_curChannelType1.channel_mode<<4)|src->bm_curChannelType1.channel; + break; + case AIFG_IE_ID_BM_QUEUEIND: + dst[offset++]=src->bm_queuingInd.value<<1; + break; + case AIFG_IE_ID_BM_SPEECHVER: + dst[offset++]=src->bm_speechVer.value; + break; + case AIFG_IE_ID_BM_ASSIGNREQUIREMENT: + dst[offset++]=src->bm_assignReq.value; + break; + case AIFG_IE_ID_BM_TALKERFLAG://do nothing + break; + case AIFG_IE_ID_BM_GROUPCALLREF: + dst[offset++]=5; + groupref: + dst[offset++]=src->bm_groupRef.binary_code>>19; + dst[offset++]=src->bm_groupRef.binary_code>>11; + dst[offset++]=src->bm_groupRef.binary_code>>3; + dst[offset]=((src->bm_groupRef.binary_code & 0x07)<<5)|(src->bm_groupRef.sf<<4); + dst[offset]=dst[offset]|(src->bm_groupRef.af<<3)|src->bm_groupRef.call_priority; + offset++; + dst[offset++]=src->bm_groupRef.cipher_info<<4; + break; + case AIFG_IE_ID_BM_EMLPP: + dst[offset++]=src->bm_eMLPP.value; + break; + case AIFG_IE_ID_BM_CFGEVOIND: + dst[offset++]=src->bm_cfgEvoInd.value; + break; + case AIFG_IE_ID_BM_BSSOLDTONEW: + dst[offset++]=src->bm_bssOldtoNew.len; + memcpy(&dst[offset],src->bm_bssOldtoNew.content,src->bm_bssOldtoNew.len); + offset+=src->bm_bssOldtoNew.len; + break; + case AIFG_IE_ID_BM_LSAINFO: + dst[offset++]=src->bm_lsaInfo.lsa_num*4+1; + dst[offset++]=src->bm_lsaInfo.lsa_only; + i=0; + while(ibm_lsaInfo.lsa_num) + { + dst[offset++]=src->bm_lsaInfo.info[i].priority; + dst[offset++]=src->bm_lsaInfo.info[i].id[0]; + dst[offset++]=src->bm_lsaInfo.info[i].id[1]; + dst[offset++]=src->bm_lsaInfo.info[i].id[2]; + i++;} + break; + case AIFG_IE_ID_BM_LOCATIONINFO: + dst[offset++]=src->bm_locInfo.len; + memcpy(&dst[offset],src->bm_locInfo.info,src->bm_locInfo.len); + offset+=src->bm_locInfo.len; + break; + case AIFG_IE_ID_BM_CLASSMARKINFO2: + classmarkinfo2: + dst[offset++]=3; + i = (src->bm_cmInfo2.rev_level<<5) | (src->bm_cmInfo2.es_ind<<4); + i = i | (src->bm_cmInfo2.a5_1<<3) | src->bm_cmInfo2.rf_power_cap; + dst[offset++] = i; + j = (src->bm_cmInfo2.ps_cap<<6)|(src->bm_cmInfo2.ss_screen_ind<<4); + j = j|(src->bm_cmInfo2.sm_cap<<3)|(src->bm_cmInfo2.vbs<<2); + j = j|(src->bm_cmInfo2.vgcs<<1)|src->bm_cmInfo2.fc; + dst[offset++] = j; + k = (src->bm_cmInfo2.cm3<<7)|(src->bm_cmInfo2.lcsva_cap<<5); + k = k|(src->bm_cmInfo2.so_lsa<<3)|(src->bm_cmInfo2.cmsp<<2); + k = k|(src->bm_cmInfo2.a5_3<<1)|src->bm_cmInfo2.a5_2; + dst[offset++] = k; + break; + case AIFG_IE_ID_BM_CELLIDLIST: + length_position = offset++; + i=0; + dst[offset++]=src->bm_cellIdList.discriminator; + switch(src->bm_cellIdList.discriminator){ + case 0: + while(ibm_cellIdList.cid_num){ + dst[offset++]=(src->bm_cellIdList.cell_id[i].mcc[1]<<4)|src->bm_cellIdList.cell_id[i].mcc[0]; + dst[offset++]=(src->bm_cellIdList.cell_id[i].mnc[2]<<4)|src->bm_cellIdList.cell_id[i].mcc[2]; + dst[offset++]=(src->bm_cellIdList.cell_id[i].mnc[1]<<4)|src->bm_cellIdList.cell_id[i].mnc[0]; + dst[offset++]=src->bm_cellIdList.cell_id[i].LAC>>8; + dst[offset++]=src->bm_cellIdList.cell_id[i].LAC; + dst[offset++]=src->bm_cellIdList.cell_id[i].CI>>8; + dst[offset++]=src->bm_cellIdList.cell_id[i].CI; + i++;} + break; + case 1: + while(ibm_cellIdList.cid_num){ + dst[offset++]=src->bm_cellIdList.cell_id[i].LAC>>8; + dst[offset++]=src->bm_cellIdList.cell_id[i].LAC; + dst[offset++]=src->bm_cellIdList.cell_id[i].CI>>8; + dst[offset++]=src->bm_cellIdList.cell_id[i].CI; + i++;} + break; + case 2: + while(ibm_cellIdList.cid_num){ + dst[offset++]=src->bm_cellIdList.cell_id[i].CI>>8; + dst[offset++]=src->bm_cellIdList.cell_id[i].CI; + i++;} + break; + case 4: + while(ibm_cellIdList.cid_num){ + dst[offset++]=(src->bm_cellIdList.cell_id[i].mcc[1]<<4)|src->bm_cellIdList.cell_id[i].mcc[0]; + dst[offset++]=(src->bm_cellIdList.cell_id[i].mnc[2]<<4)|src->bm_cellIdList.cell_id[i].mcc[2]; + dst[offset++]=(src->bm_cellIdList.cell_id[i].mnc[1]<<4)|src->bm_cellIdList.cell_id[i].mnc[0]; + dst[offset++]=src->bm_cellIdList.cell_id[i].LAC>>8; + dst[offset++]=src->bm_cellIdList.cell_id[i].LAC; + i++;} + break; + case 5: + while(ibm_cellIdList.cid_num){ + dst[offset++]=src->bm_cellIdList.cell_id[i].LAC>>8; + dst[offset++]=src->bm_cellIdList.cell_id[i].LAC; + i++;} + break; + } + if(length_position == 0)//zhugq,in case of "M" + dst[0] = offset-1; + else + dst[1] = offset-2; + break; + case AIFG_IE_ID_BM_CLASSMARKINFO3: + //to do + break; + case AIFG_IE_ID_BM_L3INFO: + //to do + break; + case AIFG_IE_ID_BM_CLASSMARKINFO1: + //to do + break; + case AIFG_IE_ID_BM_L3MSGCONTENT: + //to do + break; + } + break; + + } + + return offset; + +ERR_PROC: + // aifg_debug_print(aifg_event, (void*)src, NULL); + return AIFG_ERROR; +} +//End of information element process functions definition------------------------------ + diff --git a/omc/plat/aif/src/aifg_m.c b/omc/plat/aif/src/aifg_m.c new file mode 100644 index 0000000..ceeda65 --- /dev/null +++ b/omc/plat/aif/src/aifg_m.c @@ -0,0 +1,1689 @@ +/******************************************************************** +Copyright ?2007 LGC Wireless, Inc. All rights reserved +File Name: aifg_m.c +Description: FSM of AIFG module +Version: v9.0.0 +Author: Roy Jiang +Create Date: 2007-3-12 + +History: +2007-3-12 v9.0.0 Create +*********************************************************************/ +//#include "aifg_mpp.h" +#include "./include/aifg_var_ext.h" +#include "./include/aifg.h" + +aifg_sap sap[AIFG_MAX_SAP]; +aifg_port aifg_pcb[AIFG_MAX_PORT]; +aifg_circuit_group cg[AIFG_MAX_CG]; +aifg_link_info link_info[SCCP_MAX_LINK]; +aifg_dual_server dual_server; +aifg_event_code aifg_event; +aifg_port *pOpenPort_h = NULL; //List head of opened port +aifg_port *pPagPort_h = NULL; //List head of paging port +aifg_port *pPagPort_t = NULL; //List tail of paging port + +static int paging_port_count = 0; //for protection + +extern inline void aifg_add_paging_port(aifg_port *p); +extern inline void aifg_del_paging_port(aifg_port *p); +extern void aifg_csta_init(); +extern void aifg_csta_proc(); + +enum REL_CAUSE{ + REL_CAUSE_CALL_CONTROL = 0x09, + REL_CAUSE_HO_SUCCESS = 0x0B, + REL_CAUSE_TIMER_EXPIRE = 0x66, + REL_CAUSE_PROTOCOL_ERR = 0x6F, + REL_CAUSE_TEMP_FAILURE = 0x29, +}; + +/* +Purpose:Init AIFG module. +Input: None +Output: None +*/ +void aifg_init() +{ + int memsize; + + memset(&sap, 0, sizeof(sap)); + memset(aifg_pcb, 0, sizeof(aifg_port)*AIFG_MAX_PORT); + memset(link_info, 0, sizeof(aifg_link_info)*SCCP_MAX_LINK); + + memsize = (sizeof(sap)+sizeof(aifg_port)*AIFG_MAX_PORT+sizeof(aifg_raw_msg)+sizeof(aifg_msg_pre_decoded) + + sizeof(dual_server) + sizeof(aifg_event) + sizeof(cg) + sizeof(aifg_link_info)*SCCP_MAX_LINK + + sizeof(SP_UiPriPara))/1024; + + printf("AIFG memory usage: %d KB\n", memsize); + + aifg_set_running_mode(AIFG_RUN_MODE_SINGLE); + + aifg_event = AIFG_SUCCEED; + + aifg_mpp_init(); + aifg_debug_init(); + aifg_csta_init(); + //for dual server test + aifg_set_running_mode(AIFG_RUN_MODE_DUAL); + + printf("AIFG init completed!\n"); +} + +/* +Purpose:10ms routing of AIFG module. +Input: None +Output: None +*/ +void aifg_proc() +{ + int i; + aifg_port *pPort; + + for (i = 0; i < MSG_PROC_EACH_TIME; i++){ + if(AIFG_PROC_FINISH == aifg_mpp_proc()) + break; + } + + //process opened port + i = 0; + pPort = pOpenPort_h; + while(pPort != NULL){ + aifg_port *pTmpPort = pPort; + pPort = pPort->pNextOpenPort; + + (pTmpPort->timer > 0 ) ? pTmpPort->timer-- : 0; + aifg_port_proc(pTmpPort, NULL, NULL); + + if(++i > AIFG_MAX_PORT) + break; + } + + //---------for protection--------------- + if(i > AIFG_MAX_PORT) + { + //memory corrupted, reset all ports + pOpenPort_h = NULL; + for(i = 0; i < AIFG_MAX_PORT; i++) + aifg_port_release(&aifg_pcb[i]); + } + //---------protection end--------------- + aifg_csta_proc(); + aifg_debug_timer(); +} + +//FSM--------------------------------------------------------------------------------------- +inline void aifg_send_release_ind(aifg_sap_type sapid, int app_port, int aif_port, int cause) +{ + rv_msg.id = AIFG_MSG_ID_RELEASE; + rv_msg.app_port = app_port; + rv_msg.aif_port = aif_port; + rv_msg.cause = cause; + sap[sapid].callback_func(AIFG_IND_RV_MSG, &rv_msg); + aifg_pcb[aif_port].app_rel_flag = 1; +} + +inline void aifg_reset_timer(int port, int value) +{ + aifg_pcb[port].timer = value; +} + +inline int aifg_get_cause_value(aifg_ie_ptr *cause) +{ + aifg_ie tmp_ie; + if(cause->ptr != NULL){ + aifg_ie_decode(cause, &tmp_ie); + if (tmp_ie.iei == AIFG_IE_ID_BM_CAUSE) + return tmp_ie.param.bm_cause.value; + else + return tmp_ie.param.dt_cause.cause_value; + } + else + return 0x1F; //unspecified +} + +enum RESET_STATE{ + RESET_INIT, + RESET_WAIT_RESET_COMPLETE, +}; +int reset_fsm(aifg_port *p, aifg_msg_t *upper_msg, aifg_msg_pre_decoded *peer_msg) +{ + switch(p->ti_stat){ + case RESET_INIT: + if(AIFG_SAP_MSC == p->sapid) + p->timer = AIFG_TIMER_T2; + else + p->timer = AIFG_TIMER_T13; + p->ti_stat = RESET_WAIT_RESET_COMPLETE; + break; + case RESET_WAIT_RESET_COMPLETE: + //Send RESET_ACK + if(0 == p->timer){ + sd_msg.id = AIFG_MSG_ID_RESET_ACK; + aifg_send_udt(p->cgid, &sd_msg, NULL); + return AIFG_PROC_FINISH; + } + break; + default: + assert(0); + goto ERR_PROC; + break; + } + + return AIFG_PROC_CONTINUE; + +ERR_PROC: + //release the port + return AIFG_ERROR; +} + + +enum PAGING_STATE{ + PAGING_INIT, + PAGING_WAIT_RESP, + PAGING_REPAGING, +}; +int paging_fsm(aifg_port *p, aifg_msg_t *upper_msg, aifg_msg_pre_decoded *peer_msg) +{ + switch(p->ti_stat){ + case PAGING_INIT: + { + //remember imsi or tmsi + if (upper_msg->msg.paging.tmsi.flag == 1){ + //TMSI, because the TMSI in paging is BCD coding and single byte coding in paging response + //so here BCD coded TMSI will be translated to single byte coding + int i = 0, j = 0; + while (i < 4){ + p->imsi[j++] = upper_msg->msg.paging.tmsi.value[i] & 0x0F; + p->imsi[j++] = (upper_msg->msg.paging.tmsi.value[i++] & 0xF0) >> 4; + } + p->imsi_len = j; + } + else{ + p->imsi_len = upper_msg->msg.paging.imsi.imsi_len; + memcpy(p->imsi, upper_msg->msg.paging.imsi.imsi, p->imsi_len); + } + aifg_send_udt(p->cgid, upper_msg, &p->sd_buffer); + + //add the port paging port list +// aifg_add_paging_port(p); + p->ti_stat = PAGING_WAIT_RESP; + p->timer = AIFG_TIMER_T3113; + } + break; + case PAGING_WAIT_RESP: + { + if((peer_msg != NULL && AIFG_MSG_ID_PAGING_RESP == peer_msg->msg.completeL3Info.l3msg.id)){ + peer_msg->app_port = p->upper_port; + sap[p->sapid].callback_func(AIFG_IND_RV_MSG, peer_msg); + return AIFG_PROC_FINISH; + } + else if(p->timer <= 0){ + aifg_debug_print(p-aifg_pcb, AIFG_ERR_PAGING_NOT_RESP, NULL, p-aifg_pcb); + goto ERR_PROC; + } + else if(0 == (p->timer % AIFG_TIMER_REPAGE)) + p->ti_stat = PAGING_REPAGING; + } + break; + case PAGING_REPAGING: + { + //Re-paging + PostSp(&p->sd_buffer); + p->ti_stat = PAGING_WAIT_RESP; + } + break; + default: + assert(0); + goto ERR_PROC; + break; + } + return AIFG_PROC_CONTINUE; + +ERR_PROC: + //remove this port from paging list + p->app_rel_flag = 1; //no need to release app +// aifg_del_paging_port(p); + return AIFG_ERROR; +} + +enum LU_STATE{ + LU_WAIT_RESPONSE, + LU_CLEAR, + LU_WAIT_CLEAR_CMP, +}; +int lu_fsm(aifg_port *p, aifg_msg_t *upper_msg, aifg_msg_pre_decoded *peer_msg) +{ + if (peer_msg != NULL && peer_msg->id == AIFG_MSG_ID_CLR_REQ){ + p->rel_cause = aifg_get_cause_value(&peer_msg->msg.clearReq.cause); + aifg_send_release_ind(p->sapid, p->upper_port, p-aifg_pcb, p->rel_cause); + p->ti_stat = LU_CLEAR; + p->timer = 0; + } + + switch(p->ti_stat) + { + case LU_WAIT_RESPONSE: + { + if(upper_msg != NULL){ + if(upper_msg->id == AIFG_MSG_ID_RELEASE){ + p->ti_stat = LU_CLEAR; + p->app_rel_flag = 1; + } + else{ + aifg_send_dt1(p->link_id, upper_msg, p->ti); + } + } + else if(peer_msg != NULL){ + peer_msg->app_port = p->upper_port; + sap[p->sapid].callback_func(AIFG_IND_RV_MSG, peer_msg); + } + } + break; + case LU_CLEAR: + { + sd_msg.aif_port = p - aifg_pcb; //for debug print + sd_msg.app_port = p->upper_port;//for debug print + sd_msg.pd = AIFG_PD_BSSMAP_DEDICATED; + sd_msg.id = AIFG_MSG_ID_CLR_CMD; + sd_msg.msg.clearCmd.cause.flag = 1; + sd_msg.msg.clearCmd.cause.ext_value.flag = 0; + sd_msg.msg.clearCmd.cause.value = REL_CAUSE_CALL_CONTROL; + sd_msg.msg.clearCmd.l3HeaderInfo.flag = 0; + aifg_send_dt1(p->link_id, &sd_msg, p->ti); + + p->ti_stat = LU_WAIT_CLEAR_CMP; + p->timer = AIFG_TIMER_CLEAR_TIMEOUT; + } + break; + case LU_WAIT_CLEAR_CMP: + { + if((peer_msg != NULL && peer_msg->id == AIFG_MSG_ID_CLR_CMP) + || p->timer <= 0){ + link_info[p->link_id].cleared = 1; + return AIFG_PROC_FINISH; + } + } + break; + default: + assert(0); + return AIFG_PROC_FINISH; + break; + } + + return AIFG_PROC_CONTINUE; +} + +enum HO_STATE{ + HO_IDLE, + HO_SETUP_NEW_LINK, + HO_EXECUTE, + HO_WAIT_COMPLETE, + HO_CLEAR_OLD_LINK, + HO_WAIT_OLD_CLEAR_CMP, + HO_CLEAR_NEW_LINK, + HO_WAIT_NEW_CLEAR_CMP, +}; +enum HO_RETURN{ + HO_PROCECCED, + HO_NOT_PROCECCED, +}; +int ho_fsm(aifg_port *p, aifg_msg_t *upper_msg, aifg_msg_pre_decoded *peer_msg) +{ + int retVal = HO_PROCECCED; + + switch(p->ho_stat){ + case HO_IDLE: + { + if (peer_msg->id == AIFG_MSG_ID_HO_REQUIRED){ + peer_msg->app_port = p->upper_port; + sap[p->sapid].callback_func(AIFG_IND_RV_MSG, peer_msg); + p->app_ho_port = peer_msg->app_port; + p->ho_stat = HO_SETUP_NEW_LINK; + p->timer = AIFG_TIMER_TRANS_TIMEOUT; + } + else{ + assert(0); + retVal = HO_NOT_PROCECCED; + goto ERROR_PROC; + } + } + break; + case HO_SETUP_NEW_LINK: + { + if (upper_msg != NULL ){ + if (upper_msg->id == AIFG_MSG_ID_HO_REQUEST){ + p->new_link = aifg_send_cr(p->sapid, p->cgid, upper_msg); + aifg_add_link(p->new_link, p->sapid); + link_info[p->new_link].cur_port = p - aifg_pcb; + p->ho_stat = HO_EXECUTE; + p->timer = AIFG_TIMER_TRANS_TIMEOUT; + } + else if (upper_msg->id == AIFG_MSG_ID_HO_REQ_REJ){ + aifg_send_dt1(p->link_id, upper_msg, -1); + p->ho_stat = 0; + } + else + retVal = HO_NOT_PROCECCED; + } + else if(p->timer == 0) + goto ERROR_PROC; + else + retVal = HO_NOT_PROCECCED; + } + break; + case HO_EXECUTE: + { + if (upper_msg != NULL){ + switch(upper_msg->id) + { + case AIFG_MSG_ID_HO_CMD: + aifg_send_dt1(p->link_id, upper_msg, -1); + retVal = HO_PROCECCED; + p->ho_stat = HO_WAIT_COMPLETE; + p->timer = AIFG_TIMER_TRANS_TIMEOUT; + break; + default: + retVal = HO_NOT_PROCECCED; + break; + } + } + else if(peer_msg != NULL){ + switch(peer_msg->id) + { + case AIFG_MSG_ID_HO_FAIL: + //rollback to HO_SETUP_NEW_LINK + p->ho_stat = HO_SETUP_NEW_LINK; + //no break here + case AIFG_MSG_ID_HO_REQ_ACK: + case AIFG_MSG_ID_QUEUE_IND: + peer_msg->app_port = p->app_ho_port; + sap[p->sapid].callback_func(AIFG_IND_RV_MSG, peer_msg); + break; + default: + retVal = HO_NOT_PROCECCED; + break; + } + } + else if(p->timer == 0) + goto ERROR_PROC; + } + break; + case HO_WAIT_COMPLETE: + { + if(peer_msg != NULL){ + switch(peer_msg->id) + { + case AIFG_MSG_ID_HO_DETECT: + peer_msg->app_port = p->app_ho_port; + sap[p->sapid].callback_func(AIFG_IND_RV_MSG, peer_msg); + break; + case AIFG_MSG_ID_HO_CMP: + p->ho_stat = HO_CLEAR_OLD_LINK; + peer_msg->app_port = p->app_ho_port; + sap[p->sapid].callback_func(AIFG_IND_RV_MSG, peer_msg); + break; + case AIFG_MSG_ID_HO_FAIL: + p->ho_stat = HO_CLEAR_NEW_LINK; + peer_msg->app_port = p->app_ho_port; + sap[p->sapid].callback_func(AIFG_IND_RV_MSG, peer_msg); + break; + default: + retVal = HO_NOT_PROCECCED; + break; + } + } + else if(p->timer == 0) + goto ERROR_PROC; + else + retVal = HO_NOT_PROCECCED; + } + break; + case HO_CLEAR_OLD_LINK: + { + sd_msg.aif_port = p - aifg_pcb; //for debug print + sd_msg.app_port = p->upper_port;//for debug print + sd_msg.pd = AIFG_PD_BSSMAP_DEDICATED; + sd_msg.id = AIFG_MSG_ID_CLR_CMD; + sd_msg.msg.clearCmd.cause.flag = 1; + sd_msg.msg.clearCmd.cause.ext_value.flag = 0; + sd_msg.msg.clearCmd.cause.value = REL_CAUSE_HO_SUCCESS; + sd_msg.msg.clearCmd.l3HeaderInfo.flag = 0; + aifg_send_dt1(p->link_id, &sd_msg, p->ti); + + p->ho_stat = HO_WAIT_OLD_CLEAR_CMP; + p->timer = AIFG_TIMER_CLEAR_TIMEOUT; + } + break; + case HO_WAIT_OLD_CLEAR_CMP: + { + if((peer_msg != NULL && peer_msg->id == AIFG_MSG_ID_CLR_CMP)|| p->timer <= 0){ + int old_link = p->link_id; + aifg_pcb[link_info[old_link].cur_port].link_id = p->new_link; + if(link_info[old_link].ti_number > 0){ + //handover all transaction on the old link to the new link + int i = 0; + while(link_info[old_link].ti_number > 0 && i < AIFG_MAX_TI_PER_LINK){ + if(link_info[old_link].ti[TI_FOR_CC][i].en_flag == 1){ + aifg_pcb[link_info[old_link].ti[TI_FOR_CC][i].port].link_id = p->new_link; + link_info[old_link].ti_number--; + } + if(link_info[old_link].ti[TI_FOR_SMS][i].en_flag == 1){ + aifg_pcb[link_info[old_link].ti[TI_FOR_SMS][i].port].link_id = p->new_link; + link_info[old_link].ti_number--; + } + if(link_info[old_link].ti[TI_FOR_SS][i].en_flag == 1){ + aifg_pcb[link_info[old_link].ti[TI_FOR_SS][i].port].link_id = p->new_link; + link_info[old_link].ti_number--; + } + i++; + } + } + link_info[old_link].cleared = 1; + aifg_send_rlsd(old_link); + + p->ho_stat = 0; //Handover completed + aifg_reset_timer(p-aifg_pcb, AIFG_TIMER_TRANS_TIMEOUT); + } + } + break; + case HO_CLEAR_NEW_LINK: + { + sd_msg.aif_port = p - aifg_pcb; //for debug print + sd_msg.app_port = p->upper_port;//for debug print + sd_msg.pd = AIFG_PD_BSSMAP_DEDICATED; + sd_msg.id = AIFG_MSG_ID_CLR_CMD; + sd_msg.msg.clearCmd.cause.flag = 1; + sd_msg.msg.clearCmd.cause.ext_value.flag = 0; + sd_msg.msg.clearCmd.cause.value = REL_CAUSE_CALL_CONTROL; + sd_msg.msg.clearCmd.l3HeaderInfo.flag = 0; + aifg_send_dt1(p->new_link, &sd_msg, p->ti); + + p->ho_stat = HO_WAIT_NEW_CLEAR_CMP; + p->timer = AIFG_TIMER_CLEAR_TIMEOUT; + } + break; + case HO_WAIT_NEW_CLEAR_CMP: + if((peer_msg != NULL && peer_msg->id == AIFG_MSG_ID_CLR_CMP)|| p->timer <= 0){ + link_info[p->new_link].cleared = 1; + aifg_send_rlsd(p->new_link); + p->new_link = -1; + p->ho_stat = 0; //Handover failed + } + else + retVal = HO_NOT_PROCECCED; + break; + default: + assert(0); + goto ERROR_PROC; + break; + } + return retVal; + +ERROR_PROC: + p->ho_stat = 0; + return retVal; +} + +enum CC_STATE{ + CC_WAIT_SETUP, + CC_CONNECTING, + CC_CONNECTED, + CC_DISCONNECTING, + CC_WAIT_RELEASE, + CC_RELEASING, + CC_WAIT_RELEASE_CMP, + CC_RELEASE_CMP, + CC_CLEARING, + CC_WAIT_CLEAR_CMP, + CC_HANDOVER, +}; +int cc_fsm(aifg_port *p, aifg_msg_t *upper_msg, aifg_msg_pre_decoded *peer_msg) +{ + if (peer_msg != NULL && peer_msg->id == AIFG_MSG_ID_CLR_REQ){ + p->rel_cause = aifg_get_cause_value(&peer_msg->msg.clearReq.cause); + aifg_send_release_ind(p->sapid, p->upper_port, p-aifg_pcb, p->rel_cause); + p->ti_stat = CC_CLEARING; + p->timer = 0; + } + + switch(p->ti_stat) + { + case CC_WAIT_SETUP: + { + if(upper_msg != NULL){ + if (upper_msg->pd == AIFG_PD_DTAP_CC && p->ti == -1){ + //assign a new ti for the transaction + p->ti = aifg_get_ti(p->link_id, p-aifg_pcb, TI_FOR_CC); + if(p->ti == -1){ + aifg_send_release_ind(p->sapid, p->upper_port, p-aifg_pcb, REL_CAUSE_PROTOCOL_ERR); + p->rel_cause = REL_CAUSE_PROTOCOL_ERR; + p->ti_stat = CC_CLEARING; + + aifg_debug_print(p-aifg_pcb, AIFG_ERR_CAN_NOT_FIND_TI, NULL, p-aifg_pcb); + #ifdef _AIFG_DEBUG_ + assert(0); + #endif + } + } + switch(upper_msg->id){ + case AIFG_MSG_ID_SETUP: + p->ti_stat = CC_CONNECTING; + aifg_send_dt1(p->link_id, upper_msg, p->ti); + break; + case AIFG_MSG_ID_RELEASE: + p->rel_cause = upper_msg->msg.release.cause1.cause_value; + p->ti_stat = CC_RELEASING; + p->app_rel_flag = 1; + break; + default: + aifg_send_dt1(p->link_id, upper_msg, p->ti); + break; + } + } + else if(peer_msg != NULL){ + if(peer_msg->pd == AIFG_PD_DTAP_CC && p->ti == -1){ + p->ti = peer_msg->ti; + aifg_add_ti(p->link_id, p->ti, TI_FOR_CC, p-aifg_pcb); + } + switch(peer_msg->id){ + case AIFG_MSG_ID_DISCONNECT: + p->ti_stat = CC_RELEASING; + p->rel_cause = aifg_get_cause_value(&peer_msg->msg.disconnect.cause); + aifg_send_release_ind(p->sapid, p->upper_port, p-aifg_pcb, p->rel_cause); + break; + case AIFG_MSG_ID_RELEASE: + p->ti_stat = CC_RELEASE_CMP; + p->rel_cause = aifg_get_cause_value(&peer_msg->msg.release.cause1); + aifg_send_release_ind(p->sapid, p->upper_port, p-aifg_pcb, p->rel_cause); + break; + case AIFG_MSG_ID_RELEASE_CMP: + p->ti_stat = CC_CLEARING; + p->rel_cause = aifg_get_cause_value(&peer_msg->msg.releaseComp.cause); + aifg_send_release_ind(p->sapid, p->upper_port, p-aifg_pcb, p->rel_cause); + break; + case AIFG_MSG_ID_EMERGENCY_SETUP: + case AIFG_MSG_ID_SETUP: + p->ti_stat = CC_CONNECTING; + //no break here + default: + peer_msg->app_port = p->upper_port; + sap[p->sapid].callback_func(AIFG_IND_RV_MSG, peer_msg); + break; + } + } + else if(p->timer == 0){ + p->rel_cause = REL_CAUSE_TIMER_EXPIRE; //protocol timeout + aifg_debug_print(p-aifg_pcb, AIFG_ERR_PORT_TIMER_OUT, NULL, p-aifg_pcb); + aifg_send_release_ind(p->sapid, p->upper_port, p-aifg_pcb, p->rel_cause); + p->ti_stat = CC_CLEARING; + } + + if (p->ti_stat != CC_WAIT_SETUP && p->ti_stat!=CC_RELEASE_CMP){ + //status changed + aifg_reset_timer(p-aifg_pcb, AIFG_TIMER_TRANS_TIMEOUT); + } + } + break; + case CC_CONNECTING: + { + if(upper_msg != NULL){ + switch(upper_msg->id){ + case AIFG_MSG_ID_CONNECT: + p->ti_stat = CC_CONNECTED; + aifg_send_dt1(p->link_id, upper_msg, p->ti); + break; + case AIFG_MSG_ID_RELEASE: + p->rel_cause = upper_msg->msg.release.cause1.cause_value; + if(upper_msg->msg.release.cause1.diag_len > 0){ + p->diag_len = upper_msg->msg.release.cause1.diag_len; + memcpy(p->diagnostic, upper_msg->msg.release.cause1.diagnostic, p->diag_len); + } + else + p->diag_len = 0; + p->ti_stat = CC_DISCONNECTING; + p->app_rel_flag = 1; + break; + default: + aifg_send_dt1(p->link_id, upper_msg, p->ti); + break; + } + aifg_reset_timer(p-aifg_pcb, AIFG_TIMER_TRANS_TIMEOUT); + } + else if(peer_msg != NULL){ + switch(peer_msg->id){ + case AIFG_MSG_ID_DISCONNECT: + p->ti_stat = CC_RELEASING; + p->rel_cause = aifg_get_cause_value(&peer_msg->msg.disconnect.cause); + aifg_send_release_ind(p->sapid, p->upper_port, p-aifg_pcb, p->rel_cause); + break; + case AIFG_MSG_ID_RELEASE: + p->ti_stat = CC_RELEASE_CMP; + p->rel_cause = aifg_get_cause_value(&peer_msg->msg.release.cause1); + aifg_send_release_ind(p->sapid, p->upper_port, p-aifg_pcb, p->rel_cause); + break; + case AIFG_MSG_ID_RELEASE_CMP: + p->ti_stat = CC_CLEARING; + p->rel_cause = aifg_get_cause_value(&peer_msg->msg.releaseComp.cause); + aifg_send_release_ind(p->sapid, p->upper_port, p-aifg_pcb, p->rel_cause); + break; + case AIFG_MSG_ID_CONNECT: + p->ti_stat = CC_CONNECTED; + //no break here + default: + peer_msg->app_port = p->upper_port; + sap[p->sapid].callback_func(AIFG_IND_RV_MSG, peer_msg); + break; + } + aifg_reset_timer(p-aifg_pcb, AIFG_TIMER_TRANS_TIMEOUT); + } + else if(p->timer == 0){ + p->rel_cause = REL_CAUSE_TIMER_EXPIRE; //protocol timeout + aifg_debug_print(p-aifg_pcb, AIFG_ERR_PORT_TIMER_OUT, NULL, p-aifg_pcb); + aifg_send_release_ind(p->sapid, p->upper_port, p-aifg_pcb, p->rel_cause); + p->ti_stat = CC_RELEASE_CMP; + } + + if (p->ti_stat!=CC_CONNECTING && p->ti_stat!=CC_RELEASE_CMP){ + //status changed + aifg_reset_timer(p-aifg_pcb, AIFG_TIMER_TRANS_TIMEOUT); + } + } + break; + case CC_CONNECTED: + { + if(upper_msg != NULL){ + if(upper_msg->id == AIFG_MSG_ID_RELEASE){ + p->rel_cause = upper_msg->msg.release.cause1.cause_value; + if(upper_msg->msg.release.cause1.diag_len > 0){ + p->diag_len = upper_msg->msg.release.cause1.diag_len; + memcpy(p->diagnostic, upper_msg->msg.release.cause1.diagnostic, p->diag_len); + } + else + p->diag_len = 0; + p->ti_stat = CC_DISCONNECTING; + p->app_rel_flag = 1; + } + else + aifg_send_dt1(p->link_id, upper_msg, p->ti); + } + else if(peer_msg != NULL){ + switch(peer_msg->id){ + case AIFG_MSG_ID_DISCONNECT: + p->ti_stat = CC_RELEASING; + p->rel_cause = aifg_get_cause_value(&peer_msg->msg.disconnect.cause); + aifg_send_release_ind(p->sapid, p->upper_port, p-aifg_pcb, p->rel_cause); + break; + case AIFG_MSG_ID_RELEASE: + p->ti_stat = CC_RELEASE_CMP; + p->rel_cause = aifg_get_cause_value(&peer_msg->msg.release.cause1); + aifg_send_release_ind(p->sapid, p->upper_port, p-aifg_pcb, p->rel_cause); + break; + case AIFG_MSG_ID_RELEASE_CMP: + p->ti_stat = CC_CLEARING; + p->rel_cause = aifg_get_cause_value(&peer_msg->msg.releaseComp.cause); + aifg_send_release_ind(p->sapid, p->upper_port, p-aifg_pcb, p->rel_cause); + break; + default: + peer_msg->app_port = p->upper_port; + sap[p->sapid].callback_func(AIFG_IND_RV_MSG, peer_msg); + break; + } + } + } + break; + case CC_DISCONNECTING: + { + memset(&sd_msg.msg.disconnect, 0 ,sizeof(sd_msg.msg.disconnect)); + sd_msg.aif_port = p - aifg_pcb; //for debug print + sd_msg.app_port = p->upper_port;//for debug print + sd_msg.pd = AIFG_PD_DTAP_CC; + sd_msg.id = AIFG_MSG_ID_DISCONNECT; + sd_msg.msg.disconnect.cause.flag = 1; + sd_msg.msg.disconnect.cause.coding_std = 3; + sd_msg.msg.disconnect.cause.location = 1; + sd_msg.msg.disconnect.cause.cause_value = p->rel_cause; + if(p->diag_len > 0) + memcpy(sd_msg.msg.disconnect.cause.diagnostic, p->diagnostic, p->diag_len); + sd_msg.msg.disconnect.cause.diag_len = p->diag_len; + aifg_send_dt1(p->link_id, &sd_msg, p->ti); + p->ti_stat = CC_WAIT_RELEASE; + aifg_reset_timer(p-aifg_pcb, AIFG_TIMER_RELEASE_TIMEOUT); + } + break; + case CC_WAIT_RELEASE: + { + if(peer_msg != NULL && peer_msg->id == AIFG_MSG_ID_RELEASE){ + p->ti_stat = CC_RELEASE_CMP; + p->timer = AIFG_TIMER_WAIT_RELEASE_CMP; + } + else if(p->timer == 0){ + p->ti_stat = CC_RELEASING; + p->rel_cause = REL_CAUSE_TIMER_EXPIRE; + } + } + break; + case CC_RELEASE_CMP: + { + if (p->timer == 0){ + memset(&sd_msg.msg.releaseCmp, 0 ,sizeof(sd_msg.msg.releaseCmp)); + sd_msg.aif_port = p - aifg_pcb; //for debug print + sd_msg.app_port = p->upper_port;//for debug print + sd_msg.pd = AIFG_PD_DTAP_CC; + sd_msg.id = AIFG_MSG_ID_RELEASE_CMP; + sd_msg.msg.releaseCmp.cause.flag = 1; + sd_msg.msg.releaseCmp.cause.coding_std = 3; + sd_msg.msg.releaseCmp.cause.location = 1; + sd_msg.msg.releaseCmp.cause.cause_value = p->rel_cause; + aifg_send_dt1(p->link_id, &sd_msg, p->ti); + p->ti_stat = CC_CLEARING; + aifg_reset_timer(p-aifg_pcb, AIFG_TIMER_WAIT_RELEASE_CMP); + } + } + break; + case CC_RELEASING: + { + memset(&sd_msg.msg.release, 0 ,sizeof(sd_msg.msg.release)); + sd_msg.aif_port = p - aifg_pcb; //for debug print + sd_msg.app_port = p->upper_port;//for debug print + sd_msg.pd = AIFG_PD_DTAP_CC; + sd_msg.id = AIFG_MSG_ID_RELEASE; + sd_msg.msg.release.cause1.flag = 1; + sd_msg.msg.release.cause1.coding_std = 3; + sd_msg.msg.release.cause1.location = 1; + sd_msg.msg.release.cause1.cause_value = p->rel_cause; + + aifg_send_dt1(p->link_id, &sd_msg, p->ti); + p->ti_stat = CC_WAIT_RELEASE_CMP; + aifg_reset_timer(p-aifg_pcb, AIFG_TIMER_RELEASE_TIMEOUT); + } + break; + case CC_WAIT_RELEASE_CMP: + { + if((peer_msg != NULL && peer_msg->id == AIFG_MSG_ID_RELEASE_CMP) || p->timer == 0){ + p->ti_stat = CC_CLEARING; + aifg_reset_timer(p-aifg_pcb, 0); + } + } + break; + case CC_CLEARING: + { + if (p->timer <= 0){ + if(aifg_del_ti(p->link_id, p->ti, TI_FOR_CC) > 0) + return AIFG_PROC_FINISH; + else{ + //send clear command + sd_msg.aif_port = p - aifg_pcb; //for debug print + sd_msg.app_port = p->upper_port;//for debug print + sd_msg.pd = AIFG_PD_BSSMAP_DEDICATED; + sd_msg.id = AIFG_MSG_ID_CLR_CMD; + sd_msg.msg.clearCmd.cause.flag = 1; + sd_msg.msg.clearCmd.cause.ext_value.flag = 0; + sd_msg.msg.clearCmd.cause.value = REL_CAUSE_CALL_CONTROL; + sd_msg.msg.clearCmd.l3HeaderInfo.flag = 0; + aifg_send_dt1(p->link_id, &sd_msg, p->ti); + + p->ti_stat = CC_WAIT_CLEAR_CMP; + p->timer = AIFG_TIMER_CLEAR_TIMEOUT; + } + } + } + break; + case CC_WAIT_CLEAR_CMP: + { + if((peer_msg != NULL && peer_msg->id == AIFG_MSG_ID_CLR_CMP) + || p->timer <= 0){ + link_info[p->link_id].cleared = 1; + return AIFG_PROC_FINISH; + } + } + break; + default: + assert(0); + return AIFG_PROC_FINISH; + break; + } + + return AIFG_PROC_CONTINUE; +} + +enum SMS_STATE{ + SMS_RP_TRANS, + SMS_RELEASING, + SMS_CLEARING, + SMS_WAIT_CLEAR_CMP, +}; +int sms_fsm(aifg_port *p, aifg_msg_t *upper_msg, aifg_msg_pre_decoded *peer_msg) +{ + if (peer_msg != NULL && peer_msg->id == AIFG_MSG_ID_CLR_REQ){ + p->rel_cause = aifg_get_cause_value(&peer_msg->msg.clearReq.cause); + aifg_send_release_ind(p->sapid, p->upper_port, p-aifg_pcb, p->rel_cause); + p->ti_stat = SMS_CLEARING; + p->timer = 0; + } + + switch(p->ti_stat){ + case SMS_RP_TRANS: + { + if (upper_msg != NULL){ + if(upper_msg->id == AIFG_MSG_ID_RELEASE){ + p->ti_stat = SMS_RELEASING; + p->app_rel_flag = 1; + } + else{ + if (upper_msg->pd == AIFG_PD_DTAP_SMS && p->ti == -1){ + //assign a new ti for the transaction + p->ti = aifg_get_ti(p->link_id, p-aifg_pcb, TI_FOR_SMS); + if(p->ti == -1){ + aifg_debug_print(p-aifg_pcb, AIFG_ERR_CAN_NOT_FIND_TI, NULL, p-aifg_pcb); + aifg_send_release_ind(p->sapid, p->upper_port, p-aifg_pcb, REL_CAUSE_PROTOCOL_ERR); + p->ti_stat = SMS_RELEASING; + + #ifdef _AIFG_DEBUG_ + assert(0); + #endif + } + } + aifg_send_dt1(p->link_id, upper_msg, p->ti); + aifg_reset_timer(p-aifg_pcb, AIFG_TIMER_TRANS_TIMEOUT); + } + } + else if(peer_msg != NULL){ + if(peer_msg->pd == AIFG_PD_DTAP_SMS && p->ti == -1){ + p->ti = peer_msg->ti; + aifg_add_ti(p->link_id, p->ti, TI_FOR_SMS, p-aifg_pcb); + } + peer_msg->app_port = p->upper_port; + sap[p->sapid].callback_func(AIFG_IND_RV_MSG, peer_msg); + aifg_reset_timer(p-aifg_pcb, AIFG_TIMER_TRANS_TIMEOUT); + } + else if(p->timer == 0){ + aifg_debug_print(p-aifg_pcb, AIFG_ERR_PORT_TIMER_OUT, NULL, p-aifg_pcb); + aifg_send_release_ind(p->sapid, p->upper_port, p-aifg_pcb, REL_CAUSE_TIMER_EXPIRE); + p->ti_stat = SMS_RELEASING; + } + } + break; + case SMS_RELEASING: + { + if(aifg_del_ti(p->link_id, p->ti, TI_FOR_SMS) == 0 + && link_info[p->link_id].cur_port == p-aifg_pcb){ + p->ti_stat = SMS_CLEARING; + p->timer = AIFG_TIMER_WAIT_RELEASE_CMP; + } + else + return AIFG_PROC_FINISH; + } + break; + case SMS_CLEARING: + { + if (p->timer == 0){ + sd_msg.aif_port = p - aifg_pcb; //for debug print + sd_msg.app_port = p->upper_port;//for debug print + sd_msg.pd = AIFG_PD_BSSMAP_DEDICATED; + sd_msg.id = AIFG_MSG_ID_CLR_CMD; + sd_msg.msg.clearCmd.cause.flag = 1; + sd_msg.msg.clearCmd.cause.ext_value.flag = 0; + sd_msg.msg.clearCmd.cause.value = REL_CAUSE_CALL_CONTROL; + sd_msg.msg.clearCmd.l3HeaderInfo.flag = 0; + aifg_send_dt1(p->link_id, &sd_msg, p->ti); + + p->ti_stat = SMS_WAIT_CLEAR_CMP; + p->timer = AIFG_TIMER_CLEAR_TIMEOUT; + } + } + break; + case SMS_WAIT_CLEAR_CMP: + { + if((peer_msg != NULL && peer_msg->id == AIFG_MSG_ID_CLR_CMP) + || p->timer <= 0){ + link_info[p->link_id].cleared = 1; + return AIFG_PROC_FINISH; + } + } + break; + default: + assert(0); + return AIFG_PROC_FINISH; + break; + } + + return AIFG_PROC_CONTINUE; +} + +enum SS_STATE{ + SS_REGISTERING, + SS_CLEARING, + SS_WAIT_CLEAR_CMP, +}; +int ss_fsm(aifg_port *p, aifg_msg_t *upper_msg, aifg_msg_pre_decoded *peer_msg) +{ + if (peer_msg != NULL && peer_msg->id == AIFG_MSG_ID_CLR_REQ){ + p->rel_cause = aifg_get_cause_value(&peer_msg->msg.clearReq.cause); + aifg_send_release_ind(p->sapid, p->upper_port, p-aifg_pcb, p->rel_cause); + + //clear request, BSC may encounter error + //send clear command without checking if there exist other transaction + sd_msg.aif_port = p - aifg_pcb; //for debug print + sd_msg.app_port = p->upper_port;//for debug print + sd_msg.pd = AIFG_PD_BSSMAP_DEDICATED; + sd_msg.id = AIFG_MSG_ID_CLR_CMD; + sd_msg.msg.clearCmd.cause.flag = 1; + sd_msg.msg.clearCmd.cause.ext_value.flag = 0; + sd_msg.msg.clearCmd.cause.value = REL_CAUSE_CALL_CONTROL; + sd_msg.msg.clearCmd.l3HeaderInfo.flag = 0; + aifg_send_dt1(p->link_id, &sd_msg, p->ti); + + p->ti_stat = SS_WAIT_CLEAR_CMP; + p->timer = AIFG_TIMER_CLEAR_TIMEOUT; + } + + switch(p->ti_stat){ + case SS_REGISTERING: + { + if(upper_msg != NULL){ + if(upper_msg->id == AIFG_MSG_ID_RELEASE_CMP_SS){ + p->ti_stat = SS_CLEARING; + p->app_rel_flag = 1; + } + aifg_send_dt1(p->link_id, upper_msg, p->ti); + } + else if(peer_msg != NULL){ + if (peer_msg->pd == AIFG_PD_DTAP_SS && p->ti == -1){ + p->ti = peer_msg->ti; + aifg_add_ti(p->link_id, p->ti, TI_FOR_SS, p-aifg_pcb); + } + peer_msg->app_port = p->upper_port; + sap[p->sapid].callback_func(AIFG_IND_RV_MSG, peer_msg); + aifg_reset_timer(p-aifg_pcb, AIFG_TIMER_TRANS_TIMEOUT); + } + else if(p->timer <= 0){ + aifg_debug_print(p-aifg_pcb, AIFG_ERR_PORT_TIMER_OUT, NULL, p-aifg_pcb); + aifg_send_release_ind(p->sapid, p->upper_port, p-aifg_pcb, REL_CAUSE_TIMER_EXPIRE); + p->ti_stat = SS_CLEARING; + } + } + break; + case SS_CLEARING: + { + if(aifg_del_ti(p->link_id, p->ti, TI_FOR_SS) > 0) + return AIFG_PROC_FINISH; + else{ + memset(&sd_msg.msg.clearCmd, 0 ,sizeof(sd_msg.msg.clearCmd)); + sd_msg.aif_port = p - aifg_pcb; //for debug print + sd_msg.app_port = p->upper_port;//for debug print + sd_msg.pd = AIFG_PD_BSSMAP_DEDICATED; + sd_msg.id = AIFG_MSG_ID_CLR_CMD; + sd_msg.msg.clearCmd.cause.flag = 1; + sd_msg.msg.clearCmd.cause.ext_value.flag = 0; + sd_msg.msg.clearCmd.cause.value = REL_CAUSE_CALL_CONTROL; + sd_msg.msg.clearCmd.l3HeaderInfo.flag = 0; + aifg_send_dt1(p->link_id, &sd_msg, p->ti); + + p->ti_stat = SS_WAIT_CLEAR_CMP; + p->timer = AIFG_TIMER_CLEAR_TIMEOUT; + } + } + break; + case SS_WAIT_CLEAR_CMP: + { + if((peer_msg != NULL && peer_msg->id == AIFG_MSG_ID_CLR_CMP) + || p->timer <= 0){ + link_info[p->link_id].cleared = 1; + return AIFG_PROC_FINISH; + } + } + break; + } + + return AIFG_PROC_CONTINUE; +} + +void aifg_port_proc(aifg_port *pPort, aifg_msg_t *upper_msg, aifg_msg_pre_decoded *peer_msg) +{ + switch(pPort->stat){ + case AIFG_PORT_INIT: //init + { + if(upper_msg != NULL){ + //the port is activate by upper app + switch(upper_msg->id){ + case AIFG_MSG_ID_PAGING: + assert(AIFG_SAP_MSC == pPort->sapid); //only MSC can send this message + pPort->stat = AIFG_PORT_PAGING; + paging_fsm(pPort, upper_msg, peer_msg); + break; + case AIFG_MSG_ID_SETUP: + pPort->ti_type = AIFG_TRANS_CC; + pPort->ti_stat = 0; + pPort->stat = AIFG_PORT_TRANSACTION; + pPort->timer = AIFG_TIMER_TRANS_TIMEOUT; + cc_fsm(pPort, upper_msg, peer_msg); + break; + case AIFG_MSG_ID_RP_DATA: + pPort->ti_type = AIFG_TRANS_SMS; + pPort->ti_stat = 0; + pPort->stat = AIFG_PORT_TRANSACTION; + pPort->timer = AIFG_TIMER_TRANS_TIMEOUT; + sms_fsm(pPort, upper_msg, peer_msg); + break; + case AIFG_MSG_ID_L3_INFO: + { + int link_id; + assert(AIFG_SAP_BSC == pPort->sapid); //only BSC can send this message + pPort->stat = AIFG_PORT_TRANSPARENT; + link_id = aifg_send_cr(pPort->sapid, pPort->cgid, upper_msg); + if(link_id < 0 || link_id > SCCP_MAX_LINK) + goto ERROR_PROC; + aifg_add_link(link_id, pPort->sapid); + pPort->link_id = link_id; + link_info[link_id].cur_port = pPort - aifg_pcb; + } + break; + default: + assert(0); + goto ERROR_PROC; + break; + } + } + else if(peer_msg != NULL){ + //the port is activate by peer app + switch(peer_msg->id){ + case AIFG_MSG_ID_RESET: + peer_msg->app_port = -1; + pPort->stat = AIFG_PORT_RESET; + break; + case AIFG_MSG_ID_L3_INFO: + peer_msg->app_port = -1; + pPort->stat = AIFG_PORT_TRANSACTION; + pPort->timer = AIFG_TIMER_TRANS_TIMEOUT; + pPort->ti = -1; + pPort->ti_stat = 0; + if(AIFG_MSG_ID_LU_REQUEST == peer_msg->msg.completeL3Info.l3msg.id) + pPort->ti_type = AIFG_TRANS_LU; + else if(AIFG_MSG_ID_IMSI_DETACH_IND == peer_msg->msg.completeL3Info.l3msg.id){ + pPort->ti_type = AIFG_TRANS_LU; + pPort->ti_stat = LU_CLEAR; + } + else if(AIFG_MSG_ID_CM_REQUEST == peer_msg->msg.completeL3Info.l3msg.id){ + switch(peer_msg->msg.completeL3Info.l3msg.msg.cmRequest.type.ptr[0] & 0x0F){ //cm service type + case 0x01: //MO Call + pPort->ti_type = AIFG_TRANS_CC; + break; + case 0x04: + pPort->ti_type = AIFG_TRANS_SMS; + break; + case 0x08: + pPort->ti_type = AIFG_TRANS_SS; + break; + default: + pPort->ti_type = AIFG_TRANS_UNKNOW; + break; + } + } + else{ + assert(0); + } + break; + case AIFG_MSG_ID_CM_REQUEST: //the app_port is set to last opened port for this message + pPort->stat = AIFG_PORT_TRANSACTION; + pPort->timer = AIFG_TIMER_TRANS_TIMEOUT; + pPort->ti = -1; + pPort->ti_stat = 0; + switch(peer_msg->msg.cmReq.type.ptr[0] & 0x0F){ //cm service type + case 0x01: //MO Call + pPort->ti_type = AIFG_TRANS_CC; + break; + case 0x04: + pPort->ti_type = AIFG_TRANS_SMS; + break; + case 0x08: + pPort->ti_type = AIFG_TRANS_SS; + break; + default: + pPort->ti_type = AIFG_TRANS_UNKNOW; + break; + } + break; + case AIFG_MSG_ID_HO_REQUEST: + peer_msg->app_port = -1; + pPort->stat = AIFG_PORT_TRANSPARENT; + break; + default: + assert(0); + //unexpected message + goto ERROR_PROC; + break; + } + rv_msg.trace_flag = 0; + sap[pPort->sapid].callback_func(AIFG_IND_RV_MSG, peer_msg); + pPort->upper_port = peer_msg->app_port; //remember new assigned app port + if (rv_msg.trace_flag == 1) + aifg_pcb[rv_msg.aif_port].trace_flag = rv_msg.trace_flag; //app may enable trace by setting rv_msg.trace_flag + } + else{ + assert(0); + goto ERROR_PROC; + } + } + break; + case AIFG_PORT_TRANSACTION: + { + switch(pPort->ti_type){ + case AIFG_TRANS_LU: + { + int ret = lu_fsm(pPort, upper_msg, peer_msg); + if(AIFG_PROC_FINISH == ret){ + pPort->stat = AIFG_PORT_FINISH; + } + else if(AIFG_ERROR == ret) + goto ERROR_PROC; + } + break; + case AIFG_TRANS_CC: + { + int ret = -1; + + /* + *when in handover state, we will first try ho_fsm + *if the ho_fsm return HO_PROCECCED, the process will end here + *else, we will continue to cc_fsm + */ + if(pPort->ho_stat != 0 || (peer_msg != NULL && peer_msg->id == AIFG_MSG_ID_HO_REQUIRED)){ + //perform handover, the ho_stat will be set to 0 when the handover is completed + if (HO_PROCECCED == ho_fsm(pPort, upper_msg, peer_msg)) + goto CC_FINISH; /*BEWARE: switch-case may break here*/ + } + + ret = cc_fsm(pPort, upper_msg, peer_msg); + if(AIFG_PROC_FINISH == ret) + pPort->stat = AIFG_PORT_FINISH; + else if(AIFG_ERROR == ret) + goto ERROR_PROC; + } + CC_FINISH: + break; + case AIFG_TRANS_SS: + { + int ret = ss_fsm(pPort, upper_msg, peer_msg); + if(AIFG_PROC_FINISH == ret) + pPort->stat = AIFG_PORT_FINISH; + else if(AIFG_ERROR == ret) + goto ERROR_PROC; + } + break; + case AIFG_TRANS_SMS: + { + int ret = sms_fsm(pPort, upper_msg, peer_msg); + if(AIFG_PROC_FINISH == ret) + pPort->stat = AIFG_PORT_FINISH; + else if(AIFG_ERROR == ret) + goto ERROR_PROC; + } + break; + case AIFG_TRANS_UNKNOW: //for paging response + { + aifg_pd tmp_pd; + if(upper_msg != NULL) + tmp_pd = upper_msg->pd; + else if(peer_msg != NULL) + tmp_pd = peer_msg->pd; + else if(pPort->timer == 0) + goto ERROR_PROC; + else + break; //case AIFG_TRANS_UNKNOW may break here + + switch(tmp_pd) + { + case AIFG_PD_DTAP_CC: + pPort->ti_type = AIFG_TRANS_CC; + cc_fsm(pPort, upper_msg, peer_msg); + break; + case AIFG_PD_DTAP_SMS: + pPort->ti_type = AIFG_TRANS_SMS; + sms_fsm(pPort, upper_msg, peer_msg); + break; + case AIFG_PD_DTAP_SS: + pPort->ti_type = AIFG_TRANS_SS; + ss_fsm(pPort, upper_msg, peer_msg); + break; + default: + if (upper_msg != NULL){ + aifg_send_dt1(pPort->link_id, upper_msg, pPort->ti); + } + else{ + peer_msg->app_port = pPort->upper_port; + sap[pPort->sapid].callback_func(AIFG_IND_RV_MSG, peer_msg); + } + break; + } + } + break; + default: + assert(0); + break; + } + } + break; + case AIFG_PORT_TRANSPARENT: + { + //transparent transfer + if(upper_msg != NULL){ + aifg_send_dt1(pPort->link_id, upper_msg, pPort->ti); + } + else if (peer_msg != NULL){ + peer_msg->app_port = pPort->upper_port; + sap[pPort->sapid].callback_func(AIFG_IND_RV_MSG, peer_msg); + } + } + break; + case AIFG_PORT_PAGING: //paging transaction + { + int ret = paging_fsm(pPort, upper_msg, peer_msg); + if(AIFG_PROC_FINISH == ret){ + //assert(NULL != p->sd_buffer); + //free(p->sd_buffer); + pPort->stat = AIFG_PORT_TRANSACTION; + pPort->timer = AIFG_TIMER_TRANS_TIMEOUT; + pPort->ti_type = AIFG_TRANS_UNKNOW; + pPort->ti_stat = 0; + aifg_reset_timer(pPort-aifg_pcb, AIFG_TIMER_TRANS_TIMEOUT); + } + else if(AIFG_ERROR == ret){ + //assert(NULL != p->sd_buffer); + //free(p->sd_buffer); + goto ERROR_PROC; + } + } + break; + case AIFG_PORT_RESET: //reset transaction + { + int ret = reset_fsm(pPort, upper_msg, peer_msg); + if(AIFG_PROC_FINISH == ret) + pPort->stat = AIFG_PORT_FINISH; + else if(AIFG_ERROR == ret) + goto ERROR_PROC; + } + break; + case AIFG_PORT_FINISH: + if(pPort->link_id != -1 +// && link_info[pPort->link_id].ti_number <= 0 + && link_info[pPort->link_id].cleared == 1) + { + aifg_link_release(pPort->link_id); + } + else{ + if(pPort->link_id != -1 && link_info[pPort->link_id].cur_port == pPort - aifg_pcb) + link_info[pPort->link_id].cur_port = -1; + aifg_port_release(pPort); + } + break; + default: + assert(0); + goto ERROR_PROC; + break; + } + + return; + +ERROR_PROC: + if(pPort->link_id != -1 + && link_info[pPort->link_id].ti_number <= 1) //only one transaction or less +// && link_info[pPort->link_id].cleared == 1) + { + aifg_link_release(pPort->link_id); + } + else{ + if(link_info[pPort->link_id].cur_port == pPort - aifg_pcb) + link_info[pPort->link_id].cur_port = -1; + aifg_port_release(pPort); + } + return; +} + +//end of FSM--------------------------------------------------------------------------------- + +/* +Purpose:assign a free port and init +Input: int sapid: SAP ID + int linkid: Link ID +Output: int: Port number, -1 if no port available +*/ +int start_pos = 0; //start position +inline int aifg_port_assign(int sapid, int cgid, int linkid) +{ + int i = start_pos; + int end_pos = start_pos - 1; + if (end_pos < 0){ + end_pos = AIFG_MAX_PORT -1 ; + } + + while(i != end_pos){ + if(aifg_pcb[i].stat == AIFG_PORT_IDLE){ + aifg_pcb[i].sapid = sapid; + aifg_pcb[i].cgid = cgid; + aifg_pcb[i].link_id = linkid; + aifg_pcb[i].upper_port = -1; //not assigned yet + aifg_pcb[i].stat = AIFG_PORT_INIT; + aifg_pcb[i].timer = 0; + aifg_pcb[i].pNextPort = aifg_pcb[i].pPrevPort = NULL; + aifg_pcb[i].ti = -1; //not assigned yet + aifg_pcb[i].ti_stat = 0; + aifg_pcb[i].ti_type = 0; + //aifg_pcb[i].sd_buffer = NULL; + + //add this port to opened port list + if(NULL == pOpenPort_h){ + //this is the first one + pOpenPort_h = &aifg_pcb[i]; + aifg_pcb[i].pNextOpenPort = NULL; + aifg_pcb[i].pPrevOpenPort = NULL; + } + else{ + //add to the head of the list + aifg_pcb[i].pNextOpenPort = pOpenPort_h; + aifg_pcb[i].pPrevOpenPort = NULL; + pOpenPort_h->pPrevOpenPort = &aifg_pcb[i]; + pOpenPort_h = &aifg_pcb[i]; + } + + //set next time start position + start_pos = i + 1; + if(start_pos >= AIFG_MAX_PORT) + start_pos = 0; + + return i; + } + if(++i >= AIFG_MAX_PORT) + i = 0; //restart from beginning + } + return -1; +} + +/* +Purpose:release a opened port +Input: int l_port: port number +Output: None +*/ +inline void aifg_port_release(aifg_port *p) +{ + if (p->stat == AIFG_PORT_IDLE) + return; + + if (p->upper_port != -1 && p->app_rel_flag == 0){ //release application if not released + aifg_send_release_ind(p->sapid, p->upper_port, p-aifg_pcb, REL_CAUSE_TEMP_FAILURE); + } + + //delete this port from the opened port list + if(NULL != p->pPrevOpenPort) + p->pPrevOpenPort->pNextOpenPort = p->pNextOpenPort; + else + pOpenPort_h = p->pNextOpenPort; + + if(NULL != p->pNextOpenPort) + p->pNextOpenPort->pPrevOpenPort = p->pPrevOpenPort; + + memset(p, 0, sizeof(*p)); + + aifg_debug_print(p-aifg_pcb, AIFG_EVENT_PORT_RELEASE, NULL, p-aifg_pcb); + + return; +} + +inline void aifg_link_release(int link_id) +{ + aifg_send_rlsd(link_id); + aifg_del_link(link_id); +} + +/* +Purpose: Get local port according to specific TI +Input: int ti: ti_value +int link_id: search port on which link +Output: int: local port number, -1 if not found +*/ +inline int aifg_ti2lport(int ti, int link_id, int pd) +{ + int ti_type; + assert(ti >=0 && ti < AIFG_MAX_TI_PER_LINK); + assert(link_id >=0 && link_id < SCCP_MAX_LINK); + + switch(pd) + { + case AIFG_PD_DTAP_CC: + ti_type = TI_FOR_CC; + break; + case AIFG_PD_DTAP_SMS: + ti_type = TI_FOR_SMS; + break; + case AIFG_PD_DTAP_SS: + ti_type = TI_FOR_SS; + break; + default: + assert(0); + } + + if(1 == link_info[link_id].ti[ti_type][ti].en_flag) + return link_info[link_id].ti[ti_type][ti].port; + + return -1; +} + +/* +Purpose:get the paging port according to the IMSI +Input: BYTE imsi_ptr: pointer to imsi buffer +Output: local port number, -1 if not found +*/ +inline int aifg_get_paging_port(int cgid, BYTE *imsi_ptr, int imsi_len) +{ + int retVal = -1; + aifg_port *pPort = pOpenPort_h; //pPagPort_h; + aifg_port *pTmpPort; + int i = 0; + + while (pPort != NULL){ + pTmpPort = pPort->pNextOpenPort; //pPort->pNextPort; + if(pPort->stat == AIFG_PORT_PAGING){ + if(memcmp(pPort->imsi, imsi_ptr, imsi_len) == 0){ + if (pPort->cgid == cgid){ + retVal = pPort-aifg_pcb; + // aifg_del_paging_port(pPort); + } + else{ + pPort->app_rel_flag = 1; + // aifg_del_paging_port(pPort); + aifg_port_release(pPort); + } + } + } + pPort = pTmpPort; + + if(++i > AIFG_MAX_PORT){ //for protection + break; + } + } + + return retVal; +} + +inline void aifg_add_paging_port(aifg_port *p) +{ + p->pPrevPort = NULL; + p->pNextPort = NULL; + + if (NULL == pPagPort_t){ + assert(pPagPort_h == NULL); //pointer to head should also be NULL + pPagPort_h = p; + pPagPort_t = p; + } + else{ + p->pPrevPort = pPagPort_t; + pPagPort_t->pNextPort = p; + pPagPort_t = p; + } + paging_port_count++; +} + +inline void aifg_del_paging_port(aifg_port *p) +{ + if(pPagPort_h == p) + pPagPort_h = p->pNextPort; //update list head + if(pPagPort_t == p) + pPagPort_t = p->pPrevPort; //update list tail + + if (p->pPrevPort != NULL){ + p->pPrevPort->pNextPort = p->pNextPort; + } + if (p->pNextPort != NULL){ + p->pNextPort->pPrevPort = p->pPrevPort; + } + p->pNextPort = NULL; + p->pPrevPort = NULL; + paging_port_count--; +} +//Circuit group & link management functions------------------------------------- +inline int aifg_get_cg(int dpc, int ni) +{ + int i = 0; + + while(i < AIFG_MAX_CG){ + if(cg[i].enable == 1 && cg[i].dpc == dpc && cg[i].ni == ni) + return i; + i++; + } + return -1; +} + +/* +Purpose: Get SCCP link info from its ID +Input: int sccp_link_id: ID of the connection +Output: aifg_link_info: SCCP link structure pointer +*/ +inline aifg_link_info *aifg_get_link_info(int linkid) +{ + assert(linkid < SCCP_MAX_LINK); + assert(link_info[linkid].en_flag == 1); + return &link_info[linkid]; +} + +/* +Purpose: Add a sccp link object to the link pool +Input: int linkid:ID of the link, assigned by SCCP module + int sapid: which sap manage this link + int status: next message is CC or DT1 +Output: int: result +*/ +inline int aifg_add_link(int linkid, int sapid) +{ + link_info[linkid].en_flag = 1; + link_info[linkid].ti_number = 0; + link_info[linkid].sapid = sapid; + link_info[linkid].cur_port = -1; + + return AIFG_SUCCEED; +} + +/* +Purpose: Delete specific connection from pool +Input: int sccp_link_id: ID of the connection +Output: int: result +*/ +inline int aifg_del_link(int link_id) +{ + int i = 0; + assert(link_id < SCCP_MAX_LINK); + + if(link_id > SCCP_MAX_LINK) + return AIFG_ERROR; + + //release ports belongs to this link, if any + while(link_info[link_id].ti_number > 0){ + if (1 == link_info[link_id].ti[TI_FOR_CC][i].en_flag){ + link_info[link_id].ti_number--; + aifg_port_release(&aifg_pcb[link_info[link_id].ti[TI_FOR_CC][i].port]); + } + if (1 == link_info[link_id].ti[TI_FOR_SMS][i].en_flag){ + link_info[link_id].ti_number--; + aifg_port_release(&aifg_pcb[link_info[link_id].ti[TI_FOR_SMS][i].port]); + } + if (1 == link_info[link_id].ti[TI_FOR_SS][i].en_flag){ + link_info[link_id].ti_number--; + aifg_port_release(&aifg_pcb[link_info[link_id].ti[TI_FOR_SS][i].port]); + } + + if (++i > AIFG_MAX_TI_PER_LINK) + break; + } + if(aifg_pcb[link_info[link_id].cur_port].ho_stat == 0) + aifg_port_release(&aifg_pcb[link_info[link_id].cur_port]); + + memset(&link_info[link_id], 0, sizeof(aifg_link_info)); + + return AIFG_SUCCEED; +} +//end of Circuit group & link management functions--------------------------------- + +//TI management function definition----------------------------------------------------- +/* +Purpose: get a new free TI of a link and add it +Input: int link_id: link ID + int port:port number of upper layer +Output: int: new assigned TI, -1 if not found +*/ +inline int aifg_get_ti(int link_id, int port, int ti_type) +{ + int i; + + assert(link_id < SCCP_MAX_LINK); + + for(i=0; i < 7; i++){ + if (0 == link_info[link_id].ti[ti_type][i].en_flag){ + aifg_add_ti(link_id, i, ti_type, port); + return i; + } + } + return -1; +} + +/* +Purpose: Add a new TI for a existed SCCP link +Input: int link_id: link ID of the TI + int ti: TI value + int port: port number of upper layer +Output: None +*/ +inline void aifg_add_ti(int link_id, int ti, int ti_type, int port) +{ + assert(ti <= AIFG_MAX_TI_PER_LINK); + assert(link_id < SCCP_MAX_LINK); + assert(ti_type < 3); + assert(link_info[link_id].ti[ti_type][ti].en_flag != 1); + + link_info[link_id].ti[ti_type][ti].en_flag = 1; + link_info[link_id].ti[ti_type][ti].port = port; + link_info[link_id].ti_number++; + + return; +} + +/* +Purpose: Delete a terminated TI +Input: int link_id: link ID of the TI + int ti: TI value + int ti_type: could be 1 of the 3: TI_FOR_CC, TI_FOR_SMS, TI_FOR_SS +Output: int: remaining TI number +*/ +inline int aifg_del_ti(int link_id, int ti, int ti_type) +{ + assert(ti <= AIFG_MAX_TI_PER_LINK); + assert(link_id < SCCP_MAX_LINK); + assert(ti_type < 3); + + if (ti >= 0 && link_info[link_id].ti[ti_type][ti].en_flag > 0){ + link_info[link_id].ti[ti_type][ti].en_flag = 0; + link_info[link_id].ti_number--; + } + + return link_info[link_id].ti_number; +} +//end of TI management function definition---------------------------------------------- + diff --git a/omc/plat/aif/src/aifg_mpp.c b/omc/plat/aif/src/aifg_mpp.c new file mode 100644 index 0000000..2dd4326 --- /dev/null +++ b/omc/plat/aif/src/aifg_mpp.c @@ -0,0 +1,7614 @@ +/******************************************************************** +Copyright ?2007 LGC Wireless, Inc. All rights reserved +File Name: aifg_mpp.c +Description: Message process part of AIFG module +Version: v9.0.0 +Author: Roy Jiang +Create Date: 2007-3-19 + +History: +2007-3-19 v9.0.0 Create +2007-7-1 v9.0.1 Apply new port process mechanism +*********************************************************************/ +#include "./include/aifg_msg.h" +#include "./include/aifg_var_ext.h" + +extern int msc_check_timeslot_avail(int tg_id); + +//global message structure definition +aifg_msg_t sd_msg; +aifg_msg_pre_decoded rv_msg; +SP_UiPriPara sccp_msg; + +int (*aifg_msg_rv_func_ptr[AIFG_MAX_MESSAGE])( + BYTE *src, + aifg_msg_pre_decoded *dst, + BYTE msg_len); +int (*aifg_msg_sd_func_ptr[AIFG_MAX_MESSAGE])( + aifg_msg_t *src, + BYTE *dst); + +enum{ + AIFG_PORT_NOT_NEED = -1, + UPPER_PROC = -1, + LOCAL_PROC = -2, +}; + +int aifg_check_timeslot_avail(int tg_id) +{ + return msc_check_timeslot_avail(tg_id); +} +//Message process function definition---------------------------------------------- +/* +Purpose:Convert protocol message type ot local message id +Input: int msg_type: protocol message type +Output: int: local message id +*/ +int aifg_msgtype_to_localid(aifg_pd pd, int msg_type) +{ + aifg_msg_protocol protocol = AIFG_MSG_BSSMAP; + + if (pd < AIFG_PD_BSSMAP_GLOBAL) + protocol = AIFG_MSG_DTAP; + + if(AIFG_MSG_DTAP == protocol){ + msg_type = msg_type & 0x3F; + switch(pd){ + case AIFG_PD_DTAP_MM: + switch(msg_type){ + //MM messages + case AIFG_MSG_T_IMSI_DETACH_IND: + return AIFG_MSG_ID_IMSI_DETACH_IND; + break; + case AIFG_MSG_T_LU_ACCEPT: + return AIFG_MSG_ID_LU_ACCEPT; + break; + case AIFG_MSG_T_LU_REQUEST: + return AIFG_MSG_ID_LU_REQUEST; + break; + case AIFG_MSG_T_AUTH_REQUEST: + return AIFG_MSG_ID_AUTH_REQUEST; + break; + case AIFG_MSG_T_AUTH_RESPONSE: + return AIFG_MSG_ID_AUTH_RESPONSE; + break; + case AIFG_MSG_T_CM_REEST_REQUEST: + return AIFG_MSG_ID_CM_REEST_REQUEST; + break; + case AIFG_MSG_T_LU_REJECT: + return AIFG_MSG_ID_LU_REJECT; + break; + case AIFG_MSG_T_CM_REJECT: + return AIFG_MSG_ID_CM_REJECT; + break; + case AIFG_MSG_T_ABORT: + return AIFG_MSG_ID_ABORT; + break; + case AIFG_MSG_T_MM_STATUS: + return AIFG_MSG_ID_MM_STATUS; + break; + case AIFG_MSG_T_CM_REQUEST: + return AIFG_MSG_ID_CM_REQUEST; + break; + case AIFG_MSG_T_ID_REQUEST: + return AIFG_MSG_ID_ID_REQUEST; + break; + case AIFG_MSG_T_ID_RESPONSE: + return AIFG_MSG_ID_ID_RESPONSE; + break; + case AIFG_MSG_T_TMSI_REALLOC_CMD: + return AIFG_MSG_ID_TMSI_REALLOC_CMD; + break; + case AIFG_MSG_T_AUTH_REJECT: + return AIFG_MSG_ID_AUTH_REJECT; + break; + case AIFG_MSG_T_CM_ACCEPT: + return AIFG_MSG_ID_CM_ACCEPT; + break; + case AIFG_MSG_T_CM_ABORT: + return AIFG_MSG_ID_CM_ABORT; + break; + case AIFG_MSG_T_TMSI_REALLOC_CMP: + return AIFG_MSG_ID_TMSI_REALLOC_CMP; + break; + case AIFG_MSG_T_MM_NULL: + return AIFG_MSG_ID_MM_NULL; + break; + case AIFG_MSG_T_MM_INFO: + return AIFG_MSG_ID_MM_INFO; + break; + default: + break; + } + break; + case AIFG_PD_DTAP_CC: //CC + switch(msg_type){ + case AIFG_MSG_T_PROGRESS: + return AIFG_MSG_ID_PROGRESS; + break; + case AIFG_MSG_T_MODIFY: + return AIFG_MSG_ID_MODIFY; + break; + case AIFG_MSG_T_MODIFY_CMP: + return AIFG_MSG_ID_MODIFY_CMP; + break; + case AIFG_MSG_T_MODIFY_REJECT: + return AIFG_MSG_ID_MODIFY_REJECT; + break; + case AIFG_MSG_T_USER_INFO: + return AIFG_MSG_ID_USER_INFO; + break; + case AIFG_MSG_T_DISCONNECT: + return AIFG_MSG_ID_DISCONNECT; + break; + case AIFG_MSG_T_HOLD_REJECT: + return AIFG_MSG_ID_HOLD_REJECT; + break; + case AIFG_MSG_T_RETRIEVE_REJECT: + return AIFG_MSG_ID_RETRIEVE_REJECT; + break; + case AIFG_MSG_T_START_DTMF_REJECT: + return AIFG_MSG_ID_START_DTMF_REJECT; + break; + case AIFG_MSG_T_FACILITY: + return AIFG_MSG_ID_FACILITY; + break; + case AIFG_MSG_T_CONGESTION_CTRL: + return AIFG_MSG_ID_CONGESTION_CTRL; + break; + case AIFG_MSG_T_NOTIFY: + return AIFG_MSG_ID_NOTIFY; + break; + case AIFG_MSG_T_START_DTMF: + return AIFG_MSG_ID_START_DTMF; + break; + case AIFG_MSG_T_START_DTMF_ACK: + return AIFG_MSG_ID_START_DTMF_ACK; + break; + case AIFG_MSG_T_STATUS: + return AIFG_MSG_ID_STATUS; + break; + case AIFG_MSG_T_ALERTING: + return AIFG_MSG_ID_ALERTING; + break; + case AIFG_MSG_T_CALL_CONFIRMED: + return AIFG_MSG_ID_CALL_CONFIRMED; + break; + case AIFG_MSG_T_CALL_PROCEEDING: + return AIFG_MSG_ID_CALL_PROCEEDING; + break; + case AIFG_MSG_T_CONNECT: + return AIFG_MSG_ID_CONNECT; + break; + case AIFG_MSG_T_EMERGENCY_SETUP: + return AIFG_MSG_ID_EMERGENCY_SETUP; + break; + case AIFG_MSG_T_RELEASE: + return AIFG_MSG_ID_RELEASE; + break; + case AIFG_MSG_T_RELEASE_CMP: + return AIFG_MSG_ID_RELEASE_CMP; + break; + case AIFG_MSG_T_SETUP: + return AIFG_MSG_ID_SETUP; + break; + case AIFG_MSG_T_CONNECT_ACK: + return AIFG_MSG_ID_CONNECT_ACK; + break; + case AIFG_MSG_T_HOLD: + return AIFG_MSG_ID_HOLD; + break; + case AIFG_MSG_T_HOLD_ACK: + return AIFG_MSG_ID_HOLD_ACK; + break; + case AIFG_MSG_T_RETRIEVE: + return AIFG_MSG_ID_RETRIEVE; + break; + case AIFG_MSG_T_RETRIEVE_ACK: + return AIFG_MSG_ID_RETRIEVE_ACK; + break; + case AIFG_MSG_T_STATUS_ENQ: + return AIFG_MSG_ID_STATUS_ENQ; + break; + case AIFG_MSG_T_STOP_DTMF: + return AIFG_MSG_ID_STOP_DTMF; + break; + case AIFG_MSG_T_STOP_DTMF_ACK: + return AIFG_MSG_ID_STOP_DTMF_ACK; + break; + default: + break; + } + break; + case AIFG_PD_DTAP_SMS: //SMS messages + switch(msg_type){ + case AIFG_MSG_T_RP_DATA_NW: + case AIFG_MSG_T_RP_DATA_MS: + return AIFG_MSG_ID_RP_DATA; + break; + case AIFG_MSG_T_RP_ACK_NW: + case AIFG_MSG_T_RP_ACK_MS: + return AIFG_MSG_ID_RP_ACK; + break; + case AIFG_MSG_T_RP_ERROR_NW: + case AIFG_MSG_T_RP_ERROR_MS: + return AIFG_MSG_ID_RP_ERROR; + break; + case AIFG_MSG_T_RP_SMMA: + return AIFG_MSG_ID_RP_SMMA; + break; + default: + break; + } + break; + case AIFG_PD_DTAP_SS: //SS messages + switch(msg_type){ + case AIFG_MSG_T_FACILITY_SS: + return AIFG_MSG_ID_FACILITY_SS; + break; + case AIFG_MSG_T_REGISTER: + return AIFG_MSG_ID_REGISTER; + break; + case AIFG_MSG_T_RELEASE_CMP_SS: + return AIFG_MSG_ID_RELEASE_CMP_SS; + break; + default: + break; + } + break; + default: + break; + } + } + else if(AIFG_MSG_BSSMAP == protocol){ + switch(msg_type){ + case AIFG_MSG_T_ASSIGN_REQ: + return AIFG_MSG_ID_ASSIGN_REQ; + case AIFG_MSG_T_ASSIGN_CMP: + return AIFG_MSG_ID_ASSIGN_CMP; + break; + case AIFG_MSG_T_ASSIGN_FAIL: + return AIFG_MSG_ID_ASSIGN_FAIL; + break; + case AIFG_MSG_T_BLOCK: + return AIFG_MSG_ID_BLOCK; + break; + case AIFG_MSG_T_BLOCK_ACK: + return AIFG_MSG_ID_BLOCK_ACK; + break; + case AIFG_MSG_T_UNBLOCK: + return AIFG_MSG_ID_UNBLOCK; + break; + case AIFG_MSG_T_UNBLOCK_ACK: + return AIFG_MSG_ID_UNBLOCK_ACK; + break; + case AIFG_MSG_T_HO_REQUEST: + return AIFG_MSG_ID_HO_REQUEST; + break; + case AIFG_MSG_T_HO_REQUIRED: + return AIFG_MSG_ID_HO_REQUIRED; + break; + case AIFG_MSG_T_HO_REQ_ACK: + return AIFG_MSG_ID_HO_REQ_ACK; + break; + case AIFG_MSG_T_HO_CMD: + return AIFG_MSG_ID_HO_CMD; + break; + case AIFG_MSG_T_HO_CMP: + return AIFG_MSG_ID_HO_CMP; + break; + case AIFG_MSG_T_HO_SUC: + return AIFG_MSG_ID_HO_SUC; + break; + case AIFG_MSG_T_HO_CAN_ENQ: + return AIFG_MSG_ID_HO_CAN_ENQ; + break; + case AIFG_MSG_T_HO_CAN_RESP: + return AIFG_MSG_ID_HO_CAN_RESP; + break; + case AIFG_MSG_T_HO_FAIL: + return AIFG_MSG_ID_HO_FAIL; + break; + case AIFG_MSG_T_RESRC_REQ: + return AIFG_MSG_ID_RESRC_REQ; + break; + case AIFG_MSG_T_RESRC_IND: + return AIFG_MSG_ID_RESRC_IND; + break; + case AIFG_MSG_T_PAGING: + return AIFG_MSG_ID_PAGING; + break; + case AIFG_MSG_T_CLR_REQ: + return AIFG_MSG_ID_CLR_REQ; + break; + case AIFG_MSG_T_CLR_CMD: + return AIFG_MSG_ID_CLR_CMD; + break; + case AIFG_MSG_T_CLR_CMP: + return AIFG_MSG_ID_CLR_CMP; + break; + case AIFG_MSG_T_RESET: + return AIFG_MSG_ID_RESET; + break; + case AIFG_MSG_T_RESET_ACK: + return AIFG_MSG_ID_RESET_ACK; + break; + case AIFG_MSG_T_HO_PERFORMED: + return AIFG_MSG_ID_HO_PERFORMED; + break; + case AIFG_MSG_T_OVERLOAD: + return AIFG_MSG_ID_OVERLOAD; + break; + case AIFG_MSG_T_MSC_INVK_TRACE: + return AIFG_MSG_ID_MSC_INVK_TRACE; + break; + case AIFG_MSG_T_BSC_INVK_TRACE: + return AIFG_MSG_ID_BSC_INVK_TRACE; + break; + case AIFG_MSG_T_CM_UPDATE: + return AIFG_MSG_ID_CM_UPDATE; + break;case AIFG_MSG_T_CIPHER_MODE_CMD: + return AIFG_MSG_ID_CIPHER_MODE_CMD; + break; + case AIFG_MSG_T_CIPHER_MODE_CMP: + return AIFG_MSG_ID_CIPHER_MODE_CMP; + break; + case AIFG_MSG_T_L3_INFO: + return AIFG_MSG_ID_L3_INFO; + break; + case AIFG_MSG_T_QUEUE_IND: + return AIFG_MSG_ID_QUEUE_IND; + break; + case AIFG_MSG_T_SAPI_REJ: + return AIFG_MSG_ID_SAPI_REJ; + break; + case AIFG_MSG_T_HO_REQ_REJ: + return AIFG_MSG_ID_HO_REQ_REJ; + break; + case AIFG_MSG_T_RESET_CC: + return AIFG_MSG_ID_RESET_CC; + break; + case AIFG_MSG_T_RESET_CC_ACK: + return AIFG_MSG_ID_RESET_CC_ACK; + break; + case AIFG_MSG_T_HO_DETECT: + return AIFG_MSG_ID_HO_DETECT; + break; + case AIFG_MSG_T_CC_GROUP_BLK: + return AIFG_MSG_ID_CC_GROUP_BLK; + break; + case AIFG_MSG_T_CC_GROUP_BLK_ACK: + return AIFG_MSG_ID_CC_GROUP_BLK_ACK; + break; + case AIFG_MSG_T_CC_GROUP_UNBLK: + return AIFG_MSG_ID_CC_GROUP_UNBLK; + break; + case AIFG_MSG_T_CC_GROUP_UNBLK_ACK: + return AIFG_MSG_ID_CC_GROUP_UNBLK_ACK; + break; + case AIFG_MSG_T_CONFUSION: + return AIFG_MSG_ID_CONFUSION; + break; + case AIFG_MSG_T_CM_REQUEST: + return AIFG_MSG_ID_CM_REQUEST; + break; + case AIFG_MSG_T_UNEQUIP_CC: + return AIFG_MSG_ID_UNEQUIP_CC; + break; + case AIFG_MSG_T_CIPHER_MODE_REJ: + return AIFG_MSG_ID_CIPHER_MODE_REJ; + break; + case AIFG_MSG_T_LOAD_IND: + return AIFG_MSG_ID_LOAD_IND; + break; + case AIFG_MSG_T_SUSPEND: + return AIFG_MSG_ID_SUSPEND; + break; + case AIFG_MSG_T_RESUME: + return AIFG_MSG_ID_RESUME; + break; + case AIFG_MSG_T_CHANGE_CC: + return AIFG_MSG_ID_CHANGE_CC; + break; + case AIFG_MSG_T_CHANGE_CC_ACK: + return AIFG_MSG_ID_CHANGE_CC_ACK; + break; + //case AIFG_MSG_T_LSA_INFO: + // return AIFG_MSG_ID_LSA_INFO; + //break; + case AIFG_MSG_T_LOC_INFO_CMD: + return AIFG_MSG_ID_LOC_INFO_CMD; + break; + case AIFG_MSG_T_LOC_INFO_RPT: + return AIFG_MSG_ID_LOC_INFO_RPT; + break; + default: + break; + } + } + + aifg_event = AIFG_ERR_UNKNOW_MSG; + return AIFG_ERROR; +} + +/* +Name: aifg_msg_proc +Purpose:Process received AIF message +Input: aifg_msg *src: Pointer to first byte of raw message +aifg_msg_pre_decoded *dst: target message structure +int sapid: SAP ID +Output: result +*/ +int aifg_msg_proc(BYTE *src, aifg_msg_pre_decoded *dst) +{ + int msg_len = 0, offset = 0; + int pd, ti; + aifg_msg_protocol protocol; + aifg_msg_type msg_type; + aifg_msg_id msg_id; + + assert(src != NULL); + assert(dst != NULL); + + memset(&dst->msg, 0, sizeof(dst->msg)); + + if ((protocol = src[0]) == 2){ + protocol = 0; //protocol=2, redirected BSSMAP message + } + + switch(protocol){ + case AIFG_MSG_DTAP: + msg_len = src[2] - 2; //skip pd/ti and msg type + pd = src[3] & 0x0F; + if(AIFG_PD_DTAP_MM != pd){ + ti = src[3] >> 4; + if(ti >= 8) + ti = ti & 0x07; //set ti flag to assigned by local + else + ti = ti | 0x08; //set ti flag to assigned by remote + } + else + ti = -1; //ti not present + + if(AIFG_PD_DTAP_SMS == pd){ + //get RP type + msg_type = src[4]; + msg_len = src[5]; + if(msg_type == AIFG_MSG_T_CP_DATA) + msg_id = aifg_msgtype_to_localid(pd, src[6]); + else{ + dst->id = AIFG_MSG_ID_IGNORED_MSG; //ignore CP-ACK, CP-ERROR + goto FINISH; + } + offset += 7; + } + else{ + msg_id = aifg_msgtype_to_localid(pd, src[4]); + offset += 5; + } + + if(AIFG_ERROR == msg_id) + goto ERR_PROC; + + break; + case AIFG_MSG_BSSMAP: + msg_len = src[1] - 1; //skip msg type + msg_id = aifg_msgtype_to_localid(AIFG_PD_BSSMAP_GLOBAL, src[2]); + if(AIFG_ERROR == msg_id) + goto ERR_PROC; + + if(msg_id <= AIFG_MSG_ID_HO_CAN_RESP) + pd = AIFG_PD_BSSMAP_GLOBAL; + else + pd = AIFG_PD_BSSMAP_DEDICATED; + + ti = -1; + offset += 3; + break; + default: + //Unknown message, ignore + aifg_debug_print(-1, AIFG_ERR_UNKNOW_MSG, NULL, 0); + goto ERR_PROC; + break; + } + if (msg_len < 0 || msg_len >= 256) + goto ERR_PROC; + + dst->id = msg_id; + dst->ti = ti; + dst->pd = pd; + + //predecode message + if(NULL != aifg_msg_rv_func_ptr[msg_id]){ + if(AIFG_SUCCEED != (aifg_msg_rv_func_ptr[msg_id])(&(src[offset]), dst, msg_len)){ + aifg_debug_print(-1, AIFG_ERR_ERROR_MSG, NULL, 0); + goto ERR_PROC; + } + } + +FINISH: + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +void aifg_msg_redirect(SP_UiPriPara *msg) +{ + BYTE *pdata = NULL; + + if(AIFG_RUN_MODE_SINGLE == dual_server.mode) + return; + + if (msg->uUiPri == N_UNITDATA_IND) + pdata = msg->tPriUnion.tPriNUDataInd.tUD.aUserData; + else + pdata = msg->tPriUnion.tPriNConnInd.tUD.aUserData; + + if (pdata[0] == 0x02){ + return; //already redirected, discard + } + + aifg_debug_print(-1, AIFG_EVENT_REDIR_MSG, msg, 0); + pdata[0] = 0x02; //WXC2 system private BSSAP msg type, used for msg redirect + PostSp(msg); +} +//End of message process function definition----------------------------------------- + + + +//RV message process functions definition---------------------------------------------- +/* +Remark for all message encode functions +Input: BYTE *src: raw code of message to be processed +aifg_msg_pre_decoded *dst: target struct where the decoded information to be stored in +Output: int - result AIFG_SUCCEED / AIFG_ERROR, detailed info stored in aifg_event +*/ +//For embedded DTAP messages in BSSMAP message +int aifg_msg_decode_embeded_l3msg(BYTE *src, aifg_msg_predecode_l3msg *l3msg) +{ + int offset = 1; + + switch(src[offset++]){ //message type + case AIFG_MSG_T_CM_REQUEST: + l3msg->id = AIFG_MSG_ID_CM_REQUEST; + memset(&(l3msg->msg.cmRequest), 0, sizeof(l3msg->msg.cmRequest)); + + //CM service type + l3msg->msg.cmRequest.type.iei = AIFG_IE_ID_DT_CMTYPE; + l3msg->msg.cmRequest.type.ptr = src + offset; + l3msg->msg.cmRequest.type.hi_lo_flag = AIFG_LOW_BITS; + + //Ciphering key sequence number - M + l3msg->msg.cmRequest.cipherKeySeq.iei = AIFG_IE_ID_DT_CIPHERKEY; + l3msg->msg.cmRequest.cipherKeySeq.ptr = src + offset; + l3msg->msg.cmRequest.cipherKeySeq.hi_lo_flag = AIFG_HIGH_BITS; + offset++; + + //Mobile station classmark 2 - M + l3msg->msg.cmRequest.cm2.iei = AIFG_IE_ID_DT_MSCM2; + l3msg->msg.cmRequest.cm2.ptr = src + offset; + offset += src[offset] + 1; + + //Mobile identity - M + l3msg->msg.cmRequest.mobileId.iei = AIFG_IE_ID_DT_MOBILEID; + l3msg->msg.cmRequest.mobileId.ptr = src + offset; + offset += src[offset] + 1; + + //Priority + if((src[offset]&0xF0) == AIFG_IEI_DT_PRIORITYLEVEL){ + l3msg->msg.cmRequest.priority.iei = AIFG_IE_ID_DT_PRIORITYLEVEL; + l3msg->msg.cmRequest.priority.ptr = src + offset; + } + break; + + case AIFG_MSG_T_LU_REQUEST: + l3msg->id = AIFG_MSG_ID_LU_REQUEST; + memset(&(l3msg->msg.luRequest), 0, sizeof(l3msg->msg.luRequest)); + + //Location updating type - M + l3msg->msg.luRequest.type.iei = AIFG_IE_ID_DT_LUTYPE; + l3msg->msg.luRequest.type.ptr = src + offset; + l3msg->msg.luRequest.type.hi_lo_flag = AIFG_LOW_BITS; + + //Ciphering key sequence number - M + l3msg->msg.luRequest.cipherKeySeq.iei = AIFG_IE_ID_DT_CIPHERKEY; + l3msg->msg.luRequest.cipherKeySeq.ptr = src + offset; + l3msg->msg.luRequest.cipherKeySeq.hi_lo_flag = AIFG_HIGH_BITS; + offset++; + + //Location area identification - M + l3msg->msg.luRequest.lai.iei = AIFG_IE_ID_DT_LAI; + l3msg->msg.luRequest.lai.ptr = src + offset; + offset += 5; + + //Mobile station classmark 1 - M + l3msg->msg.luRequest.cm1.iei = AIFG_IE_ID_DT_MSCM1; + l3msg->msg.luRequest.cm1.ptr = src + offset; + offset++; + + //Mobile identity - M + l3msg->msg.luRequest.mobileId.iei = AIFG_IE_ID_DT_MOBILEID; + l3msg->msg.luRequest.mobileId.ptr = src + offset; + break; + + case AIFG_MSG_T_CM_REEST_REQUEST: + l3msg->id = AIFG_MSG_ID_CM_REEST_REQUEST; + memset(&(l3msg->msg.cmReEstReq), 0, sizeof(l3msg->msg.cmReEstReq)); + + //Ciphering key sequence number - M + l3msg->msg.cmReEstReq.cipherKeySeq.iei = AIFG_IE_ID_DT_CIPHERKEY; + l3msg->msg.cmReEstReq.cipherKeySeq.ptr = src + offset; + l3msg->msg.cmReEstReq.cipherKeySeq.hi_lo_flag = AIFG_LOW_BITS; + offset++; + + //Mobile station classmark 2 - M + l3msg->msg.cmReEstReq.cm2.iei = AIFG_IE_ID_DT_MSCM2; + l3msg->msg.cmReEstReq.cm2.ptr = src + offset; + offset += src[offset] + 1; + + //Mobile identity - M + l3msg->msg.cmReEstReq.mobileId.iei = AIFG_IE_ID_DT_MOBILEID; + l3msg->msg.cmReEstReq.mobileId.ptr = src + offset; + offset += src[offset] + 1; + + //Location area identification + if(src[offset] == AIFG_IEI_DT_LAI){ + offset++; //skip iei + l3msg->msg.cmReEstReq.lai.iei = AIFG_IE_ID_DT_LAI; + l3msg->msg.cmReEstReq.lai.ptr = src + offset; + } + break; + + case AIFG_MSG_T_PAGING_RESP: + l3msg->id = AIFG_MSG_ID_PAGING_RESP; + memset(&(l3msg->msg.pagingResp), 0, sizeof(l3msg->msg.pagingResp)); + + //Ciphering key sequence number - M + l3msg->msg.pagingResp.cipherKeySeq.iei = AIFG_IE_ID_DT_CIPHERKEY; + l3msg->msg.pagingResp.cipherKeySeq.ptr = src+offset; + l3msg->msg.pagingResp.cipherKeySeq.hi_lo_flag = AIFG_LOW_BITS; + offset++; + + //Mobile station classmark 2 - M + l3msg->msg.pagingResp.cm2.iei = AIFG_IE_ID_DT_MSCM2; + l3msg->msg.pagingResp.cm2.ptr = src + offset; + offset += src[offset] + 1; + + //Mobile identity - M + l3msg->msg.pagingResp.mobileId.iei = AIFG_IE_ID_DT_MOBILEID; + l3msg->msg.pagingResp.mobileId.ptr = src + offset; + offset += src[offset] + 1; + break; + + case AIFG_MSG_T_IMSI_DETACH_IND: + l3msg->id = AIFG_MSG_ID_IMSI_DETACH_IND; + memset(&(l3msg->msg.imsiDetachInd), 0, sizeof(l3msg->msg.imsiDetachInd)); + + //Mobile station classmark 1 - M + l3msg->msg.imsiDetachInd.cm1.iei = AIFG_IE_ID_DT_MSCM1; + l3msg->msg.imsiDetachInd.cm1.ptr = src + offset; + offset++; + + //Mobile identity - M + l3msg->msg.imsiDetachInd.mobileId.iei = AIFG_IE_ID_DT_MOBILEID; + l3msg->msg.imsiDetachInd.mobileId.ptr = src + offset; + break; + + case AIFG_MSG_T_RR_HO_CMD: + //TODO + break; + + default: + aifg_event = AIFG_ERR_ERROR_MSG; + goto ERR_PROC; + break; + } + + return AIFG_SUCCEED; + +ERR_PROC: + return AIFG_ERROR; +} + +//For assign request +int aifg_msg_rv_assignReq(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.assignReq), 0, sizeof(dst->msg.assignReq)); + + //channal type - M + if(src[offset] != AIFG_IEI_BM_CHANNELTYPE) + goto ERR_PROC; + offset++; + dst->msg.assignReq.channelType.iei = AIFG_IE_ID_BM_CHANNELTYPE; + dst->msg.assignReq.channelType.ptr = src+offset; + offset += src[offset] + 1; + + if(offset >= msg_len) goto FINISH; + + //L3 header information + if(src[offset] == AIFG_IEI_BM_L3HEADERINFO){ + offset++; + dst->msg.assignReq.l3HeaderInfo.iei = AIFG_IE_ID_BM_L3HEADERINFO; + dst->msg.assignReq.l3HeaderInfo.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //priority + if(src[offset] == AIFG_IEI_BM_PRIORITY){ + offset++; + dst->msg.assignReq.priority.iei = AIFG_IE_ID_BM_PRIORITY; + dst->msg.assignReq.priority.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //CIC + if(src[offset] == AIFG_IEI_BM_CIC){ + offset++; + dst->msg.assignReq.cic.iei = AIFG_IE_ID_BM_CIC; + dst->msg.assignReq.cic.ptr = src+offset; + offset += 2; + if(offset >= msg_len) goto FINISH; + } + + //DTX flag + if(src[offset] == AIFG_IEI_BM_DTXFLAG){ + offset++; + dst->msg.assignReq.dtxFlag.iei = AIFG_IE_ID_BM_DTXFLAG; + dst->msg.assignReq.dtxFlag.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Interference Band To Be Used + if(src[offset] == AIFG_IEI_BM_BANDUSED){ + offset++; + dst->msg.assignReq.bandUsed.iei = AIFG_IE_ID_BM_BANDUSED; + dst->msg.assignReq.bandUsed.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Classmark Information 2 + if(src[offset] == AIFG_IEI_BM_CLASSMARKINFO2){ + offset++; + dst->msg.assignReq.cmInfo2.iei = AIFG_IE_ID_BM_CLASSMARKINFO2; + dst->msg.assignReq.cmInfo2.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Group Call Reference + if(src[offset] == AIFG_IEI_BM_GROUPCALLREF){ + offset++; + dst->msg.assignReq.groupRef.iei = AIFG_IE_ID_BM_GROUPCALLREF; + dst->msg.assignReq.groupRef.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Talker Flag + if(src[offset] == AIFG_IEI_BM_TALKERFLAG){ + dst->msg.assignReq.talkerFlag.iei = AIFG_IE_ID_BM_TALKERFLAG; + dst->msg.assignReq.talkerFlag.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Configuration Evolution Indication + if(src[offset] == AIFG_IEI_BM_CFGEVOIND){ + offset++; + dst->msg.assignReq.cfgEvoInd.iei = AIFG_IE_ID_BM_CFGEVOIND; + dst->msg.assignReq.cfgEvoInd.ptr = src+offset; + } + +FINISH: + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//for assign complete +int aifg_msg_rv_assignComplete(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.assignComplete), 0, sizeof(dst->msg.assignComplete)); + + //RR cause + if(src[offset] == AIFG_IEI_BM_RRCAUSE){ + offset++; + dst->msg.assignComplete.rrcause.iei = AIFG_IE_ID_BM_RRCAUSE; + dst->msg.assignComplete.rrcause.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //CIC + if(src[offset] == AIFG_IEI_BM_CIC){ + offset++; + dst->msg.assignComplete.cic.iei = AIFG_IE_ID_BM_CIC; + dst->msg.assignComplete.cic.ptr = src+offset; + offset += 2; + if(offset >= msg_len) goto FINISH; + } + + //Cell Identifier + if(src[offset] == AIFG_IEI_BM_CELLID){ + offset++; + dst->msg.assignComplete.cellId.iei = AIFG_IE_ID_BM_CELLID; + dst->msg.assignComplete.cellId.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Chosen Channel + if(src[offset] == AIFG_IEI_BM_CHOSENCHANNEL){ + offset++; + dst->msg.assignComplete.chosenChannel.iei = AIFG_IE_ID_BM_CHOSENCHANNEL; + dst->msg.assignComplete.chosenChannel.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Chosen Encryption Algorithm + if(src[offset] == AIFG_IEI_BM_CHOSENENCRYPT){ + offset++; + dst->msg.assignComplete.chosenEncrypt.iei = AIFG_IE_ID_BM_CHOSENENCRYPT; + dst->msg.assignComplete.chosenEncrypt.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Circuit Pool + if(src[offset] == AIFG_IEI_BM_CIRCUITPOOL){ + offset++; + dst->msg.assignComplete.circuitPool.iei = AIFG_IE_ID_BM_CIRCUITPOOL; + dst->msg.assignComplete.circuitPool.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Speech Version (Chosen) + if(src[offset] == AIFG_IEI_BM_SPEECHVER){ + offset++; + dst->msg.assignComplete.speechVer.iei = AIFG_IE_ID_BM_SPEECHVER; + dst->msg.assignComplete.speechVer.ptr = src+offset; + offset++; + } + if(offset >= msg_len) goto FINISH; + + //LSA Identifier + if(src[offset] == AIFG_IEI_BM_LSAID){ + offset++; + dst->msg.assignComplete.lsaId.iei = AIFG_IE_ID_BM_LSAID; + dst->msg.assignComplete.lsaId.ptr = src+offset; + offset += src[offset] + 1; + } + +FINISH: + return AIFG_SUCCEED; +} + +//for assign failure +int aifg_msg_rv_assignFailure(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.assignFailure), 0, sizeof(dst->msg.assignFailure)); + + //Cause - M + if(src[offset] != AIFG_IEI_BM_CAUSE) + goto ERR_PROC; + offset++; + dst->msg.assignFailure.cause.iei = AIFG_IE_ID_BM_CAUSE; + dst->msg.assignFailure.cause.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + + //RR cause + if(src[offset] == AIFG_IEI_BM_RRCAUSE){ + offset++; + dst->msg.assignFailure.rrcause.iei = AIFG_IE_ID_BM_RRCAUSE; + dst->msg.assignFailure.rrcause.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Circuit Pool + if(src[offset] == AIFG_IEI_BM_CIRCUITPOOL){ + offset++; + dst->msg.assignFailure.circuitPool.iei = AIFG_IE_ID_BM_CIRCUITPOOL; + dst->msg.assignFailure.circuitPool.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Circuit Pool List + if(src[offset] == AIFG_IEI_BM_CIRCUITPOOLLIST){ + offset++; + dst->msg.assignFailure.circuitPoolList.iei = AIFG_IE_ID_BM_CIRCUITPOOLLIST; + dst->msg.assignFailure.circuitPoolList.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + +FINISH: + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//for block +int aifg_msg_rv_block(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.block), 0, sizeof(dst->msg.block)); + + //CIC - M + if(src[offset] != AIFG_IEI_BM_CIC) + goto ERR_PROC; + offset++; + dst->msg.block.cic.iei = AIFG_IE_ID_BM_CIC; + dst->msg.block.cic.ptr = src+offset; + offset += 2; + + //Cause - M + if(src[offset] != AIFG_IEI_BM_CAUSE) + goto ERR_PROC; + offset++; + dst->msg.block.cause.iei = AIFG_IE_ID_BM_CAUSE; + dst->msg.block.cause.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + + //Connection Release Requested + if(src[offset] == AIFG_IEI_BM_CONNRELREQ){ + dst->msg.block.connectionRelReq.iei = AIFG_IE_ID_BM_CONNRELREQ; + dst->msg.block.connectionRelReq.ptr = src+offset; + offset++; + } + +FINISH: + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//for block ack +int aifg_msg_rv_blockAck(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + return AIFG_SUCCEED; +} + +//for unblock +int aifg_msg_rv_unBlock(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.blockAck), 0, sizeof(dst->msg.blockAck)); + + //CIC - M + if(src[offset] != AIFG_IEI_BM_CIC) + goto ERR_PROC; + offset++; + dst->msg.unblock.cic.iei = AIFG_IE_ID_BM_CIC; + dst->msg.unblock.cic.ptr = src+offset; + offset += 2; + + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//for unblock ack +int aifg_msg_rv_unBlockAck(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + return AIFG_SUCCEED; +} + +//for HANDOVER REQUEST +int aifg_msg_rv_HORequest(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.HORequest), 0, sizeof(dst->msg.HORequest)); + + //channal type - M + if(src[offset] != AIFG_IEI_BM_CHANNELTYPE) + goto ERR_PROC; + offset++; + dst->msg.HORequest.channelType.iei = AIFG_IE_ID_BM_CHANNELTYPE; + dst->msg.HORequest.channelType.ptr = src+offset; + offset += src[offset] + 1; + + //Encryption Information - M + if(src[offset] != AIFG_IEI_BM_ENCRYPTINFO) + goto ERR_PROC; + offset++; + dst->msg.HORequest.encryptInfo.iei = AIFG_IE_ID_BM_ENCRYPTINFO; + dst->msg.HORequest.encryptInfo.ptr = src+offset; + offset += src[offset] + 1; + + //Classmark Information 1 - M + if(src[offset] == AIFG_IEI_BM_CLASSMARKINFO1){ + offset++; + dst->msg.HORequest.cmInfo1.iei = AIFG_IE_ID_BM_CLASSMARKINFO1; + dst->msg.HORequest.cmInfo1.ptr = src+offset; + offset++; + } + else if(src[offset] == AIFG_IEI_BM_CLASSMARKINFO2){ + offset++; + dst->msg.HORequest.cmInfo2.iei = AIFG_IE_ID_BM_CLASSMARKINFO2; + dst->msg.HORequest.cmInfo2.ptr = src+offset; + offset += src[offset] + 1; + } + else + goto ERR_PROC; + + //Cell Identifier (Serving) - M + if(src[offset] != AIFG_IEI_BM_CELLID) + goto ERR_PROC; + offset++; + dst->msg.HORequest.serving_cellId.iei = AIFG_IE_ID_BM_CELLID; + dst->msg.HORequest.serving_cellId.ptr = src+offset; + offset += src[offset] + 1; + + //Priority + if(src[offset] == AIFG_IEI_BM_PRIORITY){ + offset++; + dst->msg.HORequest.priority.iei = AIFG_IE_ID_BM_PRIORITY; + dst->msg.HORequest.priority.ptr = src+offset; + offset += src[offset] + 1; + } + + //CIC + if(src[offset] == AIFG_IEI_BM_CIC){ + offset++; + dst->msg.HORequest.cic.iei = AIFG_IE_ID_BM_CIC; + dst->msg.HORequest.cic.ptr = src+offset; + offset += 2; + } + + //Downlink DTX Flag + if(src[offset] == AIFG_IEI_BM_DTXFLAG){ + offset++; + dst->msg.HORequest.dtxFlag.iei = AIFG_IE_ID_BM_DTXFLAG; + dst->msg.HORequest.dtxFlag.ptr = src+offset; + offset++; + } + + //Cell Identifier (Target) - M + if(src[offset] != AIFG_IEI_BM_CELLID) + goto ERR_PROC; + offset++; + dst->msg.HORequest.target_cellId.iei = AIFG_IE_ID_BM_CELLID; + dst->msg.HORequest.target_cellId.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + + //Interference Band To Be Used + if(src[offset] == AIFG_IEI_BM_BANDUSED){ + offset++; + dst->msg.HORequest.bandUsed.iei = AIFG_IE_ID_BM_BANDUSED; + dst->msg.HORequest.bandUsed.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Cause + if(src[offset] == AIFG_IEI_BM_CAUSE){ + offset++; + dst->msg.HORequest.cause.iei = AIFG_IE_ID_BM_CAUSE; + dst->msg.HORequest.cause.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Classmark Information 3 + if(src[offset] == AIFG_IEI_BM_CLASSMARKINFO3){ + offset++; + dst->msg.HORequest.cmInfo3.iei = AIFG_IE_ID_BM_CLASSMARKINFO3; + dst->msg.HORequest.cmInfo3.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Current Channel type 1 + if(src[offset] == AIFG_IEI_BM_CURCHANNELTYPE1){ + offset++; + dst->msg.HORequest.curChanneltype1.iei = AIFG_IE_ID_BM_CURCHANNELTYPE1; + dst->msg.HORequest.curChanneltype1.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Speech Version (Used) + if(src[offset] == AIFG_IEI_BM_SPEECHVER){ + offset++; + dst->msg.HORequest.speechVer.iei = AIFG_IE_ID_BM_SPEECHVER; + dst->msg.HORequest.speechVer.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Group Call Reference + if(src[offset] == AIFG_IEI_BM_GROUPCALLREF){ + offset++; + dst->msg.HORequest.groupCallRef.iei = AIFG_IE_ID_BM_GROUPCALLREF; + dst->msg.HORequest.groupCallRef.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Talker Flag + if(src[offset] == AIFG_IEI_BM_TALKERFLAG){ + dst->msg.HORequest.talkerFlag.iei = AIFG_IE_ID_BM_TALKERFLAG; + dst->msg.HORequest.talkerFlag.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Configuration Evolution Indication + if(src[offset] == AIFG_IEI_BM_CFGEVOIND){ + offset++; + dst->msg.HORequest.cfgEvoInd.iei = AIFG_IE_ID_BM_CFGEVOIND; + dst->msg.HORequest.cfgEvoInd.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Chosen Encryption Algorithm (Serving) + if(src[offset] == AIFG_IEI_BM_CHOSENENCRYPT){ + offset++; + dst->msg.HORequest.chosenEncrypt.iei = AIFG_IE_ID_BM_CHOSENENCRYPT; + dst->msg.HORequest.chosenEncrypt.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Old BSS to New BSS Information + if(src[offset] == AIFG_IEI_BM_BSSOLDTONEW){ + offset++; + dst->msg.HORequest.oldBssToNew.iei = AIFG_IE_ID_BM_BSSOLDTONEW; + dst->msg.HORequest.oldBssToNew.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //LSA Information + if(src[offset] == AIFG_IEI_BM_LSAINFO){ + offset++; + dst->msg.HORequest.lsaInfo.iei = AIFG_IE_ID_BM_LSAINFO; + dst->msg.HORequest.lsaInfo.ptr = src+offset; + offset += src[offset] + 1; + } + +FINISH: + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + + +//for HANDOVER REQUIRED +int aifg_msg_rv_HORequired(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.HORequired), 0, sizeof(dst->msg.HORequired)); + + //Cause - M + if(src[offset] != AIFG_IEI_BM_CAUSE) + goto ERR_PROC; + offset++; + dst->msg.HORequired.cause.iei = AIFG_IE_ID_BM_CAUSE; + dst->msg.HORequired.cause.ptr = src+offset; + offset += src[offset] + 1; + + + //Response Request + if(src[offset] == AIFG_IEI_BM_RESPREQ){ + dst->msg.HORequired.respReq.iei = AIFG_IE_ID_BM_RESPREQ; + dst->msg.HORequired.respReq.ptr = src+offset; + offset++; + } + + //Cell Identifier List (Preferred) - M + if(src[offset] != AIFG_IEI_BM_CELLIDLIST) + goto ERR_PROC; + offset++; + dst->msg.HORequired.cellIdList.iei = AIFG_IE_ID_BM_CELLIDLIST; + dst->msg.HORequired.cellIdList.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + + //Circuit Pool List + if(src[offset] == AIFG_IEI_BM_CIRCUITPOOLLIST){ + offset++; + dst->msg.HORequired.circuitPoolList.iei = AIFG_IE_ID_BM_CIRCUITPOOLLIST; + dst->msg.HORequired.circuitPoolList.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Current Channel type 1 + if(src[offset] == AIFG_IEI_BM_CURCHANNELTYPE1){ + offset++; + dst->msg.HORequired.curChannelType1.iei = AIFG_IE_ID_BM_CURCHANNELTYPE1; + dst->msg.HORequired.curChannelType1.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Speech Version (Used) + if(src[offset] == AIFG_IEI_BM_SPEECHVER){ + offset++; + dst->msg.HORequired.speechVer.iei = AIFG_IE_ID_BM_SPEECHVER; + dst->msg.HORequired.speechVer.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Queueing Indicator + if(src[offset] == AIFG_IEI_BM_QUEUEIND){ + offset++; + dst->msg.HORequired.queInd.iei = AIFG_IE_ID_BM_QUEUEIND; + dst->msg.HORequired.queInd.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Old BSS to New BSS Information + if(src[offset] == AIFG_IEI_BM_BSSOLDTONEW){ + offset++; + dst->msg.HORequired.oldBssToNew.iei = AIFG_IE_ID_BM_BSSOLDTONEW; + dst->msg.HORequired.oldBssToNew.ptr = src+offset; + offset += src[offset] + 1; + } + +FINISH: + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//for HANDOVER REQUEST ACK +int aifg_msg_rv_HORequestAck(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.HORequestAck), 0, sizeof(dst->msg.HORequestAck)); + + //Layer 3 Information - M + if(src[offset] != AIFG_IEI_BM_L3INFO) + goto ERR_PROC; + offset++; + dst->msg.HORequestAck.l3Info.len = src[offset++]; + dst->msg.HORequestAck.l3Info.ptr = src + offset; + offset += src[offset] + 1; + + //Chosen Channel + if(src[offset] == AIFG_IEI_BM_CHOSENCHANNEL){ + offset++; + dst->msg.HORequestAck.chosenChannel.iei = AIFG_IE_ID_BM_CHOSENCHANNEL; + dst->msg.HORequestAck.chosenChannel.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Chosen Encryption Algorithm + if(src[offset] == AIFG_IEI_BM_CHOSENENCRYPT){ + offset++; + dst->msg.HORequestAck.chosenEncrypt.iei = AIFG_IE_ID_BM_CHOSENENCRYPT; + dst->msg.HORequestAck.chosenEncrypt.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Circuit Pool + if(src[offset] == AIFG_IEI_BM_CIRCUITPOOL){ + offset++; + dst->msg.HORequestAck.circuitPool.iei = AIFG_IE_ID_BM_CIRCUITPOOL; + dst->msg.HORequestAck.circuitPool.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Speech Version + if(src[offset] == AIFG_IEI_BM_SPEECHVER){ + offset++; + dst->msg.HORequestAck.speechVer.iei = AIFG_IE_ID_BM_SPEECHVER; + dst->msg.HORequestAck.speechVer.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //CIC + if(src[offset] == AIFG_IEI_BM_CIC){ + offset++; + dst->msg.HORequestAck.cic.iei = AIFG_IE_ID_BM_CIC; + dst->msg.HORequestAck.cic.ptr = src+offset; + offset += 2; + if(offset >= msg_len) goto FINISH; + } + + //LSA Identifier + if(src[offset] == AIFG_IEI_BM_LSAID){ + offset++; + dst->msg.HORequestAck.lsaId.iei = AIFG_IE_ID_BM_LSAID; + dst->msg.HORequestAck.lsaId.ptr = src+offset; + offset += src[offset] + 1; + } + +FINISH: + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//for HANDOVER COMMAND +int aifg_msg_rv_HOCmd(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.HOCmd), 0, sizeof(dst->msg.HOCmd)); + + //Layer 3 Information - M + if(src[offset] != AIFG_IEI_BM_L3INFO) + goto ERR_PROC; + offset++; + if(AIFG_ERROR == aifg_msg_decode_embeded_l3msg(&(src[offset+1]), &(dst->msg.HOCmd.l3msg))) + goto ERR_PROC; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + + //Cell Identifier + if(src[offset] == AIFG_IEI_BM_CELLID){ + offset++; + dst->msg.HOCmd.cellId.iei = AIFG_IE_ID_BM_CELLID; + dst->msg.HOCmd.cellId.ptr = src+offset; + offset += src[offset] + 1; + } + +FINISH: + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//for HANDOVER COMPLETE +int aifg_msg_rv_HOComplete(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.HOComplete), 0, sizeof(dst->msg.HOComplete)); + + //RR cause + if(src[offset] == AIFG_IEI_BM_RRCAUSE){ + offset++; + dst->msg.HOComplete.rrcause.iei = AIFG_IE_ID_BM_RRCAUSE; + dst->msg.HOComplete.rrcause.ptr = src+offset; + offset++; + } + + return AIFG_SUCCEED; +} + +//HANDOVER CANDIDATE ENQUIRE +int aifg_msg_rv_HOCandEnq(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.HOCandEnq), 0, sizeof(dst->msg.HOCandEnq)); + + //Number Of Mss - M + if(src[offset] != AIFG_IEI_BM_MSNUM) + goto ERR_PROC; + offset++; + dst->msg.HOCandEnq.msNum.iei = AIFG_IE_ID_BM_MSNUM; + dst->msg.HOCandEnq.msNum.ptr = src+offset; + offset++; + + //Cell Identifier List - M + if(src[offset] != AIFG_IEI_BM_CELLIDLIST) + goto ERR_PROC; + offset++; + dst->msg.HOCandEnq.cellIdList.iei = AIFG_IE_ID_BM_CELLIDLIST; + dst->msg.HOCandEnq.cellIdList.ptr = src+offset; + offset += src[offset] + 1; + + //Cell Identifier - M + if(src[offset] != AIFG_IEI_BM_CELLID) + goto ERR_PROC; + offset++; + dst->msg.HOCandEnq.cellId.iei = AIFG_IE_ID_BM_CELLID; + dst->msg.HOCandEnq.cellId.ptr = src+offset; + offset += src[offset] + 1; + + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//HANDOVER CANDIDATE RESPONSE +int aifg_msg_rv_HOCandResp(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.HOCandResp), 0, sizeof(dst->msg.HOCandResp)); + + //Number Of Mss - M + if(src[offset] != AIFG_IEI_BM_MSNUM) + goto ERR_PROC; + offset++; + dst->msg.HOCandResp.msNum.iei = AIFG_IE_ID_BM_MSNUM; + dst->msg.HOCandResp.msNum.ptr = src+offset; + offset++; + + //Cell Identifier - M + if(src[offset] != AIFG_IEI_BM_CELLID) + goto ERR_PROC; + offset++; + dst->msg.HOCandResp.cellId.iei = AIFG_IE_ID_BM_CELLID; + dst->msg.HOCandResp.cellId.ptr = src+offset; + offset += src[offset] + 1; + + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//HANDOVER FAILURE +int aifg_msg_rv_HOFailure(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.HOFailure), 0, sizeof(dst->msg.HOFailure)); + + //Cause - M + if(src[offset] != AIFG_IEI_BM_CAUSE) + goto ERR_PROC; + offset++; + dst->msg.HOFailure.cause.iei = AIFG_IE_ID_BM_CAUSE; + dst->msg.HOFailure.cause.ptr = src+offset; + offset += src[offset] + 1; + + //RR cause + if(src[offset] == AIFG_IEI_BM_RRCAUSE){ + offset++; + dst->msg.HOFailure.rrcause.iei = AIFG_IE_ID_BM_RRCAUSE; + dst->msg.HOFailure.rrcause.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Circuit Pool + if(src[offset] == AIFG_IEI_BM_CIRCUITPOOL){ + offset++; + dst->msg.HOFailure.circuitPool.iei = AIFG_IE_ID_BM_CIRCUITPOOL; + dst->msg.HOFailure.circuitPool.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Circuit Pool List + if(src[offset] == AIFG_IEI_BM_CIRCUITPOOLLIST){ + offset++; + dst->msg.HOFailure.circuitPoolList.iei = AIFG_IE_ID_BM_CIRCUITPOOLLIST; + dst->msg.HOFailure.circuitPoolList.ptr = src+offset; + offset += src[offset] + 1; + } + +FINISH: + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//RESOURCE REQUEST +int aifg_msg_rv_resrcReq(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.resrcReq), 0, sizeof(dst->msg.resrcReq)); + + //Periodicity - M + if(src[offset] != AIFG_IEI_BM_PERIODICITY) + goto ERR_PROC; + offset++; + dst->msg.resrcReq.periodicity.iei = AIFG_IE_ID_BM_PERIODICITY; + dst->msg.resrcReq.periodicity.ptr = src+offset; + offset++; + + //Resource Indication Method - M + if(src[offset] != AIFG_IEI_BM_RESOURCEINDMEHTOD) + goto ERR_PROC; + offset++; + dst->msg.resrcReq.resrcIndMethod.iei = AIFG_IE_ID_BM_RESOURCEINDMEHTOD; + dst->msg.resrcReq.resrcIndMethod.ptr = src+offset; + offset++; + + //Cell Identifier - M + if(src[offset] != AIFG_IEI_BM_CELLID) + goto ERR_PROC; + offset++; + dst->msg.resrcReq.cellId.iei = AIFG_IE_ID_BM_CELLID; + dst->msg.resrcReq.cellId.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + + //Extended Resource Indicator + if(src[offset] == AIFG_IEI_BM_EXTRESOURCEIND){ + offset++; + dst->msg.resrcReq.extResrcInd.iei = AIFG_IE_ID_BM_EXTRESOURCEIND; + dst->msg.resrcReq.extResrcInd.ptr = src+offset; + offset++; + } + +FINISH: + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//RESOURCE INDICATION +int aifg_msg_rv_resrcInd(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.resrcInd), 0, sizeof(dst->msg.resrcInd)); + + //Resource Indication Method - M + if(src[offset] != AIFG_IEI_BM_RESOURCEINDMEHTOD) + goto ERR_PROC; + offset++; + dst->msg.resrcInd.resrcIndMethod.iei = AIFG_IE_ID_BM_RESOURCEINDMEHTOD; + dst->msg.resrcInd.resrcIndMethod.ptr = src+offset; + offset++; + + //Resource Available + if(src[offset] == AIFG_IEI_BM_RESOURCEAVAIL){ + offset++; + dst->msg.resrcInd.resrcAvail.iei = AIFG_IE_ID_BM_RESOURCEAVAIL; + dst->msg.resrcInd.resrcAvail.ptr = src+offset; + offset += 20; + } + + //Cell Identifier - M + if(src[offset] != AIFG_IEI_BM_CELLID) + goto ERR_PROC; + offset++; + dst->msg.resrcInd.cellId.iei = AIFG_IE_ID_BM_CELLID; + dst->msg.resrcInd.cellId.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + + //Total Resource Accessible + if(src[offset] == AIFG_IEI_BM_TOTALRESOURCE){ + offset++; + dst->msg.resrcInd.totalResrc.iei = AIFG_IE_ID_BM_TOTALRESOURCE; + dst->msg.resrcInd.totalResrc.ptr = src+offset; + offset += 4; + } + +FINISH: + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//RESOURCE INDICATION +int aifg_msg_rv_paging(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.paging), 0, sizeof(dst->msg.paging)); + + //IMSI - M + if(src[offset] != AIFG_IEI_BM_IMSI) + goto ERR_PROC; + offset++; + dst->msg.paging.imsi.iei = AIFG_IE_ID_BM_IMSI; + dst->msg.paging.imsi.ptr = src+offset; + offset += src[offset] + 1; + + //TMSI + if(src[offset] == AIFG_IEI_BM_TMSI){ + offset++; + dst->msg.paging.tmsi.iei = AIFG_IE_ID_BM_TMSI; + dst->msg.paging.tmsi.ptr = src+offset; + offset += src[offset] + 1; + } + + //Cell Identifier List - M + if(src[offset] != AIFG_IEI_BM_CELLIDLIST) + goto ERR_PROC; + offset++; + dst->msg.paging.cellIdList.iei = AIFG_IE_ID_BM_CELLIDLIST; + dst->msg.paging.cellIdList.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + + //Channel Needed + if(src[offset] == AIFG_IEI_BM_CHANNELNEEDED){ + offset++; + dst->msg.paging.channelNeeded.iei = AIFG_IE_ID_BM_CHANNELNEEDED; + dst->msg.paging.channelNeeded.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //eMLPP Priority + if(src[offset] == AIFG_IEI_BM_EMLPP){ + offset++; + dst->msg.paging.eMLPPpri.iei = AIFG_IE_ID_BM_EMLPP; + dst->msg.paging.eMLPPpri.ptr = src+offset; + offset++; + } + +FINISH: + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//CLEAR REQUEST +int aifg_msg_rv_clearReq(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.clearReq), 0, sizeof(dst->msg.clearReq)); + + //Cause - M + if(src[offset] != AIFG_IEI_BM_CAUSE) + goto ERR_PROC; + offset++; + dst->msg.clearReq.cause.iei = AIFG_IE_ID_BM_CAUSE; + dst->msg.clearReq.cause.ptr = src+offset; + offset += src[offset] + 1; + + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//CLEAR COMMAND +int aifg_msg_rv_clearCmd(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.clearCmd), 0, sizeof(dst->msg.clearCmd)); + + //Layer 3 Header Information + if(src[offset] == AIFG_IEI_BM_L3HEADERINFO){ + offset++; + dst->msg.clearCmd.l3HeaderInfo.iei = AIFG_IE_ID_BM_L3HEADERINFO; + dst->msg.clearCmd.l3HeaderInfo.ptr = src+offset; + offset += src[offset] + 1; + } + + //Cause - M + if(src[offset] != AIFG_IEI_BM_CAUSE) + goto ERR_PROC; + offset++; + dst->msg.clearCmd.cause.iei = AIFG_IE_ID_BM_CAUSE; + dst->msg.clearCmd.cause.ptr = src+offset; + offset += src[offset] + 1; + + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//CLEAR COMPLETE +int aifg_msg_rv_clearCmp(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + return AIFG_SUCCEED; +} + +//RESET +int aifg_msg_rv_reset(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.reset), 0, sizeof(dst->msg.reset)); + + //Cause - M + if(src[offset] != AIFG_IEI_BM_CAUSE){ + aifg_event = AIFG_ERR_ERROR_MSG; + goto ERR_PROC; + } + offset++; + dst->msg.reset.cause.iei = AIFG_IE_ID_BM_CAUSE; + dst->msg.reset.cause.ptr = src+offset; + + return AIFG_SUCCEED; + +ERR_PROC: + return AIFG_ERROR; +} + +//RESET ACK +int aifg_msg_rv_resetAck(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + return AIFG_SUCCEED; +} + +//HANDOVER PERFORMED +int aifg_msg_rv_HOPerformed(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.HOPerformed), 0, sizeof(dst->msg.HOPerformed)); + + //Cause - M + if(src[offset] != AIFG_IEI_BM_CAUSE) + goto ERR_PROC; + offset++; + dst->msg.HOPerformed.cause.iei = AIFG_IE_ID_BM_CAUSE; + dst->msg.HOPerformed.cause.ptr = src+offset; + offset += src[offset] + 1; + + //Cell Identifier - M + if(src[offset] != AIFG_IEI_BM_CELLID) + goto ERR_PROC; + offset++; + dst->msg.HOPerformed.cellId.iei = AIFG_IE_ID_BM_CELLID; + dst->msg.HOPerformed.cellId.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + + //Chosen Channel + if(src[offset] == AIFG_IEI_BM_CHOSENCHANNEL){ + offset++; + dst->msg.HOPerformed.chosenChannel.iei = AIFG_IE_ID_BM_CHOSENCHANNEL; + dst->msg.HOPerformed.chosenChannel.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Chosen Encryption Algorithm + if(src[offset] == AIFG_IEI_BM_CHOSENENCRYPT){ + offset++; + dst->msg.HOPerformed.chosenEncrypt.iei = AIFG_IE_ID_BM_CHOSENENCRYPT; + dst->msg.HOPerformed.chosenEncrypt.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Speech Version + if(src[offset] == AIFG_IEI_BM_SPEECHVER){ + offset++; + dst->msg.HOPerformed.speechVer.iei = AIFG_IE_ID_BM_SPEECHVER; + dst->msg.HOPerformed.speechVer.ptr = src+offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //LSA Identifier + if(src[offset] == AIFG_IEI_BM_LSAID){ + offset++; + dst->msg.HOPerformed.lsaId.iei = AIFG_IE_ID_BM_LSAID; + dst->msg.HOPerformed.lsaId.ptr = src+offset; + offset += src[offset] + 1; + } + +FINISH: + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//OVERLOAD +int aifg_msg_rv_overload(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.overload), 0, sizeof(dst->msg.overload)); + + //Cause - M + if(src[offset] != AIFG_IEI_BM_CAUSE) + goto ERR_PROC; + offset++; + dst->msg.overload.cause.iei = AIFG_IE_ID_BM_CAUSE; + dst->msg.overload.cause.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + + //Cell Identifier + if(src[offset] == AIFG_IEI_BM_CELLID){ + offset++; + dst->msg.overload.cellId.iei = AIFG_IE_ID_BM_CELLID; + dst->msg.overload.cellId.ptr = src+offset; + offset += src[offset] + 1; + } + +FINISH: + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//MSC INVOKE TRACE +int aifg_msg_rv_mscTrace(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.mscTrace), 0, sizeof(dst->msg.mscTrace)); + + //Trace Type - M + if(src[offset] != AIFG_IEI_BM_TRACETYPE) + goto ERR_PROC; + offset++; + dst->msg.mscTrace.traceType.iei = AIFG_IE_ID_BM_TRACETYPE; + dst->msg.mscTrace.traceType.ptr = src+offset; + offset++; + + //Trigger ID + if(src[offset] == AIFG_IEI_BM_TRIGGERID){ + offset++; + dst->msg.mscTrace.triggerId.iei = AIFG_IE_ID_BM_TRIGGERID; + dst->msg.mscTrace.triggerId.ptr = src+offset; + offset += src[offset] + 1; + } + + //Trace Reference - M + if(src[offset] != AIFG_IEI_BM_TRACEREF) + goto ERR_PROC; + offset++; + dst->msg.mscTrace.traceRef.iei = AIFG_IE_ID_BM_TRACEREF; + dst->msg.mscTrace.traceRef.ptr = src+offset; + offset += 2; + if(offset >= msg_len) goto FINISH; + + //Transactionid + if(src[offset] == AIFG_IEI_BM_TRANSACTIONID){ + offset++; + dst->msg.mscTrace.transId.iei = AIFG_IE_ID_BM_TRANSACTIONID; + dst->msg.mscTrace.transId.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Mobile Identity + if(src[offset] == AIFG_IEI_BM_MOBILEID){ + offset++; + dst->msg.mscTrace.mobileId.iei = AIFG_IE_ID_BM_MOBILEID; + dst->msg.mscTrace.mobileId.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //OMCId + if(src[offset] == AIFG_IEI_BM_OMCID){ + offset++; + dst->msg.mscTrace.omcId.iei = AIFG_IE_ID_BM_OMCID; + dst->msg.mscTrace.omcId.ptr = src+offset; + offset += src[offset] + 1; + } + +FINISH: + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//BSC INVOKE TRACE +int aifg_msg_rv_bscTrace(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.bscTrace), 0, sizeof(dst->msg.bscTrace)); + + //Trace Type - M + if(src[offset] != AIFG_IEI_BM_TRACETYPE) + goto ERR_PROC; + offset++; + dst->msg.bscTrace.traceType.iei = AIFG_IE_ID_BM_TRACETYPE; + dst->msg.bscTrace.traceType.ptr = src+offset; + offset++; + + //Forward Indicator + if(src[offset] == AIFG_IEI_BM_FORWARDIND){ + offset++; + dst->msg.bscTrace.forwardInd.iei = AIFG_IE_ID_BM_FORWARDIND; + dst->msg.bscTrace.forwardInd.ptr = src+offset; + offset++; + } + + //Triggerid + if(src[offset] == AIFG_IEI_BM_TRIGGERID){ + offset++; + dst->msg.bscTrace.triggerId.iei = AIFG_IE_ID_BM_TRIGGERID; + dst->msg.bscTrace.triggerId.ptr = src+offset; + offset += src[offset] + 1; + } + + //Trace Reference - M + if(src[offset] != AIFG_IEI_BM_TRACEREF) + goto ERR_PROC; + offset++; + dst->msg.bscTrace.traceRef.iei = AIFG_IE_ID_BM_TRACEREF; + dst->msg.bscTrace.traceRef.ptr = src+offset; + offset += 2; + if(offset >= msg_len) goto FINISH; + + //Transactionid + if(src[offset] == AIFG_IEI_BM_TRANSACTIONID){ + offset++; + dst->msg.bscTrace.transId.iei = AIFG_IE_ID_BM_TRANSACTIONID; + dst->msg.bscTrace.transId.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //OMCId + if(src[offset] == AIFG_IEI_BM_OMCID){ + offset++; + dst->msg.bscTrace.omcId.iei = AIFG_IE_ID_BM_OMCID; + dst->msg.bscTrace.omcId.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + +FINISH: + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//CLASSMARK UPDATE +int aifg_msg_rv_cmUpdate(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.cmUpdate), 0, sizeof(dst->msg.cmUpdate)); + + //Classmark Information 2 + if(src[offset] != AIFG_IEI_BM_CLASSMARKINFO2) + goto ERR_PROC; + offset++; + dst->msg.cmUpdate.cmInfo2.iei = AIFG_IE_ID_BM_CLASSMARKINFO2; + dst->msg.cmUpdate.cmInfo2.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + + //Classmark Information 2 + if(src[offset] == AIFG_IEI_BM_CLASSMARKINFO3){ + offset++; + dst->msg.cmUpdate.cmInfo3.iei = AIFG_IE_ID_BM_CLASSMARKINFO3; + dst->msg.cmUpdate.cmInfo3.ptr = src+offset; + offset += src[offset] + 1; + } + +FINISH: + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//CIPHER MODE COMMAND +int aifg_msg_rv_cipherModeCmd(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.cipherModeCmd), 0, sizeof(dst->msg.cipherModeCmd)); + + //Layer 3 Header Information + if(src[offset] == AIFG_IEI_BM_L3HEADERINFO){ + offset++; + dst->msg.cipherModeCmd.l3HeaderInfo.iei = AIFG_IE_ID_BM_L3HEADERINFO; + dst->msg.cipherModeCmd.l3HeaderInfo.ptr = src+offset; + offset += src[offset] + 1; + } + + //Encryption Information - M + if(src[offset] != AIFG_IEI_BM_ENCRYPTINFO) + goto ERR_PROC; + offset++; + dst->msg.cipherModeCmd.encryptInfo.iei = AIFG_IE_ID_BM_ENCRYPTINFO; + dst->msg.cipherModeCmd.encryptInfo.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + + //Cipher Response Mode + if(src[offset] == AIFG_IEI_BM_CIPHERRESPMODE){ + offset++; + dst->msg.cipherModeCmd.cipherRespMode.iei = AIFG_IE_ID_BM_CIPHERRESPMODE; + dst->msg.cipherModeCmd.cipherRespMode.ptr = src+offset; + offset++; + } + +FINISH: + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//CIPHER MODE COMPLETE +int aifg_msg_rv_cipherModeComp(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.cipherModeCmd), 0, sizeof(dst->msg.cipherModeCmd)); + + if(offset >= msg_len) goto FINISH; + + //Layer 3 Header Information + if(src[offset] == AIFG_IEI_BM_L3MSGCONTENT){ + offset++; + dst->msg.cipherModeComp.l3MsgCont.iei = AIFG_IE_ID_BM_L3MSGCONTENT; + dst->msg.cipherModeComp.l3MsgCont.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Chosen Encryption Algorithm + if(src[offset] == AIFG_IEI_BM_CHOSENENCRYPT){ + offset++; + dst->msg.cipherModeComp.chosenEncrypt.iei = AIFG_IE_ID_BM_CHOSENENCRYPT; + dst->msg.cipherModeComp.chosenEncrypt.ptr = src+offset; + offset++; + } + +FINISH: + return AIFG_SUCCEED; +} + +//COMPLETE LAYER 3 INFORMATION +int aifg_msg_rv_completeL3Info(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.completeL3Info), 0, sizeof(dst->msg.completeL3Info)); + + //Cell Identifier - M + if(src[offset] != AIFG_IEI_BM_CELLID) + goto ERR_PROC; + offset++; + dst->msg.completeL3Info.cellId.iei = AIFG_IE_ID_BM_CELLID; + dst->msg.completeL3Info.cellId.ptr = src+offset; + offset += src[offset] + 1; + + //Layer 3 Information - M + if(src[offset] != AIFG_IEI_BM_L3INFO) + goto ERR_PROC; + offset++; + if(AIFG_ERROR == aifg_msg_decode_embeded_l3msg(&(src[offset+1]), &(dst->msg.completeL3Info.l3msg))) + goto ERR_PROC; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + + //Chosen Channel + if(src[offset] == AIFG_IEI_BM_CHOSENCHANNEL){ + offset++; + dst->msg.completeL3Info.chosenChannel.iei = AIFG_IE_ID_BM_CHOSENCHANNEL; + dst->msg.completeL3Info.chosenChannel.ptr = src+offset; + offset++; + } + + //LSA Identifier List + if(src[offset] == AIFG_IEI_BM_LSAIDLIST){ + offset++; + dst->msg.completeL3Info.lsaIdList.iei = AIFG_IE_ID_BM_LSAIDLIST; + dst->msg.completeL3Info.lsaIdList.ptr = src+offset; + offset += src[offset] + 1; + } + + //Location Information + if(src[offset] == AIFG_IEI_BM_LOCATIONINFO){ + offset++; + dst->msg.completeL3Info.locInfo.iei = AIFG_IE_ID_BM_LOCATIONINFO; + dst->msg.completeL3Info.locInfo.ptr = src+offset; + offset += src[offset] + 1; + } + +FINISH: + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//SAPI "n" REJECT +int aifg_msg_rv_sapi_n_rej(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.sapi_n_rej), 0, sizeof(dst->msg.sapi_n_rej)); + + //DLCI - M + if(src[offset] != AIFG_IEI_BM_DLCI) + goto ERR_PROC; + offset++; + dst->msg.sapi_n_rej.dlci.iei = AIFG_IE_ID_BM_DLCI; + dst->msg.sapi_n_rej.dlci.ptr = src+offset; + offset++; + + //Cause - M + if(src[offset] != AIFG_IEI_BM_CAUSE) + goto ERR_PROC; + offset++; + dst->msg.sapi_n_rej.cause.iei = AIFG_IE_ID_BM_CAUSE; + dst->msg.sapi_n_rej.cause.ptr = src+offset; + offset += src[offset] + 1; + + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//HANDOVER REQUIRED REJECT +int aifg_msg_rv_HORequiredRej(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.HORequiredRej), 0, sizeof(dst->msg.HORequiredRej)); + + //Cause - M + if(src[offset] != AIFG_IEI_BM_CAUSE) + goto ERR_PROC; + offset++; + dst->msg.HORequiredRej.cause.iei = AIFG_IE_ID_BM_CAUSE; + dst->msg.HORequiredRej.cause.ptr = src+offset; + offset += src[offset] + 1; + + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//RESET CIRCUIT +int aifg_msg_rv_resetCircuit(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.resetCircuit), 0, sizeof(dst->msg.resetCircuit)); + + //CIC - M + if(src[offset] != AIFG_IEI_BM_CIC) + goto ERR_PROC; + offset++; + dst->msg.resetCircuit.cic.iei = AIFG_IE_ID_BM_CIC; + dst->msg.resetCircuit.cic.ptr = src+offset; + offset += 2; + + //Cause - M + if(src[offset] != AIFG_IEI_BM_CAUSE) + goto ERR_PROC; + offset++; + dst->msg.resetCircuit.cause.iei = AIFG_IE_ID_BM_CAUSE; + dst->msg.resetCircuit.cause.ptr = src+offset; + offset += src[offset] + 1; + + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//RESET CIRCUIT ACK +int aifg_msg_rv_resetCircuitAck(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + return AIFG_ERROR; +} + +//CIRCUIT GROUP BLOCK +int aifg_msg_rv_ccGroupBlock(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.ccGroupBlock), 0, sizeof(dst->msg.ccGroupBlock)); + + //Cause - M + if(src[offset] != AIFG_IEI_BM_CAUSE) + goto ERR_PROC; + offset++; + dst->msg.ccGroupBlock.cause.iei = AIFG_IE_ID_BM_CAUSE; + dst->msg.ccGroupBlock.cause.ptr = src+offset; + offset += src[offset] + 1; + + //CIC - M + if(src[offset] != AIFG_IEI_BM_CIC) + goto ERR_PROC; + offset++; + dst->msg.ccGroupBlock.cic.iei = AIFG_IE_ID_BM_CIC; + dst->msg.ccGroupBlock.cic.ptr = src+offset; + offset += 2; + + //Circuit Identity Code List - M + if(src[offset] != AIFG_IEI_BM_CICLIST) + goto ERR_PROC; + offset++; + dst->msg.ccGroupBlock.cicList.iei = AIFG_IE_ID_BM_CICLIST; + dst->msg.ccGroupBlock.cicList.ptr = src+offset; + offset += src[offset] + 1; + + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//CIRCUIT GROUP BLOCK ACK +int aifg_msg_rv_ccGroupBlockAck(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + return AIFG_SUCCEED; +} + +//CIRCUIT GROUP UNBLOCK +int aifg_msg_rv_ccGroupUnblock(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.ccGroupUnblock), 0, sizeof(dst->msg.ccGroupUnblock)); + + //CIC - M + if(src[offset] != AIFG_IEI_BM_CIC) + goto ERR_PROC; + offset++; + dst->msg.ccGroupUnblock.cic.iei = AIFG_IE_ID_BM_CIC; + dst->msg.ccGroupUnblock.cic.ptr = src+offset; + offset += 2; + + //Circuit Identity Code List - M + if(src[offset] != AIFG_IEI_BM_CICLIST) + goto ERR_PROC; + offset++; + dst->msg.ccGroupUnblock.cicList.iei = AIFG_IE_ID_BM_CICLIST; + dst->msg.ccGroupUnblock.cicList.ptr = src+offset; + offset += src[offset] + 1; + + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//CIRCUIT GROUP BLOCK ACK +int aifg_msg_rv_ccGroupUnblockAck(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + return AIFG_SUCCEED; +} + +//CONFUSION +int aifg_msg_rv_confusion(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.confusion), 0, sizeof(dst->msg.confusion)); + + //Cause - M + if(src[offset] != AIFG_IEI_BM_CAUSE) + goto ERR_PROC; + offset++; + dst->msg.confusion.cause.iei = AIFG_IE_ID_BM_CAUSE; + dst->msg.confusion.cause.ptr = src+offset; + offset += src[offset] + 1; + + //Diagnostics + if(src[offset] != AIFG_IEI_BM_DIGNOSTIC) + goto ERR_PROC; + offset++; + dst->msg.confusion.diagnostics.iei = AIFG_IE_ID_BM_DIGNOSTIC; + dst->msg.confusion.diagnostics.ptr = src+offset; + offset += src[offset] + 1; + + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//UNEQUIPPED CIRCUIT +int aifg_msg_rv_unequippedCircuit(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.upequipCircuit), 0, sizeof(dst->msg.upequipCircuit)); + + //CIC - M + if(src[offset] != AIFG_IEI_BM_CIC) + goto ERR_PROC; + offset++; + dst->msg.upequipCircuit.cic.iei = AIFG_IE_ID_BM_CIC; + dst->msg.upequipCircuit.cic.ptr = src+offset; + offset += 2; + + //Circuit Identity Code List + if(src[offset] != AIFG_IEI_BM_CICLIST) + goto ERR_PROC; + offset++; + dst->msg.upequipCircuit.cicList.iei = AIFG_IE_ID_BM_CICLIST; + dst->msg.upequipCircuit.cicList.ptr = src+offset; + offset += src[offset] + 1; + + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//LOAD INDICATION +int aifg_msg_rv_loadInd(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.loadInd), 0, sizeof(dst->msg.loadInd)); + + //Time Indication - M + if(src[offset] != AIFG_IEI_BM_TIMEIND) + goto ERR_PROC; + offset++; + dst->msg.loadInd.timeInd.iei = AIFG_IE_ID_BM_TIMEIND; + dst->msg.loadInd.timeInd.ptr = src+offset; + offset++; + + //Cell Identifier - M + if(src[offset] != AIFG_IEI_BM_CELLID) + goto ERR_PROC; + offset++; + dst->msg.loadInd.cellId.iei = AIFG_IE_ID_BM_CELLID; + dst->msg.loadInd.cellId.ptr = src+offset; + offset += src[offset] + 1; + + //Cell Identifier List - M + if(src[offset] != AIFG_IEI_BM_CELLIDLIST) + goto ERR_PROC; + offset++; + dst->msg.loadInd.cellIdList.iei = AIFG_IE_ID_BM_CELLIDLIST; + dst->msg.loadInd.cellIdList.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + + //Resource Situation + if(src[offset] == AIFG_IEI_BM_RESOURCESITUATION){ + offset++; + dst->msg.loadInd.resrcSit.iei = AIFG_IE_ID_BM_RESOURCESITUATION; + dst->msg.loadInd.resrcSit.ptr = src+offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Cause + if(src[offset] == AIFG_IEI_BM_CAUSE){ + offset++; + dst->msg.loadInd.cause.iei = AIFG_IE_ID_BM_CAUSE; + dst->msg.loadInd.cause.ptr = src+offset; + offset += src[offset] + 1; + } + +FINISH: + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//SUSPEND +int aifg_msg_rv_suspend(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.suspend), 0, sizeof(dst->msg.suspend)); + + //DLCI - M + if(src[offset] != AIFG_IEI_BM_DLCI) + goto ERR_PROC; + offset++; + dst->msg.sapi_n_rej.dlci.iei = AIFG_IE_ID_BM_DLCI; + dst->msg.sapi_n_rej.dlci.ptr = src+offset; + offset++; + + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//LSA INFORMATION +int aifg_msg_rv_lsaInfo(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.lsaInfo), 0, sizeof(dst->msg.lsaInfo)); + + //LSA Information + if(src[offset] != AIFG_IEI_BM_LSAINFO) + goto ERR_PROC; + offset++; + dst->msg.lsaInfo.lsaInfo.iei = AIFG_IE_ID_BM_LSAINFO; + dst->msg.lsaInfo.lsaInfo.ptr = src+offset; + offset += src[offset] + 1; + + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//Location Information Command +int aifg_msg_rv_locInfoCmd(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.locInfoCmd), 0, sizeof(dst->msg.locInfoCmd)); + + //Location Information + if(src[offset] != AIFG_IEI_BM_LOCATIONINFO) + goto ERR_PROC; + offset++; + dst->msg.locInfoCmd.locInfo.iei = AIFG_IE_ID_BM_LOCATIONINFO; + dst->msg.locInfoCmd.locInfo.ptr = src+offset; + offset += src[offset] + 1; + + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//Location Information Report +int aifg_msg_rv_locInfoReport(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.locInfoReport), 0, sizeof(dst->msg.locInfoReport)); + + if(src[offset] == AIFG_IEI_BM_LOCATIONINFO){ + //Location Information + offset++; + dst->msg.locInfoReport.locInfo.iei = AIFG_IE_ID_BM_LOCATIONINFO; + dst->msg.locInfoReport.locInfo.ptr = src+offset; + offset += src[offset] + 1; + } + else if(src[offset] == AIFG_IEI_BM_CAUSE){ + //Cause + offset++; + dst->msg.confusion.cause.iei = AIFG_IE_ID_BM_CAUSE; + dst->msg.confusion.cause.ptr = src+offset; + offset += src[offset] + 1; + } + else + goto ERR_PROC; + + return AIFG_SUCCEED; + +ERR_PROC: + aifg_event = AIFG_ERR_ERROR_MSG; + return AIFG_ERROR; +} + +//Authentication request +int aifg_msg_rv_authReq(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.authReq), 0, sizeof(dst->msg.authReq)); + + //Ciphering key sequence number - M + dst->msg.authReq.cipherKeySeq.iei = AIFG_IE_ID_DT_CIPHERKEY; + dst->msg.authReq.cipherKeySeq.ptr = src+offset; + dst->msg.authReq.cipherKeySeq.hi_lo_flag = AIFG_LOW_BITS; + offset++; + + //Auth. parameter RAND - M + dst->msg.authReq.authParamRAND.iei = AIFG_IE_ID_DT_AUTHRAND; + dst->msg.authReq.authParamRAND.ptr = src+offset; + + return AIFG_SUCCEED; +} + +//Authentication response +int aifg_msg_rv_authResp(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + memset(&(dst->msg.authResp), 0, sizeof(dst->msg.authResp)); + + //Auth. parameter SRES - M + dst->msg.authResp.authParamSRES.iei = AIFG_IE_ID_DT_AUTHSRES; + dst->msg.authResp.authParamSRES.ptr = src; + + return AIFG_SUCCEED; +} + +//CM service request +int aifg_msg_rv_cmReq(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.cmReq), 0, sizeof(dst->msg.cmReq)); + + //CM service type + dst->msg.cmReq.type.iei = AIFG_IE_ID_DT_CMTYPE; + dst->msg.cmReq.type.ptr = src + offset; + dst->msg.cmReq.type.hi_lo_flag = AIFG_LOW_BITS; + + //Ciphering key sequence number - M + dst->msg.cmReq.cipherKeySeq.iei = AIFG_IE_ID_DT_CIPHERKEY; + dst->msg.cmReq.cipherKeySeq.ptr = src + offset; + dst->msg.cmReq.cipherKeySeq.hi_lo_flag = AIFG_HIGH_BITS; + offset++; + + //Mobile station classmark 2 - M + dst->msg.cmReq.cm2.iei = AIFG_IE_ID_DT_MSCM2; + dst->msg.cmReq.cm2.ptr = src + offset; + offset += src[offset] + 1; + + //Mobile identity - M + dst->msg.cmReq.mobileId.iei = AIFG_IE_ID_DT_MOBILEID; + dst->msg.cmReq.mobileId.ptr = src + offset; + offset += src[offset] + 1; + + //Priority + if((src[offset]&0xF0) == AIFG_IEI_DT_PRIORITYLEVEL){ + dst->msg.cmReq.priority.iei = AIFG_IE_ID_DT_PRIORITYLEVEL; + dst->msg.cmReq.priority.ptr = src + offset; + } + return AIFG_SUCCEED; +} + +//CM service reject +int aifg_msg_rv_cmRej(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + memset(&(dst->msg.cmRej), 0, sizeof(dst->msg.cmRej)); + + //Reject cause - M + dst->msg.cmRej.rejCause.iei = AIFG_IE_ID_DT_REJCAUSE; + dst->msg.cmRej.rejCause.ptr = src; + + return AIFG_SUCCEED; +} + +//Abort +//The same as CM service reject + +//Identity request +int aifg_msg_rv_idReq(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + memset(&(dst->msg.idReq), 0, sizeof(dst->msg.idReq)); + + //CM service type + dst->msg.idReq.type.iei = AIFG_IE_ID_DT_IDTYPE; + dst->msg.idReq.type.ptr = src; + dst->msg.idReq.type.hi_lo_flag = AIFG_LOW_BITS; + + return AIFG_SUCCEED; +} + +//Identity response +int aifg_msg_rv_idResp(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + memset(&(dst->msg.idResp), 0, sizeof(dst->msg.idResp)); + + //Mobile identity - M + dst->msg.idResp.mobileId.iei = AIFG_IE_ID_DT_MOBILEID; + dst->msg.idResp.mobileId.ptr = src; + + return AIFG_SUCCEED; +} + +//Location updating accept +int aifg_msg_rv_luAccept(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.luAccept), 0, sizeof(dst->msg.luAccept)); + + //Location area identification - M + dst->msg.luAccept.lai.iei = AIFG_IE_ID_DT_LAI; + dst->msg.luAccept.lai.ptr = src; + offset += 5; + if(offset >= msg_len) goto FINISH; + + //Mobile identity + if(src[offset] == AIFG_IEI_DT_MOBILEID){ + offset++; //skip iei + dst->msg.luAccept.mobileId.iei = AIFG_IE_ID_DT_MOBILEID; + dst->msg.luAccept.mobileId.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Follow on proceed + if(src[offset] == AIFG_IEI_DT_FLONPROCEED){ + dst->msg.luAccept.followOnProc.iei = AIFG_IE_ID_DT_FLONPROCEED; + dst->msg.luAccept.followOnProc.ptr = src + offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //CTS permission + if(src[offset] == AIFG_IEI_DT_CTS){ + offset++; //skip iei + dst->msg.luAccept.ctsPerm.iei = AIFG_IE_ID_DT_CTS; + dst->msg.luAccept.ctsPerm.ptr = src + offset; + } + +FINISH: + return AIFG_SUCCEED; +} + +//Location updating reject +//The same as CM service reject + +//MM information +int aifg_msg_rv_mmInfo(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.mmInfo), 0, sizeof(dst->msg.mmInfo)); + if(offset >= msg_len) goto FINISH; + + //Full name for network + if(src[offset] == AIFG_IEI_DT_FULL_NWNAME){ + offset++; //skip iei + dst->msg.mmInfo.fullNetworkName.iei = AIFG_IE_ID_DT_FULL_NWNAME; + dst->msg.mmInfo.fullNetworkName.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Short name for network + if(src[offset] == AIFG_IEI_DT_SHORT_NWNAME){ + offset++; //skip iei + dst->msg.mmInfo.shortNetworkName.iei = AIFG_IE_ID_DT_SHORT_NWNAME; + dst->msg.mmInfo.shortNetworkName.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Universal time zone + if(src[offset] == AIFG_IEI_DT_TIMEZONE){ + offset++; //skip iei + dst->msg.mmInfo.timeZone.iei = AIFG_IE_ID_DT_TIMEZONE; + dst->msg.mmInfo.timeZone.ptr = src + offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Network time and time zone + if(src[offset] == AIFG_IEI_DT_TZTIME){ + offset++; //skip iei + dst->msg.mmInfo.timeZoneAndTime.iei = AIFG_IE_ID_DT_TZTIME; + dst->msg.mmInfo.timeZoneAndTime.ptr = src + offset; + offset += 7; + if(offset >= msg_len) goto FINISH; + } + + //LSA Identity + if(src[offset] == AIFG_IEI_DT_LSAID){ + offset++; //skip iei + dst->msg.mmInfo.lsaId.iei = AIFG_IE_ID_DT_LSAID; + dst->msg.mmInfo.lsaId.ptr = src + offset; + } + +FINISH: + return AIFG_SUCCEED; +} + +//MM status +//The same as CM service reject + +//TMSI reallocation command +int aifg_msg_rv_tmsiRealloc(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.tmsiReallocCmd), 0, sizeof(dst->msg.tmsiReallocCmd)); + + //Location area identification - M + dst->msg.tmsiReallocCmd.lai.iei = AIFG_IE_ID_DT_LAI; + dst->msg.tmsiReallocCmd.lai.ptr = src + offset; + offset += 5; + + //Mobile identity - M + dst->msg.tmsiReallocCmd.mobileId.iei = AIFG_IE_ID_DT_MOBILEID; + dst->msg.tmsiReallocCmd.mobileId.ptr = src + offset; + + return AIFG_SUCCEED; +} + +//Alerting +int aifg_msg_rv_alert(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.alert), 0, sizeof(dst->msg.alert)); + if(offset >= msg_len) goto FINISH; + + //Facility + if(src[offset] == AIFG_IEI_DT_FACILITY){ + offset++; //Skip iei + dst->msg.alert.facility.iei = AIFG_IE_ID_DT_FACILITY; + dst->msg.alert.facility.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Progress indicator + if(src[offset] == AIFG_IEI_DT_PROGIND){ + offset++; //Skip iei + dst->msg.alert.progressInd.iei = AIFG_IE_ID_DT_PROGIND; + dst->msg.alert.progressInd.ptr = src + offset; + offset += 3; + if(offset >= msg_len) goto FINISH; + } + + //User-user + if(src[offset] == AIFG_IEI_DT_USERUSER){ + offset++; //Skip iei + dst->msg.alert.user_user.iei = AIFG_IE_ID_DT_USERUSER; + dst->msg.alert.user_user.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //SS version + if(src[offset] == AIFG_IEI_DT_SSVER){ + offset++; //Skip iei + dst->msg.alert.ssVer.iei = AIFG_IE_ID_DT_SSVER; + dst->msg.alert.ssVer.ptr = src + offset; + } + +FINISH: + return AIFG_SUCCEED; +} + +//Call confirmed +int aifg_msg_rv_callConfirm(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.callConfirm), 0, sizeof(dst->msg.callConfirm)); + if(offset >= msg_len) goto FINISH; + + //Repeat Indicator + if((src[offset] & 0xF0) == AIFG_IEI_DT_REPEATIND){ + dst->msg.callConfirm.reptInd.iei = AIFG_IE_ID_DT_REPEATIND; + dst->msg.callConfirm.reptInd.ptr = src + offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Bearer capability 1 + if(src[offset] == AIFG_IEI_DT_BEARERCAP){ + offset++; //Skip iei + dst->msg.callConfirm.bearCap1.iei = AIFG_IE_ID_DT_BEARERCAP; + dst->msg.callConfirm.bearCap1.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Bearer capability 2 + if(src[offset] == AIFG_IEI_DT_BEARERCAP){ + offset++; //Skip iei + dst->msg.callConfirm.bearCap2.iei = AIFG_IE_ID_DT_BEARERCAP; + dst->msg.callConfirm.bearCap2.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Cause + if(src[offset] == AIFG_IEI_DT_CAUSE){ + offset++; //Skip iei + dst->msg.callConfirm.cause.iei = AIFG_IE_ID_DT_CAUSE; + dst->msg.callConfirm.cause.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //CC Capabilities + if(src[offset] == AIFG_IEI_DT_CCCAP){ + offset++; //Skip iei + dst->msg.callConfirm.ccCap.iei = AIFG_IE_ID_DT_CCCAP; + dst->msg.callConfirm.ccCap.ptr = src + offset; + } + +FINISH: + return AIFG_SUCCEED; +} + +//Call proceeding +int aifg_msg_rv_callProceed(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.callProceed), 0, sizeof(dst->msg.callProceed)); + if(offset >= msg_len) goto FINISH; + + //Repeat Indicator + if((src[offset] & 0xF0) == AIFG_IEI_DT_REPEATIND){ + dst->msg.callProceed.reptInd.iei = AIFG_IE_ID_DT_REPEATIND; + dst->msg.callProceed.reptInd.ptr = src + offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Bearer capability 1 + if(src[offset] == AIFG_IEI_DT_BEARERCAP){ + offset++; //Skip iei + dst->msg.callProceed.bearCap1.iei = AIFG_IE_ID_DT_BEARERCAP; + dst->msg.callProceed.bearCap1.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Bearer capability 2 + if(src[offset] == AIFG_IEI_DT_BEARERCAP){ + offset++; //Skip iei + dst->msg.callProceed.bearCap2.iei = AIFG_IE_ID_DT_BEARERCAP; + dst->msg.callProceed.bearCap2.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Facility + if(src[offset] == AIFG_IEI_DT_FACILITY){ + offset++; //Skip iei + dst->msg.callProceed.facility.iei = AIFG_IE_ID_DT_FACILITY; + dst->msg.callProceed.facility.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Progress indicator + if(src[offset] == AIFG_IEI_DT_PROGIND){ + offset++; //Skip iei + dst->msg.callProceed.progressInd.iei = AIFG_IE_ID_DT_PROGIND; + dst->msg.callProceed.progressInd.ptr = src + offset; + offset += 3; + if(offset >= msg_len) goto FINISH; + } + + //Priority granted + if((src[offset] & 0xF0) == AIFG_IEI_DT_PRIORITYLEVEL){ + dst->msg.callProceed.priority.iei = AIFG_IE_ID_DT_PRIORITYLEVEL; + dst->msg.callProceed.priority.ptr = src + offset; + } + +FINISH: + return AIFG_SUCCEED; +} + +//Congestion control +int aifg_msg_rv_congestCtrl(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.congestCtrl), 0, sizeof(dst->msg.congestCtrl)); + + //Congestion level + dst->msg.congestCtrl.congestLev.iei = AIFG_IE_ID_DT_CONGESTLEVEL; + dst->msg.congestCtrl.congestLev.ptr = src + offset; + dst->msg.congestCtrl.congestLev.hi_lo_flag = AIFG_LOW_BITS; + offset++; + if(offset >= msg_len) goto FINISH; + + //Cause + if(src[offset] == AIFG_IEI_DT_CAUSE){ + offset++; //Skip iei + dst->msg.congestCtrl.cause.iei = AIFG_IE_ID_DT_CAUSE; + dst->msg.congestCtrl.cause.ptr = src + offset; + offset += src[offset] + 1; + } + +FINISH: + return AIFG_SUCCEED; +} + +//Connect +int aifg_msg_rv_connect(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.connect), 0, sizeof(dst->msg.connect)); + if(offset >= msg_len) goto FINISH; + + //Facility + if(src[offset] == AIFG_IEI_DT_FACILITY){ + offset++; //Skip iei + dst->msg.connect.facility.iei = AIFG_IE_ID_DT_FACILITY; + dst->msg.connect.facility.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Progress indicator + if(src[offset] == AIFG_IEI_DT_PROGIND){ + offset++; //Skip iei + dst->msg.connect.progressInd.iei = AIFG_IE_ID_DT_PROGIND; + dst->msg.connect.progressInd.ptr = src + offset; + offset += 3; + if(offset >= msg_len) goto FINISH; + } + + //Connected number + if(src[offset] == AIFG_IEI_DT_CONNNUM){ + offset++; //Skip iei + dst->msg.connect.connNum.iei = AIFG_IE_ID_DT_CONNNUM; + dst->msg.connect.connNum.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Connected subaddress + if(src[offset] == AIFG_IEI_DT_CONNSUBADDR){ + offset++; //Skip iei + dst->msg.connect.connSubaddr.iei = AIFG_IE_ID_DT_CONNSUBADDR; + dst->msg.connect.connSubaddr.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //User-user + if(src[offset] == AIFG_IEI_DT_USERUSER){ + offset++; //Skip iei + dst->msg.connect.user_user.iei = AIFG_IE_ID_DT_USERUSER; + dst->msg.connect.user_user.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //SS version + if(src[offset] == AIFG_IEI_DT_SSVER){ + offset++; //Skip iei + dst->msg.connect.ssVer.iei = AIFG_IE_ID_DT_SSVER; + dst->msg.connect.ssVer.ptr = src + offset; + } + +FINISH: + return AIFG_SUCCEED; +} + +//Disconnect +int aifg_msg_rv_disconnect(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.disconnect), 0, sizeof(dst->msg.disconnect)); + + //Cause + dst->msg.disconnect.cause.iei = AIFG_IE_ID_DT_CAUSE; + dst->msg.disconnect.cause.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + + //Facility + if(src[offset] == AIFG_IEI_DT_FACILITY){ + offset++; //Skip iei + dst->msg.disconnect.facility.iei = AIFG_IE_ID_DT_FACILITY; + dst->msg.disconnect.facility.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Progress indicator + if(src[offset] == AIFG_IEI_DT_PROGIND){ + offset++; //Skip iei + dst->msg.disconnect.progressInd.iei = AIFG_IE_ID_DT_PROGIND; + dst->msg.disconnect.progressInd.ptr = src + offset; + offset += 3; + if(offset >= msg_len) goto FINISH; + } + + //User-user + if(src[offset] == AIFG_IEI_DT_USERUSER){ + offset++; //Skip iei + dst->msg.disconnect.user_user.iei = AIFG_IE_ID_DT_USERUSER; + dst->msg.disconnect.user_user.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //SS version + if(src[offset] == AIFG_IEI_DT_SSVER){ + offset++; //Skip iei + dst->msg.disconnect.ssVer.iei = AIFG_IE_ID_DT_SSVER; + dst->msg.disconnect.ssVer.ptr = src + offset; + } + +FINISH: + return AIFG_SUCCEED; +} + +//EMERGENCY SETUP +int aifg_msg_rv_eSetup(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.eSetup), 0, sizeof(dst->msg.eSetup)); + if(offset >= msg_len) goto FINISH; + + //Bearer capability + if(src[offset] == AIFG_IEI_DT_BEARERCAP){ + offset++; //Skip iei + dst->msg.eSetup.bearCap.iei = AIFG_IE_ID_DT_BEARERCAP; + dst->msg.eSetup.bearCap.ptr = src + offset; + } + +FINISH: + return AIFG_SUCCEED; +} + +//Facility +int aifg_msg_rv_facility(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.facility), 0, sizeof(dst->msg.facility)); + + //Facility - M + dst->msg.facility.facility.iei = AIFG_IE_ID_DT_FACILITY; + dst->msg.facility.facility.ptr = src; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + + //SS version + if(src[offset] == AIFG_IEI_DT_SSVER){ + offset++; //Skip iei + dst->msg.facility.ssVer.iei = AIFG_IE_ID_DT_SSVER; + dst->msg.facility.ssVer.ptr = src + offset; + } + +FINISH: + return AIFG_SUCCEED; +} + +//Hold Reject +int aifg_msg_rv_holdRej(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + memset(&(dst->msg.holdRej), 0, sizeof(dst->msg.holdRej)); + + //Cause + dst->msg.holdRej.cause.iei = AIFG_IE_ID_DT_CAUSE; + dst->msg.holdRej.cause.ptr = src; + + return AIFG_SUCCEED; +} + + +//Modify +int aifg_msg_rv_modify(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.modify), 0, sizeof(dst->msg.modify)); + + //Bearer capability - M + dst->msg.modify.bearCap.iei = AIFG_IE_ID_DT_BEARERCAP; + dst->msg.modify.bearCap.ptr = src + offset; + offset += src[offset] + 1; + + //Low layer comp. + if(src[offset] == AIFG_IEI_DT_LOWCOM){ + offset++; //Skip iei + dst->msg.modify.lowLComp.iei = AIFG_IE_ID_DT_LOWCOM; + dst->msg.modify.lowLComp.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //High layer comp. + if(src[offset] == AIFG_IEI_DT_HIGHCOM){ + offset++; //Skip iei + dst->msg.modify.highLComp.iei = AIFG_IE_ID_DT_HIGHCOM; + dst->msg.modify.highLComp.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Reverse call setup direction + if(src[offset] == AIFG_IEI_DT_REVCALLDIR){ + offset++; //Skip iei + dst->msg.modify.revCallSetDir.iei = AIFG_IE_ID_DT_REVCALLDIR; + dst->msg.modify.revCallSetDir.ptr = src; + } + +FINISH: + return AIFG_SUCCEED; +} + +//Modify complete +//The same as modify + +//Modify reject +int aifg_msg_rv_modifyRej(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.modifyRej), 0, sizeof(dst->msg.modifyRej)); + + //Bearer capability - M + dst->msg.modifyRej.bearCap.iei = AIFG_IE_ID_DT_BEARERCAP; + dst->msg.modifyRej.bearCap.ptr = src + offset; + offset += src[offset] + 1; + + //Cause - M + dst->msg.modifyRej.cause.iei = AIFG_IE_ID_DT_CAUSE; + dst->msg.modifyRej.cause.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + + //Low layer comp. + if(src[offset] == AIFG_IEI_DT_LOWCOM){ + offset++; //Skip iei + dst->msg.modifyRej.lowLComp.iei = AIFG_IE_ID_DT_LOWCOM; + dst->msg.modifyRej.lowLComp.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //High layer comp. + if(src[offset] == AIFG_IEI_DT_HIGHCOM){ + offset++; //Skip iei + dst->msg.modifyRej.highLComp.iei = AIFG_IE_ID_DT_HIGHCOM; + dst->msg.modifyRej.highLComp.ptr = src + offset; + offset += src[offset] + 1; + } + +FINISH: + return AIFG_SUCCEED; +} + +//Notify +int aifg_msg_rv_notify(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + memset(&(dst->msg.notify), 0, sizeof(dst->msg.notify)); + + //Notification indicator + dst->msg.notify.notifyInd.iei = AIFG_IE_ID_DT_NOTIIND; + dst->msg.notify.notifyInd.ptr = src; + + return AIFG_SUCCEED; +} + +//Progress +int aifg_msg_rv_progress(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.progress), 0, sizeof(dst->msg.progress)); + + //Progress indicator - M + dst->msg.progress.progressInd.iei = AIFG_IE_ID_DT_PROGIND; + dst->msg.progress.progressInd.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + + //User-user + if(src[offset] == AIFG_IEI_DT_USERUSER){ + offset++; //Skip iei + dst->msg.progress.user_user.iei = AIFG_IE_ID_DT_USERUSER; + dst->msg.progress.user_user.ptr = src + offset; + } + +FINISH: + return AIFG_SUCCEED; +} + +//Release +int aifg_msg_rv_release(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.release), 0, sizeof(dst->msg.release)); + if(offset >= msg_len) goto FINISH; + + //Cause + if(src[offset] == AIFG_IEI_DT_CAUSE){ + offset++; //Skip iei + dst->msg.release.cause1.iei = AIFG_IE_ID_DT_CAUSE; + dst->msg.release.cause1.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Second cause + if(src[offset] == AIFG_IEI_DT_CAUSE){ + offset++; //Skip iei + dst->msg.release.cause2.iei = AIFG_IE_ID_DT_CAUSE; + dst->msg.release.cause2.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Facility + if(src[offset] == AIFG_IEI_DT_FACILITY){ + offset++; //Skip iei + dst->msg.release.facility.iei = AIFG_IE_ID_DT_FACILITY; + dst->msg.release.facility.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //User-user + if(src[offset] == AIFG_IEI_DT_USERUSER){ + offset++; //Skip iei + dst->msg.release.user_user.iei = AIFG_IE_ID_DT_USERUSER; + dst->msg.release.user_user.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //SS version + if(src[offset] == AIFG_IEI_DT_SSVER){ + offset++; //Skip iei + dst->msg.release.ssVer.iei = AIFG_IE_ID_DT_SSVER; + dst->msg.release.ssVer.ptr = src + offset; + } + +FINISH: + return AIFG_SUCCEED; +} + +//Release complete +int aifg_msg_rv_releaseComp(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.releaseComp), 0, sizeof(dst->msg.releaseComp)); + if(offset >= msg_len) goto FINISH; + + //Cause + if(src[offset] == AIFG_IEI_DT_CAUSE){ + offset++; //Skip iei + dst->msg.releaseComp.cause.iei = AIFG_IE_ID_DT_CAUSE; + dst->msg.releaseComp.cause.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Facility + if(src[offset] == AIFG_IEI_DT_FACILITY){ + offset++; //Skip iei + dst->msg.releaseComp.facility.iei = AIFG_IE_ID_DT_FACILITY; + dst->msg.releaseComp.facility.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //User-user + if(src[offset] == AIFG_IEI_DT_USERUSER){ + offset++; //Skip iei + dst->msg.releaseComp.user_user.iei = AIFG_IE_ID_DT_USERUSER; + dst->msg.releaseComp.user_user.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //SS version + if(src[offset] == AIFG_IEI_DT_SSVER){ + offset++; //Skip iei + dst->msg.releaseComp.ssVer.iei = AIFG_IE_ID_DT_SSVER; + dst->msg.releaseComp.ssVer.ptr = src + offset; + } + +FINISH: + return AIFG_SUCCEED; +} + +//Retrieve reject +//The same as Hold Reject + + +//Setup +int aifg_msg_rv_setup(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.setup), 0, sizeof(dst->msg.setup)); + if(offset >= msg_len) goto FINISH; + + //BC repeat indicator + if((src[offset] & 0xF0) == AIFG_IEI_DT_REPEATIND){ + dst->msg.setup.reptInd_bc.iei = AIFG_IE_ID_DT_REPEATIND; + dst->msg.setup.reptInd_bc.ptr = src + offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Bearer capability 1 + if(src[offset] == AIFG_IEI_DT_BEARERCAP){ + offset++; //Skip iei + dst->msg.setup.bearCap1.iei = AIFG_IE_ID_DT_BEARERCAP; + dst->msg.setup.bearCap1.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Bearer capability 2 + if(src[offset] == AIFG_IEI_DT_BEARERCAP){ + offset++; //Skip iei + dst->msg.setup.bearCap2.iei = AIFG_IE_ID_DT_BEARERCAP; + dst->msg.setup.bearCap2.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Facility + if(src[offset] == AIFG_IEI_DT_FACILITY){ + offset++; //Skip iei + dst->msg.setup.facility.iei = AIFG_IE_ID_DT_FACILITY; + dst->msg.setup.facility.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Progress indicator + if(src[offset] == AIFG_IEI_DT_PROGIND){ + offset++; //Skip iei + dst->msg.setup.progressInd.iei = AIFG_IE_ID_DT_PROGIND; + dst->msg.setup.progressInd.ptr = src + offset; + offset += 3; + if(offset >= msg_len) goto FINISH; + } + + //Signal + if(src[offset] == AIFG_IEI_DT_SIGNAL){ + offset++; //Skip iei + dst->msg.setup.signal.iei = AIFG_IE_ID_DT_SIGNAL; + dst->msg.setup.signal.ptr = src + offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Calling party BCD number + if(src[offset] == AIFG_IEI_DT_CALLERBCD){ + offset++; //Skip iei + dst->msg.setup.callingBCD.iei = AIFG_IE_ID_DT_CALLERBCD; + dst->msg.setup.callingBCD.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Calling party subaddress + if(src[offset] == AIFG_IEI_DT_CALLERSUBADDR){ + offset++; //Skip iei + dst->msg.setup.callingSubaddr.iei = AIFG_IE_ID_DT_CALLERSUBADDR; + dst->msg.setup.callingSubaddr.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Called party BCD number + if(src[offset] == AIFG_IEI_DT_CALLEDBCD){ + offset++; //Skip iei + dst->msg.setup.calledBCD.iei = AIFG_IE_ID_DT_CALLEDBCD; + dst->msg.setup.calledBCD.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Called party subaddress + if(src[offset] == AIFG_IEI_DT_CALLEDSUBADDR){ + offset++; //Skip iei + dst->msg.setup.calledSubaddr.iei = AIFG_IE_ID_DT_CALLEDSUBADDR; + dst->msg.setup.calledSubaddr.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Redirecting party BCD number + if(src[offset] == AIFG_IEI_DT_REDIRBCD){ + offset++; //Skip iei + dst->msg.setup.redirBCD.iei = AIFG_IE_ID_DT_REDIRBCD; + dst->msg.setup.redirBCD.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Redirecting party sub-address + if(src[offset] == AIFG_IEI_DT_REDIRSUBADDR){ + offset++; //Skip iei + dst->msg.setup.redirSubaddr.iei = AIFG_IE_ID_DT_REDIRSUBADDR; + dst->msg.setup.redirSubaddr.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //LLC repeat indicator + if((src[offset] & 0xF0) == AIFG_IEI_DT_REPEATIND){ + dst->msg.setup.reptInd_llc.iei = AIFG_IE_ID_DT_REPEATIND; + dst->msg.setup.reptInd_llc.ptr = src + offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Low layer comp 1 + if(src[offset] == AIFG_IEI_DT_LOWCOM){ + offset++; //Skip iei + dst->msg.setup.lowLComp1.iei = AIFG_IE_ID_DT_LOWCOM; + dst->msg.setup.lowLComp1.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Low layer comp 2 + if(src[offset] == AIFG_IEI_DT_LOWCOM){ + offset++; //Skip iei + dst->msg.setup.lowLComp2.iei = AIFG_IE_ID_DT_LOWCOM; + dst->msg.setup.lowLComp2.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //HLC repeat indicator + if((src[offset] & 0xF0) == AIFG_IEI_DT_REPEATIND){ + dst->msg.setup.reptInd_hlc.iei = AIFG_IE_ID_DT_REPEATIND; + dst->msg.setup.reptInd_hlc.ptr = src + offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //High layer comp 1 + if(src[offset] == AIFG_IEI_DT_HIGHCOM){ + offset++; //Skip iei + dst->msg.setup.highLComp1.iei = AIFG_IE_ID_DT_HIGHCOM; + dst->msg.setup.highLComp1.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //High layer comp 2 + if(src[offset] == AIFG_IEI_DT_HIGHCOM){ + offset++; //Skip iei + dst->msg.setup.highLComp2.iei = AIFG_IE_ID_DT_HIGHCOM; + dst->msg.setup.highLComp2.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //User-user + if(src[offset] == AIFG_IEI_DT_USERUSER){ + offset++; //Skip iei + dst->msg.setup.user_user.iei = AIFG_IE_ID_DT_USERUSER; + dst->msg.setup.user_user.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + } + + //Priority + if((src[offset] & 0xF0) == AIFG_IEI_DT_PRIORITYLEVEL){ + dst->msg.setup.priority.iei = AIFG_IE_ID_DT_PRIORITYLEVEL; + dst->msg.setup.priority.ptr = src + offset; + offset++; + if(offset >= msg_len) goto FINISH; + } + + //Alert + if(src[offset] == AIFG_IEI_DT_ALERTPATTERN){ + offset++; //Skip iei + dst->msg.setup.alert.iei = AIFG_IE_ID_DT_ALERTPATTERN; + dst->msg.setup.alert.ptr = src + offset; + offset += src[offset] + 1; + } + + //SS version + if(src[offset] == AIFG_IEI_DT_SSVER){ + offset++; //Skip iei + dst->msg.setup.ssVer.iei = AIFG_IE_ID_DT_SSVER; + dst->msg.setup.ssVer.ptr = src + offset; + offset += src[offset] + 1; + } + + //CLIR suppression + if(src[offset] == AIFG_IEI_DT_CLIRSUP){ + dst->msg.setup.clirSuppr.iei = AIFG_IE_ID_DT_CLIRSUP; + dst->msg.setup.clirSuppr.ptr = src + offset; + offset++; + } + + //CLIR invocation + if(src[offset] == AIFG_IEI_DT_CLIRIVO){ + dst->msg.setup.clirInvo.iei = AIFG_IE_ID_DT_CLIRIVO; + dst->msg.setup.clirInvo.ptr = src + offset; + offset++; + } + + //CC capabilities + if(src[offset] == AIFG_IEI_DT_CCCAP){ + dst->msg.setup.ccCap.iei = AIFG_IE_ID_DT_CCCAP; + dst->msg.setup.ccCap.ptr = src + offset; + } + +FINISH: + return AIFG_SUCCEED; +} + +//Start DTMF +int aifg_msg_rv_startDTMF(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + memset(&(dst->msg.startDTMF), 0, sizeof(dst->msg.startDTMF)); + + //Keypad facility - M + dst->msg.startDTMF.keypadFacility.iei = AIFG_IE_ID_DT_KEYPAD; + dst->msg.startDTMF.keypadFacility.ptr = src + 1; //skip IEI + + return AIFG_SUCCEED; +} + +//Start DTMF Acknowledge +//The same as Start DTMF + +//Start DTMF reject +//The same as Hold Reject + +//Status +int aifg_msg_rv_status(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.status), 0, sizeof(dst->msg.status)); + + //Cause - M + dst->msg.status.cause.iei = AIFG_IE_ID_DT_CAUSE; + dst->msg.status.cause.ptr = src + offset; + offset += src[offset] + 1; + + //Call state - M + dst->msg.status.callState.iei = AIFG_IE_ID_DT_CALLSTAT; + dst->msg.status.callState.ptr = src + offset; + offset++; + if(offset >= msg_len) goto FINISH; + + //Auxiliary states + if(src[offset] == AIFG_IEI_DT_AUXSTAT){ + offset++; //Skip iei + dst->msg.status.auxState.iei = AIFG_IE_ID_DT_AUXSTAT; + dst->msg.status.auxState.ptr = src + offset; + } + +FINISH: + return AIFG_SUCCEED; +} + +//User information +int aifg_msg_rv_userInfo(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.userInfo), 0, sizeof(dst->msg.userInfo)); + + //User-user - M + dst->msg.userInfo.user_user.iei = AIFG_IE_ID_DT_USERUSER; + dst->msg.userInfo.user_user.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) goto FINISH; + + //More data + if(src[offset] == AIFG_IEI_DT_MOREDATA){ + offset++; //Skip iei + dst->msg.userInfo.moreDate.iei = AIFG_IE_ID_DT_MOREDATA; + dst->msg.userInfo.moreDate.ptr = src + offset; + } + +FINISH: + return AIFG_SUCCEED; +} + +//Facility SS +int aifg_msg_rv_facilitySS(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + memset(&(dst->msg.facilitySS), 0, sizeof(dst->msg.facilitySS)); + + //Facility + dst->msg.facilitySS.facility.iei = AIFG_IE_ID_DT_FACILITY; + dst->msg.facilitySS.facility.ptr = src; + + return AIFG_SUCCEED; +} + +//Release Complete SS +int aifg_msg_rv_releaseCompSS(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.releaseCompSS), 0, sizeof(dst->msg.releaseCompSS)); + + //Cause + if(src[offset] == AIFG_IEI_DT_CAUSE){ + offset++; //Skip iei + dst->msg.releaseCompSS.cause.iei = AIFG_IE_ID_DT_CAUSE; + dst->msg.releaseCompSS.cause.ptr = src + offset; + } + + //Facility + if(src[offset] == AIFG_IEI_DT_FACILITY){ + offset++; //Skip iei + dst->msg.releaseCompSS.facility.iei = AIFG_IE_ID_DT_FACILITY; + dst->msg.releaseCompSS.facility.ptr = src + offset; + } + + return AIFG_SUCCEED; +} + +//Register +int aifg_msg_rv_register(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.registerSS), 0, sizeof(dst->msg.registerSS)); + + //Facility + if(src[offset] != AIFG_IEI_DT_FACILITY) + goto ERR_PROC; + + offset++; //Skip iei + dst->msg.registerSS.facility.iei = AIFG_IE_ID_DT_FACILITY; + dst->msg.registerSS.facility.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) + goto FINISH; + + + //SS version + if(src[offset] == AIFG_IEI_DT_SSVER){ + offset++; //Skip iei + dst->msg.registerSS.ssVer.iei = AIFG_IE_ID_DT_SSVER; + dst->msg.registerSS.ssVer.ptr = src + offset; + } + +FINISH: + return AIFG_SUCCEED; + +ERR_PROC: + aifg_debug_print(-1, AIFG_ERR_MISS_MANDATORY, dst, 0); + return AIFG_ERROR; +} + +//SMS +//RP DATA +int aifg_msg_rv_rp_data(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.rpData), 0, sizeof(dst->msg.rpData)); + + //reference + dst->msg.rpData.ref = src[offset++]; + + //RP-Originator Address + dst->msg.rpData.moAddr.iei = AIFG_IE_ID_DT_RP_MO_ADDR; + dst->msg.rpData.moAddr.ptr = src + offset; + offset += src[offset] + 1; + + //RP-Destination Address + dst->msg.rpData.mtAddr.iei = AIFG_IE_ID_DT_RP_MT_ADDR; + dst->msg.rpData.mtAddr.ptr = src + offset; + offset += src[offset] + 1; + + //RP-User Data + dst->msg.rpData.data.iei = AIFG_IE_ID_DT_RP_UD; + dst->msg.rpData.data.ptr = src + offset; + + return AIFG_SUCCEED; +} + +////RP SMMA +int aifg_msg_rv_rp_smma(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + memset(&(dst->msg.rpSMMA), 0, sizeof(dst->msg.rpSMMA)); + + //reference + dst->msg.rpSMMA.ref = src[0]; + return AIFG_SUCCEED; +} + +//RP ACK +int aifg_msg_rv_rp_ack(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.rpAck), 0, sizeof(dst->msg.rpAck)); + + //reference + dst->msg.rpAck.ref = src[offset++]; + if(offset >= msg_len) + goto FINISH; + + //RP-User Data + if(src[offset] == AIFG_IEI_DT_RP_UD){ + dst->msg.rpAck.data.iei = AIFG_IE_ID_DT_RP_UD; + dst->msg.rpAck.data.ptr = src + offset; + } + +FINISH: + return AIFG_SUCCEED; +} + +//RP ERROR +int aifg_msg_rv_rp_error(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len) +{ + int offset = 0; + memset(&(dst->msg.rpError), 0, sizeof(dst->msg.rpError)); + + //reference + dst->msg.rpError.ref = src[offset++]; + + //RP-Cause + dst->msg.rpError.cause.iei = AIFG_IE_ID_DT_RP_CAUSE; + dst->msg.rpError.cause.ptr = src + offset; + offset += src[offset] + 1; + if(offset >= msg_len) + goto FINISH; + + //RP-User Data + if(src[offset] == AIFG_IEI_DT_RP_UD){ + dst->msg.rpError.data.iei = AIFG_IE_ID_DT_RP_UD; + dst->msg.rpError.data.ptr = src + offset; + } + +FINISH: + return AIFG_SUCCEED; +} + +//End of message decode function definition----------------------------------------- + +//Message encode functions definition----------------------------------------------- +//For embedded DTAP messages in BSSMAP message +int aifg_msg_encode_embeded_l3msg(aifg_msg_bm_l3msg *l3msg, BYTE *dst) +{ + int offset = 0; + + assert(l3msg != NULL && dst != NULL); + + switch(l3msg->id){ + case AIFG_MSG_ID_CM_REQUEST: + dst[offset++] = 0x05; //PD + dst[offset++] = AIFG_MSG_T_CM_REQUEST; + + //CM serviece type + assert(l3msg->msg.cmRequest.cmType.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CMTYPE, + (ie_u *)&( l3msg->msg.cmRequest.cmType), dst+offset, AIFG_LOW_BITS); + + //ciphering kye sequence number + assert(l3msg->msg.cmRequest.cipherKey.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CIPHERKEY, + (ie_u *)&( l3msg->msg.cmRequest.cipherKey), dst+offset, AIFG_HIGH_BITS); + + //mobile station classmark2 + assert(l3msg->msg.cmRequest.cmInfo2.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_MSCM2, + (ie_u *)&( l3msg->msg.cmRequest.cmInfo2), dst+offset, 0); + + //mobile identity + assert(l3msg->msg.cmRequest.mobileId.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_MOBILEID, + (ie_u *)&( l3msg->msg.cmRequest.mobileId), dst+offset, 0); + + //priority level + if(l3msg->msg.cmRequest.priority.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_PRIORITYLEVEL, + (ie_u *)&( l3msg->msg.cmRequest.priority), dst+offset, 2); + } + break; + + case AIFG_MSG_ID_LU_REQUEST: + dst[offset++] = 0x05; //PD + dst[offset++] = AIFG_MSG_T_LU_REQUEST; + + //location updating type + assert(l3msg->msg.luRequest.luType.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_LUTYPE, + (ie_u *)&(l3msg->msg.luRequest.luType), dst+offset, 0); + + //ciphering key sequence + assert(l3msg->msg.luRequest.cipherKey.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CIPHERKEY, + (ie_u *)&(l3msg->msg.luRequest.cipherKey), dst+offset, 1); + + //location area identification + assert(l3msg->msg.luRequest.lai.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_LAI, + (ie_u *)&(l3msg->msg.luRequest.lai), dst+offset, 0); + + //mobile station classmark1 + assert(l3msg->msg.luRequest.cmInfo1.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_MSCM1, + (ie_u *)&(l3msg->msg.luRequest.cmInfo1), dst+offset, 0); + + //mobile identity + assert(l3msg->msg.luRequest.mobileId.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_MOBILEID, + (ie_u *)&(l3msg->msg.luRequest.mobileId), dst+offset, 0); + break; + + case AIFG_MSG_ID_CM_REEST_REQUEST: + dst[offset++] = 0x05; //PD + dst[offset++] = AIFG_MSG_T_CM_REEST_REQUEST; + + //ciphering key sequence number + assert(l3msg->msg.cmReEstReq.cipherKey.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CIPHERKEY, + (ie_u *)&(l3msg->msg.cmReEstReq.cipherKey), dst+offset, 0); + offset++; + + //mobile station classmark2 + assert(l3msg->msg.cmReEstReq.cmInfo2.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_MSCM2, + (ie_u *)&(l3msg->msg.cmReEstReq.cmInfo2), dst+offset, 0); + + //mobile identity + assert(l3msg->msg.cmReEstReq.mobileId.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_MOBILEID, + (ie_u *)&(l3msg->msg.cmReEstReq.mobileId), dst+offset, 0); + + //location area identification + if(l3msg->msg.cmReEstReq.lai.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_LAI, + (ie_u *)&(l3msg->msg.cmReEstReq.lai), dst+offset, 2); + } + break; + + case AIFG_MSG_ID_PAGING_RESP: + dst[offset++] = 0x06; //PD + dst[offset++] = AIFG_MSG_T_PAGING_RESP; + + //ciphering key sequence number + assert(l3msg->msg.pagingResp.cipherKey.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CIPHERKEY, + (ie_u *)&(l3msg->msg.pagingResp.cipherKey), dst+offset, 0); + offset++; + + //mobile station classmark2 + assert(l3msg->msg.pagingResp.cmInfo2.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_MSCM2, + (ie_u *)&(l3msg->msg.pagingResp.cmInfo2), dst+offset, 0); + + //mobile identity + assert(l3msg->msg.pagingResp.mobileId.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_MOBILEID, + (ie_u *)&(l3msg->msg.pagingResp.mobileId), dst+offset, 0); + break; + + case AIFG_MSG_ID_IMSI_DETACH_IND: + dst[offset++] = 0x05; //PD + dst[offset++] = AIFG_MSG_T_IMSI_DETACH_IND; + + //mobile station classmark1 + assert(l3msg->msg.imsiDetachInd.cmInfo1.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_MSCM1, + (ie_u *)&(l3msg->msg.imsiDetachInd.cmInfo1), dst+offset, 0); + + //mobile identity + assert(l3msg->msg.imsiDetachInd.mobileId.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_MOBILEID, + (ie_u *)&(l3msg->msg.imsiDetachInd.mobileId), dst+offset, 0); + break; + + case AIFG_MSG_ID_RR_HO_CMD: + //TODO + dst[offset++] = 0x06; //PD + break; + + default: + assert(0); + goto ERR_PROC; + } + + return offset; + +ERR_PROC: + return offset; +} + +//Assign request +int aifg_msg_sd_assignReq(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_assignReq *assignReq = &(src->msg.assignReq); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_ASSIGN_REQ; + + //Channel type - M + assert(assignReq->channelType.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CHANNELTYPE, (ie_u*)&(assignReq->channelType), dst+offset, 0); + + //Layer 3 Header Information + if(assignReq->l3HeaderInfo.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_L3HEADERINFO, (ie_u*)&(assignReq->l3HeaderInfo), dst+offset, 0); + } + + //Priority + if(assignReq->priority.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_PRIORITY, (ie_u*)&(assignReq->priority), dst+offset, 0); + } + + //CIC + if(assignReq->cic.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIC, (ie_u*)&(assignReq->cic), dst+offset, 0); + } + + //Downlink DTX Flag + if(assignReq->dtxFlag.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_DTXFLAG, (ie_u*)&(assignReq->dtxFlag), dst+offset, 0); + } + + //Interference Band To Be Used + if(assignReq->bandUsed.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_BANDUSED, (ie_u*)&(assignReq->bandUsed), dst+offset, 0); + } + + //Classmark Information 2 + if(assignReq->cm2.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CLASSMARKINFO2, (ie_u*)&(assignReq->cm2), dst+offset, 0); + } + + //Group Call Reference + if(assignReq->groupRef.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_GROUPCALLREF, (ie_u*)&(assignReq->groupRef), dst+offset, 0); + } + + //Talker Flag + if(assignReq->talkerFlag.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_GROUPCALLREF, (ie_u*)&(assignReq->talkerFlag), dst+offset, 0); + } + + //Configuration Evolution Indication + if(assignReq->cfgEvoInd.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CFGEVOIND, (ie_u*)&(assignReq->cfgEvoInd), dst+offset, 0); + } + + return offset; +} + +//ASSIGNMENT COMPLETE +int aifg_msg_sd_assignComplete(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_assignComplete *assignComp = &(src->msg.assignComplete); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_ASSIGN_CMP; + + //RR Cause + if(assignComp->rrCause.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_RRCAUSE, (ie_u*)&(assignComp->rrCause),dst+offset, 0); + } + + //CIC + if(assignComp->cic.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIC, (ie_u*)&(assignComp->cic), dst+offset, 0); + } + + //Cell Identifier + if(assignComp->cellId.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CELLID, (ie_u*)&(assignComp->cellId), dst+offset, 0); + } + + //Chosen Channel + if(assignComp->chosenChannel.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CHOSENCHANNEL, (ie_u*)&(assignComp->chosenChannel), dst+offset, 0); + } + + //Chosen Encryption Algorithm + if(assignComp->chosenEncrypt.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CHOSENENCRYPT, (ie_u*)&(assignComp->chosenEncrypt), dst+offset, 0); + } + + //Circuit Pool + if(assignComp->circuitPool.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIRCUITPOOL, (ie_u*)&(assignComp->circuitPool), dst+offset, 0); + } + + //Speech Version (Chosen) + if(assignComp->speechVer.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_SPEECHVER, (ie_u*)&(assignComp->speechVer), dst+offset, 0); + } + + //LSA Identifier + if(assignComp->lsaId.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_LSAID, (ie_u*)&(assignComp->lsaId), dst+offset, 0); + } + + return offset; +} + +//ASSIGNMENT FAILURE +int aifg_msg_sd_assignFailure(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_assignFailure *assignFail = &(src->msg.assignFailure); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_ASSIGN_FAIL; + + //Cause + assert(assignFail->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CAUSE, (ie_u*)&(assignFail->cause), dst+offset, 0); + + //RR Cause + if(assignFail->rrCause.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_RRCAUSE, (ie_u*)&(assignFail->rrCause),dst+offset, 0); + } + + //Circuit Pool + if(assignFail->circuitPool.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIRCUITPOOL, (ie_u*)&(assignFail->circuitPool), dst+offset, 0); + } + + //Circuit Pool List + if(assignFail->circuitPoolList.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIRCUITPOOLLIST, (ie_u*)&(assignFail->circuitPoolList), dst+offset, 0); + } + + return offset; +} + +//BLOCK +int aifg_msg_sd_block(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_block *block = &(src->msg.block); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_BLOCK; + + //CIC + assert(block->cic.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIC, (ie_u*)&(block->cic),dst+offset, 0); + + //Cause + assert(block->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CAUSE, (ie_u*)&(block->cause), dst+offset, 0); + + //Connection Release Requested + if(block->connRelReq.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CONNRELREQ, (ie_u*)&(block->connRelReq), dst+offset, 0); + } + + return offset; +} + +//BLOCKING ACKNOWLEDGE +int aifg_msg_sd_blockAck(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_blockAck *blockAck = &(src->msg.blockAck); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_BLOCK_ACK; + + //CIC + assert(blockAck->cic.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIC, (ie_u*)&(blockAck->cic),dst+offset, 0); + + return offset; +} + +//UNBLOCK +int aifg_msg_sd_unblock(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_unblock *unblock = &(src->msg.unblock); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_UNBLOCK; + + //CIC + assert(unblock->cic.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIC, (ie_u*)&(unblock->cic),dst+offset, 0); + + return offset; +} + +//UNBLOCK ACKNOWLEDGE +int aifg_msg_sd_unblockAck(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_unblockAck *unblockAck = &(src->msg.unblockAck); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_UNBLOCK_ACK; + + //CIC + assert(unblockAck->cic.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIC, (ie_u*)&(unblockAck->cic),dst+offset, 0); + + return offset; +} + +//HANDOVER REQUEST +int aifg_msg_sd_HORequest(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_HORequest *HOReq = &(src->msg.HORequest); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_HO_REQUEST; + + //CHANNEL TYPE + assert(HOReq->channelType.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CHANNELTYPE, (ie_u*)&(HOReq->channelType),dst+offset, 0); + + //Encryption Information + assert(HOReq->encryptInfo.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_ENCRYPTINFO, (ie_u*)&(HOReq->encryptInfo),dst+offset, 0); + + //Classmark information + if(HOReq->cmInfo.cm2.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CLASSMARKINFO2, (ie_u*)&(HOReq->cmInfo.cm2),dst+offset, 0); + }else if(HOReq->cmInfo.cm1.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CLASSMARKINFO1, (ie_u*)&(HOReq->cmInfo.cm1),dst+offset, 0); + }else{ + //should never runs to here + assert(0); + } + + //Cell Identifier (Serving) + assert(HOReq->servingCellId.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CELLID, (ie_u*)&(HOReq->servingCellId),dst+offset, 0); + + //Priority + if(HOReq->priority.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_PRIORITY, (ie_u*)&(HOReq->priority),dst+offset, 0); + } + + //Circuit Identity Code + if(HOReq->cic.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIC, (ie_u*)&(HOReq->cic),dst+offset, 0); + } + + //Downlink DTX Flag + if(HOReq->dtxFlag.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_DTXFLAG, (ie_u*)&(HOReq->dtxFlag),dst+offset, 0); + } + + //Cell Identifier (Target) + assert(HOReq->targetCellId.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CELLID, (ie_u*)&(HOReq->targetCellId),dst+offset, 0); + + //Interference Band To Be Used + if(HOReq->bandUsed.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_BANDUSED, (ie_u*)&(HOReq->bandUsed),dst+offset, 0); + } + + //Cause + if(HOReq->cause.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CAUSE, (ie_u*)&(HOReq->cause),dst+offset, 0); + } + + //Classmark Information 3 + // if(HOReq->c.flag == 1){ + // offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CAUSE, (ie_u*)&(HOReq->cause),dst+offset, 0); + // } + + //Current Channel type 1 + if(HOReq->curChannelType1.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CURCHANNELTYPE1, (ie_u*)&(HOReq->curChannelType1),dst+offset, 0); + } + + //Speech Version (Used) + if(HOReq->speechVer.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_SPEECHVER, (ie_u*)&(HOReq->speechVer),dst+offset, 0); + } + + //Group Call Reference + if(HOReq->gourpRef.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_GROUPCALLREF, (ie_u*)&(HOReq->gourpRef),dst+offset, 0); + } + + //Talker Flag + if(HOReq->talkerFlag.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_TALKERFLAG, (ie_u*)&(HOReq->talkerFlag),dst+offset, 0); + } + + //Configuration Evolution Indication + if(HOReq->cfgEvoInd.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CFGEVOIND, (ie_u*)&(HOReq->cfgEvoInd),dst+offset, 0); + } + + //Chosen Encryption Algorithm (Serving) + if(HOReq->chosenEncrypt.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CHOSENENCRYPT, (ie_u*)&(HOReq->chosenEncrypt),dst+offset, 0); + } + + //Old BSS to New BSS Information + if(HOReq->bssOldtoNew.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_BSSOLDTONEW, (ie_u*)&(HOReq->bssOldtoNew),dst+offset, 0); + } + + //LSA Information + if(HOReq->lsaInfo.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_LSAINFO, (ie_u*)&(HOReq->lsaInfo),dst+offset, 0); + } + + return offset; +} + +//HANDOVER REQUIRED +int aifg_msg_sd_HORequired(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_HORequired *HORequired = &(src->msg.HORequired); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_HO_REQUIRED; + + //Cause + assert(HORequired->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CAUSE, (ie_u*)&(HORequired->cause),dst+offset, 0); + + //Response Request + if(HORequired->respReq.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_RESPREQ, (ie_u*)&(HORequired->respReq),dst+offset, 0); + } + + //Cell Identifier List (Preferred) + assert(HORequired->prefer_cidList.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CELLIDLIST, + (ie_u*)&(HORequired->prefer_cidList),dst+offset, 0); + + //Circuit Pool List + if(HORequired->circuitPoolList.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIRCUITPOOLLIST, + (ie_u*)&(HORequired->circuitPoolList),dst+offset, 0); + } + + //Current Channel type 1 + if(HORequired->curChannelType1.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CURCHANNELTYPE1, + (ie_u*)&(HORequired->curChannelType1),dst+offset, 0); + } + + //Speech Version (Used) + if(HORequired->speechVer.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_SPEECHVER, + (ie_u*)&(HORequired->speechVer),dst+offset, 0); + } + + //Queueing Indicator + if(HORequired->queuingInd.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_QUEUEIND, + (ie_u*)&(HORequired->queuingInd),dst+offset, 0); + } + + //Old BSS to New BSS Information + if(HORequired->bssOldtoNew.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_BSSOLDTONEW, + (ie_u*)&(HORequired->bssOldtoNew),dst+offset, 0); + } + + return offset; +} + +//HANDOVER REQUEST ACKNOWLEDGE +int aifg_msg_sd_HORequestAck(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_HORequestAck *HOReqAck = &(src->msg.HORequestAck); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_HO_REQ_ACK; + + //Layer 3 Information + dst[offset++] = AIFG_IEI_BM_L3INFO; + dst[offset++] = HOReqAck->l3Info.len; + memcpy(dst+offset, HOReqAck->l3Info.ptr, HOReqAck->l3Info.len); + offset += HOReqAck->l3Info.len; + + //Chosen Channel + if(HOReqAck->chosenChannel.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CHOSENCHANNEL, (ie_u*)&(HOReqAck->chosenChannel),dst+offset, 0); + } + + //Chosen Encryption Algorithm + if(HOReqAck->chosenEncrypt.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CHOSENENCRYPT, (ie_u*)&(HOReqAck->chosenEncrypt),dst+offset, 0); + } + + //Circuit Pool + if(HOReqAck->circuitPool.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIRCUITPOOL, (ie_u*)&(HOReqAck->circuitPool),dst+offset, 0); + } + + //Speech Version (Chosen) + if(HOReqAck->speechVer.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_SPEECHVER, (ie_u*)&(HOReqAck->speechVer),dst+offset, 0); + } + + //Circuit Identity Code + if(HOReqAck->cic.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIC, (ie_u*)&(HOReqAck->cic),dst+offset, 0); + } + + //LSA Identifier + if(HOReqAck->lsaId.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_LSAID, (ie_u*)&(HOReqAck->lsaId),dst+offset, 0); + } + + return offset; +} + +//HANDOVER COMMAND +int aifg_msg_sd_HOCmd(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_HOCmd *HOCmd = &(src->msg.HOCmd); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_HO_CMD; + //Layer 3 Information + dst[offset++] = AIFG_IEI_BM_L3INFO; + dst[offset++] = HOCmd->l3Info.len; + memcpy(dst+offset, HOCmd->l3Info.ptr, HOCmd->l3Info.len); + offset += HOCmd->l3Info.len; + + //Cell Identifier + if(HOCmd->cellId.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CELLID, (ie_u*)&(HOCmd->cellId),dst+offset, 0); + } + + return offset; +} + +//HANDOVER COMPLETE +int aifg_msg_sd_HOComplete(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_HOComplete *HOcomplete = &(src->msg.HOComplete); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_HO_CMP; + + //RR Cause + if(HOcomplete->rrCause.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_RRCAUSE, (ie_u*)&(HOcomplete->rrCause),dst+offset, 0); + } + + return offset; +} + +//HANDOVER SUCCEEDED +int aifg_msg_sd_HOSucceed(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + + dst[offset++] = AIFG_MSG_T_HO_SUC; + + return offset; +} + +//HANDOVER CANDIDATE ENQUIRE +int aifg_msg_sd_HOCandEnq(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_HOCandidateEnq *HOCandEnq = &(src->msg.HOCandidateEnq); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_HO_CAN_ENQ; + + //Number Of Mss + assert(HOCandEnq->msNum.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_MSNUM, + (ie_u*)&(HOCandEnq->msNum),dst+offset, 0); + + //Cell Identifier List + assert(HOCandEnq->cidList.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CELLIDLIST, + (ie_u*)&(HOCandEnq->cidList),dst+offset, 0); + + //Cell Identifier + assert(HOCandEnq->cellId.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CELLID, + (ie_u*)&(HOCandEnq->cellId),dst+offset, 0); + + return offset; +} + +//HANDOVER CANDIDATE RESPONSE +int aifg_msg_sd_HOCandResp(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_HOCandidateResp *HOCandResp = &(src->msg.HOCandidateResp); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_HO_CAN_RESP; + + //Number Of Mss + assert(HOCandResp->msNum.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_MSNUM, + (ie_u*)&(HOCandResp->msNum),dst+offset, 0); + + //Cell Identifier + assert(HOCandResp->cellId.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CELLID, + (ie_u*)&(HOCandResp->cellId),dst+offset, 0); + + return offset; +} + +//HANDOVER FAILURE +int aifg_msg_sd_HOFailure(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_HOFailure *HOFailure = &(src->msg.HOFailure); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_HO_FAIL; + + //Cause + assert(HOFailure->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CAUSE, + (ie_u*)&(HOFailure->cause), dst+offset, 0); + + //RR Cause + if(HOFailure->rrCause.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_RRCAUSE, + (ie_u*)&(HOFailure->rrCause),dst+offset, 0); + } + + //Circuit Pool + if(HOFailure->circuitPool.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIRCUITPOOL, + (ie_u*)&(HOFailure->circuitPool), dst+offset, 0); + } + + //Circuit Pool List + if(HOFailure->circuitPoolList.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIRCUITPOOLLIST, + (ie_u*)&(HOFailure->circuitPoolList), dst+offset, 0); + } + + return offset; +} + +//RESOURCE REQUEST +int aifg_msg_sd_resrcReq(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_resrcReq *resrcReq = &(src->msg.resourceReq); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_RESRC_REQ; + + //Periodicity + assert(resrcReq->periodicity.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_PERIODICITY, + (ie_u*)&(resrcReq->periodicity), dst+offset, 0); + + //Resource Indication Method + assert(resrcReq->resrcIndMethod.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_RESOURCEINDMEHTOD, + (ie_u*)&(resrcReq->resrcIndMethod),dst+offset, 0); + + //Cell Identifier + assert(resrcReq->cellId.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CELLID, + (ie_u*)&(resrcReq->cellId), dst+offset, 0); + + //Extended Resource Indicator + if(resrcReq->extResrcInd.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_EXTRESOURCEIND, + (ie_u*)&(resrcReq->extResrcInd), dst+offset, 0); + } + + return offset; +} + +//RESOURCE INDICATION +int aifg_msg_sd_resrcInd(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_resrcInd *resrcInd = &(src->msg.resourceInd); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_RESRC_IND; + + //Resource Indication Method + assert(resrcInd->resrcIndMethod.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_RESOURCEINDMEHTOD, + (ie_u*)&(resrcInd->resrcIndMethod),dst+offset, 0); + + //Resource Available + if(resrcInd->resrcAvail.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_RESOURCEAVAIL, + (ie_u*)&(resrcInd->resrcAvail), dst+offset, 0); + } + + //Cell Identifier + assert(resrcInd->cellId.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CELLID, + (ie_u*)&(resrcInd->cellId), dst+offset, 0); + + //Total Resource Accessible + if(resrcInd->totalResrc.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_TOTALRESOURCE, + (ie_u*)&(resrcInd->totalResrc), dst+offset, 0); + } + + return offset; +} + +//PAGING +int aifg_msg_sd_paging(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_paging *paging = &(src->msg.paging); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_PAGING; + + //IMSI + assert(paging->imsi.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_IMSI, (ie_u*)&(paging->imsi),dst+offset, 0); + + //TMSI + if(paging->tmsi.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_TMSI, + (ie_u*)&(paging->tmsi), dst+offset, 0); + } + + //Cell Identifier List + assert(paging->cidList.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CELLIDLIST, + (ie_u*)&(paging->cidList), dst+offset, 0); + + //Channel Needed + if(paging->channelNeeded.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CHANNELNEEDED, + (ie_u*)&(paging->channelNeeded), dst+offset, 0); + } + + //eMLPP Priority + if(paging->eMLPP.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_EMLPP, + (ie_u*)&(paging->eMLPP), dst+offset, 0); + } + + return offset; +} + +//CLEAR REQUEST +int aifg_msg_sd_clearReq(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_clearReq *clearReq = &(src->msg.clearReq); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_CLR_REQ; + + //Cause + assert(clearReq->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CAUSE, + (ie_u*)&(clearReq->cause),dst+offset, 0); + + return offset; +} + +//CLEAR COMMAND +int aifg_msg_sd_clearCmd(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_clearCmd *clearCmd = &(src->msg.clearCmd); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_CLR_CMD; + + //Layer 3 Header Information + if(clearCmd->l3HeaderInfo.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_L3HEADERINFO, + (ie_u*)&(clearCmd->l3HeaderInfo), dst+offset, 0); + } + + //Cause + assert(clearCmd->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CAUSE, + (ie_u*)&(clearCmd->cause),dst+offset, 0); + + return offset; +} + +//CLEAR COMPLETE +int aifg_msg_sd_clearComplete(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + + dst[offset++] = AIFG_MSG_T_CLR_CMP; + + return offset; +} + +//RESET +int aifg_msg_sd_reset(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_reset *reset = &(src->msg.reset); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_RESET; + + //Cause + assert(reset->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CAUSE, (ie_u*)&(reset->cause),dst+offset, 0); + + return offset; +} + +//RESET ACKNOWLEDGE +int aifg_msg_sd_resetAck(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + + dst[offset++] = AIFG_MSG_T_RESET_ACK; + + return offset; +} + + +//HANDOVER PERFORMED +int aifg_msg_sd_HOPerformed(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_HOPerformed *HOPerformed = &(src->msg.HOPerformed); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_HO_PERFORMED; + + //Cause + assert(HOPerformed->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CAUSE, + (ie_u*)&(HOPerformed->cause),dst+offset, 0); + + //Cell Identifier + assert(HOPerformed->cellId.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CELLID, + (ie_u*)&(HOPerformed->cellId),dst+offset, 0); + + //Chosen Channel + if(HOPerformed->chosenChannel.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CHOSENCHANNEL, + (ie_u*)&(HOPerformed->chosenChannel), dst+offset, 0); + } + + //Chosen Encryption Algorithm + assert(HOPerformed->chosenEncrypt.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CHOSENENCRYPT, + (ie_u*)&(HOPerformed->chosenEncrypt), dst+offset, 0); + + //Speech Version (Chosen) + if(HOPerformed->speechVer.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_SPEECHVER, + (ie_u*)&(HOPerformed->speechVer), dst+offset, 0); + } + + //LSA Identifier + if(HOPerformed->lsaId.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_LSAID, + (ie_u*)&(HOPerformed->lsaId), dst+offset, 0); + } + + return offset; +} + +//OVERLOAD +int aifg_msg_sd_overload(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_overload *overload = &(src->msg.overload); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_OVERLOAD; + + //Cause + assert(overload->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CAUSE, + (ie_u*)&(overload->cause),dst+offset, 0); + + //Cell Identifier + if(overload->cellId.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CELLID, + (ie_u*)&(overload->cellId),dst+offset, 0); + } + + return offset; +} + +//MSC INVOKE TRACE +int aifg_msg_sd_mscTrace(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_mscInvokeTrace *mscTrace = &(src->msg.mscInvokeTrace); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_MSC_INVK_TRACE; + + //Trace Type + assert(mscTrace->traceType.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_TRACETYPE, + (ie_u*)&(mscTrace->traceType),dst+offset, 0); + + //Triggerid + if(mscTrace->tiggerId.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_TRIGGERID, + (ie_u*)&(mscTrace->tiggerId),dst+offset, 0); + } + + //Trace Reference + assert(mscTrace->traceRef.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_TRACEREF, + (ie_u*)&(mscTrace->traceRef),dst+offset, 0); + + //Transactionid + if(mscTrace->transId.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_TRANSACTIONID, + (ie_u*)&(mscTrace->transId),dst+offset, 0); + } + + //Mobile Identity + if(mscTrace->mobileId.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_MOBILEID, + (ie_u*)&(mscTrace->mobileId),dst+offset, 0); + } + + //OMCId + if(mscTrace->omcId.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_OMCID, + (ie_u*)&(mscTrace->omcId),dst+offset, 0); + } + + return offset; +} + +//BSS INVOKE TRACE +int aifg_msg_sd_bscTrace(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_bscInvokeTrace *bscTrace = &(src->msg.bscInvokeTrace); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_BSC_INVK_TRACE; + + //Trace Type + assert(bscTrace->traceType.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_TRACETYPE, + (ie_u*)&(bscTrace->traceType),dst+offset, 0); + + //Forward Indicator + if(bscTrace->forwardInd.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_FORWARDIND, + (ie_u*)&(bscTrace->forwardInd),dst+offset, 0); + } + + //Triggerid + if(bscTrace->tiggerId.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_TRIGGERID, + (ie_u*)&(bscTrace->tiggerId),dst+offset, 0); + } + + //Trace Reference + assert(bscTrace->traceRef.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_TRACEREF, + (ie_u*)&(bscTrace->traceRef),dst+offset, 0); + + //Transactionid + if(bscTrace->transId.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_TRANSACTIONID, + (ie_u*)&(bscTrace->transId),dst+offset, 0); + } + + //OMCId + if(bscTrace->omcId.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_OMCID, + (ie_u*)&(bscTrace->omcId),dst+offset, 0); + } + + return offset; +} + +//CLASSMARK UPDATE +int aifg_msg_sd_cmUpdate(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_cmUpdate *cmUpdate = &(src->msg.cmUpdate); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_CM_UPDATE; + + //Classmark Information Type 2 + assert(cmUpdate->cm2.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CLASSMARKINFO2, + (ie_u*)&(cmUpdate->cm2),dst+offset, 0); + + //Classmark Information Type 3 + // if(cmUpdate->forwardInd.flag == 1){ + // offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_FORWARDIND, + // (ie_u*)&(cmUpdate->forwardInd),dst+offset, 0); + // } + + return offset; +} + +//CIPHER MODE COMMAND +int aifg_msg_sd_cipherModeCmd(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_cipherModeCmd *cipherModeCmd = &(src->msg.cipherModeCmd); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_CIPHER_MODE_CMD; + + //Layer 3 Header Information + if(cipherModeCmd->l3HeaderInfo.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_L3HEADERINFO, + (ie_u*)&(cipherModeCmd->l3HeaderInfo),dst+offset, 0); + } + + //Encryption Information + assert(cipherModeCmd->encryptInfo.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_ENCRYPTINFO, + (ie_u*)&(cipherModeCmd->encryptInfo),dst+offset, 0); + + //Cipher Response Mode + if(cipherModeCmd->cipherRespMode.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIPHERRESPMODE, + (ie_u*)&(cipherModeCmd->cipherRespMode),dst+offset, 0); + } + + return offset; +} + +//CIPHER MODE COMPLETE +int aifg_msg_sd_cipherModeComplete(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_cipherModeComplete *cipherModeComplete = &(src->msg.cipherModeComplete); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_CIPHER_MODE_CMP; + + //Layer 3 Message Contents + if(cipherModeComplete->l3Info.flag == 1){ + strncpy((char*)dst+offset, (const char*)cipherModeComplete->l3Info.ptr, cipherModeComplete->l3Info.len); + offset += cipherModeComplete->l3Info.len; + } + + //Chosen Encryption Algorithm + if(cipherModeComplete->chosenEncrypt.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CHOSENENCRYPT, + (ie_u*)&(cipherModeComplete->chosenEncrypt),dst+offset, 0); + } + + return offset; +} + +//COMPLETE LAYER 3 INFORMATION +int aifg_msg_sd_completeL3Info(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_completeL3Info *completeL3Info = &(src->msg.completeL3Info); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_L3_INFO; + + //Cell Identifier + assert(completeL3Info->cellId.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CELLID, + (ie_u*)&(completeL3Info->cellId),dst+offset, 0); + + //Layer 3 Information, transparent transfer + dst[offset++] = AIFG_IEI_BM_L3INFO; + dst[offset++] = completeL3Info->l3Info.len; + memcpy(dst+offset, completeL3Info->l3Info.ptr, completeL3Info->l3Info.len); + offset += completeL3Info->l3Info.len; + + /* + dst[offset++] = AIFG_IEI_BM_L3INFO; + offset++; //skip length + l3msg_len += aifg_msg_encode_embeded_l3msg(&completeL3Info->l3Info, dst+offset); + dst[offset-1] = l3msg_len; + offset += l3msg_len; + */ + + //Chosen Channel + if(completeL3Info->chosenChannel.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CHOSENCHANNEL, + (ie_u*)&(completeL3Info->chosenChannel), dst+offset, 0); + } + + //LSA Identifier List + if(completeL3Info->lsaIdList.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_LSAIDLIST, + (ie_u*)&(completeL3Info->lsaIdList), dst+offset, 0); + } + + //Location Information + if(completeL3Info->locInfo.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_LOCATIONINFO, + (ie_u*)&(completeL3Info->locInfo), dst+offset, 0); + } + + return offset; +} + +//QUEUEING INDICATION +int aifg_msg_sd_queueInd(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + + dst[offset++] = AIFG_MSG_T_QUEUE_IND; + + return offset; +} + +//SAPI "n" REJECT + +int aifg_msg_sd_sapi_n_rej(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_SAPI_n_Reject *SAPI_n_Reject = &(src->msg.SAPI_n_Reject); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_SAPI_REJ; + + //DLCI + assert(SAPI_n_Reject->dlci.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_DLCI, + (ie_u*)&(SAPI_n_Reject->dlci),dst+offset, 0); + + //Cause + assert(SAPI_n_Reject->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CAUSE, + (ie_u*)&(SAPI_n_Reject->cause),dst+offset, 0); + + return offset; +} + +//HANDOVER REQUIRED REJECT +int aifg_msg_sd_HORequiredRej(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_HOReject *HOReject = &(src->msg.HOReject); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_HO_REQ_REJ; + + //Cause + assert(HOReject->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CAUSE, + (ie_u*)&(HOReject->cause),dst+offset, 0); + + return offset; +} + +//RESET CIRCUIT +int aifg_msg_sd_resetCircuit(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_resetCircuit *resetCircuit = &(src->msg.resetCircuit); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_RESET_CC; + + //CIC + assert(resetCircuit->cic.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIC, + (ie_u*)&(resetCircuit->cic),dst+offset, 0); + + //Cause + assert(resetCircuit->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CAUSE, + (ie_u*)&(resetCircuit->cause),dst+offset, 0); + + return offset; +} + +//RESET CIRCUIT ACKNOWLEDGE +int aifg_msg_sd_resetCircuitAck(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_resetCircuitAck *resetCircuitAck = &(src->msg.resetCircuitAck); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_RESET_CC_ACK; + + //CIC + assert(resetCircuitAck->cic.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIC, + (ie_u*)&(resetCircuitAck->cic),dst+offset, 0); + + return offset; +} + +//HANDOVER DETECT +int aifg_msg_sd_HODetect(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + + dst[offset++] = AIFG_MSG_T_HO_DETECT; + + return offset; +} + +//CIRCUIT GROUP BLOCK +int aifg_msg_sd_ccGrpBlk(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_circuitGrpBlk *circuitGrpBlk = &(src->msg.ccGroupBlock); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_CC_GROUP_BLK; + + //Cause + assert(circuitGrpBlk->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CAUSE, + (ie_u*)&(circuitGrpBlk->cause),dst+offset, 0); + + //CIC + assert(circuitGrpBlk->cic.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIC, + (ie_u*)&(circuitGrpBlk->cic),dst+offset, 0); + + //Circuit Identity Code List + assert(circuitGrpBlk->cicList.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CICLIST, + (ie_u*)&(circuitGrpBlk->cicList),dst+offset, 0); + + return offset; +} + +//CIRCUIT GROUP BLOCKING ACKNOWLEDGE +int aifg_msg_sd_ccGroupBlockAck(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_circuitGrpBlkAck *circuitGrpBlkAck = &(src->msg.ccGroupBlockAck); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_CC_GROUP_BLK_ACK; + + //CIC + assert(circuitGrpBlkAck->cic.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIC, + (ie_u*)&(circuitGrpBlkAck->cic),dst+offset, 0); + + //Circuit Identity Code List + assert(circuitGrpBlkAck->cicList.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CICLIST, + (ie_u*)&(circuitGrpBlkAck->cicList),dst+offset, 0); + + return offset; +} + +//CIRCUIT GROUP UNBLOCK +int aifg_msg_sd_ccGroupUnblock(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_circuitGrpUnblk *circuitGrpUnblk = &(src->msg.ccGroupUnblock); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_CC_GROUP_UNBLK; + + //CIC + assert(circuitGrpUnblk->cic.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIC, + (ie_u*)&(circuitGrpUnblk->cic),dst+offset, 0); + + //Circuit Identity Code List + assert(circuitGrpUnblk->cicList.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CICLIST, + (ie_u*)&(circuitGrpUnblk->cicList),dst+offset, 0); + + return offset; +} + +//CIRCUIT GROUP UNBLOCKING ACKNOWLEDGE +int aifg_msg_sd_ccGroupUnblockAck(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_circuitGrpUnblkAck *circuitGrpUnblkAck = &(src->msg.ccGroupUnblockAck); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_CC_GROUP_UNBLK_ACK; + + //CIC + assert(circuitGrpUnblkAck->cic.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIC, + (ie_u*)&(circuitGrpUnblkAck->cic),dst+offset, 0); + + //Circuit Identity Code List + assert(circuitGrpUnblkAck->cicList.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CICLIST, + (ie_u*)&(circuitGrpUnblkAck->cicList),dst+offset, 0); + + return offset; +} + +//CONFUSION +int aifg_msg_sd_confusion(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_confusion *confusion = &(src->msg.confusion); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_CONFUSION; + + //Cause + assert(confusion->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CAUSE, + (ie_u*)&(confusion->cause),dst+offset, 0); + + //Diagnostics + assert(confusion->diagnostics.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_DIGNOSTIC, + (ie_u*)&(confusion->diagnostics),dst+offset, 0); + + return offset; +} + +//CLASSMARK REQUEST +int aifg_msg_sd_classmarkReq(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + + dst[offset++] = AIFG_MSG_T_CLASSMARK_REQ; + + return offset; +} + +//UNEQUIPPED CIRCUIT +int aifg_msg_sd_unequippedCircuit(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_unequippedCircuit *unequippedCircuit = &(src->msg.unequippedCircuit); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_UNEQUIP_CC; + + //CIC + assert(unequippedCircuit->cic.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIC, + (ie_u*)&(unequippedCircuit->cic),dst+offset, 0); + + //Circuit Identity Code List + if(unequippedCircuit->cicList.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CICLIST, + (ie_u*)&(unequippedCircuit->cicList),dst+offset, 0); + } + + return offset; +} + +//CIPHER MODE REJECT +int aifg_msg_sd_cipherModeRej(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_cipherModeReject *cipherModeReject = &(src->msg.cipherModeReject); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_CIPHER_MODE_REJ; + + //Cause + assert(cipherModeReject->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CAUSE, + (ie_u*)&(cipherModeReject->cause),dst+offset, 0); + + return offset; +} + +//LOAD INDICATION +int aifg_msg_sd_loadInd(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_loadIndication *loadInd = &(src->msg.loadInd); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_LOAD_IND; + + //Time Indication + assert(loadInd->timeInd.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_TIMEIND, + (ie_u*)&(loadInd->timeInd),dst+offset, 0); + + //Cell Identifier + assert(loadInd->cellId.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CELLID, + (ie_u*)&(loadInd->cellId),dst+offset, 0); + + //Cell Identifier List(Target) + assert(loadInd->cidList.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CELLIDLIST, + (ie_u*)&(loadInd->cidList), dst+offset, 0); + + //Resource Situation + if(loadInd->resrcSit.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_RESOURCESITUATION, + (ie_u*)&(loadInd->resrcSit), dst+offset, 0); + } + + //Cause + if(loadInd->cause.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CAUSE, + (ie_u*)&(loadInd->cause),dst+offset, 0); + } + + return offset; +} + +//SUSPEND +int aifg_msg_sd_suspend(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_suspend *suspend = &(src->msg.suspend); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_SUSPEND; + + //DLCI + assert(suspend->dlci.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_DLCI, (ie_u*)&(suspend->dlci),dst+offset, 0); + + return offset; +} + +//RESUME +int aifg_msg_sd_resume(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_resume *resume = &(src->msg.resume); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_RESUME; + + //DLCI + assert(resume->dlci.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_DLCI, (ie_u*)&(resume->dlci),dst+offset, 0); + + return offset; +} + +//CHANGE CIRCUIT +int aifg_msg_sd_changeCircuit(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_changeCircuit *changeCircuit = &(src->msg.changeCircuit); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_CHANGE_CC; + + //Cause + assert(changeCircuit->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CAUSE, (ie_u*)&(changeCircuit->cause),dst+offset, 0); + + return offset; +} + +//CHANGE CIRCUIT ACKNOWLEDGE +int aifg_msg_sd_changeCircuitAck(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_changeCircuitAck *changeCircuitAck = &(src->msg.changeCircuitAck); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_CHANGE_CC_ACK; + + //CIC + assert(changeCircuitAck->cic.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CIC, (ie_u*)&(changeCircuitAck->cic),dst+offset, 0); + + return offset; +} + +/* +//LSA INFORMATION +int aifg_msg_sd_lsaInfo(aifg_msg_t *src, BYTE *dst) +{ +int offset = 0; +aifg_msg_bm_lsaInfo *lsaInfo = &(src->msg.lsaInfo); + +assert(src != NULL && dst != NULL); + +dst[offset++] = AIFG_MSG_T_LSA_INFO; + +//LSA Information +assert(lsaInfo->lsaInfo.flag == 1); +offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_LSAINFO, (ie_u*)&(lsaInfo->lsaInfo),dst+offset, 0); + +return offset; +} +*/ + +//Location Information Command +int aifg_msg_sd_locCmd(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_locCmd *locCmd = &(src->msg.locCmd); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_LOC_INFO_CMD; + + //Location Information + assert(locCmd->locInfo.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_LOCATIONINFO, + (ie_u*)&(locCmd->locInfo), dst+offset, 0); + + return offset; +} + +//Location Information Report +int aifg_msg_sd_locReport(aifg_msg_t *src, BYTE *dst) +{ + int offset = 0; + aifg_msg_bm_locReport *locReport = &(src->msg.locReport); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_LOC_INFO_RPT; + + //Location Information + if(locReport->locInfo.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_LOCATIONINFO, + (ie_u*)&(locReport->locInfo), dst+offset, 0); + } + else if(locReport->cause.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_BSSMAP, AIFG_IE_ID_BM_CAUSE, + (ie_u*)&(locReport->cause), dst+offset, 0); + } + + else + assert(0); //should never runs to here + + return offset; +} + +//DTAP--------------------------------------------------------------------------------- +int aifg_msg_sd_luAccept(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_luAccept *luAccept = &(src->msg.luAccept); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_LU_ACCEPT; + + + //location area identification + assert(luAccept->lai.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_LAI, + (ie_u *)&( luAccept->lai), dst+offset, 0); + + + //mobile identity + if(luAccept->mobileId.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_MOBILEID, + (ie_u *)&( luAccept->mobileId), dst+offset, 2); + } + + //follow on proceed + if(luAccept->followOnProceed.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_FLONPROCEED, + (ie_u *)&( luAccept->followOnProceed), dst+offset, 2); + } + + //CTS permission + if(luAccept->CTSPermission.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CTS, + (ie_u *)&( luAccept->CTSPermission), dst+offset, 2); + } + + return offset; +} + +//CM service reject +int aifg_msg_sd_cmRej(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_cmReject *cmRej = &(src->msg.cmReject); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_CM_REJECT; + + //reject cause + assert(cmRej->rejectCause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_REJCAUSE, (ie_u *)&( cmRej->rejectCause), dst+offset, 0); + + return offset; +} + +//location updating reject +int aifg_msg_sd_luReject(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_luReject *luReject = &(src->msg.luReject); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_LU_REJECT; + + //reject cause + assert(luReject->rejectCause.flag== 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_REJCAUSE, (ie_u *)&( luReject->rejectCause), dst+offset, 0); + + return offset; +} + +//abort +int aifg_msg_sd_abort(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_abort *abort = &(src->msg.abort); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_ABORT; + + //reject cause + assert(abort->rejectCause.flag== 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_REJCAUSE, (ie_u *)&( abort->rejectCause), dst+offset, 0); + + return offset; +} + +//MM status +int aifg_msg_sd_mmStatus(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_mmStatus *mmStatus = &(src->msg.mmStatus); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_MM_STATUS; + + //reject cause + assert(mmStatus->rejectCause.flag== 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_REJCAUSE, (ie_u *)&( mmStatus->rejectCause), dst+offset, 0); + + return offset; +} + +//authentication request +int aifg_msg_sd_authReq(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_authRequest *authRequest = &(src->msg.authRequest); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_AUTH_REQUEST; + + //ciphering key sequence number + assert(authRequest->cipherKey.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CIPHERKEY, (ie_u *)&( authRequest->cipherKey), dst+offset, 0); + offset++; + + //authentication parameter RAND + assert(authRequest->authRAND.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_AUTHRAND, (ie_u *)&( authRequest->authRAND), dst+offset, 0); + + return offset; +} + +//authentication response +int aifg_msg_sd_authResp(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_authResp *authResp = &(src->msg.authResp); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_AUTH_RESPONSE; + + //authentication parameter SRES + assert(authResp->authSRES.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_AUTHSRES, (ie_u *)&( authResp->authSRES), dst+offset, 0); + + return offset; +} + +//identity request +int aifg_msg_sd_idReq(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_idRequest *idRequest = &(src->msg.idRequest); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_ID_REQUEST; + + //identity type + assert(idRequest->idType.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_IDTYPE, (ie_u *)&( idRequest->idType), dst+offset, 0); + offset++; + + return offset; +} + +//identity response +int aifg_msg_sd_idResp(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_idResp *idResp = &(src->msg.idResp); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_ID_RESPONSE; + + //mobile identity + assert(idResp->mobileId.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_MOBILEID, (ie_u *)&( idResp->mobileId), dst+offset, 0); + + return offset; +} + +//TMSI reallocation command +int aifg_msg_sd_tmsiReallocCmd(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_tmsiCmd *tmsiCmd = &(src->msg.tmsiCmd); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_TMSI_REALLOC_CMD; + + //location area identification + assert(tmsiCmd->lai.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_LAI, (ie_u *)&(tmsiCmd->lai), dst+offset, 0); + + //mobile identity + assert(tmsiCmd->mobileId.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_MOBILEID, (ie_u *)&(tmsiCmd->mobileId), dst+offset, 0); + + return offset; +} + +//MM infomation +int aifg_msg_sd_mmInfo(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_mmInfo *mmInfo = &(src->msg.mmInfo); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_MM_INFO; + + //full name of network + if(mmInfo->fullName.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_FULL_NWNAME, + (ie_u *)&( mmInfo->fullName), dst+offset, 2); + } + + //short name of network + if(mmInfo->shortName.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_SHORT_NWNAME, + (ie_u *)&( mmInfo->shortName), dst+offset, 2); + } + + //time zone + if(mmInfo->timeZone.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_TIMEZONE, + (ie_u *)&( mmInfo->timeZone), dst+offset, 2); + } + + //timezone and time + if(mmInfo->tzTime.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_TZTIME, + (ie_u *)&( mmInfo->tzTime), dst+offset, 2); + } + + //LSA identifier + if(mmInfo->lsaId.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_LSAID, + (ie_u *)&( mmInfo->lsaId), dst+offset, 2); + } + + return offset; +} + +//alerting +int aifg_msg_sd_alert(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_alert *alert = &(src->msg.alert); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_ALERTING; + + //facility + if(alert->facility.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_FACILITY, (ie_u *)&( alert->facility), dst+offset, 2); + } + + //progress indicator + if(alert->progInd.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_PROGIND, (ie_u *)&( alert->progInd), dst+offset, 2); + } + + //user-user + if(alert->uu.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_USERUSER, (ie_u *)&( alert->uu), dst+offset, 2); + } + + return offset; +} + +//call confirmed +int aifg_msg_sd_callConfirm(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_callConfirm *callConfirm = &(src->msg.callConfirm); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_CALL_CONFIRMED; + + //repeat indicator + if(callConfirm->rpInd.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_REPEATIND, (ie_u *)&( callConfirm->rpInd), dst+offset, 2); + } + + //bearer capability 1 + if(callConfirm->bc1.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_BEARERCAP, (ie_u *)&( callConfirm->bc1), dst+offset, 2); + } + + //bearer capability 2 + if(callConfirm->bc2.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_BEARERCAP, (ie_u *)&( callConfirm->bc2), dst+offset, 2); + } + + //cause + if(callConfirm->cause.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CAUSE, (ie_u *)&( callConfirm->cause), dst+offset, 2); + } + + //call control capability + if(callConfirm->ccCap.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CCCAP, (ie_u *)&( callConfirm->ccCap), dst+offset, 2); + } + + return offset; +} + +//call proceeding +int aifg_msg_sd_callProceed(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_callProceed *callProceed = &(src->msg.callProceed); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_CALL_PROCEEDING; + + //repeat indicator + if(callProceed->rpInd.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_REPEATIND, + (ie_u *)&( callProceed->rpInd), dst+offset, 2); + } + + //bearer capability 1 + if(callProceed->bc1.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_BEARERCAP, + (ie_u *)&( callProceed->bc1), dst+offset, 2); + } + + //bearer capability 2 + if(callProceed->bc2.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_BEARERCAP, + (ie_u *)&( callProceed->bc2), dst+offset, 2); + } + + //facility + if(callProceed->facility.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_FACILITY, + (ie_u *)&( callProceed->facility), dst+offset, 2); + } + + //progress indicator + if(callProceed->progInd.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_PROGIND, + (ie_u *)&( callProceed->progInd), dst+offset, 2); + } + + //priority level + if(callProceed->priority.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_PRIORITYLEVEL, + (ie_u *)&( callProceed->priority), dst+offset, 2); + } + + return offset; +} + +//connect +int aifg_msg_sd_connect(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_connect *connect = &(src->msg.connect); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_CONNECT; + + //facility + if(connect->facility.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_FACILITY, + (ie_u *)&( connect->facility), dst+offset, 2); + } + + //progress indicator + if(connect->progInd.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_PROGIND, + (ie_u *)&( connect->progInd), dst+offset, 2); + } + + //connected number + if(connect->connNum.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CONNNUM, + (ie_u *)&( connect->connNum), dst+offset, 2); + } + + //connected subaddress + if(connect->connSubAddr.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CONNSUBADDR, + (ie_u *)&( connect->connSubAddr), dst+offset, 2); + } + + //user-user + if(connect->uu.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_USERUSER, + (ie_u *)&( connect->uu), dst+offset, 2); + } + + return offset; +} + +//emergency setup +int aifg_msg_sd_eSetup(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_eSetup *eSetup = &(src->msg.eSetup); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_EMERGENCY_SETUP; + + //bearer capability + if(eSetup->bc.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_BEARERCAP, + (ie_u *)&( eSetup->bc), dst+offset, 2); + } + + return offset; +} + +//progress +int aifg_msg_sd_progress(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_progress *progress = &(src->msg.progress); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_PROGRESS; + + //progress indicator + assert(progress->progInd.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_PROGIND, + (ie_u *)&( progress->progInd), dst+offset, 0); + + //user-user + if(progress->uu.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_USERUSER, + (ie_u *)&( progress->uu), dst+offset, 2); + } + + return offset; +} + +//setup +int aifg_msg_sd_setup(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_setup *setup = &(src->msg.setup); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_SETUP; + + //BC repeat indicator + if(setup->bc_rpInd.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_REPEATIND, + (ie_u *)&( setup->bc_rpInd), dst+offset, 2); + } + + //bearer capability 1 + if(setup->bc1.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_BEARERCAP, + (ie_u *)&( setup->bc1), dst+offset, 2); + } + + //bearer capability 2 + if(setup->bc2.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_BEARERCAP, + (ie_u *)&( setup->bc2), dst+offset, 2); + } + + //facility + if(setup->facility.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_FACILITY, + (ie_u *)&( setup->facility), dst+offset, 2); + } + + //progress indicator + if(setup->progInd.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_PROGIND, + (ie_u *)&( setup->progInd), dst+offset, 2); + } + + //signal + if(setup->signal.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_SIGNAL, + (ie_u *)&( setup->signal), dst+offset, 2); + } + + //calling party BCD number + if(setup->callingNum.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CALLERBCD, + (ie_u *)&( setup->callingNum), dst+offset, 2); + } + + //calling party subaddr + if(setup->callingSubAddr.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CALLERSUBADDR, + (ie_u *)&( setup->callingSubAddr), dst+offset, 2); + } + + //called party BCD num + if(setup->calledNum.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CALLEDBCD, + (ie_u *)&( setup->calledNum), dst+offset, 2); + } + + //called party subaddr + if(setup->calledSubAddr.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CALLEDSUBADDR, + (ie_u *)&( setup->calledSubAddr), dst+offset, 2); + } + + //redirecting party BCD num + if(setup->redirNum.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_REDIRBCD, + (ie_u *)&( setup->redirNum), dst+offset, 2); + } + + //redirecting party subaddr + if(setup->redirSubAddr.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_REDIRSUBADDR, + (ie_u *)&( setup->redirSubAddr), dst+offset, 2); + } + + //LLC repeat indicator + if(setup->llc_rpInd.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_REPEATIND, + (ie_u *)&( setup->llc_rpInd), dst+offset, 2); + } + + //low layer compatability 1 + if(setup->loComp1.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_LOWCOM, + (ie_u *)&( setup->loComp1), dst+offset, 2); + } + + //low layer compatability 2 + if(setup->loComp2.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_LOWCOM, + (ie_u *)&( setup->loComp2), dst+offset, 2); + } + + //HLC repeat indicator + if(setup->hlc_rpInd.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_REPEATIND, + (ie_u *)&( setup->hlc_rpInd), dst+offset, 2); + } + + //high layer compatability 1 + if(setup->hiComp1.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_HIGHCOM, + (ie_u *)&( setup->hiComp1), dst+offset, 2); + } + + //high layer compatability 2 + if(setup->hiComp2.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_HIGHCOM, + (ie_u *)&( setup->hiComp2), dst+offset, 2); + } + + //user-user + if(setup->uu.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_USERUSER, + (ie_u *)&( setup->uu), dst+offset, 2); + } + + //priority level + if(setup->priority.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_PRIORITYLEVEL, + (ie_u *)&( setup->priority), dst+offset, 2); + } + + //alert pattern + if(setup->alertPattern.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_ALERTPATTERN, + (ie_u *)&( setup->alertPattern), dst+offset, 2); + } + + return offset; +} + +//modify +int aifg_msg_sd_modify(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_modify *modify = &(src->msg.modify); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_MODIFY; + + //bearer capability + assert(modify->bc.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_BEARERCAP, + (ie_u *)&( modify->bc), dst+offset, 0); + + //low layer comp + if(modify->loComp.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_LOWCOM, + (ie_u *)&( modify->loComp), dst+offset, 2); + } + + //high layer comp + if(modify->hiComp.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_HIGHCOM, + (ie_u *)&( modify->hiComp), dst+offset, 2); + } + + //reverse call setup direction + if(modify->revCallDir.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_REVCALLDIR, + (ie_u *)&( modify->revCallDir), dst+offset, 2); + } + + return offset; +} + +//modify complete +int aifg_msg_sd_modifyCmp(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_modifyCmp *modifyCmp = &(src->msg.modifyCmp); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_MODIFY_CMP; + + //bearer capability + assert(modifyCmp->bc.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_BEARERCAP, + (ie_u *)&( modifyCmp->bc), dst+offset, 0); + + //low layer comp + if(modifyCmp->loComp.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_LOWCOM, + (ie_u *)&( modifyCmp->loComp), dst+offset, 2); + } + + //high layer comp + if(modifyCmp->hiComp.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_HIGHCOM, + (ie_u *)&( modifyCmp->hiComp), dst+offset, 2); + } + + //reverse call setup direction + if(modifyCmp->revCallDir.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_REVCALLDIR, + (ie_u *)&( modifyCmp->revCallDir), dst+offset, 2); + } + + return offset; +} + +//modify reject +int aifg_msg_sd_modifyRej(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_modifyRej *modifyRej = &(src->msg.modifyRej); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_MODIFY_REJECT; + + //bearer capability + assert(modifyRej->bc.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_BEARERCAP, + (ie_u *)&( modifyRej->bc), dst+offset, 0); + + //cause + assert(modifyRej->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CAUSE, + (ie_u *)&( modifyRej->cause), dst+offset, 0); + + //low layer comp + if(modifyRej->loComp.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_LOWCOM, + (ie_u *)&( modifyRej->loComp), dst+offset, 2); + } + + //high layer comp + if(modifyRej->hiComp.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_HIGHCOM, + (ie_u *)&( modifyRej->hiComp), dst+offset, 2); + } + + return offset; +} + +//user infomation +int aifg_msg_sd_userInfo(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_userInfo *userInfo = &(src->msg.userInfo); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_USER_INFO; + + //user-user + assert(userInfo->uu.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_USERUSER, + (ie_u *)&( userInfo->uu), dst+offset, 0); + + //more data + if(userInfo->moreData.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_MOREDATA, + (ie_u *)&( userInfo->moreData), dst+offset, 2); + } + + return offset; +} + +//hold reject +int aifg_msg_sd_holdRej(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_holdRej *holdRej = &(src->msg.holdRej); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_HOLD_REJECT; + + //cause + assert(holdRej->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CAUSE, + (ie_u *)&( holdRej->cause), dst+offset, 0); + + return offset; +} + +//retrieve reject +int aifg_msg_sd_retrieveRej(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_retrieveRej *retrieveRej = &(src->msg.retrieveRej); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_RETRIEVE_REJECT; + + //cause + assert(retrieveRej->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CAUSE, + (ie_u *)&( retrieveRej->cause), dst+offset, 0); + + return offset; +} + +//disconnect +int aifg_msg_sd_disconnect(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + aifg_msg_dt_disconnect *disconnect = &(src->msg.disconnect); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_DISCONNECT; + + //cause + assert(disconnect->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CAUSE, + (ie_u *)&( disconnect->cause), dst+offset, 0); + + //facility + if(disconnect->facility.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_FACILITY, + (ie_u *)&( disconnect->facility), dst+offset, 2); + } + + //progress indicator + if(disconnect->progInd.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_PROGIND, + (ie_u *)&( disconnect->progInd), dst+offset, 2); + } + + //user-user + if(disconnect->uu.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_USERUSER, + (ie_u *)&( disconnect->uu), dst+offset, 2); + } + + //SS version + if(disconnect->ssVer.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_SSVER, + (ie_u *)&( disconnect->ssVer), dst+offset, 2); + } + + return offset; +} + +//release +int aifg_msg_sd_release(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_release *release = &(src->msg.release); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_RELEASE; + + //cause 1 + if(release->cause1.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CAUSE, + (ie_u *)&( release->cause1), dst+offset, 2); + } + + //cause 2 + if(release->cause2.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CAUSE, + (ie_u *)&( release->cause2), dst+offset, 2); + } + + //facility + if(release->facility.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_FACILITY, + (ie_u *)&( release->facility), dst+offset, 2); + } + + //user-user + if(release->uu.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_USERUSER, + (ie_u *)&( release->uu), dst+offset, 2); + } + + return offset; +} + +//release complete +int aifg_msg_sd_releaseCmp(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_releaseCmp *releaseCmp = &(src->msg.releaseCmp); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_RELEASE_CMP; + + //cause + if(releaseCmp->cause.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CAUSE, + (ie_u *)&( releaseCmp->cause), dst+offset, 2); + } + + //facility + if(releaseCmp->facility.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_FACILITY, + (ie_u *)&( releaseCmp->facility), dst+offset, 2); + } + + //user-user + if(releaseCmp->uu.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_USERUSER, + (ie_u *)&( releaseCmp->uu), dst+offset, 2); + } + + return offset; +} + +//congestion control +int aifg_msg_sd_congestCtrl(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_congestCtrl *congestCtrl = &(src->msg.congestCtrl); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_CONGESTION_CTRL; + + //congestion level + assert(congestCtrl->congestLevel.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CONGESTLEVEL, + (ie_u *)&( congestCtrl->congestLevel), dst+offset, 0); + offset++; + + //cause + if(congestCtrl->cause.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CAUSE, + (ie_u *)&( congestCtrl->cause), dst+offset, 2); + } + + return offset; +} + +//notify +int aifg_msg_sd_notify(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_notify *notify = &(src->msg.notify); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_NOTIFY; + + //notification indicator + assert(notify->notificationInd.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_NOTIIND, + (ie_u *)&( notify->notificationInd), dst+offset, 0); + + return offset; +} + +//status +int aifg_msg_sd_status(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_status *status = &(src->msg.status); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_STATUS; + + //cause + assert(status->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CAUSE, + (ie_u *)&( status->cause), dst+offset, 0); + + //call state + assert(status->callStat.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CALLSTAT, + (ie_u *)&( status->callStat), dst+offset, 0); + + //auxiliary states + if(status->auxStat.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_AUXSTAT, + (ie_u *)&( status->auxStat), dst+offset, 2); + } + + return offset; +} + +//start DTMF +int aifg_msg_sd_startDTMF(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_startDTMF *startDTMF = &(src->msg.startDTMF); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_START_DTMF; + + //keypad facility + assert(startDTMF->keypad.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_KEYPAD, + (ie_u *)&( startDTMF->keypad), dst+offset, 2); + + return offset; +} + +//start DTMF acknowledge +int aifg_msg_sd_startDTMFAck(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_startDTMF_ack *startDTMF_ack = &(src->msg.startDTMF_ack); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_START_DTMF_ACK; + + //keypad facility + assert(startDTMF_ack->keypad.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_KEYPAD, + (ie_u *)&( startDTMF_ack->keypad), dst+offset, 2); + + return offset; +} + +//start DTMF reject +int aifg_msg_sd_startDTMFRej(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_startDTMF_rej *startDTMF_rej = &(src->msg.startDTMF_rej); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_START_DTMF_REJECT; + + //cause + assert(startDTMF_rej->cause.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CAUSE, (ie_u *)&( startDTMF_rej->cause), dst+offset, 0); + + return offset; +} + +//facility +int aifg_msg_sd_facility(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_facility *facility = &(src->msg.facility); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_FACILITY; + + //facility + assert(facility->facility.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_FACILITY, (ie_u *)&( facility->facility), dst+offset, 0); + + return offset; +} + +//msg_encode with only 3 ies +//authentication reject +int aifg_msg_sd_authRej(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_AUTH_REJECT; + + return offset; +} + +//CM service accept +int aifg_msg_sd_cmAccept(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_CM_ACCEPT; + + return offset; +} + +//CM service abort +int aifg_msg_sd_cmAbort(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_CM_ABORT; + + return offset; +} + +//TMSI reallocation complete +int aifg_msg_sd_tmsiReallocCmp(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_TMSI_REALLOC_CMP; + + return offset; +} + +//MM null +int aifg_msg_sd_mmNull(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_MM_NULL; + + return offset; +} + +//connect acknowledge +int aifg_msg_sd_connectAck(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_CONNECT_ACK; + + return offset; +} + +//hold +int aifg_msg_sd_hold(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_HOLD; + + return offset; +} + +//hold acknowledge +int aifg_msg_sd_holdAck(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_HOLD_ACK; + + return offset; +} + +//retrieve +int aifg_msg_sd_retrieve(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_RETRIEVE; + + return offset; +} + +//retrieve acknowledge +int aifg_msg_sd_retrieveAck(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_RETRIEVE_ACK; + + return offset; +} + +//status enquiry +int aifg_msg_sd_statusEnq(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_STATUS_ENQ; + + return offset; +} + +//stop DTMF +int aifg_msg_sd_stopDTMF(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_STOP_DTMF; + + return offset; +} + +//stop DTMF acknowledge +int aifg_msg_sd_stopDTMFAck(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_STOP_DTMF_ACK; + + return offset; +} + +//facility SS +int aifg_msg_sd_facilitySS(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_facilitySS *facilitySS = &(src->msg.facilitySS); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_FACILITY_SS; + + //facility, mandatory but has iei + assert(facilitySS->facility.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_FACILITY, + (ie_u *)&( facilitySS->facility), dst+offset, 0); + + return offset; +} + + +//register +int aifg_msg_sd_register(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_register *registerSS = &(src->msg.registerSS); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_REGISTER; + + //facility, mandatory but has iei + assert(registerSS->facility.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_FACILITY, + (ie_u *)&( registerSS->facility), dst+offset, 2); + + //SS Version + if(registerSS->ssVer.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_SSVER, + (ie_u *)&( registerSS->ssVer), dst+offset, 2); + } + + return offset; +} + +//release complete SS +int aifg_msg_sd_releaseCompSS(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_releaseCompSS *releaseCompSS = &(src->msg.releaseCompSS); + + assert(src != NULL && dst != NULL); + + dst[offset++] = AIFG_MSG_T_RELEASE_CMP_SS; + + //Cause + if(releaseCompSS->cause.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_CAUSE, + (ie_u *)&( releaseCompSS->cause), dst+offset, 2); + } + + //facility + if(releaseCompSS->facility.flag == 1){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_FACILITY, + (ie_u *)&( releaseCompSS->facility), dst+offset, 2); + } + + return offset; +} + +//SMS +//RP DATA +int aifg_msg_sd_rp_data(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_rpData *rpData = &(src->msg.rpData); + + assert(src != NULL && dst != NULL); + + //CP header + dst[offset++] = AIFG_MSG_T_CP_DATA; + offset++; //skip length + + //RP header + dst[offset++] = AIFG_MSG_T_RP_DATA_NW; + dst[offset++] = src->msg.rpData.ref; + + //Originator address element + assert(rpData->moAddr.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_RP_MO_ADDR, + (ie_u *)&( rpData->moAddr), dst+offset, 0); + + //Destination address element + assert(rpData->mtAddr.flag == 1); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_RP_MT_ADDR, + (ie_u *)&( rpData->mtAddr), dst+offset, 0); + + //RP User data + assert(rpData->data.len > 0); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_RP_UD, + (ie_u *)&( rpData->data), dst+offset, 1); + + dst[1] = offset - 2; + + return offset; +} + +//RP ACK +int aifg_msg_sd_rp_ack(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_rpAck *rpAck = &(src->msg.rpAck); + + assert(src != NULL && dst != NULL); + + //CP header + dst[offset++] = AIFG_MSG_T_CP_DATA; + offset++; //skip length + + //RP header + dst[offset++] = AIFG_MSG_T_RP_ACK_NW; + dst[offset++] = rpAck->ref; + + //RP User data + if(rpAck->data.len > 0){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_RP_UD, + (ie_u *)&( rpAck->data), dst+offset, 2); + } + + dst[1] = offset - 2; + + return offset; +} + +//RP ERROR +int aifg_msg_sd_rp_error(aifg_msg_t* src, BYTE *dst) +{ + int offset = 0; + + aifg_msg_dt_rpError *rpErr = &(src->msg.rpError); + + assert(src != NULL && dst != NULL); + + //CP header + dst[offset++] = AIFG_MSG_T_CP_DATA; + offset++; //skip length + + //RP header + dst[offset++] = AIFG_MSG_T_RP_ERROR_NW; + dst[offset++] = rpErr->ref; + + //RP Cause + assert(1 == rpErr->cause.flag); + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_RP_CAUSE, + (ie_u *)&( rpErr->cause), dst+offset, 0); + + //RP User data + if(rpErr->data.len > 0){ + offset += aifg_ie_encode(AIFG_MSG_DTAP, AIFG_IE_ID_DT_RP_UD, + (ie_u *)&( rpErr->data), dst+offset, 2); + } + + dst[1] = offset - 2; + + return offset; +} + +//End of message encode functions definition---------------------------------------- + +//Interface function of MPP submodule definition-------------------------------------- +/* +Name: aifg_mpp_init +Purpose:init MPP submodule +Input: None +Output: None +*/ +enum{AIFG_MSG_DECODE, AIFG_MSG_ENCODE}; +void aifg_mpp_init() +{ + //Init message decode function ptr array + aifg_msg_rv_func_ptr[AIFG_MSG_ID_ASSIGN_REQ] = aifg_msg_rv_assignReq; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_ASSIGN_CMP] = aifg_msg_rv_assignComplete; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_ASSIGN_FAIL] = aifg_msg_rv_assignFailure; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_BLOCK] = aifg_msg_rv_block; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_BLOCK_ACK] = aifg_msg_rv_blockAck; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_UNBLOCK] = aifg_msg_rv_unBlock; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_UNBLOCK_ACK] = aifg_msg_rv_unBlockAck; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_HO_REQUEST] = aifg_msg_rv_HORequest; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_HO_REQUIRED] = aifg_msg_rv_HORequired; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_HO_REQ_ACK] = aifg_msg_rv_HORequestAck; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_HO_CMD] = aifg_msg_rv_HOCmd; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_HO_CMP] = aifg_msg_rv_HOComplete; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_HO_SUC] = NULL; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_HO_CAN_ENQ] = aifg_msg_rv_HOCandEnq; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_HO_CAN_RESP] = aifg_msg_rv_HOCandResp; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_HO_FAIL] = aifg_msg_rv_HOFailure; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_RESRC_REQ] = aifg_msg_rv_resrcReq; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_RESRC_IND] = aifg_msg_rv_resrcInd; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_PAGING] = aifg_msg_rv_paging; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CLR_REQ] = aifg_msg_rv_clearReq; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CLR_CMD] = aifg_msg_rv_clearCmd; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CLR_CMP] = aifg_msg_rv_clearCmp; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_RESET] = aifg_msg_rv_reset; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_RESET_ACK] = aifg_msg_rv_resetAck; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_HO_PERFORMED] = aifg_msg_rv_HOPerformed; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_OVERLOAD] = aifg_msg_rv_overload; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_MSC_INVK_TRACE] = aifg_msg_rv_mscTrace; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_BSC_INVK_TRACE] = aifg_msg_rv_bscTrace; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CM_UPDATE] = aifg_msg_rv_cmUpdate; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CIPHER_MODE_CMD] = aifg_msg_rv_cipherModeCmd; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CIPHER_MODE_CMP] = aifg_msg_rv_cipherModeComp; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_L3_INFO] = aifg_msg_rv_completeL3Info; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_QUEUE_IND] = NULL; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_SAPI_REJ] = aifg_msg_rv_sapi_n_rej; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_HO_REQ_REJ] = aifg_msg_rv_HORequiredRej; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_RESET_CC] = aifg_msg_rv_resetCircuit; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_RESET_CC_ACK] = aifg_msg_rv_resetCircuitAck; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_HO_DETECT] = NULL; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CC_GROUP_BLK] = aifg_msg_rv_ccGroupBlock; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CC_GROUP_BLK_ACK] = aifg_msg_rv_ccGroupBlockAck; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CC_GROUP_UNBLK] = aifg_msg_rv_ccGroupUnblock; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CC_GROUP_UNBLK_ACK] = aifg_msg_rv_ccGroupUnblockAck; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CONFUSION] = aifg_msg_rv_confusion; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CM_REQUEST] = NULL; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_UNEQUIP_CC] = aifg_msg_rv_unequippedCircuit; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CIPHER_MODE_REJ] = aifg_msg_rv_clearReq; //the same as clear request + aifg_msg_rv_func_ptr[AIFG_MSG_ID_LOAD_IND] = aifg_msg_rv_loadInd; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_SUSPEND] = aifg_msg_rv_suspend; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_RESUME] = aifg_msg_rv_suspend; //the same as suspend + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CHANGE_CC] = NULL; //not supported + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CHANGE_CC_ACK] = NULL; //not supported + aifg_msg_rv_func_ptr[AIFG_MSG_ID_LSA_INFO] = NULL; //not supported + aifg_msg_rv_func_ptr[AIFG_MSG_ID_LOC_INFO_CMD] = aifg_msg_rv_locInfoCmd; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_LOC_INFO_RPT] = aifg_msg_rv_locInfoReport; + ////////dtap///////////// + //mm + aifg_msg_rv_func_ptr[AIFG_MSG_ID_AUTH_REJECT] = NULL; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_AUTH_REQUEST] = aifg_msg_rv_authReq; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_AUTH_RESPONSE] = aifg_msg_rv_authResp; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CM_REEST_REQUEST] = NULL; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CM_ACCEPT] = NULL; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CM_REJECT] = aifg_msg_rv_cmRej; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CM_ABORT] = NULL; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_ABORT] = aifg_msg_rv_cmRej;//the same as cm service reject + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CM_REQUEST] = aifg_msg_rv_cmReq; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_ID_REQUEST] = aifg_msg_rv_idReq; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_ID_RESPONSE] = aifg_msg_rv_idResp; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_IMSI_DETACH_IND] = NULL; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_LU_ACCEPT] = aifg_msg_rv_luAccept; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_LU_REQUEST] = NULL; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_LU_REJECT] = aifg_msg_rv_cmRej;//the same as cm service reject + aifg_msg_rv_func_ptr[AIFG_MSG_ID_MM_INFO] = aifg_msg_rv_mmInfo; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_MM_STATUS] = aifg_msg_rv_cmRej;//The same as CM service reject + aifg_msg_rv_func_ptr[AIFG_MSG_ID_TMSI_REALLOC_CMD] = aifg_msg_rv_tmsiRealloc; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_TMSI_REALLOC_CMP] = NULL; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_MM_NULL] = NULL; + //cc + aifg_msg_rv_func_ptr[AIFG_MSG_ID_ALERTING] = aifg_msg_rv_alert; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CALL_CONFIRMED] = aifg_msg_rv_callConfirm; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CALL_PROCEEDING] = aifg_msg_rv_callProceed; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CONGESTION_CTRL] = aifg_msg_rv_congestCtrl; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CONNECT] = aifg_msg_rv_connect; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_CONNECT_ACK] = NULL; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_DISCONNECT] = aifg_msg_rv_disconnect; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_EMERGENCY_SETUP] = aifg_msg_rv_eSetup; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_FACILITY] = aifg_msg_rv_facility; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_HOLD] = NULL; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_HOLD_ACK] = NULL; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_HOLD_REJECT] = aifg_msg_rv_holdRej; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_MODIFY] = aifg_msg_rv_modify; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_MODIFY_CMP] = aifg_msg_rv_modify;//the same as modify + aifg_msg_rv_func_ptr[AIFG_MSG_ID_MODIFY_REJECT] = aifg_msg_rv_modifyRej; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_NOTIFY] = aifg_msg_rv_notify; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_PROGRESS] = aifg_msg_rv_progress; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_RELEASE] = aifg_msg_rv_release; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_RELEASE_CMP] = aifg_msg_rv_releaseComp; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_RETRIEVE] = NULL; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_RETRIEVE_ACK] = NULL; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_RETRIEVE_REJECT] = aifg_msg_rv_holdRej;//the same as hold reject + aifg_msg_rv_func_ptr[AIFG_MSG_ID_SETUP] = aifg_msg_rv_setup; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_START_DTMF] = aifg_msg_rv_startDTMF; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_START_DTMF_ACK] = aifg_msg_rv_startDTMF;//the same as stratDTMF + aifg_msg_rv_func_ptr[AIFG_MSG_ID_START_DTMF_REJECT] = aifg_msg_rv_holdRej;//the same as holdReject + aifg_msg_rv_func_ptr[AIFG_MSG_ID_STATUS] = aifg_msg_rv_status; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_STATUS_ENQ] = NULL; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_STOP_DTMF] = NULL; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_STOP_DTMF_ACK] = NULL; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_USER_INFO] = aifg_msg_rv_userInfo; + //ss + aifg_msg_rv_func_ptr[AIFG_MSG_ID_FACILITY_SS] = aifg_msg_rv_facilitySS; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_RELEASE_CMP_SS] = aifg_msg_rv_releaseCompSS; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_REGISTER] = aifg_msg_rv_register; + //sms + aifg_msg_rv_func_ptr[AIFG_MSG_ID_RP_DATA] = aifg_msg_rv_rp_data; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_RP_SMMA] = aifg_msg_rv_rp_smma; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_RP_ACK] = aifg_msg_rv_rp_ack; + aifg_msg_rv_func_ptr[AIFG_MSG_ID_RP_ERROR] = aifg_msg_rv_rp_error; + + //Init message encode function ptr array + aifg_msg_sd_func_ptr[AIFG_MSG_ID_ASSIGN_REQ] = aifg_msg_sd_assignReq; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_ASSIGN_CMP] = aifg_msg_sd_assignComplete; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_ASSIGN_FAIL] = aifg_msg_sd_assignFailure; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_BLOCK] = aifg_msg_sd_block; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_BLOCK_ACK] = aifg_msg_sd_blockAck; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_UNBLOCK] = aifg_msg_sd_unblock; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_UNBLOCK_ACK] = aifg_msg_sd_unblockAck; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_HO_REQUEST] = aifg_msg_sd_HORequest; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_HO_REQUIRED] = aifg_msg_sd_HORequired; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_HO_REQ_ACK] = aifg_msg_sd_HORequestAck; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_HO_CMD] = aifg_msg_sd_HOCmd; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_HO_CMP] = aifg_msg_sd_HOComplete; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_HO_SUC] = aifg_msg_sd_HOSucceed; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_HO_CAN_ENQ] = aifg_msg_sd_HOCandEnq; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_HO_CAN_RESP] = aifg_msg_sd_HOCandResp; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_HO_FAIL] = aifg_msg_sd_HOFailure; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_RESRC_REQ] = aifg_msg_sd_resrcReq; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_RESRC_IND] = aifg_msg_sd_resrcInd; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_PAGING] = aifg_msg_sd_paging; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CLR_REQ] = aifg_msg_sd_clearReq; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CLR_CMD] = aifg_msg_sd_clearCmd; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CLR_CMP] = aifg_msg_sd_clearComplete; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_RESET] = aifg_msg_sd_reset; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_RESET_ACK] = aifg_msg_sd_resetAck; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_HO_PERFORMED] = aifg_msg_sd_HOPerformed; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_OVERLOAD] = aifg_msg_sd_overload; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_MSC_INVK_TRACE] = aifg_msg_sd_mscTrace; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_BSC_INVK_TRACE] = aifg_msg_sd_bscTrace; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CM_UPDATE] = aifg_msg_sd_cmUpdate; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CIPHER_MODE_CMD] = aifg_msg_sd_cipherModeCmd; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CIPHER_MODE_CMP] = aifg_msg_sd_cipherModeComplete; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_L3_INFO] = aifg_msg_sd_completeL3Info; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_QUEUE_IND] = aifg_msg_sd_queueInd; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_SAPI_REJ] = aifg_msg_sd_sapi_n_rej; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_HO_REQ_REJ] = aifg_msg_sd_HORequiredRej; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_RESET_CC] = aifg_msg_sd_resetCircuit; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_HO_DETECT] = aifg_msg_sd_HODetect; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CC_GROUP_BLK] = aifg_msg_sd_ccGrpBlk; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CC_GROUP_BLK_ACK] = aifg_msg_sd_ccGroupBlockAck; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CC_GROUP_UNBLK] = aifg_msg_sd_ccGroupUnblock; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CC_GROUP_UNBLK_ACK] = aifg_msg_sd_ccGroupUnblockAck; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CONFUSION] = aifg_msg_sd_confusion; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CLASSMARK_REQ] = aifg_msg_sd_classmarkReq; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_UNEQUIP_CC] = aifg_msg_sd_unequippedCircuit; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CIPHER_MODE_REJ] = aifg_msg_sd_cipherModeRej; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_LOAD_IND] = aifg_msg_sd_loadInd; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_SUSPEND] = aifg_msg_sd_suspend; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_RESUME] = aifg_msg_sd_resume; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CHANGE_CC] = aifg_msg_sd_changeCircuit; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CHANGE_CC_ACK] = aifg_msg_sd_changeCircuitAck; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_LSA_INFO] = NULL;//not supported + aifg_msg_sd_func_ptr[AIFG_MSG_ID_LOC_INFO_CMD] = aifg_msg_sd_locCmd; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_LOC_INFO_RPT] = aifg_msg_sd_locReport; + ////////dtap///////////// + //mm + aifg_msg_sd_func_ptr[AIFG_MSG_ID_AUTH_REJECT] = aifg_msg_sd_authRej; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_AUTH_REQUEST] = aifg_msg_sd_authReq; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CM_REEST_REQUEST] = NULL; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CM_ACCEPT] = aifg_msg_sd_cmAccept; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CM_REJECT] = aifg_msg_sd_cmRej; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CM_ABORT] = aifg_msg_sd_cmAbort; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_ABORT] = aifg_msg_sd_abort; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CM_REQUEST] = NULL; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_ID_REQUEST] = aifg_msg_sd_idReq; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_ID_RESPONSE] = aifg_msg_sd_idResp; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_IMSI_DETACH_IND] = NULL; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_LU_ACCEPT] = aifg_msg_sd_luAccept; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_LU_REQUEST] = NULL; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_LU_REJECT] = aifg_msg_sd_luReject; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_TMSI_REALLOC_CMD] = aifg_msg_sd_tmsiReallocCmd; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_TMSI_REALLOC_CMP] = aifg_msg_sd_tmsiReallocCmp; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_MM_NULL] = aifg_msg_sd_mmNull; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_MM_STATUS] = aifg_msg_sd_mmStatus; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_MM_INFO] = aifg_msg_sd_mmInfo; + //cc + aifg_msg_sd_func_ptr[AIFG_MSG_ID_ALERTING] = aifg_msg_sd_alert; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CALL_CONFIRMED] = aifg_msg_sd_callConfirm; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CALL_PROCEEDING] = aifg_msg_sd_callProceed; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CONGESTION_CTRL] = aifg_msg_sd_congestCtrl; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CONNECT] = aifg_msg_sd_connect; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_CONNECT_ACK] = aifg_msg_sd_connectAck; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_DISCONNECT] = aifg_msg_sd_disconnect; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_EMERGENCY_SETUP] = aifg_msg_sd_eSetup; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_FACILITY] = aifg_msg_sd_facility; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_HOLD] = aifg_msg_sd_hold; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_HOLD_ACK] = aifg_msg_sd_holdAck; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_HOLD_REJECT] = aifg_msg_sd_holdRej; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_MODIFY] = aifg_msg_sd_modify; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_MODIFY_CMP] = aifg_msg_sd_modifyCmp; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_MODIFY_REJECT] = aifg_msg_sd_modifyRej; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_NOTIFY] = aifg_msg_sd_notify; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_PROGRESS] = aifg_msg_sd_progress; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_RELEASE] = aifg_msg_sd_release; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_RELEASE_CMP] = aifg_msg_sd_releaseCmp; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_RETRIEVE] = aifg_msg_sd_retrieve; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_RETRIEVE_ACK] = aifg_msg_sd_retrieveAck; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_RETRIEVE_REJECT] = aifg_msg_sd_retrieveRej; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_SETUP] = aifg_msg_sd_setup; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_START_DTMF] = aifg_msg_sd_startDTMF; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_START_DTMF_ACK] = aifg_msg_sd_startDTMFAck; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_START_DTMF_REJECT] = aifg_msg_sd_startDTMFRej; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_STATUS] = aifg_msg_sd_status; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_STATUS_ENQ] = aifg_msg_sd_statusEnq; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_STOP_DTMF] = aifg_msg_sd_stopDTMF; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_STOP_DTMF_ACK] = aifg_msg_sd_stopDTMFAck; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_USER_INFO] = aifg_msg_sd_userInfo; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_FACILITY_SS] = aifg_msg_sd_facilitySS; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_REGISTER] = aifg_msg_sd_register; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_RELEASE_CMP_SS] = aifg_msg_sd_releaseCompSS; + //SMS + aifg_msg_sd_func_ptr[AIFG_MSG_ID_RP_DATA] = aifg_msg_sd_rp_data; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_RP_ERROR] = aifg_msg_sd_rp_error; + aifg_msg_sd_func_ptr[AIFG_MSG_ID_RP_ACK] = aifg_msg_sd_rp_ack; + + return; +} + +int aifg_mpp_proc() +{ + int tmp_sapid, tmp_cgid; + BYTE *raw_msg_ptr = NULL; + + //Read message from sccp + if(0 == SpSubmit(&sccp_msg, SCCP_SAP_AIFG)) + return AIFG_PROC_FINISH; + + switch(sccp_msg.uUiPri){ + case N_CONNECT_IND: //CR + tmp_cgid = aifg_get_cg(sccp_msg.tPriUnion.tPriNConnInd.OPC, sccp_msg.tPriUnion.tPriNConnInd.NetID); + if (tmp_cgid == -1) + goto FINISH; //can not find corresponding CG, discard + + if(0x04 != (sccp_msg.tPriUnion.tPriNConnInd.uOptFlag & 0x04)){ + aifg_debug_print(-1, AIFG_ERR_NO_UD_IN_CR, &sccp_msg, 0); //no user data, treat as error + goto FINISH; + } + + if(0 != link_info[sccp_msg.wConnId].en_flag) + goto FINISH; //duplicated CR, discard + + rv_msg.tg_id = cg[tmp_cgid].tgid; + raw_msg_ptr = sccp_msg.tPriUnion.tPriNConnInd.tUD.aUserData; + if(AIFG_MSG_T_L3_INFO == raw_msg_ptr[2]) + tmp_sapid = AIFG_SAP_MSC; + else if(AIFG_MSG_T_HO_REQUEST == raw_msg_ptr[2]) + tmp_sapid = AIFG_SAP_BSC; + else{ + aifg_event = AIFG_ERR_UNKNOW_MSG; + goto ERROR_PROC; + } + break; + + case N_CONNECT_CFM: //CC + if(0 == link_info[sccp_msg.wConnId].en_flag){ + aifg_debug_print(-1, AIFG_ERR_UNEXPECTED_CC, &sccp_msg, 0); + goto FINISH; + } + + if(0x04 == (sccp_msg.tPriUnion.tPriNConnCfm.uOptFlag & 0x04) + && sccp_msg.tPriUnion.tPriNConnCfm.tUD.uDataLen > 0){ + //has user data + raw_msg_ptr = sccp_msg.tPriUnion.tPriNConnCfm.tUD.aUserData; + tmp_sapid = link_info[sccp_msg.wConnId].sapid; + } + else + goto FINISH; + + break; + + case N_DATA_IND: //DT1 + if(0 == link_info[sccp_msg.wConnId].en_flag){ + aifg_debug_print(-1, AIFG_ERR_UNEXPECTED_DT1, &sccp_msg, 0); + goto FINISH; + } + + raw_msg_ptr = sccp_msg.tPriUnion.tPriNDataInd.tUD.aUserData; + tmp_sapid = link_info[sccp_msg.wConnId].sapid; + break; + + case N_UNITDATA_IND://UDT + tmp_cgid = aifg_get_cg(sccp_msg.tPriUnion.tPriNUDataInd.tCGA.DPC, sccp_msg.tPriUnion.tPriNUDataInd.tCGA.NetID); + rv_msg.tg_id = cg[tmp_cgid].tgid; + if (tmp_cgid == -1){ + //printf error here + goto FINISH; + } + raw_msg_ptr = sccp_msg.tPriUnion.tPriNUDataInd.tUD.aUserData; + tmp_sapid = cg[tmp_cgid].sapid; + break; + + case N_DISCONNECT_IND://RLSD or CREF + if(0 == link_info[sccp_msg.wConnId].en_flag){ + aifg_debug_print(-1, AIFG_ERR_UNEXPECTED_CC, &sccp_msg, 0); + goto FINISH; + } +/* + if(0x04 == (sccp_msg.tPriUnion.tPriNDisconnInd.uOptFlag & 0x04) + && sccp_msg.tPriUnion.tPriNDisconnInd.tUD.uDataLen > 0){ + //has user data + raw_msg_ptr = sccp_msg.tPriUnion.tPriNDisconnInd.tUD.aUserData; + tmp_sapid = link_info[sccp_msg.wConnId].sapid; + link_info[sccp_msg.wConnId].cleared = 1; + } + else +*/ goto FINISH; + break; + + default: + assert(0); //should never happen + goto FINISH; + break; + } + + if (sap[tmp_sapid].enable == 0) + goto FINISH; + + //decode the message and find its process port + if(AIFG_SAP_BSC == tmp_sapid && AIFG_MSG_DTAP == raw_msg_ptr[0]){ + //Transparently transfer of DTAP message at BSC side + rv_msg.id = AIFG_MSG_ID_TRANSPARENT_DTAP; + rv_msg.msg.dtap_msg.len = raw_msg_ptr[2]; + rv_msg.msg.dtap_msg.ptr = raw_msg_ptr + 3; //skip 3 bytes BSSAP header + rv_msg.aif_port = link_info[sccp_msg.wConnId].cur_port; + } + else{ + if(AIFG_SUCCEED != aifg_msg_proc(raw_msg_ptr, &rv_msg)) + goto ERROR_PROC; + + if (rv_msg.id == AIFG_MSG_ID_IGNORED_MSG){ + goto FINISH; + } + + //get local port for received msg + rv_msg.aif_port = -1; + rv_msg.app_port = -1; + switch(rv_msg.pd){ + case AIFG_PD_DTAP_MM: + switch(rv_msg.id){ + case AIFG_MSG_ID_CM_REQUEST: + if((rv_msg.aif_port = aifg_port_assign(tmp_sapid, -1, sccp_msg.wConnId)) < 0) + goto ERROR_PROC; + if(link_info[sccp_msg.wConnId].cur_port == -1 + || aifg_pcb[link_info[sccp_msg.wConnId].cur_port].upper_port == -1){ + int i, j, k; + k = 0; + for(i=0; i < 3; i++){ + for(j=0; j < AIFG_MAX_TI_PER_LINK; j++){ + if(link_info[sccp_msg.wConnId].ti[i][j].en_flag != 0 + && link_info[sccp_msg.wConnId].ti[i][j].port != -1 + && aifg_pcb[link_info[sccp_msg.wConnId].ti[i][j].port].upper_port != -1){ + rv_msg.app_port = aifg_pcb[link_info[sccp_msg.wConnId].ti[i][j].port].upper_port; + k = 1; + break; + } + } + if (k == 1) + break; + } + } + else + rv_msg.app_port = aifg_pcb[link_info[sccp_msg.wConnId].cur_port].upper_port; //hand message to current open port + + link_info[sccp_msg.wConnId].cur_port = rv_msg.aif_port; + break; + default: + rv_msg.aif_port = link_info[sccp_msg.wConnId].cur_port; + break; + } + break; + case AIFG_PD_DTAP_SMS: + //send back cp ack + sccp_msg.uUiPri = N_DATA_REQ; + sccp_msg.tPriUnion.tPriNDataReq.tUD.aUserData[2] = 2; //length + if (sccp_msg.tPriUnion.tPriNDataReq.tUD.aUserData[3] > 0x80)//ti + sccp_msg.tPriUnion.tPriNDataReq.tUD.aUserData[3] = + sccp_msg.tPriUnion.tPriNDataReq.tUD.aUserData[3] & 0x7F; + else + sccp_msg.tPriUnion.tPriNDataReq.tUD.aUserData[3] = + sccp_msg.tPriUnion.tPriNDataReq.tUD.aUserData[3] | 0x80; + sccp_msg.tPriUnion.tPriNDataReq.tUD.aUserData[4] = 0x04; //msg type + sccp_msg.tPriUnion.tPriNDataReq.tUD.uDataLen = 5; + PostSp(&sccp_msg); + //no break here + case AIFG_PD_DTAP_CC: //These are transfered on connection oriented link + case AIFG_PD_DTAP_SS: + { + //find the corresponding local port and open it as current port + rv_msg.aif_port = aifg_ti2lport(rv_msg.ti, sccp_msg.wConnId, rv_msg.pd); + if (rv_msg.aif_port == -1){ + //try to use current opened port + if (link_info[sccp_msg.wConnId].cur_port != -1){ + rv_msg.aif_port = link_info[sccp_msg.wConnId].cur_port; + } + else{ + aifg_event = AIFG_ERR_INVALID_TI; + goto ERROR_PROC; + } + } + } + break; + case AIFG_PD_BSSMAP_DEDICATED: + { + switch(rv_msg.id){ + case AIFG_MSG_ID_L3_INFO: + { + switch(rv_msg.msg.completeL3Info.l3msg.id){ + case AIFG_MSG_ID_CM_REQUEST: + if(raw_msg_ptr[0] != 0x02) + { + aifg_ie tmp_ie; + if(aifg_ie_decode(&rv_msg.msg.completeL3Info.l3msg.msg.cmRequest.type, &tmp_ie) < 0) + goto ERROR_PROC; + + if(tmp_ie.param.dt_cmType.value == 1||tmp_ie.param.dt_cmType.value == 2) + { + if(aifg_check_timeslot_avail(rv_msg.tg_id)==0) + { + aifg_msg_redirect(&sccp_msg); + goto FINISH; + } + } + } + case AIFG_MSG_ID_CM_REEST_REQUEST: + { + //how to deal with this msg?? + } + //break; //treat this as normal service request (as following) msg temporarily + case AIFG_MSG_ID_IMSI_DETACH_IND: + case AIFG_MSG_ID_LU_REQUEST: + { + //service request msg, assign a new port for the following transaction + if((rv_msg.aif_port = aifg_port_assign(tmp_sapid, -1, sccp_msg.wConnId)) < 0) + goto ERROR_PROC; + } + break; + case AIFG_MSG_ID_PAGING_RESP: + { + //get the paging port + aifg_ie tmp_ie; + BYTE *imsi_ptr; + BYTE imsi_len; + aifg_ie_decode(&rv_msg.msg.completeL3Info.l3msg.msg.pagingResp.mobileId, &tmp_ie); + imsi_ptr = tmp_ie.param.mobileId.id; + imsi_len = tmp_ie.param.mobileId.id_len; + if(-1 == (rv_msg.aif_port = aifg_get_paging_port(tmp_cgid, imsi_ptr, imsi_len))){ + //not found, redirect + aifg_msg_redirect(&sccp_msg); + goto FINISH; + } + //found + aifg_pcb[rv_msg.aif_port].link_id = sccp_msg.wConnId; + assert(aifg_pcb[rv_msg.aif_port].stat == AIFG_PORT_PAGING); + } + break; + default: + break; + } + + //send back cc + SP_UiPriPara tmp_msg; + tmp_msg.uUiPri = N_CONNECT_RSP; + tmp_msg.wConnId = sccp_msg.wConnId; + tmp_msg.tPriUnion.tPriNConnRsp.uOptFlag = 0; + PostSp(&tmp_msg); + //enable this link + aifg_add_link(sccp_msg.wConnId, tmp_sapid); + } + break; + case AIFG_MSG_ID_HO_REQUEST: + { + //assign a new port for the transaction + if((rv_msg.aif_port = aifg_port_assign(tmp_sapid, -1, sccp_msg.wConnId)) < 0) + goto ERROR_PROC; + + //send back cc + SP_UiPriPara tmp_msg; + tmp_msg.uUiPri = N_CONNECT_RSP; + tmp_msg.wConnId = sccp_msg.wConnId; + tmp_msg.tPriUnion.tPriNConnRsp.uOptFlag = 0; + PostSp(&tmp_msg); + //enable this link + aifg_add_link(sccp_msg.wConnId, tmp_sapid); + } + break; + default: + rv_msg.aif_port = link_info[sccp_msg.wConnId].cur_port; + break; + } + } + break; + case AIFG_PD_BSSMAP_GLOBAL: + { + BYTE redirectFlag = 1; + + switch(rv_msg.id){ + case AIFG_MSG_ID_RESET: + { + if ((rv_msg.aif_port = aifg_port_assign(tmp_sapid, tmp_cgid, -1)) < 0) + goto ERROR_PROC; + rv_msg.app_port = UPPER_PROC; + } + break; + case AIFG_MSG_ID_RESET_CC: + { + SP_UiPriPara tmp_sccp_msg; + memset(&tmp_sccp_msg, 0, sizeof(tmp_sccp_msg)); + + rv_msg.aif_port = AIFG_PORT_NOT_NEED; + rv_msg.app_port = UPPER_PROC; + + //send back reset cc ack + sd_msg.id = AIFG_MSG_ID_RESET_CC_ACK; + sd_msg.msg.resetCircuitAck.cic.flag = 1; + sd_msg.msg.resetCircuitAck.cic.pcm = + (rv_msg.msg.resetCircuit.cic.ptr[0] << 3) + | ((rv_msg.msg.resetCircuit.cic.ptr[1] & 0xE0) >> 5); + sd_msg.msg.resetCircuitAck.cic.timeslot = + rv_msg.msg.resetCircuit.cic.ptr[1] & 0x1F; + aifg_send_udt(tmp_cgid, &sd_msg, &tmp_sccp_msg); + } + break; + case AIFG_MSG_ID_BLOCK: + { + SP_UiPriPara tmp_sccp_msg; + memset(&tmp_sccp_msg, 0, sizeof(tmp_sccp_msg)); + + rv_msg.aif_port = AIFG_PORT_NOT_NEED; + rv_msg.app_port = UPPER_PROC; + + //send back block ack + sd_msg.id = AIFG_MSG_ID_BLOCK_ACK; + sd_msg.msg.blockAck.cic.flag = 1; + sd_msg.msg.blockAck.cic.pcm = + (rv_msg.msg.block.cic.ptr[0] << 3) + | ((rv_msg.msg.block.cic.ptr[1] & 0xE0) >> 5); + sd_msg.msg.blockAck.cic.timeslot = rv_msg.msg.block.cic.ptr[1] & 0x1F; + aifg_send_udt(tmp_cgid, &sd_msg, &tmp_sccp_msg); + + rv_msg.aif_port = AIFG_PORT_NOT_NEED; + } + break; + case AIFG_MSG_ID_UNBLOCK: + { + SP_UiPriPara tmp_sccp_msg; + memset(&tmp_sccp_msg, 0, sizeof(tmp_sccp_msg)); + + rv_msg.aif_port = AIFG_PORT_NOT_NEED; + rv_msg.app_port = UPPER_PROC; + + //send back unblock ack + sd_msg.id = AIFG_MSG_ID_UNBLOCK_ACK; + sd_msg.msg.blockAck.cic.flag = 1; + sd_msg.msg.blockAck.cic.pcm = + (rv_msg.msg.block.cic.ptr[0] << 3) + | ((rv_msg.msg.block.cic.ptr[1] & 0xE0) >> 5); + sd_msg.msg.blockAck.cic.timeslot = rv_msg.msg.block.cic.ptr[1] & 0x1F; + aifg_send_udt(tmp_cgid, &sd_msg, &tmp_sccp_msg); + } + break; + case AIFG_MSG_ID_CC_GROUP_BLK: + { + aifg_ie tmp_ie; + SP_UiPriPara tmp_sccp_msg; + memset(&tmp_sccp_msg, 0, sizeof(tmp_sccp_msg)); + rv_msg.aif_port = AIFG_PORT_NOT_NEED; + rv_msg.app_port = UPPER_PROC; + + //send back group block ack + sd_msg.id = AIFG_MSG_ID_CC_GROUP_BLK_ACK; + sd_msg.msg.ccGroupBlockAck.cic.flag = 1; + sd_msg.msg.ccGroupBlockAck.cic.pcm = (rv_msg.msg.ccGroupBlock.cic.ptr[0] << 3) + | ((rv_msg.msg.ccGroupBlock.cic.ptr[1] & 0xE0) >> 5); + sd_msg.msg.ccGroupBlockAck.cic.timeslot = rv_msg.msg.ccGroupBlock.cic.ptr[1] & 0x1F; + aifg_ie_decode(&rv_msg.msg.ccGroupBlock.cicList, &tmp_ie); + memcpy(&sd_msg.msg.ccGroupBlockAck.cicList, &tmp_ie.param.bm_cicList, sizeof(tmp_ie.param.bm_cicList)); + aifg_send_udt(tmp_cgid, &sd_msg, &tmp_sccp_msg); + } + break; + case AIFG_MSG_ID_CC_GROUP_UNBLK: + { + aifg_ie tmp_ie; + SP_UiPriPara tmp_sccp_msg; + memset(&tmp_sccp_msg, 0, sizeof(tmp_sccp_msg)); + rv_msg.aif_port = AIFG_PORT_NOT_NEED; + rv_msg.app_port = UPPER_PROC; + + //send back group unblock ack + sd_msg.id = AIFG_MSG_ID_CC_GROUP_UNBLK_ACK; + sd_msg.msg.ccGroupUnblockAck.cic.flag = 1; + sd_msg.msg.ccGroupUnblockAck.cic.pcm = (rv_msg.msg.ccGroupUnblock.cic.ptr[0] << 3) + | ((rv_msg.msg.ccGroupUnblock.cic.ptr[1] & 0xE0) >> 5); + sd_msg.msg.ccGroupUnblockAck.cic.timeslot = rv_msg.msg.ccGroupUnblock.cic.ptr[1] & 0x1F; + aifg_ie_decode(&rv_msg.msg.ccGroupUnblock.cicList, &tmp_ie); + memcpy(&sd_msg.msg.ccGroupUnblockAck.cicList, &tmp_ie.param.bm_cicList, sizeof(tmp_ie.param.bm_cicList)); + aifg_send_udt(tmp_cgid, &sd_msg, &tmp_sccp_msg); + } + break; + case AIFG_MSG_ID_RESET_ACK: + case AIFG_MSG_ID_RESET_CC_ACK: + case AIFG_MSG_ID_BLOCK_ACK: + case AIFG_MSG_ID_UNBLOCK_ACK: + case AIFG_MSG_ID_CC_GROUP_BLK_ACK: + case AIFG_MSG_ID_CC_GROUP_UNBLK_ACK: + rv_msg.aif_port = AIFG_PORT_NOT_NEED; + rv_msg.app_port = LOCAL_PROC; + break; + default: + redirectFlag = 0; //no need to redirect to other server + rv_msg.aif_port = AIFG_PORT_NOT_NEED; + rv_msg.app_port = UPPER_PROC; + break; + } + + if (redirectFlag){ + //redirect to the other server + aifg_msg_redirect(&sccp_msg); + } + + //deliver to upper layer application, currently global BSSMAP procedure does not activate a AIFG port + if(LOCAL_PROC != rv_msg.app_port){ + rv_msg.trace_flag = 0; + sap[tmp_sapid].callback_func(AIFG_IND_RV_MSG, &rv_msg); + if (rv_msg.trace_flag == 1) + aifg_pcb[rv_msg.aif_port].trace_flag = rv_msg.trace_flag; //app may enable trace by setting rv_msg.trace_flag + aifg_pcb[rv_msg.aif_port].upper_port = rv_msg.app_port; //record app port if new assigned + aifg_debug_print(rv_msg.aif_port, AIFG_EVENT_SD_IND, &rv_msg, 0); + } + } + break; + default: + aifg_event = AIFG_ERR_UNKNOW_MSG; + goto FINISH; + break; + } + } + aifg_debug_print(rv_msg.aif_port, AIFG_EVENT_RV_MSG, &rv_msg, 0); + + //call port process + if(AIFG_PORT_NOT_NEED != rv_msg.aif_port){ + if (aifg_pcb[rv_msg.aif_port].stat == AIFG_PORT_IDLE){ + aifg_debug_print(rv_msg.aif_port, AIFG_ERR_MSG_RV_TO_IDLE_PORT, &rv_msg, 0); + goto ERROR_PROC; + } + aifg_port_proc(&aifg_pcb[rv_msg.aif_port], NULL, &rv_msg); + + if(sccp_msg.uUiPri == N_CONNECT_IND || sccp_msg.uUiPri == N_DATA_IND) + link_info[aifg_pcb[rv_msg.aif_port].link_id].cur_port = rv_msg.aif_port; + } + +FINISH: + if (sccp_msg.uUiPri == N_DISCONNECT_IND) + aifg_del_link(sccp_msg.wConnId); //release the link + + msg_statistics[rv_msg.id][0]++; + if (rv_msg.id == AIFG_MSG_ID_L3_INFO) + msg_statistics[rv_msg.msg.completeL3Info.l3msg.id][0]++; + + return AIFG_PROC_CONTINUE; + +ERROR_PROC: + aifg_debug_print(rv_msg.aif_port, aifg_event, &rv_msg, sccp_msg.wConnId); + return AIFG_PROC_CONTINUE; +} + +//End of interface function definition----------------------------------------------- + +//SCCP SAP--------------------------------------------------------------------------- +void aifg_send_udt(int cgid, aifg_msg_t *msg, SP_UiPriPara *buf_ptr) +{ + int len = 0; + + aifg_debug_print(msg->aif_port, AIFG_EVENT_SD_MSG, msg, 0); + + if(NULL == buf_ptr) + buf_ptr = &sccp_msg; + + buf_ptr->tPriUnion.tPriNUDataReq.tUD.aUserData[len++] = AIFG_MSG_BSSMAP; //Protocol discriminator + + len++; //skip length + + if(aifg_msg_sd_func_ptr[msg->id] != NULL) + len += aifg_msg_sd_func_ptr[msg->id](msg, buf_ptr->tPriUnion.tPriNUDataReq.tUD.aUserData+len); + + buf_ptr->tPriUnion.tPriNUDataReq.tUD.aUserData[1] = len-2; //length + + buf_ptr->uUiPri = N_UNITDATA_REQ; + buf_ptr->uAnsiFlag = 0; + memset(&buf_ptr->tPriUnion.tPriNUDataReq.tCDA, 0, sizeof(buf_ptr->tPriUnion.tPriNUDataReq.tCDA)); + buf_ptr->tPriUnion.tPriNUDataReq.tUD.uDataLen = len; + buf_ptr->tPriUnion.tPriNUDataReq.tCDA.DPC = cg[cgid].dpc; + buf_ptr->tPriUnion.tPriNUDataReq.tCDA.NetID = cg[cgid].ni; + buf_ptr->tPriUnion.tPriNUDataReq.tCDA.RI = 0x01; //route on SSN + buf_ptr->tPriUnion.tPriNUDataReq.tCDA.GTI = 0x00; //no global tittle + buf_ptr->tPriUnion.tPriNUDataReq.tCDA.SSN = 0xFE; //BSSAP + buf_ptr->tPriUnion.tPriNUDataReq.tCDA.ip = 0xFFFFFFFF; + + memset(&buf_ptr->tPriUnion.tPriNUDataReq.tCGA, 0, sizeof(buf_ptr->tPriUnion.tPriNUDataReq.tCGA)); + buf_ptr->tPriUnion.tPriNUDataReq.tCGA.NetID = cg[cgid].ni; + buf_ptr->tPriUnion.tPriNUDataReq.tCGA.RI = 0x01; //route on SSN + buf_ptr->tPriUnion.tPriNUDataReq.tCGA.GTI = 0x00; //no global tittle + buf_ptr->tPriUnion.tPriNUDataReq.tCGA.SSN = 0xFE; //BSSAP + + PostSp(buf_ptr); + msg_statistics[msg->id][1]++; + + return; +} + +//return new assigned link id +int aifg_send_cr(int sapid, int cgid, aifg_msg_t *msg) +{ + int len = 0; + BYTE *sd_buf = sccp_msg.tPriUnion.tPriNConnReq.tUD.aUserData; + + assert(msg->id == AIFG_MSG_ID_L3_INFO || msg->id == AIFG_MSG_ID_HO_REQUEST); + + aifg_debug_print(msg->aif_port, AIFG_EVENT_SD_MSG, msg, 0); + + sd_buf[len++] = AIFG_MSG_BSSMAP; //Protocol discriminator + sd_buf[len++] = 0; //skip length + + if(aifg_msg_sd_func_ptr[msg->id] != NULL) + sd_buf[1] = aifg_msg_sd_func_ptr[msg->id](msg, &(sd_buf[len])); + + len += sd_buf[1]; //length + + assert(len < SP_MAX_UD); + + sccp_msg.uUiPri = N_CONNECT_REQ; + sccp_msg.uAnsiFlag = 0; + memset(&sccp_msg.tPriUnion.tPriNConnReq.tCDA, 0, sizeof(sccp_msg.tPriUnion.tPriNConnReq.tCDA)); + sccp_msg.tPriUnion.tPriNConnReq.tCDA.DPC = cg[cgid].dpc; + sccp_msg.tPriUnion.tPriNConnReq.tCDA.NetID = cg[cgid].ni; + sccp_msg.tPriUnion.tPriNConnReq.tCDA.RI = 0x01; //route on SSN + sccp_msg.tPriUnion.tPriNConnReq.tCDA.GTI = 0x00; //no global tittle + sccp_msg.tPriUnion.tPriNConnReq.tCDA.SSN = 0xFE; //BSSAP + sccp_msg.tPriUnion.tPriNConnReq.tCDA.ip = 0xFFFFFFFF; + sccp_msg.tPriUnion.tPriNConnReq.uOptFlag = 0x08; + sccp_msg.tPriUnion.tPriNConnReq.tUD.uDataLen = len; + + PostSp(&sccp_msg); + msg_statistics[msg->id][1]++; + if (msg->id == AIFG_MSG_ID_L3_INFO){ + int msg_id = aifg_msgtype_to_localid(msg->msg.completeL3Info.l3Info.ptr[0], + msg->msg.completeL3Info.l3Info.ptr[1]); + msg_statistics[msg_id][1]++; + } + + return sccp_msg.wConnId; +} + +void aifg_send_dt1(int linkid, aifg_msg_t *msg, int ti) +{ + int len = 0; + BYTE *sd_buf = sccp_msg.tPriUnion.tPriNDataReq.tUD.aUserData; + + assert(msg->id != AIFG_MSG_ID_L3_INFO || msg->id != AIFG_MSG_ID_HO_REQUEST); + + aifg_debug_print(msg->aif_port, AIFG_EVENT_SD_MSG, msg, 0); + + if(AIFG_PD_BSSMAP_DEDICATED == msg->pd){ + sd_buf[len++] = AIFG_MSG_BSSMAP; //Protocol discriminator + sd_buf[len++] = 0; //skip length + + if(aifg_msg_sd_func_ptr[msg->id] != NULL) + sd_buf[1] = aifg_msg_sd_func_ptr[msg->id](msg, &(sd_buf[len])); + + len += sd_buf[1]; //length + msg_statistics[msg->id][1]++; + } + else if(msg->id != AIFG_MSG_ID_TRANSPARENT_DTAP){ + sd_buf[len++] = AIFG_MSG_DTAP; //Protocol discriminator + //DLCI + if (msg->pd == AIFG_PD_DTAP_SMS) + sd_buf[len++] = 0x03; + else + sd_buf[len++] = 0x00; + + sd_buf[len++] = 1; + + //TI and PD + if(ti != -1 && msg->pd != AIFG_PD_DTAP_MM) + sd_buf[len++] = msg->pd | (ti << 4); + else + sd_buf[len++] = msg->pd; + + if(aifg_msg_sd_func_ptr[msg->id] != NULL) + sd_buf[2] += aifg_msg_sd_func_ptr[msg->id](msg, &(sd_buf[len])); + + len += sd_buf[2] - 1; //length + msg_statistics[msg->id][1]++; + } + else{ + //transparently transfer of DTAP message at BSC side + len += msg->msg.dtap_msg.len; + memcpy(sd_buf, msg->msg.dtap_msg.ptr, msg->msg.dtap_msg.len); + msg_statistics[aifg_msgtype_to_localid(msg->pd, msg->msg.dtap_msg.ptr[1])][1]++; + } + + sccp_msg.uUiPri = N_DATA_REQ; + sccp_msg.wConnId = linkid; + sccp_msg.tPriUnion.tPriNDataReq.tUD.uDataLen = len; + + PostSp(&sccp_msg); +} + +void aifg_send_rlsd(int linkid) +{ + sccp_msg.wConnId = linkid; + sccp_msg.uUiPri = N_DISCONNECT_REQ; + sccp_msg.tPriUnion.tPriNDisconnReq.eREA = 0; + sccp_msg.tPriUnion.tPriNDisconnReq.uOptFlag = 0; + + aifg_debug_print(-1, AIFG_EVENT_LINK_RELEASE, NULL, sccp_msg.wConnId); + PostSp(&sccp_msg); +} +//End of SCCP SAP-------------------------------------------------------------------- + diff --git a/omc/plat/aif/src/include/.copyarea.db b/omc/plat/aif/src/include/.copyarea.db new file mode 100644 index 0000000..a3621e3 --- /dev/null +++ b/omc/plat/aif/src/include/.copyarea.db @@ -0,0 +1,11 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\aif\src\include +2 +7 +6:aifg.h|1|11d70a3de67|fe7|8b5f2301|b0296707bfa411dc84f1001c23e19543|0 +d:aifg_public.h|1|11d70a3dee4|39d|33cc0d9f|b159673fbfa411dc84f1001c23e19543|0 +9:aifg_ie.h|1|11d70a3df90|78f0|98f81cdb|b3196793bfa411dc84f1001c23e19543|0 +9:aifg_if.h|1|11d70a3df23|26a|5af7abd0|b1e9675bbfa411dc84f1001c23e19543|0 +a:aifg_msg.h|1|11d70a3deb5|aaac|6675a37b|853d2877c9bd11dc8b4a001c23e19543|0 +e:aifg_var_ext.h|1|11d70a3de29|93a|8f4d21bb|aef966ebbfa411dc84f1001c23e19543|0 +f:aifg_type_def.h|1|11d70a3df52|4492|b9916b|866d2878c9bd11dc8b4b001c23e19543|0 diff --git a/omc/plat/aif/src/include/aifg.h b/omc/plat/aif/src/include/aifg.h new file mode 100644 index 0000000..11c75c8 --- /dev/null +++ b/omc/plat/aif/src/include/aifg.h @@ -0,0 +1,118 @@ +/******************************************************************** +Copyright ?2007 LGC Wireless, Inc. All rights reserved +File Name: aifg.h +Description: API Definition of AIFG module +Version: v9.0.0 +Author: Roy Jiang +Create Date: 2007-3-6 + +History: +2007-3-6 v9.0.0 Create +2007-7-7 v9.0.1 Remove Block/Unblock/Reset/Reset CC/Overload/HO Can. Enq. API, + replace with aifg_send +*********************************************************************/ +#ifndef _WXC2_AIFG_H +#define _WXC2_AIFG_H +#include "aifg_msg.h" + +/*******************************SAP Management**********************************/ +/* +Name: aifg_bind +Purpose: Request to create a SAP in AIFG module. +Input: aifg_sap_type type: type of upper layer entity + int opc:OPC of upper layer entity. + aifg_ni ni: NI of upper layer entity. +Output: SAP id +*/ +int aifg_bind(aifg_sap_type type, int (*callback)(aifg_indication, aifg_msg_pre_decoded *)); + +/* +Name: aifg_modify +Purpose: Request to modify the SAP parameter in AIFG module. +Input: aifg_sap_type type: type of upper layer entity + int opc: new OPC, -1 if no need to modify + aifg_ni ni:new NI, -1 if no need to modify + aifg_callback_func *callback: new callback functions, null if no need to modify +Output: none +*/ +void aifg_modify(aifg_sap_type type, int (*callback)(aifg_indication, aifg_msg_pre_decoded *)); + +/* +Name: aifg_set_running_mode +Purpose: Set the running mode of AIFG module. +Input: enum aifg_run_mode mode: running mode, 0 - single, 1 - dual + int alter_ip:IP address of the alternative server, hex format +Output: None +*/ +void aifg_set_running_mode(aifg_run_mode mode); + +/* +Name: aifg_createCircuitGroup +Purpose: Request to create a circuit group in AIFG module. +Input: int sapid: SAP ID of upper layer entity + int dpc: DPC of the circuit group. + aifg_ni ni: NI of the circuit group. +Output: Circuit Group ID - Upper layer entity should record this ID and pass it to AIFG module + whenever it request to send a message through this circuit group + -1: Create failed +*/ +int aifg_createCircuitGroup(int sapid, int dpc, aifg_ni ni, int tgid); + +/* +Name: aifg_modCircuitGroup +Purpose: Request to modify the parameter of a circuit group in AIFG module. +Input: int sapid: SAP ID of upper layer entity + int cgid: Circuit Group ID + int dpc: new DPC of the circuit group, -1 if no need to change. + enum aifg_ni: new NI of the circuit group, -1 if no need to change. +Output: Circuit Group ID - Upper layer entity should record this ID and pass it to AIFG module + whenever it request to send a message through this circuit group +*/ +int aifg_modCircuitGroup(int sapid, int cgid, int dpc, int ni); + +/* +Name: aifg_delCircuitGroup +Purpose: Request to delete a circuit group in AIFG module. +Input: int sapid: SAP ID of upper layer entity + int cgid: Circuit Group ID +Output: None +*/ +void aifg_delCircuitGroup(int sapid, int cgid); + +/* +Name: aifg_send +Purpose: Request to send a message through A-interface. +Input: int sapid: SAP ID of upper layer entity. + int cgid: Circuit Group ID + int u_port: process port of upper layer entity + aifg_msg *msg: content of assign request message +Output: 0 - succeed + -1 - failed + -2 - failed, circuit group not ready +*/ +int aifg_send(int sapid, int cgid, int u_port, aifg_msg_t *msg); + +/* +Name: aifg_paging +Purpose: Request to paging. +Input: int sapid: SAP ID of upper layer entity + int cgid: Circuit Group ID + int u_port: process port of upper layer entity + aifg_msg_bm_paging *msg: paging message +Output: 0 - succeed + -1 - failed + -2 - failed, circuit group not ready +*/ +int aifg_paging(int sapid, int cgid, int u_port, aifg_msg_t *msg); + +/* +Name: aifg_ie_decode +Purpose: Information element decode function +Input: aifg_msg_protocol protocol: BSSMAP or DTAP + aifg_pre_decoded_ie *pre_decoded: pre-decoded IE structure + aifg_ie *dst: pointer to a aifg_ie structure object in which the decoded message will be stored. +Output: Total length of decoded IE +*/ +int aifg_ie_decode(aifg_ie_ptr *pre_decoded, aifg_ie *dst); + +#endif diff --git a/omc/plat/aif/src/include/aifg_ie.h b/omc/plat/aif/src/include/aifg_ie.h new file mode 100644 index 0000000..5b7b409 --- /dev/null +++ b/omc/plat/aif/src/include/aifg_ie.h @@ -0,0 +1,1006 @@ +/******************************************************************** +Copyright ?2007 LGC Wireless, Inc. All rights reserved +File Name: aifg_ie.h +Description: Definition of information element structure of A-I/F messages +Version: v9.0.0 +Author: Roy Jiang +Create Date: 2007-3-21 + +History: +2007-3-21 v9.0.0 Create +*********************************************************************/ + +#ifndef _WXC2_AIFG_IE_H +#define _WXC2_AIFG_IE_H + +#include "aifg_public.h" + +#define MAX_IE_LEN 256 + +#define aifg_set_field(x, y) (x.flag = 1, x.value = y) +typedef struct _aifg_ie_field{ + BYTE flag; + BYTE value; +}aifg_ie_field; + +typedef enum{ + //For BSSMAP + AIFG_IE_ID_BM_CIC = 0x00, //CIC + AIFG_IE_ID_BM_RESOURCEAVAIL = 0x01, //Resource available + AIFG_IE_ID_BM_CAUSE = 0x02, //Cause + AIFG_IE_ID_BM_CELLID = 0x03, //Cell identifier + AIFG_IE_ID_BM_PRIORITY = 0x04, //Priority + AIFG_IE_ID_BM_L3HEADERINFO = 0x05, //Layer 3 header information + AIFG_IE_ID_BM_IMSI = 0x06, //IMSI + AIFG_IE_ID_BM_TMSI = 0x07, //TMSI + AIFG_IE_ID_BM_ENCRYPTINFO = 0x08, //Encrypt information + AIFG_IE_ID_BM_CHANNELTYPE = 0x09, //Channel type + AIFG_IE_ID_BM_PERIODICITY = 0x0A, //Periodicity + AIFG_IE_ID_BM_EXTRESOURCEIND = 0x0B, //Extended resource indicator + AIFG_IE_ID_BM_MSNUM = 0x0C, //Number of MSs + AIFG_IE_ID_BM_CLASSMARKINFO2 = 0x0D, //Classmark information type 2 + AIFG_IE_ID_BM_CLASSMARKINFO3 = 0x0E, //Classmark information type 3 + AIFG_IE_ID_BM_BANDUSED = 0x0F, //Band to be used + AIFG_IE_ID_BM_RRCAUSE = 0x10, //RR cause + AIFG_IE_ID_BM_L3INFO = 0x11, //Layer 3 information + AIFG_IE_ID_BM_DLCI = 0x12, //DLCI + AIFG_IE_ID_BM_DTXFLAG = 0x13, //DTC flag + AIFG_IE_ID_BM_CELLIDLIST = 0x14, //Cell identity list + AIFG_IE_ID_BM_RESPREQ = 0x15, //Response request + AIFG_IE_ID_BM_RESOURCEINDMEHTOD = 0x16, //Resource indication method + AIFG_IE_ID_BM_CLASSMARKINFO1 = 0x17, //Classmark information type 1 + AIFG_IE_ID_BM_CICLIST = 0x18, //CIC list + AIFG_IE_ID_BM_DIGNOSTIC = 0x19, //Dignostic + AIFG_IE_ID_BM_L3MSGCONTENT = 0x1A, //Layer 3 message content + AIFG_IE_ID_BM_CHOSENCHANNEL = 0x1B, //Chosen channel + AIFG_IE_ID_BM_TOTALRESOURCE = 0x1C, //Total resource accessiable + AIFG_IE_ID_BM_CIPHERRESPMODE = 0x1D, //Cipher response mode + AIFG_IE_ID_BM_CHANNELNEEDED = 0x1E, //Channel needed + AIFG_IE_ID_BM_TRACETYPE = 0x1F, //Trace type + AIFG_IE_ID_BM_TRIGGERID = 0x20, //Trigger ID + AIFG_IE_ID_BM_TRACEREF = 0x21, //Trace reference + AIFG_IE_ID_BM_TRANSACTIONID = 0x22, //Transaction ID + AIFG_IE_ID_BM_MOBILEID = 0x23, //Mobile identity + AIFG_IE_ID_BM_OMCID = 0x24, //OMC ID + AIFG_IE_ID_BM_FORWARDIND = 0x25, //Forward indication + AIFG_IE_ID_BM_CHOSENENCRYPT = 0x26, //Chosen encript algorithm + AIFG_IE_ID_BM_CIRCUITPOOL = 0x27, //Circuit pool + AIFG_IE_ID_BM_CIRCUITPOOLLIST = 0x28, //Circuit pool list + AIFG_IE_ID_BM_TIMEIND = 0x29, //Time indicator + AIFG_IE_ID_BM_RESOURCESITUATION = 0x2A, //Resource situation + AIFG_IE_ID_BM_CURCHANNELTYPE1 = 0x2B, //Current channel type 1 + AIFG_IE_ID_BM_QUEUEIND = 0x2C, //Queuing indicator + AIFG_IE_ID_BM_SPEECHVER = 0x2D, //Speech version + AIFG_IE_ID_BM_ASSIGNREQUIREMENT = 0x2E, //Assignment requirment + AIFG_IE_ID_BM_TALKERFLAG = 0x2F, //Talker flag + AIFG_IE_ID_BM_CONNRELREQ = 0x30, //Connection release request + AIFG_IE_ID_BM_GROUPCALLREF = 0x31, //Group call reference + AIFG_IE_ID_BM_EMLPP = 0x32, //eMLPP + AIFG_IE_ID_BM_CFGEVOIND = 0x33, //Configuration evolution indication + AIFG_IE_ID_BM_BSSOLDTONEW = 0x34, //Old BSS to new BSS + AIFG_IE_ID_BM_LSAID = 0x35, //LSA identity + AIFG_IE_ID_BM_LSAIDLIST = 0x36, //LSA identity list + AIFG_IE_ID_BM_LSAINFO = 0x37, //LSA information + AIFG_IE_ID_BM_LOCATIONINFO = 0x38, //Location information + + //For DTAP + //The iei defined below is program specific, it is not the iei of DTAP defined in GSM 04.08 + //The first byte of these iei is the type of the ie. 01-04 = type1 - type4, see 11.2.1.1.4, GSM 04.07 + //common + AIFG_IE_ID_DT_CELLID = 0x39, //Cell identity + AIFG_IE_ID_DT_CIPHERKEY = 0x3A, //Ciphering key sequence number + AIFG_IE_ID_DT_LAI = 0x3B, //location area identification + AIFG_IE_ID_DT_MOBILEID = 0x3C, //mobile identity + AIFG_IE_ID_DT_MSCM1 = 0x3D, //mobile station classmark 1 + AIFG_IE_ID_DT_MSCM2 = 0x3E, //mobile station classmark 2 + AIFG_IE_ID_DT_MSCM3 = 0x3F, //mobile station classmark 3 + AIFG_IE_ID_DT_GROUPREF = 0x40, //Descriptive group or broadcast call reference + AIFG_IE_ID_DT_GROUPCIPHERKEY = 0x41, //Group Cipher Key Number + AIFG_IE_ID_DT_PRIORITYLEVEL = 0x42, //Priority level + //MM + AIFG_IE_ID_DT_AUTHRAND = 0x43, //Authentication parameter RAND + AIFG_IE_ID_DT_AUTHSRES = 0x44, //Authentication parameter SRES + AIFG_IE_ID_DT_CMTYPE = 0x45, //CM service type + AIFG_IE_ID_DT_IDTYPE = 0x46, //Identity type + AIFG_IE_ID_DT_LUTYPE = 0x47, //Location update type + AIFG_IE_ID_DT_FULL_NWNAME = 0x48, //Full Network name + AIFG_IE_ID_DT_SHORT_NWNAME = 0x99, //Short Network name + AIFG_IE_ID_DT_REJCAUSE = 0x49, //Reject cause + AIFG_IE_ID_DT_FLONPROCEED = 0x4A, //Follow on proceed + AIFG_IE_ID_DT_TIMEZONE = 0x4B, //Time zone + AIFG_IE_ID_DT_TZTIME = 0x4C, //Time zone and time + AIFG_IE_ID_DT_CTS = 0x4D, //CTS permission + AIFG_IE_ID_DT_LSAID = 0x4E, //LSA identifier + //CC +// AIFG_IE_ID_DT_CODESETEXT = 0x4F, //Extention of codesets +// AIFG_IE_ID_DT_SHIFT = 0x50, //Locking and non-locking shift procedure + AIFG_IE_ID_DT_AUXSTAT = 0x51, //Auxiliary states + AIFG_IE_ID_DT_BEARERCAP = 0x52, //Bearer capability + AIFG_IE_ID_DT_CCCAP = 0x53, //Call control capability + AIFG_IE_ID_DT_CALLSTAT = 0x54, //Call state + AIFG_IE_ID_DT_CALLEDBCD = 0x55, //Called party BCD + AIFG_IE_ID_DT_CALLEDSUBADDR = 0x56, //Called party subaddress + AIFG_IE_ID_DT_CALLERBCD = 0x57, //Calling party BCD + AIFG_IE_ID_DT_CALLERSUBADDR = 0x58, //Calling party subaddress + AIFG_IE_ID_DT_CAUSE = 0x59, //Cause + AIFG_IE_ID_DT_CLIRSUP = 0x5A, //CLIR suppression + AIFG_IE_ID_DT_CLIRIVO = 0x5B, //CLIR invocation + AIFG_IE_ID_DT_CONGESTLEVEL = 0x5C, //Congestion level + AIFG_IE_ID_DT_CONNNUM = 0x5D, //Connected number + AIFG_IE_ID_DT_CONNSUBADDR = 0x5E, //Connected subaddress + AIFG_IE_ID_DT_FACILITY = 0x5F, //Facility + AIFG_IE_ID_DT_HIGHCOM = 0x60, //Higher layer compatibility + AIFG_IE_ID_DT_KEYPAD = 0x61, //Keypad facility + AIFG_IE_ID_DT_LOWCOM = 0x62, //Lower layer compatibility + AIFG_IE_ID_DT_MOREDATA = 0x63, //More data + AIFG_IE_ID_DT_NOTIIND = 0x64, //Notification indicator + AIFG_IE_ID_DT_PROGIND = 0x65, //Progress indicator + AIFG_IE_ID_DT_REDIRBCD = 0x66, //Redirecting party BCD + AIFG_IE_ID_DT_REDIRSUBADDR = 0x67, //Redirecting party subaddress + AIFG_IE_ID_DT_REPEATIND = 0x68, //Repeat indicator + AIFG_IE_ID_DT_REVCALLDIR = 0x69, //Reverse call setup direction + AIFG_IE_ID_DT_SIGNAL = 0x6A, //Signal + AIFG_IE_ID_DT_SSVER = 0x6B, //SS version indicator + AIFG_IE_ID_DT_USERUSER = 0x6C, //User-user + AIFG_IE_ID_DT_ALERTPATTERN = 0x6D, //Alert parttern + //SMS + AIFG_IE_ID_DT_RP_MO_ADDR = 0x6E, //Originator address element + AIFG_IE_ID_DT_RP_MT_ADDR = 0x6F, //Destination address element + AIFG_IE_ID_DT_RP_UD = 0x70, //RP-User data element + AIFG_IE_ID_DT_RP_CAUSE = 0x71, //RP-Cause element +}aifg_ie_id; + +/*******************************************DTAP*******************************************/ +//Broadcast Call Reference---------------------------------- +typedef struct _aifg_ie_dt_broadcastRef{ + BYTE flag; + int binary_code; //27 bit in total + BYTE sf; + BYTE af; + BYTE call_priority; + BYTE cipher_info; +}aifg_ie_dt_broadcastRef; +//---------------------------------------------------------- + +//Classmark Information Type 2------------------------------ +typedef struct _aifg_ie_dt_cmInfo2{ + BYTE flag; + BYTE rev_level; + BYTE es_ind; + BYTE a5_1; + BYTE rf_power_cap; + BYTE ps_cap; + BYTE ss_screen_ind; + BYTE sm_cap; + BYTE vbs; + BYTE vgcs; + BYTE fc; + BYTE cm3; + BYTE lcsva_cap; + BYTE so_lsa; + BYTE cmsp; + BYTE a5_3; + BYTE a5_2; +}aifg_ie_dt_cmInfo2; +//---------------------------------------------------------- + +//Classmark Information Type 2------------------------------ +typedef struct _aifg_ie_dt_cmInfo1{ + BYTE flag; + BYTE rev_level; + BYTE es_ind; + BYTE a5_1; + BYTE rf_power_cap; +}aifg_ie_dt_cmInfo1; +//---------------------------------------------------------- + +//Mobile ID------------------------------------------------- +typedef struct _aifg_ie_dt_mobileId{ + BYTE flag; + BYTE type; + BYTE odd_even_flag; + BYTE id[16]; + BYTE id_len; +}aifg_ie_mobileId; +//---------------------------------------------------------- + +//Location area identification------------------------------ +typedef struct _aifg_ie_dt_lai{ + BYTE flag; + BYTE mcc[3]; + BYTE mnc[3]; + int LAC; +}aifg_ie_dt_lai; +//---------------------------------------------------------- + +//Location updating type------------------------------------ +typedef struct _aifg_ie_dt_luType{ + BYTE flag; + BYTE fo_req; + BYTE lut; +}aifg_ie_dt_luType; +//---------------------------------------------------------- + +//Network name---------------------------------------------- +typedef struct _aifg_ie_dt_nwName{ + BYTE flag; + BYTE code_scheme; + BYTE add_ci; + BYTE spare_num; + BYTE text[MAX_IE_LEN]; + BYTE text_len; +}aifg_ie_dt_nwName; +//---------------------------------------------------------- + +//Time zone and time---------------------------------------- +typedef struct _aifg_ie_dt_tzTime{ + BYTE flag; + BYTE year; + BYTE month; + BYTE day; + BYTE hour; + BYTE minute; + BYTE second; + BYTE time_zone; +}aifg_ie_dt_tzTime; +//---------------------------------------------------------- + +//Progress indicator---------------------------------------- +typedef struct _aifg_ie_dt_progInd{ + BYTE flag; + BYTE coding_standard; + BYTE location; + BYTE desc; +}aifg_ie_dt_progInd; +//---------------------------------------------------------- + +//User-user------------------------------------------------- +typedef struct _aifg_ie_dt_uu{ + BYTE flag; + BYTE pd; + BYTE info[131]; + BYTE info_len; +}aifg_ie_dt_uu; +//---------------------------------------------------------- + +//Bearer capbility------------------------------------------ +typedef struct _aifg_ie_dt_bc{ + BYTE flag; + BYTE channel_require; + BYTE coding_std; + BYTE trans_mode; + BYTE info_trans_cap; + aifg_ie_field coding; + aifg_ie_field speech_ver; + aifg_ie_field compress; + aifg_ie_field structure; + aifg_ie_field dupl_mode; + aifg_ie_field confiure; + aifg_ie_field nirr; + aifg_ie_field establishment; + aifg_ie_field access_id; + aifg_ie_field rate_adaption; + aifg_ie_field signal_protocol; + aifg_ie_field o_itc; + aifg_ie_field o_rate_adaption; + aifg_ie_field hdr_nohdr; + aifg_ie_field multi_frame; + aifg_ie_field mode; + aifg_ie_field lli; + aifg_ie_field assign_or_e; + aifg_ie_field inb_neg; + aifg_ie_field layer1_id; + aifg_ie_field user_info1_protocol; + aifg_ie_field sync_async; + aifg_ie_field num_stop_bits; + aifg_ie_field negotiation; + aifg_ie_field num_data_bits; + aifg_ie_field user_rate; + aifg_ie_field intermed_rate; + aifg_ie_field nic_on_tx; + aifg_ie_field nic_on_rx; + aifg_ie_field parity; + aifg_ie_field connection_element; + aifg_ie_field modem_type; + aifg_ie_field o_modem_type; + aifg_ie_field fixed_nw_user_rate; + aifg_ie_field acceptable_chennel_code; + aifg_ie_field max_traffic_channel; + aifg_ie_field uimi; + aifg_ie_field wanted_air_if_user_rate; + aifg_ie_field layer2_id; + aifg_ie_field user_info2_protocol; +}aifg_ie_dt_bc; +//---------------------------------------------------------- + +//Facility-------------------------------------------------- +typedef struct _aifg_ie_dt_facility +{ + BYTE flag; + BYTE component[256]; + BYTE component_len; +/* struct{ + struct{ + BYTE tag; + BYTE len; + struct + { + BYTE flag; + BYTE param; + }param; + struct + { + BYTE tag; + BYTE len; + BYTE id; + }invoke_id; + struct + { BYTE flag; + BYTE tag; + BYTE len; + BYTE id; + }linked_id; + struct + { + BYTE tag; + BYTE len; + BYTE op[32]; + }opCode; + }invoke; + + struct{ + BYTE tag; + BYTE len; + struct + { BYTE flag; + BYTE param[32]; + }param; + struct + { + BYTE tag; + BYTE len; + BYTE id; + }invoke_id; + struct + { BYTE flag; + BYTE tag; + BYTE len; + }sequence; + struct + { BYTE flag; + BYTE tag; + BYTE len; + BYTE op[32]; + }opCode; + }return_result; + + struct{ + BYTE tag; + BYTE len; + struct + { + BYTE flag; + BYTE param; + }param; + struct + { + BYTE tag; + BYTE len; + BYTE id; + }invoke_id; + struct + { + BYTE tag; + BYTE len; + BYTE er[32]; + }error; + }return_error; + + struct{ + BYTE tag; + BYTE len; + struct + { + BYTE tag; + BYTE len; + BYTE id; + }invoke_id; + struct + { + BYTE tag; + BYTE len; + BYTE pro[32]; + }problem; + }reject; + }components; +*/ + +}aifg_ie_dt_facility; +//---------------------------------------------------------- + +//Cause----------------------------------------------------- +typedef struct _aifg_ie_dt_cause{ + BYTE flag; + BYTE coding_std; + BYTE location; + aifg_ie_field recommendation; + BYTE cause_value; + BYTE diagnostic[32]; + BYTE diag_len; +}aifg_ie_dt_cause; +//---------------------------------------------------------- + +//Call Control Capabilities--------------------------------- +typedef struct _aifg_ie_dt_ccCap{ + BYTE flag; + BYTE pcp; + BYTE dtmf; +}aifg_ie_dt_ccCap; +//---------------------------------------------------------- + +//Connected number------------------------------------------ +typedef struct _aifg_ie_dt_connNum{ + BYTE flag; + BYTE type; + BYTE num_plan; + aifg_ie_field presentation_ind; + aifg_ie_field screen_ind; + BYTE number[80]; + BYTE num_len; +}aifg_ie_dt_connNum; +//---------------------------------------------------------- + +//Calling number-------------------------------------------- +typedef aifg_ie_dt_connNum aifg_ie_dt_callingNum; +//---------------------------------------------------------- + +//Called number--------------------------------------------- +typedef aifg_ie_dt_connNum aifg_ie_dt_calledNum; +//---------------------------------------------------------- + +//Redirecting number---------------------------------------- +typedef aifg_ie_dt_connNum aifg_ie_dt_redirNum; +//---------------------------------------------------------- + +//Connected subaddress-------------------------------------- +typedef struct _aifg_ie_dt_connSubAddr{ + BYTE flag; + BYTE type; + BYTE odd_even_ind; + BYTE info[20]; + BYTE info_len; +}aifg_ie_dt_connSubAddr; +//---------------------------------------------------------- + +//Calling subaddress---------------------------------------- +typedef aifg_ie_dt_connSubAddr aifg_ie_dt_callingSubAddr; +//---------------------------------------------------------- + +//Called subaddress----------------------------------------- +typedef aifg_ie_dt_connSubAddr aifg_ie_dt_calledSubAddr; +//---------------------------------------------------------- + +//Redirecting subaddress------------------------------------ +typedef aifg_ie_dt_connSubAddr aifg_ie_dt_redirSubAddr; +//---------------------------------------------------------- + +//SS Version Indicator-------------------------------------- +typedef struct _aifg_ie_dt_ssVer{ + BYTE flag; + BYTE info[MAX_IE_LEN]; + BYTE info_len; +}aifg_ie_dt_ssVer; +//---------------------------------------------------------- + +//High layer compatibility---------------------------------- +typedef struct _aifg_ie_dt_hiComp{ + BYTE flag; + aifg_ie_field coding_std; + aifg_ie_field interpret; + aifg_ie_field presentat_method; + aifg_ie_field high_layer_id; + aifg_ie_field ext_high_layer_id; +}aifg_ie_dt_hiComp; +//---------------------------------------------------------- + +//low layer compatibility----------------------------------- +typedef struct _aifg_ie_dt_loComp{ + BYTE flag; + BYTE data[13]; + BYTE data_len; +}aifg_ie_dt_loComp; +//---------------------------------------------------------- + +//Auxiliary states------------------------------------------ +typedef struct _aifg_ie_dt_auxStat{ + BYTE flag; + BYTE hold_stat; + BYTE mpty_stat; +}aifg_ie_dt_auxStat; +//---------------------------------------------------------- + +//Call status----------------------------------------------- +typedef struct _aifg_ie_dt_callStat{ + BYTE flag; + BYTE coding_std; + BYTE value; +}aifg_ie_dt_callStat; +//---------------------------------------------------------- + +//Authenticataion RAND-------------------------------------- +typedef struct _aifg_ie_dt_authRAND{ + BYTE flag; + BYTE value[16]; +}aifg_ie_dt_authRAND; +//---------------------------------------------------------- + +//Authenticataion SRES-------------------------------------- +typedef struct _aifg_ie_dt_authSRES{ + BYTE flag; + BYTE value[4]; +}aifg_ie_dt_authSRES; +//---------------------------------------------------------- + +//LSA Identifier-------------------------------------------- +typedef struct _aifg_ie_dt_lsaId{ + BYTE flag; + BYTE value[3]; +}aifg_ie_dt_lsaId; +//---------------------------------------------------------- + +//Follow On Proceed----------------------------------------- +typedef struct _aifg_ie_dt_followOnProceed{ + BYTE flag; + BYTE value; +}aifg_ie_dt_followOnProceed; +//---------------------------------------------------------- + +typedef aifg_ie_dt_followOnProceed aifg_ie_dt_CTSPermission; +typedef aifg_ie_dt_followOnProceed aifg_ie_dt_rejectCause; +typedef aifg_ie_dt_followOnProceed aifg_ie_dt_cmType; +typedef aifg_ie_dt_followOnProceed aifg_ie_dt_cipherKey; +typedef aifg_ie_dt_followOnProceed aifg_ie_dt_priority; +typedef aifg_ie_dt_followOnProceed aifg_ie_dt_idType; +typedef aifg_ie_dt_followOnProceed aifg_ie_dt_rpInd; +typedef aifg_ie_dt_followOnProceed aifg_ie_dt_congestLevel; +typedef aifg_ie_dt_followOnProceed aifg_ie_dt_notificationInd; +typedef aifg_ie_dt_followOnProceed aifg_ie_dt_signal; +typedef aifg_ie_dt_followOnProceed aifg_ie_dt_alertPattern; +typedef aifg_ie_dt_followOnProceed aifg_ie_dt_keypad; +typedef aifg_ie_dt_followOnProceed aifg_ie_dt_moreData; +typedef aifg_ie_dt_followOnProceed aifg_ie_dt_revCallDir; +typedef aifg_ie_dt_followOnProceed aifg_ie_dt_timeZone; + +//SMS +typedef struct{ + BYTE flag; + BYTE number_type; + BYTE number_plan; + BYTE number[18]; + BYTE number_len; +}aifg_ie_dt_rpAddr; + +typedef struct{ + BYTE len; + BYTE content[234]; +}aifg_ie_dt_rpUD; + +typedef struct{ + BYTE flag; + int cause; + BYTE diagnostic[234]; + BYTE diag_len; +}aifg_ie_dt_rpCause; + +/*******************************************BSSMAP*******************************************/ +//CIC------------------------------------------------------- +typedef struct _aifg_ie_bm_cic{ + BYTE flag; + int pcm; + int timeslot; +}aifg_ie_bm_cic; +//---------------------------------------------------------- + +//Resource available---------------------------------------- +typedef struct _aifg_ie_bm_resrcAvail{ + BYTE flag; + int full_rate_channel[5]; + int half_rate_channel[5]; +}aifg_ie_bm_resrcAvail; +//---------------------------------------------------------- + +//Cause----------------------------------------------------- +typedef struct _aifg_ie_bm_cause{ + BYTE flag; + BYTE value; + aifg_ie_field ext_value; +}aifg_ie_bm_cause; +//---------------------------------------------------------- + +//Cell Id--------------------------------------------------- +typedef struct _aifg_ie_bm_cellId{ + BYTE flag; + BYTE discriminator; + BYTE mcc[3]; + BYTE mnc[3]; + int LAC; + int CI; +}aifg_ie_bm_cellId; +//---------------------------------------------------------- + +//Priority-------------------------------------------------- +typedef struct _aifg_ie_bm_priority{ + BYTE flag; + BYTE pci; + BYTE level; + BYTE qa; + BYTE pvi; +}aifg_ie_bm_priority; +//---------------------------------------------------------- + +//Layer 3 Header Information-------------------------------- +typedef struct _aifg_ie_bm_L3HeaderInfo{ + BYTE flag; + BYTE pd; + BYTE ti; +}aifg_ie_bm_L3HeaderInfo; +//---------------------------------------------------------- + +//IMSI------------------------------------------------------ +typedef struct _aifg_ie_bm_imsi{ + BYTE flag; + BYTE type; + BYTE odd_even_flag; + BYTE imsi[16]; + BYTE imsi_len; +}aifg_ie_bm_imsi; +//---------------------------------------------------------- + +//Encrypt Information--------------------------------------- +typedef struct _aifg_ie_bm_encryptInfo{ + BYTE flag; + BYTE algorithm; + BYTE key[8]; +}aifg_ie_bm_encryptInfo; +//---------------------------------------------------------- + +//channel type---------------------------------------------- +typedef struct _aifg_ie_bm_channelType{ + BYTE flag; + BYTE speech_data_ind; + BYTE channel_rate_type; + union{ + struct { + BYTE len; + BYTE ver[6]; + }speech; + struct{ + BYTE t_nt; + BYTE rate; + aifg_ie_field allowed_data_rate; + }data_cfg; + }ext; +}aifg_ie_bm_channelType; +//---------------------------------------------------------- + +//Extended resource indicator------------------------------- +typedef struct _aifg_ie_bm_extResourceInd{ + BYTE flag; + BYTE sm; + BYTE tarr; +}aifg_ie_bm_extResourceInd; +//---------------------------------------------------------- + +//Classmark Information Type 2------------------------------ +typedef aifg_ie_dt_cmInfo2 aifg_ie_bm_cmInfo2; +//---------------------------------------------------------- + +//Layer 3 information and Layer 3 message content----------- +typedef struct _aifg_ie_bm_l3Info{ + void *l3_msg; //this void pointer should be converted to a pointer to aifg_msg after L3 message is decoded + BYTE len; +}aifg_ie_bm_l3Info; +//---------------------------------------------------------- + +//Cell identifier list-------------------------------------- +typedef struct _aifg_ie_bm_cidList{ + BYTE flag; + BYTE discriminator; + struct{ + BYTE mcc[3]; + BYTE mnc[3]; + int LAC; + int CI; + }cell_id[32]; + BYTE cid_num; +}aifg_ie_bm_cidList; +//---------------------------------------------------------- + +//Classmark Information Type 1------------------------------ +typedef aifg_ie_dt_cmInfo1 aifg_ie_bm_cmInfo1; +//---------------------------------------------------------- + +//CIC list-------------------------------------------------- +typedef struct _aifg_ie_bm_cicList{ + BYTE flag; + BYTE range; + struct{ + BYTE len; + BYTE content[32]; + }status; +}aifg_ie_bm_cicList; +//---------------------------------------------------------- + +//Diagnostics----------------------------------------------- +typedef struct _aifg_ie_bm_diagnostics{ + BYTE flag; + BYTE err_pointer; + BYTE bit_pointer; + struct{ + BYTE len; + BYTE msg[MAX_IE_LEN]; + }err_msg; +}aifg_ie_bm_diagnostics; +//---------------------------------------------------------- + +//Chosen channel-------------------------------------------- +typedef struct _aifg_ie_bm_chosenChannel{ + BYTE flag; + BYTE mode; + BYTE channel; +}aifg_ie_bm_chosenChannel; +//---------------------------------------------------------- + +//Total resource accessiable-------------------------------- +typedef struct _aifg_ie_bm_totalResrc{ + BYTE flag; + int full_rate_channel; + int half_rate_channel; +}aifg_ie_bm_totalResrc; +//---------------------------------------------------------- + +//Trigger ID------------------------------------------------ +typedef struct _aifg_ie_bm_triggerId{ + BYTE flag; + BYTE len; + BYTE content[20]; +}aifg_ie_bm_triggerId; +//---------------------------------------------------------- + +//Circuit pool list----------------------------------------- +typedef struct _aifg_ie_bm_circuitPoolList{ + BYTE flag; + BYTE circuit[MAX_IE_LEN]; + BYTE num; +}aifg_ie_bm_circuitPoolList; +//---------------------------------------------------------- + +//Resource situation---------------------------------------- +typedef struct _aifg_ie_bm_resrcSit{ + BYTE flag; + struct{ + BYTE band_ind; + BYTE channel_type; + int channel_num; + }band[7]; + BYTE band_num; +}aifg_ie_bm_resrcSit; +//---------------------------------------------------------- + +//Current channel type 1------------------------------------ +typedef struct _aifg_ie_bm_curChannelType1{ + BYTE flag; + BYTE channel_mode; + BYTE channel; +}aifg_ie_bm_curChannelType1; +//---------------------------------------------------------- + +//Group Call Reference-------------------------------------- +typedef aifg_ie_dt_broadcastRef aifg_ie_bm_groupRef; +//---------------------------------------------------------- + +//LSA identifier list--------------------------------------- +typedef struct _aifg_ie_bm_lsaIdList{ + BYTE flag; + BYTE ep; + struct{ + BYTE id[3]; + }list[64]; + BYTE lsa_num; +}aifg_ie_bm_lsaIdList; +//---------------------------------------------------------- + +//LSA information------------------------------------------- +typedef struct _aifg_ie_bm_lsaInfo{ + BYTE flag; + BYTE lsa_only; + BYTE lsa_num; + struct{ + BYTE priority; + BYTE id[3]; + }info[50]; +}aifg_ie_bm_lsaInfo; +//---------------------------------------------------------- + +//Location information-------------------------------------- +typedef struct _aifg_ie_bm_locInfo{ + BYTE flag; + BYTE info[MAX_IE_LEN]; + BYTE len; +}aifg_ie_bm_locInfo; +//---------------------------------------------------------- + +//OMC ID---------------------------------------------------- +typedef struct _aifg_ie_bm_omcId{ + BYTE flag; + BYTE id[20]; + BYTE len; +}aifg_ie_bm_omcId; +//---------------------------------------------------------- + +//Old BSS to New BSS information---------------------------- +typedef struct _aifg_ie_bm_bssOldtoNew{ + BYTE flag; + BYTE content[MAX_IE_LEN]; + BYTE len; +}aifg_ie_bm_bssOldtoNew; +//---------------------------------------------------------- + +//Trace reference------------------------------------------- +typedef struct _aifg_ie_bm_traceRef{ + BYTE flag; + int value; +}aifg_ie_bm_traceRef; +//---------------------------------------------------------- + +typedef aifg_ie_bm_traceRef aifg_ie_bm_transId; + +//TMSI----------------------------------------------------- +typedef struct _aifg_ie_bm_tmsi{ + BYTE flag; + BYTE value[4]; +}aifg_ie_bm_tmsi; +//---------------------------------------------------------- + +typedef aifg_ie_dt_lsaId aifg_ie_bm_lsaId; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_periodicity; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_msNum; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_bandUsed; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_rrCause; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_dlci; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_dtx; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_respReq; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_resrcIndMethod; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_cipherRespMode; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_channelNeeded; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_traceType; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_fowardInd; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_chosenEncrypt; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_circuitPool; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_timeId; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_speechVer; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_queuingInd; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_assignReq; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_talkerFlag; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_connRelReq; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_eMLPP; +typedef aifg_ie_dt_followOnProceed aifg_ie_bm_cfgEvoInd; + + +typedef union{ + //Common + aifg_ie_mobileId mobileId; + + //DTAP + aifg_ie_dt_broadcastRef dt_broadcastRef; + aifg_ie_dt_cmInfo1 dt_cmInfo1; + aifg_ie_dt_cmInfo2 dt_cmInfo2; + aifg_ie_dt_lai dt_lai; + aifg_ie_dt_luType dt_luType; + aifg_ie_dt_nwName dt_nwName; + aifg_ie_dt_tzTime dt_tzTime; + aifg_ie_dt_progInd dt_progInd; + aifg_ie_dt_uu dt_uu; + aifg_ie_dt_bc dt_bc; + aifg_ie_dt_cause dt_cause; + aifg_ie_dt_ccCap dt_ccCap; + aifg_ie_dt_connNum dt_connNum; + aifg_ie_dt_callingNum dt_callingNum; + aifg_ie_dt_calledNum dt_calledNum; + aifg_ie_dt_redirNum dt_redirNum; + aifg_ie_dt_connSubAddr dt_connSubAddr; + aifg_ie_dt_callingSubAddr dt_callingSubAddr; + aifg_ie_dt_calledSubAddr dt_calledSubAddr; + aifg_ie_dt_redirSubAddr dt_redirSubAddr; + aifg_ie_dt_ssVer dt_ssVer; + aifg_ie_dt_hiComp dt_hiComp; + aifg_ie_dt_loComp dt_loComp; + aifg_ie_dt_callStat dt_callStat; + aifg_ie_dt_auxStat dt_auxStat; + aifg_ie_dt_followOnProceed dt_followOnProceed; + aifg_ie_dt_CTSPermission dt_CTSPermission; + aifg_ie_dt_rejectCause dt_rejectCause; + aifg_ie_dt_cmType dt_cmType; + aifg_ie_dt_cipherKey dt_cipherKey; + aifg_ie_dt_priority dt_priority; + aifg_ie_dt_idType dt_idType; + aifg_ie_dt_rpInd dt_rpInd; + aifg_ie_dt_congestLevel dt_congestLevel; + aifg_ie_dt_notificationInd dt_notificationInd; + aifg_ie_dt_signal dt_signal; + aifg_ie_dt_alertPattern dt_alertPattern; + aifg_ie_dt_keypad dt_keypad; + aifg_ie_dt_moreData dt_moreData; + aifg_ie_dt_revCallDir dt_revCallDir; + aifg_ie_dt_timeZone dt_timeZone; + aifg_ie_dt_authRAND dt_authRAND; + aifg_ie_dt_authSRES dt_authSRES; + aifg_ie_dt_lsaId dt_lsaId; + aifg_ie_dt_facility dt_facility; + aifg_ie_dt_rpAddr dt_rpAddr; + aifg_ie_dt_rpUD dt_rpUD; + aifg_ie_dt_rpCause dt_rpCause; + + //BSSMAP + aifg_ie_bm_cic bm_cic; + aifg_ie_bm_resrcAvail bm_resrcAvail; + aifg_ie_bm_cause bm_cause; + aifg_ie_bm_cellId bm_cellId; + aifg_ie_bm_priority bm_priority; + aifg_ie_bm_L3HeaderInfo bm_L3HeaderInfo; + aifg_ie_bm_imsi bm_imsi; + aifg_ie_bm_encryptInfo bm_encryptInfo; + aifg_ie_bm_channelType bm_channelType; + aifg_ie_bm_extResourceInd bm_extResrcInd; + aifg_ie_bm_cmInfo2 bm_cmInfo2; + aifg_ie_bm_l3Info bm_l3Info; + aifg_ie_bm_cidList bm_cellIdList; + aifg_ie_bm_cicList bm_cicList; + aifg_ie_bm_diagnostics bm_diagnostics; + aifg_ie_bm_chosenChannel bm_chosenChannel; + aifg_ie_bm_totalResrc bm_totalResrc; + aifg_ie_bm_triggerId bm_triggerId; + aifg_ie_bm_circuitPoolList bm_circuitPoolList; + aifg_ie_bm_resrcSit bm_resrcSit; + aifg_ie_bm_curChannelType1 bm_curChannelType1; + aifg_ie_bm_groupRef bm_groupRef; + aifg_ie_bm_lsaIdList bm_lsaIdList; + aifg_ie_bm_lsaInfo bm_lsaInfo; + aifg_ie_bm_locInfo bm_locInfo; + aifg_ie_bm_omcId bm_omcId; + aifg_ie_bm_bssOldtoNew bm_bssOldtoNew; + aifg_ie_bm_periodicity bm_periodicity; + aifg_ie_bm_msNum bm_msNum; + aifg_ie_bm_bandUsed bm_bandUsed; + aifg_ie_bm_rrCause bm_rrCause; + aifg_ie_bm_dlci bm_dlci; + aifg_ie_bm_dtx bm_dtx; + aifg_ie_bm_respReq bm_respReq; + aifg_ie_bm_resrcIndMethod bm_resrcIndMethod; + aifg_ie_bm_cipherRespMode bm_cipherRespMode; + aifg_ie_bm_channelNeeded bm_channelNeeded; + aifg_ie_bm_traceType bm_traceType; + aifg_ie_bm_fowardInd bm_fowardInd; + aifg_ie_bm_chosenEncrypt bm_chosenEncrypt; + aifg_ie_bm_circuitPool bm_circuitPool; + aifg_ie_bm_timeId bm_timeId; + aifg_ie_bm_speechVer bm_speechVer; + aifg_ie_bm_queuingInd bm_queuingInd; + aifg_ie_bm_assignReq bm_assignReq; + aifg_ie_bm_talkerFlag bm_talkerFlag; + aifg_ie_bm_connRelReq bm_connRelReq; + aifg_ie_bm_eMLPP bm_eMLPP; + aifg_ie_bm_cfgEvoInd bm_cfgEvoInd; + aifg_ie_bm_traceRef bm_traceRef; + aifg_ie_bm_transId bm_transId; + aifg_ie_bm_tmsi bm_tmsi; + aifg_ie_bm_lsaId bm_lsaId; +}ie_u; + +typedef struct{ + int iei; + ie_u param; +}aifg_ie; + +#endif + diff --git a/omc/plat/aif/src/include/aifg_if.h b/omc/plat/aif/src/include/aifg_if.h new file mode 100644 index 0000000..19a4588 --- /dev/null +++ b/omc/plat/aif/src/include/aifg_if.h @@ -0,0 +1,31 @@ +/******************************************************************** +Copyright ?2007 LGC Wireless, Inc. All rights reserved +File Name: aifg_if.h +Description: Interface declearation for wxc2main +Version: v9.0.0 +Author: Roy Jiang +Create Date: 2007-3-14 + +History: +2007-3-14 v9.0.0 Create +*********************************************************************/ +#ifndef _WXC2_AIFG_IF_H +#define _WXC2_AIFG_IF_H + +/* +Name: aifg_init +Purpose: Init AIFG module. +Input: None +Output: None +*/ +void aifg_init(); + +/* +Name: aifg_init +Purpose: 10ms routing of AIFG module. +Input: None +Output: None +*/ +void aifg_proc(); + +#endif diff --git a/omc/plat/aif/src/include/aifg_msg.h b/omc/plat/aif/src/include/aifg_msg.h new file mode 100644 index 0000000..bb6a201 --- /dev/null +++ b/omc/plat/aif/src/include/aifg_msg.h @@ -0,0 +1,1636 @@ +/******************************************************************** +Copyright ?2007 LGC Wireless, Inc. All rights reserved +File Name: aifg_msg.h +Description: Definition of message structure of AIFG module +Version: v9.0.0 +Author: Roy Jiang +Create Date: 2007-3-6 + +History: +2007-3-6 v9.0.0 Create +*********************************************************************/ + +#ifndef _WXC2_AIFG_MSG_H +#define _WXC2_AIFG_MSG_H +#include "aifg_ie.h" + +#define AIFG_MAX_MSG_IE 24 + +/**********************************PUBLIC**********************************/ +//local message id +typedef enum { + //DTAP + AIFG_MSG_ID_TRANSPARENT_DTAP = 0x00, //TRANSPARENT Dtap message at BSC side + //RR + AIFG_MSG_ID_PAGING_RESP = 0x01, //Paging response + AIFG_MSG_ID_RR_HO_CMD = 0x02, //RR Handover command + //MM + AIFG_MSG_ID_IMSI_DETACH_IND = 0x03, //IMSI detach indication + AIFG_MSG_ID_LU_ACCEPT = 0x04, //Location updating accept + AIFG_MSG_ID_LU_REJECT = 0x05, //Location updating reject + AIFG_MSG_ID_LU_REQUEST = 0x06, //Location updating request + AIFG_MSG_ID_AUTH_REJECT = 0x07, //Authentication reject + AIFG_MSG_ID_AUTH_REQUEST = 0x08, //Authentication request + AIFG_MSG_ID_AUTH_RESPONSE = 0x09, //Authentication response + AIFG_MSG_ID_ID_REQUEST = 0x0A, //Identity request + AIFG_MSG_ID_ID_RESPONSE = 0x0B, //Identity response + AIFG_MSG_ID_TMSI_REALLOC_CMD = 0x0C, //TMSI reallocation command + AIFG_MSG_ID_TMSI_REALLOC_CMP = 0x0D, //TMSI reallocation complete + AIFG_MSG_ID_CM_ACCEPT = 0x0E, //CM service accept + AIFG_MSG_ID_CM_REJECT = 0x0F, //CM service reject + AIFG_MSG_ID_CM_ABORT = 0x10, //CM service abort + AIFG_MSG_ID_CM_REQUEST = 0x11, //CM service request + AIFG_MSG_ID_CM_PROMPT = 0x12, //CM service prompt + AIFG_MSG_ID_CM_REEST_REQUEST = 0x13, //CM re-establishment request + AIFG_MSG_ID_ABORT = 0x14, //Abort + AIFG_MSG_ID_MM_NULL = 0x15, //MM NULL + AIFG_MSG_ID_MM_STATUS = 0x16, //MM status + AIFG_MSG_ID_MM_INFO = 0x17, //MM information + //CC + AIFG_MSG_ID_ALERTING = 0x18, //Alerting + AIFG_MSG_ID_CALL_CONFIRMED = 0x19, //Call confirmed + AIFG_MSG_ID_CALL_PROCEEDING = 0x1A, //Call proceeding + AIFG_MSG_ID_CONNECT = 0x1B, //Connect + AIFG_MSG_ID_CONNECT_ACK = 0x1C, //Connect ack + AIFG_MSG_ID_EMERGENCY_SETUP = 0x1D, //Emergency setup + AIFG_MSG_ID_PROGRESS = 0x1E, //Progress + AIFG_MSG_ID_SETUP = 0x1F, //Setup + AIFG_MSG_ID_MODIFY = 0x20, //Modify + AIFG_MSG_ID_MODIFY_CMP = 0x21, //Modify complete + AIFG_MSG_ID_MODIFY_REJECT = 0x22, //Modify reject + AIFG_MSG_ID_USER_INFO = 0x23, //User information + AIFG_MSG_ID_HOLD = 0x24, //Hold + AIFG_MSG_ID_HOLD_ACK = 0x25, //Hold ack + AIFG_MSG_ID_HOLD_REJECT = 0x26, //Hold reject + AIFG_MSG_ID_RETRIEVE = 0x27, //Retrieve + AIFG_MSG_ID_RETRIEVE_ACK = 0x28, //Retrieve ack + AIFG_MSG_ID_RETRIEVE_REJECT = 0x29, //Retrieve reject + AIFG_MSG_ID_DISCONNECT = 0x2A, //Disconnect + AIFG_MSG_ID_RELEASE = 0x2B, //Release + AIFG_MSG_ID_RELEASE_CMP = 0x2C, //Release complete + AIFG_MSG_ID_CONGESTION_CTRL = 0x2D, //Congestion control + AIFG_MSG_ID_NOTIFY = 0x2E, //Notify + AIFG_MSG_ID_STATUS = 0x2F, //Status + AIFG_MSG_ID_STATUS_ENQ = 0x30, //Status enquiry + AIFG_MSG_ID_START_DTMF = 0x31, //Start DTMF + AIFG_MSG_ID_STOP_DTMF = 0x32, //Stop DTMF + AIFG_MSG_ID_STOP_DTMF_ACK = 0x33, //Stop DTMF ack + AIFG_MSG_ID_START_DTMF_ACK = 0x34, //Start DTMF ack + AIFG_MSG_ID_START_DTMF_REJECT = 0x35, //Start DTMF reject + AIFG_MSG_ID_FACILITY = 0x36, //Facility + //SS + AIFG_MSG_ID_FACILITY_SS = 0x37, //Facility SS + AIFG_MSG_ID_REGISTER = 0x38, //Register + AIFG_MSG_ID_RELEASE_CMP_SS = 0x39, //Release Completed SS + //SMS + AIFG_MSG_ID_RP_DATA = 0x3A, //RP-DATA + AIFG_MSG_ID_RP_ACK = 0x3B, //RP-ACK + AIFG_MSG_ID_RP_ERROR = 0x3C, //RP-ERROR + AIFG_MSG_ID_RP_SMMA = 0x3D, //RP-SMMA + //BSSMAP + //Global + AIFG_MSG_ID_BLOCK = 0x3E, //Block + AIFG_MSG_ID_BLOCK_ACK = 0x3F, //Blocking ack + AIFG_MSG_ID_UNBLOCK = 0x40, //Unblock + AIFG_MSG_ID_UNBLOCK_ACK = 0x41, //Unblocking ack + AIFG_MSG_ID_CC_GROUP_BLK = 0x42, //Circuit group block + AIFG_MSG_ID_CC_GROUP_BLK_ACK = 0x43, //Circuit group block ack + AIFG_MSG_ID_CC_GROUP_UNBLK = 0x44, //Circuit group unblock + AIFG_MSG_ID_CC_GROUP_UNBLK_ACK = 0x45, //Circuit group unblock ack + AIFG_MSG_ID_RESRC_REQ = 0x46, //Resource request + AIFG_MSG_ID_RESRC_IND = 0x47, //Resource indication + AIFG_MSG_ID_RESET = 0x48, //Reset + AIFG_MSG_ID_RESET_ACK = 0x49, //Reset ack + AIFG_MSG_ID_PAGING = 0x4A, //Paging + AIFG_MSG_ID_OVERLOAD = 0x4B, //Overload + AIFG_MSG_ID_RESET_CC = 0x4C, //Reset circuit + AIFG_MSG_ID_RESET_CC_ACK = 0x4D, //Reset circuit ack + AIFG_MSG_ID_HO_CAN_ENQ = 0x4E, //Handover candidate enquire + AIFG_MSG_ID_HO_CAN_RESP = 0x4F, //Handover candidate response + //Dedicated + AIFG_MSG_ID_ASSIGN_REQ = 0x50, //Assign request + AIFG_MSG_ID_ASSIGN_CMP = 0x51, //Assign complete + AIFG_MSG_ID_ASSIGN_FAIL = 0x52, //Assign failure + AIFG_MSG_ID_HO_REQUEST = 0x53, //Handover request + AIFG_MSG_ID_HO_REQUIRED = 0x54, //Handover required + AIFG_MSG_ID_HO_REQ_ACK = 0x55, //Handover request ack + AIFG_MSG_ID_HO_CMD = 0x56, //Handover command + AIFG_MSG_ID_HO_CMP = 0x57, //Handover complete + AIFG_MSG_ID_HO_SUC = 0x58, //Handover succeeded + AIFG_MSG_ID_HO_FAIL = 0x59, //Handover failure + AIFG_MSG_ID_HO_PERFORMED = 0x5A, //Handover performed + AIFG_MSG_ID_HO_REQ_REJ = 0x5B, //Handover required reject + AIFG_MSG_ID_HO_DETECT = 0x5C, //Handover detect + AIFG_MSG_ID_CLR_CMD = 0x5D, //Clear command + AIFG_MSG_ID_CLR_CMP = 0x5E, //Clear complete + AIFG_MSG_ID_CLR_REQ = 0x5F, //Clear request + AIFG_MSG_ID_SAPI_REJ = 0x60, //SAPI 'n' reject + AIFG_MSG_ID_CONFUSION = 0x61, //Confusion + AIFG_MSG_ID_SUSPEND = 0x62, //Suspend + AIFG_MSG_ID_RESUME = 0x63, //Resume + AIFG_MSG_ID_LOC_INFO_CMD = 0x64, //Location information command + AIFG_MSG_ID_LOC_INFO_RPT = 0x65, //Location information report + AIFG_MSG_ID_MSC_INVK_TRACE = 0x66, //MSC invoke trace + AIFG_MSG_ID_BSC_INVK_TRACE = 0x67, //BSC invoke trace + AIFG_MSG_ID_UNEQUIP_CC = 0x68, //Unequipped circuit + AIFG_MSG_ID_CHANGE_CC = 0x69, //Change circuit + AIFG_MSG_ID_CHANGE_CC_ACK = 0x6A, //Change circuit ack + AIFG_MSG_ID_CIPHER_MODE_CMD = 0x6B, //Cipher mode command + AIFG_MSG_ID_CM_UPDATE = 0x6C, //Classmark update + AIFG_MSG_ID_CIPHER_MODE_CMP = 0x6D, //Cipher mode complete + AIFG_MSG_ID_QUEUE_IND = 0x6E, //Queueing indication + AIFG_MSG_ID_L3_INFO = 0x6F, //Complete layer 3 information + AIFG_MSG_ID_CLASSMARK_REQ = 0x70, //Classmark request + AIFG_MSG_ID_CIPHER_MODE_REJ = 0x71, //Cipher mode reject + AIFG_MSG_ID_LOAD_IND = 0x72, //Load indication + AIFG_MSG_ID_LSA_INFO = 0x73, //LSA INFORMATION + AIFG_MSG_ID_IGNORED_MSG = 0xFF, //Ignored message, no need to process +}aifg_msg_id; + +typedef enum { + AIFG_MSG_DTAP = 1, + AIFG_MSG_BSSMAP = 0, +}aifg_msg_protocol; + +typedef enum { + //There are protocol defined, see GSM 04.08 + AIFG_PD_DTAP_MM = 0x05, + AIFG_PD_DTAP_CC = 0x03, + AIFG_PD_DTAP_SS = 0x0B, + AIFG_PD_DTAP_SMS = 0x09, + + //These are module defined + AIFG_PD_BSSMAP_GLOBAL = 0xF0, + AIFG_PD_BSSMAP_DEDICATED = 0xF1, +}aifg_pd; + +//Message struct for encode----------------------------------------------------- +//DTAP-------------------------------------------------------------------------- +typedef struct{ + aifg_ie_dt_lai lai; + aifg_ie_mobileId mobileId; + aifg_ie_dt_followOnProceed followOnProceed; + aifg_ie_dt_CTSPermission CTSPermission; +}aifg_msg_dt_luAccept; + +typedef struct{ + aifg_ie_dt_rejectCause rejectCause; +}aifg_msg_dt_cmReject; + +typedef aifg_msg_dt_cmReject aifg_msg_dt_luReject; + +typedef aifg_msg_dt_cmReject aifg_msg_dt_abort; + +typedef aifg_msg_dt_cmReject aifg_msg_dt_mmStatus; + +typedef struct{ + aifg_ie_dt_luType luType; + aifg_ie_dt_lai lai; + aifg_ie_dt_cipherKey cipherKey; + aifg_ie_mobileId mobileId; + aifg_ie_dt_cmInfo1 cmInfo1; +}aifg_msg_dt_LURequest; + +typedef struct{ + aifg_ie_dt_cipherKey cipherKey; + aifg_ie_dt_authRAND authRAND; +}aifg_msg_dt_authRequest; + +typedef struct{ + aifg_ie_dt_authSRES authSRES; +}aifg_msg_dt_authResp; + +typedef struct{ + aifg_ie_dt_idType idType; +}aifg_msg_dt_idRequest; + +typedef struct{ + aifg_ie_mobileId mobileId; +}aifg_msg_dt_idResp; + +typedef struct{ + aifg_ie_dt_cmInfo1 cmInfo1; + aifg_ie_mobileId mobileId; +}aifg_msg_dt_imsiDetachInd; + +typedef struct{ + aifg_ie_dt_lai lai; + aifg_ie_mobileId mobileId; +}aifg_msg_dt_tmsiCmd; + +typedef struct{ + aifg_ie_dt_cipherKey cipherKey; + aifg_ie_dt_cmInfo2 cmInfo2; + aifg_ie_mobileId mobileId; + aifg_ie_dt_lai lai; +}aifg_msg_dt_cmReEstReq; + +typedef struct{ + aifg_ie_dt_cmType cmType; + aifg_ie_dt_cipherKey cipherKey; + aifg_ie_dt_cmInfo2 cmInfo2; + aifg_ie_mobileId mobileId; + aifg_ie_dt_priority priority; +}aifg_msg_dt_cmRequest; + +typedef struct{ + aifg_ie_dt_nwName fullName; + aifg_ie_dt_nwName shortName; + aifg_ie_dt_timeZone timeZone; + aifg_ie_dt_tzTime tzTime; + aifg_ie_dt_lsaId lsaId; +}aifg_msg_dt_mmInfo; + +//cc +typedef struct{ + aifg_ie_dt_facility facility; + aifg_ie_dt_progInd progInd; + aifg_ie_dt_uu uu; +}aifg_msg_dt_alert; + +typedef struct{ + aifg_ie_dt_rpInd rpInd; + aifg_ie_dt_bc bc1; + aifg_ie_dt_bc bc2; + aifg_ie_dt_cause cause; + aifg_ie_dt_ccCap ccCap; +}aifg_msg_dt_callConfirm; + +typedef struct{ + aifg_ie_dt_rpInd rpInd; + aifg_ie_dt_bc bc1; + aifg_ie_dt_bc bc2; + aifg_ie_dt_facility facility; + aifg_ie_dt_progInd progInd; + aifg_ie_dt_priority priority; +}aifg_msg_dt_callProceed; + +typedef struct{ + aifg_ie_dt_facility facility; + aifg_ie_dt_progInd progInd; + aifg_ie_dt_connNum connNum; + aifg_ie_dt_connSubAddr connSubAddr; + aifg_ie_dt_uu uu; +}aifg_msg_dt_connect; + +typedef struct{ + aifg_ie_dt_bc bc; +}aifg_msg_dt_eSetup; + +typedef struct{ + aifg_ie_dt_progInd progInd; + aifg_ie_dt_uu uu; +}aifg_msg_dt_progress; + +typedef struct{ + aifg_ie_dt_rpInd bc_rpInd; + aifg_ie_dt_bc bc1; + aifg_ie_dt_bc bc2; + aifg_ie_dt_facility facility; + aifg_ie_dt_progInd progInd; + aifg_ie_dt_signal signal; + aifg_ie_dt_callingNum callingNum; + aifg_ie_dt_callingSubAddr callingSubAddr; + aifg_ie_dt_calledNum calledNum; + aifg_ie_dt_calledSubAddr calledSubAddr; + aifg_ie_dt_redirNum redirNum; + aifg_ie_dt_redirSubAddr redirSubAddr; + aifg_ie_dt_rpInd llc_rpInd; + aifg_ie_dt_loComp loComp1; + aifg_ie_dt_loComp loComp2; + aifg_ie_dt_rpInd hlc_rpInd; + aifg_ie_dt_hiComp hiComp1; + aifg_ie_dt_hiComp hiComp2; + aifg_ie_dt_uu uu; + aifg_ie_dt_priority priority; + aifg_ie_dt_alertPattern alertPattern; +}aifg_msg_dt_setup; + +typedef struct{ + aifg_ie_dt_bc bc; + aifg_ie_dt_loComp loComp; + aifg_ie_dt_hiComp hiComp; + aifg_ie_dt_revCallDir revCallDir; +}aifg_msg_dt_modify; + +typedef aifg_msg_dt_modify aifg_msg_dt_modifyCmp; + +typedef struct{ + aifg_ie_dt_bc bc; + aifg_ie_dt_cause cause; + aifg_ie_dt_loComp loComp; + aifg_ie_dt_hiComp hiComp; +}aifg_msg_dt_modifyRej; + +typedef struct{ + aifg_ie_dt_uu uu; + aifg_ie_dt_moreData moreData; +}aifg_msg_dt_userInfo; + +typedef struct{ + aifg_ie_dt_cause cause; +}aifg_msg_dt_holdRej; + +typedef aifg_msg_dt_holdRej aifg_msg_dt_retrieveRej; + +typedef struct{ + aifg_ie_dt_cause cause; + aifg_ie_dt_facility facility; + aifg_ie_dt_progInd progInd; + aifg_ie_dt_uu uu; + aifg_ie_dt_ssVer ssVer; +}aifg_msg_dt_disconnect; + +typedef struct{ + aifg_ie_dt_cause cause1; + aifg_ie_dt_cause cause2; + aifg_ie_dt_facility facility; + aifg_ie_dt_uu uu; +}aifg_msg_dt_release; + +typedef struct{ + aifg_ie_dt_cause cause; + aifg_ie_dt_facility facility; + aifg_ie_dt_uu uu; +}aifg_msg_dt_releaseCmp; + +typedef struct{ + aifg_ie_dt_congestLevel congestLevel; + aifg_ie_dt_cause cause; +}aifg_msg_dt_congestCtrl; + +typedef struct{ + aifg_ie_dt_notificationInd notificationInd; +}aifg_msg_dt_notify; + +typedef struct{ + aifg_ie_dt_cause cause; + aifg_ie_dt_callStat callStat; + aifg_ie_dt_auxStat auxStat; +}aifg_msg_dt_status; + +typedef struct{ + aifg_ie_dt_keypad keypad; +}aifg_msg_dt_startDTMF; + +typedef aifg_msg_dt_startDTMF aifg_msg_dt_startDTMF_ack; + +typedef aifg_msg_dt_holdRej aifg_msg_dt_startDTMF_rej; + +typedef struct{ + aifg_ie_dt_facility facility; +}aifg_msg_dt_facility; + +typedef struct{ + aifg_ie_dt_cipherKey cipherKey; + aifg_ie_dt_cmInfo2 cmInfo2; + aifg_ie_mobileId mobileId; +}aifg_msg_dt_pagingResp; + +typedef struct{ + aifg_ie_dt_cause cause; + aifg_ie_dt_facility facility; +}aifg_msg_dt_releaseCompSS; + +typedef struct{ + aifg_ie_dt_facility facility; + aifg_ie_dt_ssVer ssVer; +}aifg_msg_dt_register; + +typedef struct{ + aifg_ie_dt_facility facility; +}aifg_msg_dt_facilitySS; + +typedef struct{ + BYTE ref; + aifg_ie_dt_rpAddr moAddr; + aifg_ie_dt_rpAddr mtAddr; + aifg_ie_dt_rpUD data; +}aifg_msg_dt_rpData; + +typedef struct{ + BYTE ref; +}aifg_msg_dt_rpSMMA; + +typedef struct{ + BYTE ref; + aifg_ie_dt_rpUD data; +}aifg_msg_dt_rpAck; + +typedef struct{ + BYTE ref; + aifg_ie_dt_rpCause cause; + aifg_ie_dt_rpUD data; +}aifg_msg_dt_rpError; + +//BSSMAP---------------------------------------------------------------------- +typedef struct{ + BYTE id; //message id + union{ + aifg_msg_dt_LURequest luRequest; + aifg_msg_dt_cmRequest cmRequest; + aifg_msg_dt_cmReEstReq cmReEstReq; + aifg_msg_dt_imsiDetachInd imsiDetachInd; + aifg_msg_dt_pagingResp pagingResp; + }msg; +}aifg_msg_bm_l3msg; + +typedef struct { + aifg_ie_bm_channelType channelType; + aifg_ie_bm_L3HeaderInfo l3HeaderInfo; + aifg_ie_bm_priority priority; + aifg_ie_bm_cic cic; + aifg_ie_bm_dtx dtxFlag; + aifg_ie_bm_bandUsed bandUsed; + aifg_ie_bm_cmInfo2 cm2; + aifg_ie_bm_groupRef groupRef; + aifg_ie_bm_talkerFlag talkerFlag; + aifg_ie_bm_cfgEvoInd cfgEvoInd; +}aifg_msg_bm_assignReq; + +typedef struct { + aifg_ie_bm_rrCause rrCause; + aifg_ie_bm_cic cic; + aifg_ie_bm_cellId cellId; + aifg_ie_bm_chosenChannel chosenChannel; + aifg_ie_bm_chosenEncrypt chosenEncrypt; + aifg_ie_bm_circuitPool circuitPool; + aifg_ie_bm_speechVer speechVer; + aifg_ie_bm_lsaId lsaId; +}aifg_msg_bm_assignComplete; + +typedef struct { + aifg_ie_bm_rrCause rrCause; + aifg_ie_bm_cause cause; + aifg_ie_bm_circuitPool circuitPool; + aifg_ie_bm_circuitPoolList circuitPoolList; +}aifg_msg_bm_assignFailure; + +typedef struct { + aifg_ie_bm_cic cic; + aifg_ie_bm_cause cause; + aifg_ie_bm_connRelReq connRelReq; +}aifg_msg_bm_block; + +typedef struct { + aifg_ie_bm_cic cic; +}aifg_msg_bm_blockAck; + +typedef aifg_msg_bm_blockAck aifg_msg_bm_unblock; + +typedef aifg_msg_bm_blockAck aifg_msg_bm_unblockAck; + +typedef struct { + aifg_ie_bm_channelType channelType; + aifg_ie_bm_encryptInfo encryptInfo; + union{ + BYTE ind; + aifg_ie_bm_cmInfo1 cm1; + aifg_ie_bm_cmInfo2 cm2; + }cmInfo; + aifg_ie_bm_cellId servingCellId; + aifg_ie_bm_priority priority; + aifg_ie_bm_cic cic; + aifg_ie_bm_dtx dtxFlag; + aifg_ie_bm_cellId targetCellId; + aifg_ie_bm_bandUsed bandUsed; + aifg_ie_bm_cause cause; +// aifg_ie_bm_cmInfo3 cm3; + aifg_ie_bm_curChannelType1 curChannelType1; + aifg_ie_bm_speechVer speechVer; + aifg_ie_bm_groupRef gourpRef; + aifg_ie_bm_talkerFlag talkerFlag; + aifg_ie_bm_cfgEvoInd cfgEvoInd; + aifg_ie_bm_chosenEncrypt chosenEncrypt; + aifg_ie_bm_bssOldtoNew bssOldtoNew; + aifg_ie_bm_lsaInfo lsaInfo; +}aifg_msg_bm_HORequest; + +typedef struct { + aifg_ie_bm_cause cause; + aifg_ie_bm_respReq respReq; + aifg_ie_bm_cidList prefer_cidList; + aifg_ie_bm_circuitPoolList circuitPoolList; + aifg_ie_bm_curChannelType1 curChannelType1; + aifg_ie_bm_speechVer speechVer; + aifg_ie_bm_queuingInd queuingInd; + aifg_ie_bm_bssOldtoNew bssOldtoNew; +}aifg_msg_bm_HORequired; + +typedef struct { + struct{ + BYTE *ptr; + BYTE len; + }l3Info; + aifg_ie_bm_chosenChannel chosenChannel; + aifg_ie_bm_chosenEncrypt chosenEncrypt; + aifg_ie_bm_circuitPool circuitPool; + aifg_ie_bm_speechVer speechVer; + aifg_ie_bm_cic cic; + aifg_ie_bm_lsaId lsaId; +}aifg_msg_bm_HORequestAck; + +typedef struct { + struct{ + BYTE *ptr; + BYTE len; + }l3Info; + aifg_ie_bm_cellId cellId; +}aifg_msg_bm_HOCmd; + +typedef struct { + aifg_ie_bm_rrCause rrCause; +}aifg_msg_bm_HOComplete; + +typedef struct { + aifg_ie_bm_msNum msNum; + aifg_ie_bm_cidList cidList; + aifg_ie_bm_cellId cellId; +}aifg_msg_bm_HOCandidateEnq; + +typedef struct { + aifg_ie_bm_msNum msNum; + aifg_ie_bm_cellId cellId; +}aifg_msg_bm_HOCandidateResp; + +typedef struct { + aifg_ie_bm_cause cause; + aifg_ie_bm_rrCause rrCause; + aifg_ie_bm_circuitPool circuitPool; + aifg_ie_bm_circuitPoolList circuitPoolList; +}aifg_msg_bm_HOFailure; + +typedef struct { + aifg_ie_bm_periodicity periodicity; + aifg_ie_bm_resrcIndMethod resrcIndMethod; + aifg_ie_bm_cellId cellId; + aifg_ie_bm_extResourceInd extResrcInd; +}aifg_msg_bm_resrcReq; + +typedef struct { + aifg_ie_bm_resrcIndMethod resrcIndMethod; + aifg_ie_bm_resrcAvail resrcAvail; + aifg_ie_bm_cellId cellId; + aifg_ie_bm_totalResrc totalResrc; +}aifg_msg_bm_resrcInd; + +typedef struct { + aifg_ie_bm_imsi imsi; + aifg_ie_bm_tmsi tmsi; + aifg_ie_bm_cidList cidList; + aifg_ie_bm_channelNeeded channelNeeded; + aifg_ie_bm_eMLPP eMLPP; +}aifg_msg_bm_paging; + +typedef struct { + aifg_ie_bm_cause cause; +}aifg_msg_bm_clearReq; + +typedef struct { + aifg_ie_bm_L3HeaderInfo l3HeaderInfo; + aifg_ie_bm_cause cause; +}aifg_msg_bm_clearCmd; + +typedef aifg_msg_bm_clearReq aifg_msg_bm_reset; + +typedef struct { + aifg_ie_bm_cause cause; + aifg_ie_bm_cellId cellId; + aifg_ie_bm_chosenChannel chosenChannel; + aifg_ie_bm_chosenEncrypt chosenEncrypt; + aifg_ie_bm_speechVer speechVer; + aifg_ie_bm_lsaId lsaId; +}aifg_msg_bm_HOPerformed; + +typedef struct { + aifg_ie_bm_cause cause; + aifg_ie_bm_cellId cellId; +}aifg_msg_bm_overload; + +typedef struct { + aifg_ie_bm_traceType traceType; + aifg_ie_bm_triggerId tiggerId; + aifg_ie_bm_traceRef traceRef; + aifg_ie_bm_transId transId; + aifg_ie_mobileId mobileId; + aifg_ie_bm_omcId omcId; +}aifg_msg_bm_mscInvokeTrace; + +typedef struct { + aifg_ie_bm_traceType traceType; + aifg_ie_bm_fowardInd forwardInd; + aifg_ie_bm_triggerId tiggerId; + aifg_ie_bm_traceRef traceRef; + aifg_ie_bm_transId transId; + aifg_ie_bm_omcId omcId; +}aifg_msg_bm_bscInvokeTrace; + +typedef struct { + aifg_ie_bm_cmInfo2 cm2; +// aifg_ie_bm_cmInfo3 cm3; +}aifg_msg_bm_cmUpdate; + +typedef struct { + aifg_ie_bm_L3HeaderInfo l3HeaderInfo; + aifg_ie_bm_encryptInfo encryptInfo; + aifg_ie_bm_cipherRespMode cipherRespMode; +}aifg_msg_bm_cipherModeCmd; + +typedef struct { + struct{ + BYTE flag; + BYTE *ptr; + BYTE len; + }l3Info; + aifg_ie_bm_chosenEncrypt chosenEncrypt; +}aifg_msg_bm_cipherModeComplete; + +typedef struct { + struct{ + BYTE *ptr; + BYTE len; + }l3Info; +// aifg_msg_bm_l3msg l3Info; + aifg_ie_bm_cellId cellId; + aifg_ie_bm_chosenChannel chosenChannel; + aifg_ie_bm_lsaIdList lsaIdList; + aifg_ie_bm_locInfo locInfo; +}aifg_msg_bm_completeL3Info; + +typedef struct { + aifg_ie_bm_dlci dlci; + aifg_ie_bm_cause cause; +}aifg_msg_bm_SAPI_n_Reject; + +typedef aifg_msg_bm_clearReq aifg_msg_bm_HOReject; + +typedef struct { + aifg_ie_bm_cic cic; + aifg_ie_bm_cause cause; +}aifg_msg_bm_resetCircuit; + +typedef struct { + aifg_ie_bm_cic cic; +}aifg_msg_bm_resetCircuitAck; + +typedef struct { + aifg_ie_bm_cause cause; + aifg_ie_bm_cic cic; + aifg_ie_bm_cicList cicList; +}aifg_msg_bm_circuitGrpBlk; + +typedef struct { + aifg_ie_bm_cic cic; + aifg_ie_bm_cicList cicList; +}aifg_msg_bm_circuitGrpBlkAck; + +typedef aifg_msg_bm_circuitGrpBlkAck aifg_msg_bm_circuitGrpUnblk; + +typedef aifg_msg_bm_circuitGrpBlkAck aifg_msg_bm_circuitGrpUnblkAck; + +typedef struct { + aifg_ie_bm_cause cause; + aifg_ie_bm_diagnostics diagnostics; +}aifg_msg_bm_confusion; + +typedef aifg_msg_bm_circuitGrpBlkAck aifg_msg_bm_unequippedCircuit; + +typedef aifg_msg_bm_clearReq aifg_msg_bm_cipherModeReject; + +typedef struct { + aifg_ie_bm_timeId timeInd; + aifg_ie_bm_cellId cellId; + aifg_ie_bm_cidList cidList; + aifg_ie_bm_resrcSit resrcSit; + aifg_ie_bm_cause cause; +}aifg_msg_bm_loadIndication; + +typedef struct { + aifg_ie_bm_dlci dlci; +}aifg_msg_bm_suspend; + +typedef aifg_msg_bm_suspend aifg_msg_bm_resume; + +typedef aifg_msg_bm_clearReq aifg_msg_bm_changeCircuit; + +typedef aifg_msg_bm_resetCircuitAck aifg_msg_bm_changeCircuitAck; + +typedef struct { + aifg_ie_bm_lsaInfo lsaInfo; +}aifg_msg_bm_lsaInfo; + +typedef struct { + aifg_ie_bm_locInfo locInfo; +}aifg_msg_bm_locCmd; + +typedef struct { + aifg_ie_bm_locInfo locInfo; + aifg_ie_bm_cause cause; +}aifg_msg_bm_locReport; + +typedef struct { + aifg_msg_id id; + aifg_pd pd; + int app_port; + int aif_port; + int trace_flag; //0 - off, 1 - on + union{ + //BSSMAP + aifg_msg_bm_assignReq assignReq; + aifg_msg_bm_assignComplete assignComplete; + aifg_msg_bm_assignFailure assignFailure; + aifg_msg_bm_block block; + aifg_msg_bm_blockAck blockAck; + aifg_msg_bm_unblock unblock; + aifg_msg_bm_unblockAck unblockAck; + aifg_msg_bm_HORequired HORequired; + aifg_msg_bm_HORequest HORequest; + aifg_msg_bm_HORequestAck HORequestAck; + aifg_msg_bm_HOCmd HOCmd; + aifg_msg_bm_HOComplete HOComplete; + aifg_msg_bm_HOCandidateEnq HOCandidateEnq; + aifg_msg_bm_HOCandidateResp HOCandidateResp; + aifg_msg_bm_HOFailure HOFailure; + aifg_msg_bm_HOPerformed HOPerformed; + aifg_msg_bm_HOReject HOReject; + aifg_msg_bm_resrcReq resourceReq; + aifg_msg_bm_resrcInd resourceInd; + aifg_msg_bm_paging paging; + aifg_msg_bm_clearReq clearReq; + aifg_msg_bm_clearCmd clearCmd; + aifg_msg_bm_reset reset; + aifg_msg_bm_overload overload; + aifg_msg_bm_mscInvokeTrace mscInvokeTrace; + aifg_msg_bm_bscInvokeTrace bscInvokeTrace; + aifg_msg_bm_cmUpdate cmUpdate; + aifg_msg_bm_cipherModeCmd cipherModeCmd; + aifg_msg_bm_cipherModeComplete cipherModeComplete; + aifg_msg_bm_cipherModeReject cipherModeReject; + aifg_msg_bm_completeL3Info completeL3Info; + aifg_msg_bm_SAPI_n_Reject SAPI_n_Reject; + aifg_msg_bm_resetCircuit resetCircuit; + aifg_msg_bm_resetCircuitAck resetCircuitAck; + aifg_msg_bm_circuitGrpBlk ccGroupBlock; + aifg_msg_bm_circuitGrpBlkAck ccGroupBlockAck; + aifg_msg_bm_circuitGrpUnblk ccGroupUnblock; + aifg_msg_bm_circuitGrpUnblkAck ccGroupUnblockAck; + aifg_msg_bm_confusion confusion; + aifg_msg_bm_unequippedCircuit unequippedCircuit; + aifg_msg_bm_loadIndication loadInd; + aifg_msg_bm_suspend suspend; + aifg_msg_bm_resume resume; + aifg_msg_bm_changeCircuit changeCircuit; + aifg_msg_bm_changeCircuitAck changeCircuitAck; + aifg_msg_bm_lsaInfo lsaInfo; + aifg_msg_bm_locCmd locCmd; + aifg_msg_bm_locReport locReport; + + //DTAP + aifg_msg_dt_luAccept luAccept; + aifg_msg_dt_cmReject cmReject; + aifg_msg_dt_luReject luReject; + aifg_msg_dt_abort abort; + aifg_msg_dt_mmStatus mmStatus; + aifg_msg_dt_LURequest luRequest; + aifg_msg_dt_authRequest authRequest; + aifg_msg_dt_authResp authResp; + aifg_msg_dt_idRequest idRequest; + aifg_msg_dt_idResp idResp; + aifg_msg_dt_imsiDetachInd IMSI_ind; + aifg_msg_dt_tmsiCmd tmsiCmd; + aifg_msg_dt_cmReEstReq cmReEst_Request; + aifg_msg_dt_cmRequest cmRequest; + aifg_msg_dt_mmInfo mmInfo; + aifg_msg_dt_alert alert; + aifg_msg_dt_callConfirm callConfirm; + aifg_msg_dt_callProceed callProceed; + aifg_msg_dt_connect connect; + aifg_msg_dt_eSetup eSetup; + aifg_msg_dt_progress progress; + aifg_msg_dt_setup setup; + aifg_msg_dt_modify modify; + aifg_msg_dt_modifyCmp modifyCmp; + aifg_msg_dt_modifyRej modifyRej; + aifg_msg_dt_userInfo userInfo; + aifg_msg_dt_holdRej holdRej; + aifg_msg_dt_retrieveRej retrieveRej; + aifg_msg_dt_disconnect disconnect; + aifg_msg_dt_release release; + aifg_msg_dt_releaseCmp releaseCmp; + aifg_msg_dt_congestCtrl congestCtrl; + aifg_msg_dt_notify notify; + aifg_msg_dt_status status; + aifg_msg_dt_startDTMF startDTMF; + aifg_msg_dt_startDTMF_ack startDTMF_ack; + aifg_msg_dt_startDTMF_rej startDTMF_rej; + aifg_msg_dt_facility facility; + aifg_msg_dt_facilitySS facilitySS; + aifg_msg_dt_register registerSS; + aifg_msg_dt_releaseCompSS releaseCompSS; + aifg_msg_dt_rpData rpData; + aifg_msg_dt_rpSMMA rpSMMA; + aifg_msg_dt_rpAck rpAck; + aifg_msg_dt_rpError rpError; + + //for transparently DTAP message transfer in BSC + struct { + BYTE *ptr; + BYTE len; + }dtap_msg; + }msg; +}aifg_msg_t; + +//Message struct for decode----------------------------------------------------- +enum{AIFG_LOW_BITS = 0, AIFG_HIGH_BITS}; + +typedef struct +{ + BYTE iei; + BYTE *ptr; + BYTE hi_lo_flag; +}aifg_ie_ptr; + +//DTAP------------------------------------- +typedef struct +{ + aifg_ie_ptr cipherKeySeq; + aifg_ie_ptr authParamRAND; +}aifg_msg_predecode_dt_authReq; + +typedef struct +{ + aifg_ie_ptr authParamSRES; +}aifg_msg_predecode_dt_authResp; + +typedef struct +{ + aifg_ie_ptr cipherKeySeq; + aifg_ie_ptr cm2; + aifg_ie_ptr mobileId; + aifg_ie_ptr lai; + aifg_ie_ptr id; +}aifg_msg_predecode_dt_cmReEstReq; + +typedef struct +{ + aifg_ie_ptr rejCause; +}aifg_msg_predecode_dt_cmRej; + +typedef struct +{ + aifg_ie_ptr rejCause; +}aifg_msg_predecode_dt_abort; + +typedef struct +{ + aifg_ie_ptr type; + aifg_ie_ptr cipherKeySeq; + aifg_ie_ptr cm2; + aifg_ie_ptr mobileId; + aifg_ie_ptr priority; +}aifg_msg_predecode_dt_cmReq; + +typedef struct +{ + aifg_ie_ptr type; +}aifg_msg_predecode_dt_idReq; + +typedef struct +{ + aifg_ie_ptr mobileId; +}aifg_msg_predecode_dt_idResp; + +typedef struct +{ + aifg_ie_ptr cm1; + aifg_ie_ptr mobileId; +}aifg_msg_predecode_dt_imsiDetachInd; + +typedef struct +{ + aifg_ie_ptr lai; + aifg_ie_ptr mobileId; + aifg_ie_ptr followOnProc; + aifg_ie_ptr ctsPerm; +}aifg_msg_predecode_dt_luAccept; + +typedef struct +{ + aifg_ie_ptr rejCause; +}aifg_msg_predecode_dt_luReject; + +typedef struct +{ + aifg_ie_ptr type; + aifg_ie_ptr cipherKeySeq; + aifg_ie_ptr lai; + aifg_ie_ptr cm1; + aifg_ie_ptr mobileId; +}aifg_msg_predecode_dt_LURequest; + +typedef struct +{ + aifg_ie_ptr fullNetworkName; + aifg_ie_ptr shortNetworkName; + aifg_ie_ptr timeZone; + aifg_ie_ptr timeZoneAndTime; + aifg_ie_ptr lsaId; +}aifg_msg_predecode_dt_mmInfo; + +typedef struct +{ + aifg_ie_ptr rejCause; +}aifg_msg_predecode_dt_mmStatus; + +typedef struct +{ + aifg_ie_ptr lai; + aifg_ie_ptr mobileId; +}aifg_msg_predecode_dt_tmsiReallocCmd; + +typedef struct +{ + aifg_ie_ptr facility; + aifg_ie_ptr progressInd; + aifg_ie_ptr user_user; + aifg_ie_ptr ssVer; +}aifg_msg_predecode_dt_alert; + +typedef struct +{ + aifg_ie_ptr reptInd; + aifg_ie_ptr bearCap1; + aifg_ie_ptr bearCap2; + aifg_ie_ptr cause; + aifg_ie_ptr ccCap; +}aifg_msg_predecode_dt_callConfirm; + +typedef struct +{ + aifg_ie_ptr reptInd; + aifg_ie_ptr bearCap1; + aifg_ie_ptr bearCap2; + aifg_ie_ptr facility; + aifg_ie_ptr progressInd; + aifg_ie_ptr priority; +}aifg_msg_predecode_dt_callProceed; + +typedef struct +{ + aifg_ie_ptr congestLev; + aifg_ie_ptr cause; +}aifg_msg_predecode_dt_congestCtrl; + +typedef struct +{ + aifg_ie_ptr facility; + aifg_ie_ptr progressInd; + aifg_ie_ptr connNum; + aifg_ie_ptr connSubaddr; + aifg_ie_ptr user_user; + aifg_ie_ptr ssVer; +}aifg_msg_predecode_dt_connect; + +typedef struct +{ + aifg_ie_ptr cause; + aifg_ie_ptr facility; + aifg_ie_ptr progressInd; + aifg_ie_ptr user_user; + aifg_ie_ptr allowAct; + aifg_ie_ptr ssVer; +}aifg_msg_predecode_dt_disconnect; + +typedef struct +{ + aifg_ie_ptr bearCap; +}aifg_msg_predecode_dt_emergSetup; + +typedef struct +{ + aifg_ie_ptr facility; + aifg_ie_ptr ssVer; +}aifg_msg_predecode_dt_facility; + +typedef struct +{ + aifg_ie_ptr bearCap; + aifg_ie_ptr lowLComp; + aifg_ie_ptr highLComp; + aifg_ie_ptr revCallSetDir; +}aifg_msg_predecode_dt_modify; + +typedef aifg_msg_predecode_dt_modify aifg_msg_predecode_dt_modifyComp; + +typedef struct +{ + aifg_ie_ptr bearCap; + aifg_ie_ptr cause; + aifg_ie_ptr lowLComp; + aifg_ie_ptr highLComp; +}aifg_msg_predecode_dt_modifyRej; + +typedef struct +{ + aifg_ie_ptr progressInd; + aifg_ie_ptr user_user; +}aifg_msg_predecode_dt_progress; + +typedef struct +{ + aifg_ie_ptr cause1; + aifg_ie_ptr cause2; + aifg_ie_ptr facility; + aifg_ie_ptr user_user; + aifg_ie_ptr ssVer; +}aifg_msg_predecode_dt_release; + +typedef struct +{ + aifg_ie_ptr cause; + aifg_ie_ptr facility; + aifg_ie_ptr user_user; + aifg_ie_ptr ssVer; +}aifg_msg_predecode_dt_releaseComp; + +typedef struct +{ + aifg_ie_ptr reptInd_bc; + aifg_ie_ptr bearCap1; + aifg_ie_ptr bearCap2; + aifg_ie_ptr facility; + aifg_ie_ptr progressInd; + aifg_ie_ptr signal; + aifg_ie_ptr callingBCD; + aifg_ie_ptr callingSubaddr; + aifg_ie_ptr calledBCD; + aifg_ie_ptr calledSubaddr; + aifg_ie_ptr redirBCD; + aifg_ie_ptr redirSubaddr; + aifg_ie_ptr reptInd_llc; + aifg_ie_ptr lowLComp1; + aifg_ie_ptr lowLComp2; + aifg_ie_ptr reptInd_hlc; + aifg_ie_ptr highLComp1; + aifg_ie_ptr highLComp2; + aifg_ie_ptr user_user; + aifg_ie_ptr priority; + aifg_ie_ptr alert; + aifg_ie_ptr ssVer; + aifg_ie_ptr clirSuppr; + aifg_ie_ptr clirInvo; + aifg_ie_ptr ccCap; +}aifg_msg_predecode_dt_setup; + +typedef struct +{ + aifg_ie_ptr keypadFacility; +}aifg_msg_predecode_dt_startDTMF; + +typedef aifg_msg_predecode_dt_startDTMF aifg_msg_predecode_dt_startDTMFAck; + +typedef struct +{ + aifg_ie_ptr cause; + aifg_ie_ptr callState; + aifg_ie_ptr auxState; +}aifg_msg_predecode_dt_status; + +typedef struct +{ + aifg_ie_ptr user_user; + aifg_ie_ptr moreDate; +}aifg_msg_predecode_dt_userInfo; + +typedef struct +{ + aifg_ie_ptr cause; +}aifg_msg_predecode_dt_holdRej; + +typedef aifg_msg_predecode_dt_holdRej aifg_msg_predecode_dt_retieveRej; +typedef aifg_msg_predecode_dt_holdRej aifg_msg_predecode_dt_startDTMFRej; + +typedef struct +{ + aifg_ie_ptr notifyInd; +}aifg_msg_predecode_dt_notify; + +typedef struct +{ + aifg_ie_ptr cipherKeySeq; + aifg_ie_ptr cm2; + aifg_ie_ptr mobileId; +}aifg_msg_predecode_dt_pagingResp; + +typedef struct +{ + aifg_ie_ptr facility; +}aifg_msg_predecode_dt_facilitySS; + +typedef struct +{ + aifg_ie_ptr facility; + aifg_ie_ptr ssVer; +}aifg_msg_predecode_dt_register; + +typedef struct +{ + aifg_ie_ptr cause; + aifg_ie_ptr facility; +}aifg_msg_predecode_dt_releaseCompSS; + +typedef struct{ + BYTE ref; + aifg_ie_ptr moAddr; + aifg_ie_ptr mtAddr; + aifg_ie_ptr data; +}aifg_msg_predecode_dt_rpData; + +typedef struct{ + BYTE ref; +}aifg_msg_predecode_dt_rpSMMA; + +typedef struct{ + BYTE ref; + aifg_ie_ptr data; +}aifg_msg_predecode_dt_rpAck; + +typedef struct{ + BYTE ref; + aifg_ie_ptr cause; + aifg_ie_ptr data; +}aifg_msg_predecode_dt_rpError; + +//BSSMAP +typedef struct +{ + BYTE id; //message id + union{ + aifg_msg_predecode_dt_LURequest luRequest; + aifg_msg_predecode_dt_cmReq cmRequest; + aifg_msg_predecode_dt_cmReEstReq cmReEstReq; + aifg_msg_predecode_dt_imsiDetachInd imsiDetachInd; + aifg_msg_predecode_dt_pagingResp pagingResp; + }msg; +}aifg_msg_predecode_l3msg; + +typedef struct +{ + aifg_ie_ptr channelType; + aifg_ie_ptr l3HeaderInfo; + aifg_ie_ptr priority; + aifg_ie_ptr cic; + aifg_ie_ptr dtxFlag; + aifg_ie_ptr bandUsed; + aifg_ie_ptr cmInfo2; + aifg_ie_ptr groupRef; + aifg_ie_ptr talkerFlag; + aifg_ie_ptr cfgEvoInd; +}aifg_msg_predecode_bm_assignReq; + + typedef struct + { + aifg_ie_ptr rrcause; + aifg_ie_ptr cic; + aifg_ie_ptr cellId; + aifg_ie_ptr chosenChannel; + aifg_ie_ptr chosenEncrypt; + aifg_ie_ptr circuitPool; + aifg_ie_ptr speechVer; + aifg_ie_ptr lsaId; + }aifg_msg_predecode_bm_assignComp; + +typedef struct +{ + aifg_ie_ptr cause; + aifg_ie_ptr rrcause; + aifg_ie_ptr circuitPool; + aifg_ie_ptr circuitPoolList; +}aifg_msg_predecode_bm_assignFail; + +typedef struct +{ + aifg_ie_ptr cic; + aifg_ie_ptr cause; + aifg_ie_ptr connectionRelReq; +}aifg_msg_predecode_bm_block; + +typedef struct +{ + aifg_ie_ptr cic; +}aifg_msg_predecode_bm_blockAck; + +typedef aifg_msg_predecode_bm_blockAck aifg_msg_predecode_bm_unBlock; + +typedef aifg_msg_predecode_bm_blockAck aifg_msg_predecode_bm_unBlockAck; + +typedef struct +{ + aifg_ie_ptr channelType; + aifg_ie_ptr encryptInfo; + aifg_ie_ptr cmInfo1; + aifg_ie_ptr cmInfo2; + aifg_ie_ptr serving_cellId; + aifg_ie_ptr priority; + aifg_ie_ptr cic; + aifg_ie_ptr dtxFlag; + aifg_ie_ptr target_cellId; + aifg_ie_ptr bandUsed; + aifg_ie_ptr cause; + aifg_ie_ptr cmInfo3; + aifg_ie_ptr curChanneltype1; + aifg_ie_ptr speechVer; + aifg_ie_ptr groupCallRef; + aifg_ie_ptr talkerFlag; + aifg_ie_ptr cfgEvoInd; + aifg_ie_ptr chosenEncrypt; + aifg_ie_ptr oldBssToNew; + aifg_ie_ptr lsaInfo; +}aifg_msg_predecode_bm_HORequest; + +typedef struct +{ + aifg_ie_ptr cause; + aifg_ie_ptr respReq; + aifg_ie_ptr cellIdList; + aifg_ie_ptr circuitPoolList; + aifg_ie_ptr curChannelType1; + aifg_ie_ptr speechVer; + aifg_ie_ptr queInd; + aifg_ie_ptr oldBssToNew; +}aifg_msg_predecode_bm_HORequired; + +typedef struct +{ + struct{ + BYTE *ptr; + BYTE len; + }l3Info; + aifg_ie_ptr chosenChannel; + aifg_ie_ptr chosenEncrypt; + aifg_ie_ptr circuitPool; + aifg_ie_ptr speechVer; + aifg_ie_ptr cic; + aifg_ie_ptr lsaId; +}aifg_msg_predecode_bm_HORequestAck; + +typedef struct +{ + aifg_msg_predecode_l3msg l3msg; + aifg_ie_ptr cellId; +}aifg_msg_predecode_bm_HOCmd; + +typedef struct +{ + aifg_ie_ptr rrcause; +}aifg_msg_predecode_bm_HOComp; + + +typedef struct +{ + aifg_ie_ptr msNum; + aifg_ie_ptr cellIdList; + aifg_ie_ptr cellId; +}aifg_msg_predecode_bm_HOCandEnq; + +typedef struct +{ + aifg_ie_ptr msNum; + aifg_ie_ptr cellId; +}aifg_msg_predecode_bm_HOCandResp; + +typedef aifg_msg_predecode_bm_assignFail aifg_msg_predecode_bm_HOFail; + +typedef struct +{ + aifg_ie_ptr periodicity; + aifg_ie_ptr resrcIndMethod; + aifg_ie_ptr cellId; + aifg_ie_ptr extResrcInd; +}aifg_msg_predecode_bm_resrcReq; + +typedef struct +{ + aifg_ie_ptr resrcIndMethod; + aifg_ie_ptr resrcAvail; + aifg_ie_ptr cellId; + aifg_ie_ptr totalResrc; +}aifg_msg_predecode_bm_resrcInd; + +typedef struct +{ + aifg_ie_ptr imsi; + aifg_ie_ptr tmsi; + aifg_ie_ptr cellIdList; + aifg_ie_ptr channelNeeded; + aifg_ie_ptr eMLPPpri; +}aifg_msg_predecode_bm_paging; + +typedef struct +{ + aifg_ie_ptr cause; +}aifg_msg_predecode_bm_clearReq; + +typedef struct +{ + aifg_ie_ptr l3HeaderInfo; + aifg_ie_ptr cause; +}aifg_msg_predecode_bm_clearCmd; + +typedef struct +{ + aifg_ie_ptr cause; +}aifg_msg_predecode_bm_reset; + +typedef struct +{ + aifg_ie_ptr cause; + aifg_ie_ptr cellId; + aifg_ie_ptr chosenChannel; + aifg_ie_ptr chosenEncrypt; + aifg_ie_ptr speechVer; + aifg_ie_ptr lsaId; +}aifg_msg_predecode_bm_HOPreformed; + +typedef struct +{ + aifg_ie_ptr cause; + aifg_ie_ptr cellId; +}aifg_msg_predecode_bm_overload; + +typedef struct +{ + aifg_ie_ptr traceType; + aifg_ie_ptr triggerId; + aifg_ie_ptr traceRef; + aifg_ie_ptr transId; + aifg_ie_ptr mobileId; + aifg_ie_ptr omcId; +}aifg_msg_predecode_bm_mscInvokeTrace; + +typedef struct +{ + aifg_ie_ptr traceType; + aifg_ie_ptr forwardInd; + aifg_ie_ptr triggerId; + aifg_ie_ptr traceRef; + aifg_ie_ptr transId; + aifg_ie_ptr omcId; +}aifg_msg_predecode_bm_bscInvokeTrace; + +typedef struct +{ + aifg_ie_ptr cmInfo2; + aifg_ie_ptr cmInfo3; +}aifg_msg_predecode_bm_cmUpdate; + +typedef struct +{ + aifg_ie_ptr l3HeaderInfo; + aifg_ie_ptr encryptInfo; + aifg_ie_ptr cipherRespMode; +}aifg_msg_predecode_bm_cipherModeCmd; + +typedef struct +{ + aifg_ie_ptr l3MsgCont; + aifg_ie_ptr chosenEncrypt; +}aifg_msg_predecode_bm_cipherModeComp; + +typedef struct +{ + aifg_ie_ptr cellId; + aifg_msg_predecode_l3msg l3msg; + aifg_ie_ptr chosenChannel; + aifg_ie_ptr lsaIdList; + aifg_ie_ptr locInfo; +}aifg_msg_predecode_bm_completeL3Info; + +typedef struct +{ + aifg_ie_ptr dlci; + aifg_ie_ptr cause; +}aifg_msg_predecode_bm_sapi_n_rej; + +typedef struct +{ + aifg_ie_ptr cause; +}aifg_msg_predecode_bm_HORequiredRej; + +typedef struct +{ + aifg_ie_ptr cic; + aifg_ie_ptr cause; +}aifg_msg_predecode_bm_resetCircuit; + +typedef struct +{ + aifg_ie_ptr cic; +}aifg_msg_predecode_bm_resetCircuitAck; + +typedef struct +{ + aifg_ie_ptr cause; + aifg_ie_ptr cic; + aifg_ie_ptr cicList; +}aifg_msg_predecode_bm_circuitGrpBlk; + +typedef struct +{ + aifg_ie_ptr cic; + aifg_ie_ptr cicList; +}aifg_msg_predecode_bm_circuitGrpBlkAck; + +typedef struct +{ + aifg_ie_ptr cic; + aifg_ie_ptr cicList; +}aifg_msg_predecode_bm_circuitGrpUnblk; + +typedef struct +{ + aifg_ie_ptr cic; + aifg_ie_ptr cicList; +}aifg_msg_predecode_bm_circuitGrpUnblkAck; + +typedef struct +{ + aifg_ie_ptr cause; + aifg_ie_ptr diagnostics; +}aifg_msg_predecode_bm_confusion; + +typedef struct +{ + aifg_ie_ptr cic; + aifg_ie_ptr cicList; +}aifg_msg_predecode_bm_unequipCircuit; + +typedef struct +{ + aifg_ie_ptr cause; +}aifg_msg_predecode_bm_cipherModeRej; + +typedef struct +{ + aifg_ie_ptr timeInd; + aifg_ie_ptr cellId; + aifg_ie_ptr cellIdList; + aifg_ie_ptr resrcSit; + aifg_ie_ptr cause; +}aifg_msg_predecode_bm_loadInd; + +typedef struct +{ + aifg_ie_ptr dlci; +}aifg_msg_predecode_bm_suspend; + +typedef struct +{ + aifg_ie_ptr dlci; +}aifg_msg_predecode_bm_resume; + +typedef struct +{ + aifg_ie_ptr cause; +}aifg_msg_predecode_bm_changeCircuit; + +typedef struct +{ + aifg_ie_ptr circuitId; +}aifg_msg_predecode_bm_changeCircuitAck; + +typedef struct +{ + aifg_ie_ptr lsaInfo; +}aifg_msg_predecode_bm_lsaInfo; + +typedef struct +{ + aifg_ie_ptr locInfo; +}aifg_msg_predecode_bm_locInfoCmd; + +typedef struct +{ + aifg_ie_ptr locInfo; + aifg_ie_ptr cause; +}aifg_msg_predecode_bm_locInfoRep; + + +typedef struct{ + aifg_msg_id id; + int ti; //ti of the message. used only in dtap message + aifg_pd pd; //Protocol discriminator + int aif_port; + int app_port; //port number of upper layer application + int cause; //for release indication + int trace_flag; //0 - off, 1 - on + int tg_id; //trunk group id + + union{ + //BSSMAP + aifg_msg_predecode_bm_assignReq assignReq; //assign request + aifg_msg_predecode_bm_assignComp assignComplete; //assign complete + aifg_msg_predecode_bm_assignFail assignFailure; //assign failure + aifg_msg_predecode_bm_block block; //block + aifg_msg_predecode_bm_blockAck blockAck; //block ack + aifg_msg_predecode_bm_unBlock unblock; //unblock + aifg_msg_predecode_bm_unBlockAck unBlockAck; //unblock ack + aifg_msg_predecode_bm_HORequest HORequest; //Handover request + aifg_msg_predecode_bm_HORequired HORequired; //HANDOVER REQUIRED + aifg_msg_predecode_bm_HORequestAck HORequestAck; //Handover request ack + aifg_msg_predecode_bm_HOCmd HOCmd; //HANDOVER COMMAND + aifg_msg_predecode_bm_HOComp HOComplete; //HANDOVER COMPLETE + aifg_msg_predecode_bm_HOCandEnq HOCandEnq; //HANDOVER CANDIDATE ENQUIRE + aifg_msg_predecode_bm_HOCandResp HOCandResp; //HANDOVER CANDIDATE RESPONSE + aifg_msg_predecode_bm_HOFail HOFailure; //HANDOVER FAILURE + aifg_msg_predecode_bm_resrcReq resrcReq; //RESOURCE REQUEST + aifg_msg_predecode_bm_resrcInd resrcInd; //RESOURCE INDICATION + aifg_msg_predecode_bm_paging paging; //PAGING + aifg_msg_predecode_bm_clearReq clearReq; //CLEAR REQUEST + aifg_msg_predecode_bm_clearCmd clearCmd; //CLEAR COMMAND + aifg_msg_predecode_bm_reset reset; //RESET + aifg_msg_predecode_bm_HOPreformed HOPerformed; //HANDOVER PERFORMED + aifg_msg_predecode_bm_overload overload; //OVERLOAD + aifg_msg_predecode_bm_mscInvokeTrace mscTrace; //MSC INVOKE TRACE + aifg_msg_predecode_bm_bscInvokeTrace bscTrace; //BSC INVOKE TRACE + aifg_msg_predecode_bm_cmUpdate cmUpdate; //CLASSMARK UPDATE + aifg_msg_predecode_bm_cipherModeCmd cipherModeCmd; //CIPHER MODE COMMAND + aifg_msg_predecode_bm_cipherModeComp cipherModeComp; //CIPHER MODE COMPLETE + aifg_msg_predecode_bm_completeL3Info completeL3Info; //COMPLETE LAYER 3 INFORMATION + aifg_msg_predecode_bm_sapi_n_rej sapi_n_rej; //SAPI "n" REJECT + aifg_msg_predecode_bm_HORequiredRej HORequiredRej; //HANDOVER REQUIRED REJECT + aifg_msg_predecode_bm_resetCircuit resetCircuit; //RESET CIRCUIT + aifg_msg_predecode_bm_resetCircuitAck resetCircuitAck; //RESET CIRCUIT ACK + aifg_msg_predecode_bm_circuitGrpBlk ccGroupBlock; //CIRCUIT GROUP BLOCK + aifg_msg_predecode_bm_circuitGrpBlkAck ccGroupBlockAck; //CIRCUIT GROUP BLOCK ACK + aifg_msg_predecode_bm_circuitGrpUnblk ccGroupUnblock; //CIRCUIT GROUP UNBLOCK + aifg_msg_predecode_bm_circuitGrpUnblkAck ccGroupUnblockAck; //CIRCUIT GROUP UNBLOCK ACK + aifg_msg_predecode_bm_confusion confusion; //CONFUSION + aifg_msg_predecode_bm_unequipCircuit upequipCircuit; //UNEQUIPPED CIRCUIT + aifg_msg_predecode_bm_cipherModeRej cipherModeRej; //CIPHER MODE REJECT + aifg_msg_predecode_bm_loadInd loadInd; //LOAD INDICATION + aifg_msg_predecode_bm_suspend suspend; //SUSPEND + aifg_msg_predecode_bm_resume resume; //RESUME + aifg_msg_predecode_bm_changeCircuit changeCC; //CHANGE CIRCUIT + aifg_msg_predecode_bm_changeCircuitAck changeCCAck; //CHANGE CIRCUIT ACK + aifg_msg_predecode_bm_lsaInfo lsaInfo; //LSA INFORMATION + aifg_msg_predecode_bm_locInfoCmd locInfoCmd; //Location Information Command + aifg_msg_predecode_bm_locInfoRep locInfoReport; //Location Information Report + + //DTAP + aifg_msg_predecode_dt_authReq authReq; //Authentication request + aifg_msg_predecode_dt_authResp authResp; //Authentication response + aifg_msg_predecode_dt_cmReEstReq cmReEstReq; //CM Re-establishment request + aifg_msg_predecode_dt_cmRej cmRej; //CM service reject + aifg_msg_predecode_dt_abort abort; //Abort + aifg_msg_predecode_dt_cmReq cmReq; //CM service request + aifg_msg_predecode_dt_idReq idReq; //Identity request + aifg_msg_predecode_dt_idResp idResp; //Identity response + aifg_msg_predecode_dt_imsiDetachInd imsiDetach; //IMSI detach indication + aifg_msg_predecode_dt_luAccept luAccept; //Location updating accept + aifg_msg_predecode_dt_luReject luReject; //Location updating reject + aifg_msg_predecode_dt_LURequest luRequest; //Location updating request + aifg_msg_predecode_dt_mmInfo mmInfo; //MM information + aifg_msg_predecode_dt_mmStatus mmStatus; //MM Status + aifg_msg_predecode_dt_tmsiReallocCmd tmsiReallocCmd; //TMSI reallocation command + aifg_msg_predecode_dt_alert alert; //Alert + aifg_msg_predecode_dt_callConfirm callConfirm; //Call confirmed + aifg_msg_predecode_dt_callProceed callProceed; //Call proceeding + aifg_msg_predecode_dt_congestCtrl congestCtrl; //Congestion control + aifg_msg_predecode_dt_connect connect; //Connect + aifg_msg_predecode_dt_disconnect disconnect; //Disconnect + aifg_msg_predecode_dt_emergSetup eSetup; //Emergency Setup + aifg_msg_predecode_dt_facility facility; //Facility + aifg_msg_predecode_dt_holdRej holdRej; //Hold Reject + aifg_msg_predecode_dt_modify modify; //Modify + aifg_msg_predecode_dt_modifyComp modifyComplete; //Modify complete + aifg_msg_predecode_dt_modifyRej modifyRej; //Modify Reject + aifg_msg_predecode_dt_notify notify; //Notify + aifg_msg_predecode_dt_progress progress; //Progress + aifg_msg_predecode_dt_release release; //Release + aifg_msg_predecode_dt_releaseComp releaseComp; //Release complete + aifg_msg_predecode_dt_retieveRej retrieveRej; //Retrieve Reject + aifg_msg_predecode_dt_setup setup; //Setup + aifg_msg_predecode_dt_startDTMF startDTMF; //Start DTMF + aifg_msg_predecode_dt_startDTMFAck startDTMFAck; //Start DTMF Ack + aifg_msg_predecode_dt_startDTMFRej startDTMFRej; //Start DTMF Rej + aifg_msg_predecode_dt_status status; //Status + aifg_msg_predecode_dt_userInfo userInfo; //User information + aifg_msg_predecode_dt_facilitySS facilitySS; //Facility SS + aifg_msg_predecode_dt_register registerSS; //Register + aifg_msg_predecode_dt_releaseCompSS releaseCompSS; //Release complete SS + aifg_msg_predecode_dt_rpData rpData; //RP DATA + aifg_msg_predecode_dt_rpSMMA rpSMMA; //RP SMMA + aifg_msg_predecode_dt_rpAck rpAck; //RP ACK + aifg_msg_predecode_dt_rpError rpError; //RP ERROR + + //for transparently DTAP message transfer in BSC + struct { + BYTE *ptr; + BYTE len; + }dtap_msg; + }msg; +}aifg_msg_pre_decoded; + +#endif + diff --git a/omc/plat/aif/src/include/aifg_public.h b/omc/plat/aif/src/include/aifg_public.h new file mode 100644 index 0000000..457a07e --- /dev/null +++ b/omc/plat/aif/src/include/aifg_public.h @@ -0,0 +1,43 @@ +/******************************************************************** +Copyright ?2007 LGC Wireless, Inc. All rights reserved +File Name: aifg_public.h +Description: Public definition of AIFG module +Version: v9.0.0 +Author: Roy Jiang +Create Date: 2007-3-6 + +History: +2007-3-6 v9.0.0 Create +*********************************************************************/ +#ifndef _WXC2_AIFG_PUBLIC_H +#define _WXC2_AIFG_PUBLIC_H + +//Common include +#include +#include +#include +#include "../../../public/src/include/public.h" + +typedef enum _aifg_sap_type{ + AIFG_SAP_MSC, + AIFG_SAP_BSC +}aifg_sap_type; + +typedef enum _aifg_ni{ + AIFG_NI_INTERNATIONAL, + AIFG_NI_INTERNATIONAL_SPARE, + AIFG_NI_NATIONAL, + AIFG_NI_NATIONAL_SPARE, +}aifg_ni; + +typedef enum _aifg_run_mode{ + AIFG_RUN_MODE_SINGLE = 0, + AIFG_RUN_MODE_DUAL, +}aifg_run_mode; + +typedef enum _aifg_indication{ + AIFG_IND_RV_MSG, +}aifg_indication; + +#endif + diff --git a/omc/plat/aif/src/include/aifg_type_def.h b/omc/plat/aif/src/include/aifg_type_def.h new file mode 100644 index 0000000..05d1536 --- /dev/null +++ b/omc/plat/aif/src/include/aifg_type_def.h @@ -0,0 +1,445 @@ +/******************************************************************** +Copyright ?2007 LGC Wireless, Inc. All rights reserved +File Name: aifg_type_def.h +Description: Data structure definition of AIFG module +Version: v9.0.0 +Author: Roy Jiang +Create Date: 2007-3-12 + +History: +2007-3-6 v9.0.12 Create +*********************************************************************/ +#ifndef _WXC2_AIFG_TYPE_DEF_H +#define _WXC2_AIFG_TYPE_DEF_H + +#include "aifg_public.h" +#include "aifg_msg.h" +#include "../../../sccp/src/include/scoc_if.h" + +#ifndef NULL +#define NULL 0 +#endif + +#ifndef TRUE +#define TRUE 1 +#endif + +#ifndef FALSE +#define FALSE 0 +#endif + +#define SCCP_SAP_AIFG 3 + +#define AIFG_PROC_FINISH 1 +#define AIFG_PROC_CONTINUE 0 + +#define AIFG_MAX_CG 256 +#define AIFG_MAX_SAP 2 +#define MSG_PROC_EACH_TIME 64 +#define AIFG_MAX_PORT 8192 +#define AIFG_MAX_MSG_LENGTH 256 +#define AIFG_MAX_TI_PER_LINK 16 +#define AIFG_MAX_MESSAGE 128 +#define SCCP_MAX_LINK 8192 + +typedef struct{ + int port; + BYTE *data_ptr; +}aifg_raw_msg; + +enum {AIFG_CG_AVAILABLE, AIFG_CG_UNAVAILABLE}; +typedef struct{ + BYTE enable; + int (*callback_func)(aifg_indication, aifg_msg_pre_decoded *); +}aifg_sap; + +typedef struct{ + BYTE mode; +}aifg_dual_server; + +typedef enum{ + AIFG_CG_STATE_DOWN, + AIFG_CG_STATE_UP, +}aifg_cg_state; + +//port status definition +typedef enum { + AIFG_PORT_IDLE, + AIFG_PORT_INIT, + AIFG_PORT_PAGING, + AIFG_PORT_RESET, + AIFG_PORT_TRANSACTION, + AIFG_PORT_TRANSPARENT, + AIFG_PORT_RELEASE, + AIFG_PORT_FINISH, +}AIFG_PORT_STATE; + +typedef enum{ + AIFG_TRANS_UNKNOW = -1, + AIFG_TRANS_LU = 1, + AIFG_TRANS_CC = AIFG_PD_DTAP_CC, //3 + AIFG_TRANS_SMS = AIFG_PD_DTAP_SMS, //9 + AIFG_TRANS_SS = AIFG_PD_DTAP_SS, //11 +}AIFG_TRANS_TYPE; + +typedef struct aifg_port_t{ + aifg_sap_type sapid; //SAP id + BYTE cgid; //circuit group id + int link_id; //link id + int new_link; //for handover, new link id to which the call will be handover to + int upper_port; //process port of upper layer + AIFG_PORT_STATE stat; //port status + int timer; //process timer + struct aifg_port_t *pNextOpenPort; //pointer to the next port in the opened port list + struct aifg_port_t *pPrevOpenPort; //pointer to the previous port in the opened port list + struct aifg_port_t *pNextPort; //pointer to the next port of the same BSSMAP transaction, such as paging/block + struct aifg_port_t *pPrevPort; //pointer to the previous port of the same BSSMAP transaction, such as paging/block + char ti; //TI value, including the TI flag + AIFG_TRANS_TYPE ti_type; //Transaction type of this port (CC/SS/SMS) + BYTE ti_stat; //Transaction status + BYTE rel_cause; //release cause + BYTE diagnostic[32]; //diagnostic for release + BYTE diag_len; //diagnostic length + BYTE imsi[16]; //associated mobile IMSI + BYTE imsi_len; //associated mobile IMSI length + BYTE ho_stat; //handover status + int app_ho_port; //application handover process port + SP_UiPriPara sd_buffer; //send message buffer, used in case when message re-send is needed + + BYTE app_rel_flag; //flag to indicate whether app is released + BYTE trace_flag; //for debug trace +#ifdef _AIFG_DEBUG_ + unsigned int dead_timer; //for resource leak checking +#endif +}aifg_port; + +//timer definition, second +#define T1S_MULTIPLIER 100 +enum{ + AIFG_TIMER_T2 = 3 * T1S_MULTIPLIER, //Reset guard period at the MSC + AIFG_TIMER_T13 = 3 * T1S_MULTIPLIER, //Reset guard period at the BSS + AIFG_TIMER_T14 = 60 * T1S_MULTIPLIER, //Time to receive RESET ACKNOWLEDGE at the BSS + AIFG_TIMER_T16 = 60 * T1S_MULTIPLIER, //Time to receive RESET ACKNOWLEDGE at the MSC + AIFG_TIMER_T3113 = 15 * T1S_MULTIPLIER, //Time to receive PAGING RESPONSE at MSC + AIFG_TIMER_REPAGE = 8 * T1S_MULTIPLIER, //Time to resend PAGING REQUEST at MSC + + AIFG_TIMER_TRANS_TIMEOUT = 120 * T1S_MULTIPLIER, //120s + AIFG_TIMER_CLEAR_TIMEOUT = 10 * T1S_MULTIPLIER, //10s + AIFG_TIMER_RELEASE_TIMEOUT = 10 * T1S_MULTIPLIER, //10s + AIFG_TIMER_WAIT_RELEASE_CMP = 50 //500ms +}; + +typedef struct{ + BYTE enable; + int dpc; + aifg_ni ni; + BYTE sapid; //SAP which owns this CG + int tgid; //MSC trunk group id +}aifg_circuit_group; + +typedef struct{ + BYTE en_flag; + BYTE cleared; //if the link was cleared, all the ports belongs to it will be released + aifg_sap_type sapid; //SAP which owns this link + + int cur_port; //in MSC:current activated local port + //in BSC:current activated upper port, for no AIFG local port need at BSC side + BYTE ti_number; //number of current activated ti, used at MSC side + BYTE next_ti; //TI value for next network initiate transaction + struct{ + BYTE en_flag; + BYTE tio; + int port; //corresponding port number + }ti[3][AIFG_MAX_TI_PER_LINK]; //0-7 is assigned by network, 8-15 is assigned by mobile, used at MSC side + //totally 3 types of TI according to different SAP: CC, SMS or SS +}aifg_link_info; +enum TI_TYPE{ + TI_FOR_CC, + TI_FOR_SMS, + TI_FOR_SS, +}; + +typedef enum{ + AIFG_SUCCEED = 0, + AIFG_ERROR = -1, + + //Error definition 1 ~ 1023 + AIFG_ERR_OUT_OF_RESOURCE = 1, + AIFG_ERR_UNKNOW_MSG, + AIFG_ERR_UNKNOW_IE, + AIFG_ERR_ERROR_MSG, + AIFG_ERR_ERROR_IE, + AIFG_ERR_UP_NOT_EXIST, + AIFG_ERR_NO_UD_IN_CR, + AIFG_ERR_UNEXPECTED_DT1, + AIFG_ERR_UNEXPECTED_UDT, + AIFG_ERR_UNEXPECTED_CC, + AIFG_ERR_OVERLOAD, + AIFG_ERR_CG_NOT_READY, + AIFG_ERR_UNEXPECTED_PAGING_RESP, + AIFG_ERR_INVALID_TI, + AIFG_ERR_MISS_MANDATORY, + AIFG_ERR_MSG_RV_TO_IDLE_PORT, + AIFG_ERR_MSG_SD_TO_IDLE_PORT, + AIFG_ERR_ASSIGN_PORT_FAIL, + AIFG_ERR_SAP_NOT_CREATED, + AIFG_ERR_PORT_TIMER_OUT, + AIFG_ERR_CAN_NOT_FIND_TI, + AIFG_ERR_PAGING_NOT_RESP, + AIFG_ERR_PORT_RELEASED, + + //event definition 1024 ~ 2048 + AIFG_EVENT_SD_MSG = 1024, //Message sent to sccp + AIFG_EVENT_RV_MSG, //Message received from sccp + AIFG_EVENT_SD_IND, //Indication sent to upper app + AIFG_EVENT_RV_REQ, //Request received from upper app + AIFG_EVENT_REDIR_MSG, //Message redirected + AIFG_EVENT_CG_UP, //Circuit come up + AIFG_EVENT_LINK_RELEASE, //Link release + AIFG_EVENT_PORT_RELEASE, +}aifg_event_code; + +typedef enum{ + //DTAP + //RR + AIFG_MSG_T_PAGING_RESP = 0x27, //Paging response + AIFG_MSG_T_RR_HO_CMD = 0x2B, //RR Handover command + + //MM + AIFG_MSG_T_IMSI_DETACH_IND = 0x01, //IMSI detach indication + AIFG_MSG_T_LU_ACCEPT = 0x02, //Location updating accept + AIFG_MSG_T_LU_REJECT = 0x04, //Location updating reject + AIFG_MSG_T_LU_REQUEST = 0x08, //Location updating request + AIFG_MSG_T_AUTH_REJECT = 0x11, //Authentication reject + AIFG_MSG_T_AUTH_REQUEST = 0x12, //Authentication request + AIFG_MSG_T_AUTH_RESPONSE = 0x14, //Authentication response + AIFG_MSG_T_ID_REQUEST = 0x18, //Identity request + AIFG_MSG_T_ID_RESPONSE = 0x19, //Identity response + AIFG_MSG_T_TMSI_REALLOC_CMD = 0x1A, //TMSI reallocation command + AIFG_MSG_T_TMSI_REALLOC_CMP = 0x1B, //TMSI reallocation complete + AIFG_MSG_T_CM_ACCEPT = 0x21, //CM service accept + AIFG_MSG_T_CM_REJECT = 0x22, //CM service reject + AIFG_MSG_T_CM_ABORT = 0x23, //CM service abort + AIFG_MSG_T_CM_REQUEST = 0x24, //CM service request + AIFG_MSG_T_CM_PROMPT = 0x25, //CM service prompt + AIFG_MSG_T_CM_REEST_REQUEST = 0x28, //CM re-establishment request + AIFG_MSG_T_ABORT = 0x29, //Abort + AIFG_MSG_T_MM_NULL = 0x30, //MM NULL + AIFG_MSG_T_MM_STATUS = 0x31, //MM status + AIFG_MSG_T_MM_INFO = 0x32, //MM information + + //CC + AIFG_MSG_T_ALERTING = 0x01, //Alerting + AIFG_MSG_T_CALL_CONFIRMED = 0x08, //Call confirmed + AIFG_MSG_T_CALL_PROCEEDING = 0x02, //Call proceeding + AIFG_MSG_T_CONNECT = 0x07, //Connect + AIFG_MSG_T_CONNECT_ACK = 0x0F, //Connect ack + AIFG_MSG_T_EMERGENCY_SETUP = 0x0E, //Emergency setup + AIFG_MSG_T_PROGRESS = 0x03, //Progress + AIFG_MSG_T_SETUP = 0x05, //Setup + AIFG_MSG_T_MODIFY = 0x17, //Modify + AIFG_MSG_T_MODIFY_CMP = 0x1F, //Modify complete + AIFG_MSG_T_MODIFY_REJECT = 0x13, //Modify reject + AIFG_MSG_T_USER_INFO = 0x10, //User information + AIFG_MSG_T_HOLD = 0x18, //Hold + AIFG_MSG_T_HOLD_ACK = 0x19, //Hold ack + AIFG_MSG_T_HOLD_REJECT = 0x1A, //Hold reject + AIFG_MSG_T_RETRIEVE = 0x1C, //Retrieve + AIFG_MSG_T_RETRIEVE_ACK = 0x1D, //Retrieve ack + AIFG_MSG_T_RETRIEVE_REJECT = 0x1E, //Retrieve reject + AIFG_MSG_T_DISCONNECT = 0x25, //Disconnect + AIFG_MSG_T_RELEASE = 0x2D, //Release + AIFG_MSG_T_RELEASE_CMP = 0x2A, //Release complete + AIFG_MSG_T_CONGESTION_CTRL = 0x39, //Congestion control + AIFG_MSG_T_NOTIFY = 0x3E, //Notify + AIFG_MSG_T_STATUS = 0x3D, //Status + AIFG_MSG_T_STATUS_ENQ = 0x34, //Status enquiry + AIFG_MSG_T_START_DTMF = 0x35, //Start DTMF + AIFG_MSG_T_STOP_DTMF = 0x31, //Stop DTMF + AIFG_MSG_T_STOP_DTMF_ACK = 0x32, //Stop DTMF ack + AIFG_MSG_T_START_DTMF_ACK = 0x36, //Start DTMF ack + AIFG_MSG_T_START_DTMF_REJECT = 0x37, //Start DTMF reject + AIFG_MSG_T_FACILITY = 0x3A, //Facility + + //SMS + AIFG_MSG_T_CP_DATA = 0x01, //CP-DATA + AIFG_MSG_T_CP_ACK = 0x04, //CP-ACK + AIFG_MSG_T_CP_ERROR = 0x10, //CP-ERRPR + + AIFG_MSG_T_RP_DATA_MS = 0x00, //RP-DATA MS side + AIFG_MSG_T_RP_ACK_MS = 0x02, //RP-ACK MS side + AIFG_MSG_T_RP_ERROR_MS = 0x04, //RP-ERRPR MS side + AIFG_MSG_T_RP_SMMA = 0x06, //RP-SMMA MS side + AIFG_MSG_T_RP_DATA_NW = 0x01, //RP-DATA network side + AIFG_MSG_T_RP_ACK_NW = 0x03, //RP-ACK network side + AIFG_MSG_T_RP_ERROR_NW = 0x05, //RP-ERRPR network side + + //SS + AIFG_MSG_T_FACILITY_SS = 0x3A, //Facility SS + AIFG_MSG_T_REGISTER = 0x3B, //Register + AIFG_MSG_T_RELEASE_CMP_SS = 0x2A, //Release complete SS + + //BSSMAP + AIFG_MSG_T_ASSIGN_REQ = 0x01, //Assign request + AIFG_MSG_T_ASSIGN_CMP = 0x02, //Assign complete + AIFG_MSG_T_ASSIGN_FAIL = 0x03, //Assign failure + AIFG_MSG_T_HO_REQUEST = 0x10, //Handover request + AIFG_MSG_T_HO_REQUIRED = 0x11, //Handover required + AIFG_MSG_T_HO_REQ_ACK = 0x12, //Handover request ack + AIFG_MSG_T_HO_CMD = 0x13, //Handover command + AIFG_MSG_T_HO_CMP = 0x14, //Handover complete + AIFG_MSG_T_HO_SUC = 0x15, //Handover succeeded + AIFG_MSG_T_HO_FAIL = 0x16, //Handover failure + AIFG_MSG_T_HO_PERFORMED = 0x17, //Handover performed + AIFG_MSG_T_HO_CAN_ENQ = 0x18, //Handover candidate enquire + AIFG_MSG_T_HO_CAN_RESP = 0x19, //Handover candidate response + AIFG_MSG_T_HO_REQ_REJ = 0x1A, //Handover required reject + AIFG_MSG_T_HO_DETECT = 0x1B, //Handover detect + AIFG_MSG_T_CLR_CMD = 0x20, //Clear command + AIFG_MSG_T_CLR_CMP = 0x21, //Clear complete + AIFG_MSG_T_CLR_REQ = 0x22, //Clear request + AIFG_MSG_T_SAPI_REJ = 0x25, //SAPI 'n' reject + AIFG_MSG_T_CONFUSION = 0x26, //Confusion + AIFG_MSG_T_SUSPEND = 0x28, //Suspend + AIFG_MSG_T_RESUME = 0x29, //Resume + AIFG_MSG_T_LOC_INFO_CMD = 0x2A, //Location information command + AIFG_MSG_T_LOC_INFO_RPT = 0x2B, //Location information report + AIFG_MSG_T_RESET = 0x30, //Reset + AIFG_MSG_T_RESET_ACK = 0x31, //Reset ack + AIFG_MSG_T_OVERLOAD = 0x32, //Overload + AIFG_MSG_T_RESET_CC = 0x34, //Reset circuit + AIFG_MSG_T_RESET_CC_ACK = 0x35, //Reset circuit ack + AIFG_MSG_T_MSC_INVK_TRACE = 0x36, //MSC invoke trace + AIFG_MSG_T_BSC_INVK_TRACE = 0x37, //BSC invoke trace + AIFG_MSG_T_BLOCK = 0x40, //Block + AIFG_MSG_T_BLOCK_ACK = 0x41, //Blocking ack + AIFG_MSG_T_UNBLOCK = 0x42, //Unblock + AIFG_MSG_T_UNBLOCK_ACK = 0x43, //Unblocking ack + AIFG_MSG_T_CC_GROUP_BLK = 0x44, //Circuit group block + AIFG_MSG_T_CC_GROUP_BLK_ACK = 0x45, //Circuit group block ack + AIFG_MSG_T_CC_GROUP_UNBLK = 0x46, //Circuit group unblock + AIFG_MSG_T_CC_GROUP_UNBLK_ACK = 0x47, //Circuit group unblock ack + AIFG_MSG_T_UNEQUIP_CC = 0x48, //Unequipped circuit + AIFG_MSG_T_CHANGE_CC = 0x4E, //Change circuit + AIFG_MSG_T_CHANGE_CC_ACK = 0x4F, //Change circuit ack + AIFG_MSG_T_RESRC_REQ = 0x50, //Resource request + AIFG_MSG_T_RESRC_IND = 0x51, //Resource indication + AIFG_MSG_T_PAGING = 0x52, //Paging + AIFG_MSG_T_CIPHER_MODE_CMD = 0x53, //Cipher mode command + AIFG_MSG_T_CM_UPDATE = 0x54, //Classmark update + AIFG_MSG_T_CIPHER_MODE_CMP = 0x55, //Cipher mode complete + AIFG_MSG_T_QUEUE_IND = 0x56, //Queuing indication + AIFG_MSG_T_L3_INFO = 0x57, //Complete layer 3 information + AIFG_MSG_T_CLASSMARK_REQ = 0x58, //Classmark request + AIFG_MSG_T_CIPHER_MODE_REJ = 0x59, //Cipher mode reject + AIFG_MSG_T_LOAD_IND = 0x5A, //Load indication +}aifg_msg_type; + +typedef enum _aifg_iei_coding{ + //For BSSMAP + AIFG_IEI_BM_CIC = 0x01, //CIC + AIFG_IEI_BM_RESOURCEAVAIL = 0x03, //Resource available + AIFG_IEI_BM_CAUSE = 0x04, //Cause + AIFG_IEI_BM_CELLID = 0x05, //Cell identifier + AIFG_IEI_BM_PRIORITY = 0x06, //Priority + AIFG_IEI_BM_L3HEADERINFO = 0x07, //Layer 3 header information + AIFG_IEI_BM_IMSI = 0x08, //IMSI + AIFG_IEI_BM_TMSI = 0x09, //TMSI + AIFG_IEI_BM_ENCRYPTINFO = 0x0A, //Encrypt information + AIFG_IEI_BM_CHANNELTYPE = 0x0B, //Channel type + AIFG_IEI_BM_PERIODICITY = 0x0C, //Periodicity + AIFG_IEI_BM_EXTRESOURCEIND = 0x0D, //Extended resource indicator + AIFG_IEI_BM_MSNUM = 0x0E, //Number of MSs + AIFG_IEI_BM_CLASSMARKINFO2 = 0x12, //Classmark information type 2 + AIFG_IEI_BM_CLASSMARKINFO3 = 0x13, //Classmark information type 3 + AIFG_IEI_BM_BANDUSED = 0x14, //Band to be used + AIFG_IEI_BM_RRCAUSE = 0x15, //RR cause + AIFG_IEI_BM_L3INFO = 0x17, //Layer 3 information + AIFG_IEI_BM_DLCI = 0x18, //DLCI + AIFG_IEI_BM_DTXFLAG = 0x19, //DTC flag + AIFG_IEI_BM_CELLIDLIST = 0x1A, //Cell identity list + AIFG_IEI_BM_RESPREQ = 0x1B, //Response request + AIFG_IEI_BM_RESOURCEINDMEHTOD = 0x1C, //Resource indication method + AIFG_IEI_BM_CLASSMARKINFO1 = 0x1D, //Classmark information type 1 + AIFG_IEI_BM_CICLIST = 0x1E, //CIC list + AIFG_IEI_BM_DIGNOSTIC = 0x1F, //Dignostic + AIFG_IEI_BM_L3MSGCONTENT = 0x20, //Layer 3 message content + AIFG_IEI_BM_CHOSENCHANNEL = 0x21, //Chosen channel + AIFG_IEI_BM_TOTALRESOURCE = 0x22, //Total resource accessible + AIFG_IEI_BM_CIPHERRESPMODE = 0x23, //Cipher response mode + AIFG_IEI_BM_CHANNELNEEDED = 0x24, //Channel needed + AIFG_IEI_BM_TRACETYPE = 0x25, //Trace type + AIFG_IEI_BM_TRIGGERID = 0x26, //Trigger ID + AIFG_IEI_BM_TRACEREF = 0x27, //Trace reference + AIFG_IEI_BM_TRANSACTIONID = 0x28, //Transaction ID + AIFG_IEI_BM_MOBILEID = 0x29, //Mobile identity + AIFG_IEI_BM_OMCID = 0x2A, //OMC ID + AIFG_IEI_BM_FORWARDIND = 0x2B, //Forward indication + AIFG_IEI_BM_CHOSENENCRYPT = 0x2C, //Chosen encrypt algorithm + AIFG_IEI_BM_CIRCUITPOOL = 0x2D, //Circuit pool + AIFG_IEI_BM_CIRCUITPOOLLIST = 0x2E, //Circuit pool list + AIFG_IEI_BM_TIMEIND = 0x2F, //Time indicator + AIFG_IEI_BM_RESOURCESITUATION = 0x30, //Resource situation + AIFG_IEI_BM_CURCHANNELTYPE1 = 0x31, //Current channel type 1 + AIFG_IEI_BM_QUEUEIND = 0x32, //Queuing indicator + AIFG_IEI_BM_ASSIGNREQUIREMENT = 0x33, //Assignment requirement + AIFG_IEI_BM_TALKERFLAG = 0x34, //Talker flag + AIFG_IEI_BM_CONNRELREQ = 0x35, //Connection release request + AIFG_IEI_BM_GROUPCALLREF = 0x36, //Group call reference + AIFG_IEI_BM_EMLPP = 0x37, //eMLPP + AIFG_IEI_BM_CFGEVOIND = 0x38, //Configuration evolution indication + AIFG_IEI_BM_BSSOLDTONEW = 0x39, //Old BSS to new BSS + AIFG_IEI_BM_LSAID = 0x3A, //LSA identity + AIFG_IEI_BM_LSAIDLIST = 0x3B, //LSA identity list + AIFG_IEI_BM_LSAINFO = 0x3C, //LSA information + AIFG_IEI_BM_LOCATIONINFO = 0x3D, //Location information + AIFG_IEI_BM_SPEECHVER = 0x40, //Speech version + + //For DTAP + //common + AIFG_IEI_DT_LAI = 0x13, //location area identification + AIFG_IEI_DT_MOBILEID = 0x17, //mobile identity + AIFG_IEI_DT_MSCM3 = 0x20, //mobile station classmark 3 + //MM + AIFG_IEI_DT_FLONPROCEED = 0xa1, //Follow on proceed + AIFG_IEI_DT_CTS = 0xa2, //CTS permission + AIFG_IEI_DT_FULL_NWNAME = 0x43, //Full name for network + AIFG_IEI_DT_SHORT_NWNAME = 0x45, //Short name for network + AIFG_IEI_DT_TIMEZONE = 0x46, //Network time zone + AIFG_IEI_DT_TZTIME = 0x47, //Universal time and time zone + AIFG_IEI_DT_LSAID = 0x48, //LSA Identity + //CC + AIFG_IEI_DT_PRIORITYLEVEL = 0x80, //Priority Level + AIFG_IEI_DT_SHIFT = 0x90, //Locking and non-locking shift procedure + AIFG_IEI_DT_REPEATIND = 0xD0, //Repease indicator + AIFG_IEI_DT_MOREDATA = 0xA0, //More data + AIFG_IEI_DT_CLIRSUP = 0xA1, //CLIR Suppression + AIFG_IEI_DT_CLIRIVO = 0xA2, //CLIR Invocation + AIFG_IEI_DT_REVCALLDIR = 0xA3, //Reverse call setup direction + AIFG_IEI_DT_BEARERCAP = 0x04, //Bearer capability + AIFG_IEI_DT_CAUSE = 0x08, //Cause + AIFG_IEI_DT_CCCAP = 0x15, //Call Control Capabilities + AIFG_IEI_DT_FACILITY = 0x1C, //Facility + AIFG_IEI_DT_PROGIND = 0x1E, //Progress indicator + AIFG_IEI_DT_AUXSTAT = 0x24, //Auxiliary states + AIFG_IEI_DT_CALLEDBCD = 0x5E, //Called party BCD + AIFG_IEI_DT_CALLEDSUBADDR = 0x6D, //Called party subaddress + AIFG_IEI_DT_CALLERBCD = 0x5C, //Calling party BCD + AIFG_IEI_DT_CALLERSUBADDR = 0x5D, //Calling party subaddress + AIFG_IEI_DT_CONNNUM = 0x4C, //Connected number + AIFG_IEI_DT_CONNSUBADDR = 0x4D, //Connected subaddress + AIFG_IEI_DT_HIGHCOM = 0x7D, //Higher layer compatibility + AIFG_IEI_DT_KEYPAD = 0x2C, //Keypad facility + AIFG_IEI_DT_LOWCOM = 0x7C, //Lower layer compatibility + AIFG_IEI_DT_REDIRBCD = 0x74, //Redirecting party BCD + AIFG_IEI_DT_REDIRSUBADDR = 0x75, //Redirecting party subaddress + AIFG_IEI_DT_SIGNAL = 0x34, //Signal + AIFG_IEI_DT_SSVER = 0x7F, //SS version indicator + AIFG_IEI_DT_USERUSER = 0x7E, //User-user + AIFG_IEI_DT_ALERTPATTERN = 0x19, //Alert pattern + //SMS + AIFG_IEI_DT_RP_UD = 0x41, //RP User data + AIFG_IEI_DT_RP_CAUSE = 0x42, //RP Cause +}aifg_iei; + +#endif diff --git a/omc/plat/aif/src/include/aifg_var_ext.h b/omc/plat/aif/src/include/aifg_var_ext.h new file mode 100644 index 0000000..f013386 --- /dev/null +++ b/omc/plat/aif/src/include/aifg_var_ext.h @@ -0,0 +1,68 @@ +/******************************************************************** +Copyright ?2007 LGC Wireless, Inc. All rights reserved +File Name: aifg_var_ext.h +Description: Public variant definition of AIFG module +Version: v9.0.0 +Author: Roy Jiang +Create Date: 2007-3-12 + +History: +2007-3-6 v9.0.12 Create +*********************************************************************/ +#ifndef _WXC2_AIFG_VAR_EXT_H +#define _WXC2_AIFG_VAR_EXT_H +#include +#include "aifg_type_def.h" + +//Variant declaration +extern aifg_circuit_group cg[AIFG_MAX_CG]; +extern aifg_sap sap[AIFG_MAX_SAP]; +extern aifg_dual_server dual_server; +extern aifg_port aifg_pcb[AIFG_MAX_PORT]; +extern aifg_event_code aifg_event; +extern aifg_msg_t sd_msg; +aifg_msg_pre_decoded rv_msg; +extern int cur_port; //current processing port +extern aifg_link_info link_info[SCCP_MAX_LINK]; + +extern int msg_statistics[AIFG_MAX_MESSAGE][2]; + +int aifg_ie_encode(aifg_msg_protocol protocol, int ie_id, ie_u *src, BYTE *dst, int m_o_flag); +int aifg_ie_decode(aifg_ie_ptr *src, aifg_ie *dst); +int aifg_msgtype_to_localid(aifg_pd pd, int msg_type); + +int aifg_send_cr(int sapid, int cgid, aifg_msg_t *msg); +void aifg_send_dt1(int linkid, aifg_msg_t *msg, int ti); +void aifg_send_udt(int cgid, aifg_msg_t *msg, SP_UiPriPara *buf_ptr); + +void aifg_mpp_init(); +int aifg_mpp_proc(); + +void aifg_port_proc(aifg_port *pPort, aifg_msg_t *upper_msg, aifg_msg_pre_decoded *peer_msg); +inline int aifg_port_assign(int sapid, int cgid, int linkid); +inline void aifg_port_release(aifg_port *pPort); +inline int aifg_get_local_port(int u_port); +inline int aifg_get_paging_port(int cgid, BYTE *imsi_ptr, int imsi_len); +inline int aifg_ti2lport(int ti, int link_id, int pd); + +inline int aifg_get_link(int u_port); +inline int aifg_add_link(int linkid, int sapid); +inline int aifg_del_link(int sccp_link_id); +inline void aifg_link_release(int link_id); +inline aifg_link_info *aifg_get_link_info(int link_id); + +inline int aifg_get_cg(int dpc, int ni); + +inline void aifg_add_ti(int link_id, int ti, int ti_type, int port); +inline int aifg_get_ti(int link_id, int port, int ti_type); +inline int aifg_del_ti(int link_id, int ti, int ti_type); + +void aifg_send_rlsd(int linkid); + +void aifg_debug_init(); +void aifg_debug_timer(); +void aifg_debug_print(int port, aifg_event_code event, void *msg, int o_info); + +void aifg_log(char *info); +#endif + diff --git a/omc/plat/aif/ut/.copyarea.db b/omc/plat/aif/ut/.copyarea.db new file mode 100644 index 0000000..1b1791c --- /dev/null +++ b/omc/plat/aif/ut/.copyarea.db @@ -0,0 +1,7 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\aif\ut +2 +3 +8:makefile|1|11d70a3e0a9|2f4|19f1d7f0|b9a968abbfa411dc84f1001c23e19543|0 +b:aifg_test.c|1|11d70a3e07a|3d275|fa91da6e|b7e96873bfa411dc84f1001c23e19543|0 +b:aifg_main.c|1|11d70a3e02c|103|bf8d4d3c|b7496857bfa411dc84f1001c23e19543|0 diff --git a/omc/plat/aif/ut/aifg_main.c b/omc/plat/aif/ut/aifg_main.c new file mode 100644 index 0000000..6096297 --- /dev/null +++ b/omc/plat/aif/ut/aifg_main.c @@ -0,0 +1,23 @@ +/* +*Test program of AIFG module --by Roy Jiang +*/ +#include "../src/include/aifg.h" +#include "../src/include/aifg_if.h" + +void aifg_test(); + +int main() +{ + printf("Test of AIFG\n"); + + aifg_test(); + +#ifdef _WINDOWS_ + system("PAUSE"); +#endif + + return 0; +} + + + diff --git a/omc/plat/aif/ut/aifg_test.c b/omc/plat/aif/ut/aifg_test.c new file mode 100644 index 0000000..fe75159 --- /dev/null +++ b/omc/plat/aif/ut/aifg_test.c @@ -0,0 +1,7083 @@ +/******************************************************************** +Copyright ?2007 LGC Wireless, Inc. All rights reserved +File Name: aifg_m.c +Description: Test case of AIFG module +Version: v9.0.0 +Author: Roy Jiang +Create Date: 2007-3-12 +Remark: CUnit is used for manageing the test cases + +History: +2007-3-12 v9.0.0 Create +*********************************************************************/ +//Header files of CUnit +#ifdef _WINDOWS_ +#include "Basic.h" +#include "Console.h" +#include "Automated.h" +#else +#include "/usr/local/include/CUnit/Basic.h" +#include "/usr/local/include/CUnit/Console.h" +#include "/usr/local/include/CUnit/Automated.h" +#endif + +//Header files of AIFG module +#include "../src/include/aifg.h" +#include "../src/include/aifg_if.h" +#include "../src/include/aifg_var_ext.h" + +/* +All the test cases share the same return value: 0-fail, 1-success +*/ +#define TEST_FAIL 0 +#define TEST_SUCCESS 1 + +//function declearation +int aifg_code_test(); +int aifg_unit_test(); +//Message process functions declearation--------------------------------------------- +int aifg_msg_proc(BYTE *src, aifg_msg_pre_decoded *dst); +int aifg_msg_decode_assignReq(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_assignComplete(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_assignFailure(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_block(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_blockAck(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_HORequest(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_HORequired(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_HORequestAck(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_HOCmd(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_HOComplete(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_HOCandEnq(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_HOCandResp(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_HOFailure(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_resrcReq(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_resrcInd(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_paging(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_clearReq(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_clearCmd(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_HOPerformed(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_overload(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_mscTrace(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_bscTrace(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_cmUpdate(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_cipherModeCmd(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_cipherModeComp(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_completeL3Info(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_sapi_n_rej(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_HORequiredRej(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_resetCircuit(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_ccGroupBlock(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_ccGroupBlockAck(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_confusion(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_loadInd(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_suspend(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_lsaInfo(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_locInfoCmd(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_locInfoReport(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_resetCircuitAck(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +/////////////dtap////////////////////// +int aifg_msg_decode_authReq(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_authResp(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_cmReEstReq(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_cmRej(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_cmReq(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_idReq(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_idResp(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_imsiDetachInd(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_locAccept(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_locReq(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_mmInfo(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_tmsiRealloc(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_alert(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_callConfirm(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_callProceed(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_congestCtrl(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_connect(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_disconnect(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_eSetup(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_facility(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_holdRej(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_modify(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_modifyRej(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_notify(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_progress(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_release(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_releaseComp(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_setup(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_startDTMF(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_status(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_decode_userInfo(BYTE *src, aifg_msg_pre_decoded *dst, BYTE msg_len); +int aifg_msg_sd_assignReq(aifg_msg_t * src, BYTE * dst); + +//Test entrance +void aifg_test() +{ + printf("\nStarting Code Test--------------------------------------------\n"); + aifg_code_test(); + printf("\nCode Test Completed-------------------------------------------\n"); + printf("\nStarting Unit Test--------------------------------------------\n"); + aifg_unit_test(); + printf("\nUnit Test Completed-------------------------------------------\n"); + return; +} + +aifg_msg_t bm_completeL3; +aifg_msg_t dt_cmAccept; +aifg_msg_t bm_clearReq; +aifg_msg_t bm_clearCmd; +aifg_msg_t bm_clearComplete; +aifg_msg_t bm_paging; +aifg_msg_t bm_setup; +aifg_msg_t rr_pagingResp; +aifg_msg_t dt_callCfm; + + +static BYTE src[][64]={//source with out iei +///////// BSSMAP //////////////////////// + {0x01,0x02}, //CIC + {0x00,0x09,0x01,0x03,0x00,0x09,0x01,0x03,0x00,0x09,0x01,0x03,0x00,0x09,0x01,0x03,0x02,0x06,0x00,0x0b}, //resrouce available + {0x01,0x09} , //cause + {0x02,0x89,0x10}, //cause_extent + {0x08,0x00,0x13,0x42,0x05,0x00,0x02,0x00,0x11}, //cellId with discriminator==0x00 + {0x05,0x01,0x00,0x42,0x01,0x03}, //cellId with discriminator==0x01 + {0x03,0x02,0x00,0x22}, //cellId with discriminator==0x02 + {0x01,0x76}, //priority + {0X02,0X08,0X02}, //L3HeaderInfo + {0x04,0xf7,0x03,0x12,0x2a}, //tmsi redefintion,out of use + {0x01,0x01}, //encryptInfo with no encryption + {0x09,0x12,0x08,0x15,0x34,0x67,0xa2,0x8d,0x46,0x8f}, //encryption with A5 + {0X04,0X01,0X09,0X83,0X79}, //channelType with speech indicator + {0x04,0x02,0x0a,0xf5,0x07}, //channelType with data indicator + {0x02}, //extResourceInd + {0x03,0x7e,0x67,0x82}, //cmInfo2 + {0x04,0x05,0x21,0x3f,0x58,0xe1}, //l3Info + {0x08,0x00,0x85,0x47,0x9c,0x67,0x24,0x3d,0x05}, //cidList with discriminator==0x00 + {0x05,0x01,0x23,0x07,0x4f,0x39}, //cidList with discriminator==0x01 + {0x03,0x02,0x77,0x64}, //cidList with discriminator==0x02 + {0x06,0x04,0x4e,0x39,0x58,0x7c,0x0a}, //cidList with discriminator==0x04 + {0x03,0x05,0x21,0xf3}, //cidList with discriminator==0x05 + {0x04,0x32,0x12,0x8d,0x36}, //cicList + {0x04,0x03,0x0a,0x38,0x89}, //diagnostics + {0x56}, //chosenChannel + {0x84,0x62,0xf2,0x7e}, //totalResrc + {0x03,0x9d,0x20,0x81}, //triggerId + {0x02,0x31,0xf2}, //mobileId,type of identity==001(IMSI),odd/even indicator==0(even) + {0x05,0x01,0x02,0x03,0x04,0x05}, //circuitPoolList + {0x05,0x11,0x83,0x04,0x28,0x75}, //resrcSit,band1 with SDCCH,band2 with Full Rate TCH + {0x19}, //curChannelType1 with speech mode and Half rate TCH + {0x05,0x24,0x38,0x56,0x19,0x10}, //groupRef,sf(VGCS),af(required),call_priority(level4),cipher_info(key1) + {0x03,0x10,0x39,0xd2}, //lsaId + {0x07,0x01,0x22,0xe4,0x31,0x57,0x69,0x83}, //lsaIdList with Ep==1 + {0x09,0x00,0x00,0x36,0x85,0xef,0x03,0x47,0x87,0x42}, //lsaInfo + {0x03,0x15,0x49,0xf5}, //locInfo + {0x03,0x39,0xc4,0x08}, //omcId + {0X07, 0xdd,0X01,0X02,0xdd ,0X02,0X06,0X01},//bssOldtoNew,UNCOMPLETED !FIELD ELEMENT{ExtraInfo:prec=0,lcs=1;curChanType2:data14.5kb/s,SDCCH} + {0Xff}, //periodicity + {0Xfe}, //msNum + {0x09}, //bandUsed + {0X08}, //rrCouse + {0XC2}, //dlci,channel is SACCH + {0x01}, //dtx, MSC forbids the BSS to activate DTX in the downlink direction + {0X01}, //resrcIdMethod,method ii is selected + {0X00}, //cipherRespMode,IMEISV must not be included by the Mobile Station + {0X02}, //channelNeeded,TCH/F (Full rate) + {0xdd}, //traceType + {0x34,0x97}, //traceRef + {0x02,0x17,0x62}, //transId + {0x02}, //forwardInd,forward to subsequent BSS, and trace at MSC + {0X03}, //chosenEncrypt,GSM A5/2 + {0X10}, //circuitPool,Circuit pool number 16 + {0X11}, //timeInd,170s + {0X21}, //speechVer,GSM speech full rate version 3 + {0X02}, //queuingInd,it is recommended to allow queuing + {0X01}, //assignReq,Immediate + {0X06}, //eMLPP,call priority level B + {0x03}, //configInd,Modification is allowed and maximum number of TCH/F is 3 + {0X04,0X33,0X79,0X27,0X46}, //tmsi +///////////// DTAP /////////////////////////////////////////// + {0x10,0x34,0x78,0x69,0x20}, //broadcastRef,vbs,ackRequired,priority4,cipher NO.2 + {0x11}, //cmInfo1,Reserved for phase 1,"CECS"implemented in MS,A5/1 available,Class2 + {0x03,0x33,0x22,0x8d}, //cmInfo2 + {0x02,0x73,0xf2}, //mobileId,even flag,IMEISV + {0x78,0xf3,0x64,0x31,0x02}, //LocId + {0x09}, //luType,iei=0,Follow-on request pending,Periodic updating + {0x03,0x91,0x35,0x64}, //nwName,bit8 set to "0" in octet n,no add letters,UCS2 (16 bit) [72] + {0x07,0x04,0x12,0x0a,0x32,0x14,0xdd}, //tzTime + {0x02,0xc0,0x82}, //progInd,National standard,User,Destination address in non-PLMN/ISDN + {0x03,0x01,0x19,0x83}, //uu,OSI high layer protocols + {0x02,0x20,0x02}, //bc with info_trans_cap==0,only octet 3a is extend + {0x0d,0xa3,0xca,0x1a,0x00,0xe4,0x21,0x53,0x5b,0x60,0x21,0x5f,0x47,0xc6}, //bc with info_trans_cap!=0 + {0x04,0x47,0xdd,0x96,0x81}, //cause,National standard,international network,Number changed + {0x01,0x03}, //ccCap + {0x04,0x28,0xa3,0x89,0x37}, //connNum/callingNum/calledNum/redirNum + {0x03,0x88,0x50,0x43}, //connSubAddr/callingSubAddr/calledSubAddr/redirSubAddr + {0x01,0xdd}, //ssVer + {0x03,0xa8,0x6e,0xb4}, //hiComp + {0x02,0xdd,0xde}, //loComp + {0xc2}, //callStat + {0x01,0x86}, //auxStat + {0x03,0x11,0x22,0x33}, //lsaId + {0X02}, //rejectCause + {0X0B}, //cmType + {0X01}, //cipherKey + {0X05}, //priority + {0X03}, //idType + {0X0F}, //congestLevel + {0x80}, //notificationInd + {0x08}, //signal + {0X01,0X07}, //alertPattern + {0X0D}, //keypad + {0XDD}, //timeZone + {0X00,0X11,0X22,0X33,0X44,0X55,0X66,0X77,0X88,0X99,0XAA,0XBB,0XCC,0XDD,0XEE,0XFF}, //authRAND + {0X11,0X12,0X13,0X14}, //authSRES + {0X01}, //rpInd + {0x30,0xa1,0x0c,0x02,0x01,0xdd,0x80,0x01,0xdd,0x02,0x03,0x0a,0x0b,0x0c,0xdd, + 0xa2,0x0d,0x02,0x01,0xdd,0x30,0x04,0x02,0x02,0x0a,0x0b,0x11,0x22,0x33,0x44, + 0xa3,0x09,0x02,0x01,0xdd,0x02,0x03,0x01,0x09,0x0a,0xdd, + 0xa4,0x06,0x02,0x01,0xdd,0x80,0x01,0x00}//facility +}; + +static aifg_ie dst; +static int len; +static aifg_msg_protocol protocol; +static aifg_ie_ptr ie; +static BYTE buffer[256]; +aifg_msg_predecode_l3msg predecode_l3msg; +aifg_msg_bm_l3msg l3Info; + +void test_aifg_ie_bm_cic() +{ + + //preconditon + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CIC; + ie.ptr=src[0]; + + + //test decode + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CIC,dst.iei); + //CU_ASSERT_EQUAL(3,len); + CU_ASSERT_EQUAL(8,dst.param.bm_cic.pcm); + CU_ASSERT_EQUAL(2,dst.param.bm_cic.timeslot); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CIC,&(dst.param),buffer, 0); + //check encode result + CU_ASSERT_EQUAL(AIFG_IEI_BM_CIC,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&(buffer[1]),src[0],2)); + +} +void test_aifg_ie_bm_resrcAvail() +{ + + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_RESOURCEAVAIL; + ie.ptr=src[1]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_RESOURCEAVAIL,dst.iei); + //CU_ASSERT_EQUAL(21,len); + CU_ASSERT_EQUAL(9,dst.param.bm_resrcAvail.full_rate_channel[0]); + CU_ASSERT_EQUAL(259,dst.param.bm_resrcAvail.half_rate_channel[0]); + CU_ASSERT_EQUAL(9,dst.param.bm_resrcAvail.full_rate_channel[1]); + CU_ASSERT_EQUAL(259,dst.param.bm_resrcAvail.half_rate_channel[1]); + CU_ASSERT_EQUAL(9,dst.param.bm_resrcAvail.full_rate_channel[2]); + CU_ASSERT_EQUAL(259,dst.param.bm_resrcAvail.half_rate_channel[2]); + CU_ASSERT_EQUAL(9,dst.param.bm_resrcAvail.full_rate_channel[3]); + CU_ASSERT_EQUAL(259,dst.param.bm_resrcAvail.half_rate_channel[3]); + CU_ASSERT_EQUAL(518,dst.param.bm_resrcAvail.full_rate_channel[4]); + CU_ASSERT_EQUAL(11,dst.param.bm_resrcAvail.half_rate_channel[4]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_RESOURCEAVAIL,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_RESOURCEAVAIL,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[1],20)); +} +void test_aifg_ie_bm_cause(){ + + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CAUSE; + ie.ptr=src[2]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CAUSE,dst.iei); + //CU_ASSERT_EQUAL(3,len); + CU_ASSERT_EQUAL(9,dst.param.bm_cause.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CAUSE,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CAUSE,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[2],2)); + + } + +void test_aifg_ie_bm_cause_ext() +{ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CAUSE; + ie.ptr=src[3]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CAUSE,dst.iei); + //CU_ASSERT_EQUAL(4,len); + CU_ASSERT_EQUAL(9,dst.param.bm_cause.value); + CU_ASSERT_EQUAL(1,dst.param.bm_cause.ext_value.flag); + CU_ASSERT_EQUAL(16,dst.param.bm_cause.ext_value.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CAUSE,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CAUSE,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[3],3)); + +} + +void test_aifg_ie_bm_cellId_00() +{ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CELLID; + ie.ptr=src[4]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(0,dst.param.bm_cellId.discriminator); + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CELLID,dst.iei); + //CU_ASSERT_EQUAL(10,len); + CU_ASSERT_EQUAL(3,dst.param.bm_cellId.mcc[0]); + CU_ASSERT_EQUAL(1,dst.param.bm_cellId.mcc[1]); + CU_ASSERT_EQUAL(2,dst.param.bm_cellId.mcc[2]); + CU_ASSERT_EQUAL(4,dst.param.bm_cellId.mnc[2]); + CU_ASSERT_EQUAL(0,dst.param.bm_cellId.mnc[1]); + CU_ASSERT_EQUAL(5,dst.param.bm_cellId.mnc[0]); + CU_ASSERT_EQUAL(2,dst.param.bm_cellId.LAC); + CU_ASSERT_EQUAL(17,dst.param.bm_cellId.CI); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CELLID,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CELLID,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[4],9)); +} + +void test_aifg_ie_bm_cellId_01() +{ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CELLID; + ie.ptr=src[5]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(1,dst.param.bm_cellId.discriminator); + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CELLID,dst.iei); + //CU_ASSERT_EQUAL(7,len); + CU_ASSERT_EQUAL(66,dst.param.bm_cellId.LAC); + CU_ASSERT_EQUAL(259,dst.param.bm_cellId.CI); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CELLID,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CELLID,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[5],6)); +} + +void test_aifg_ie_bm_cellId_02(){ + + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CELLID; + ie.ptr=src[6]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(2,dst.param.bm_cellId.discriminator); + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CELLID,dst.iei); + //CU_ASSERT_EQUAL(5,len); + CU_ASSERT_EQUAL(34,dst.param.bm_cellId.CI); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CELLID,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CELLID,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[6],4)); + } +void test_aifg_ie_bm_priority(){ + + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_PRIORITY; + ie.ptr=src[7]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_PRIORITY,dst.iei); + //CU_ASSERT_EQUAL(3,len); + CU_ASSERT_EQUAL(1,dst.param.bm_priority.pci); + CU_ASSERT_EQUAL(13,dst.param.bm_priority.level); + CU_ASSERT_EQUAL(1,dst.param.bm_priority.qa); + CU_ASSERT_EQUAL(0,dst.param.bm_priority.pvi); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_PRIORITY,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_PRIORITY,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[7],2)); + } +void test_aifg_ie_bm_L3HeaderInfo(){ + + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_L3HEADERINFO; + ie.ptr=src[8]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_L3HEADERINFO,dst.iei); + //CU_ASSERT_EQUAL(4,len); + CU_ASSERT_EQUAL(8,dst.param.bm_L3HeaderInfo.pd); + CU_ASSERT_EQUAL(2,dst.param.bm_L3HeaderInfo.ti); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_L3HEADERINFO,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_L3HEADERINFO,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[8],3)); + } +/*void test_aifg_ie_bm_tmsi(){ + + //precondition + protocol=AIFG_MSG_BSSMAP; + iei=AIFG_IE_ID_BM_TMSI; + + //test + len=aifg_ie_decode(protocol,iei,src[9],&dst,hi_lo_flag); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_TMSI,dst.iei); + CU_ASSERT_EQUAL(6,len); + CU_ASSERT_EQUAL(0xf7,dst.param.bm_tmsi[0]); + CU_ASSERT_EQUAL(0x03,dst.param.bm_tmsi[1]); + CU_ASSERT_EQUAL(0x12,dst.param.bm_tmsi[2]); + CU_ASSERT_EQUAL(0x2a,dst.param.bm_tmsi[3]); + }*///redefinition +void test_aifg_ie_bm_encryptInfo_NOencryption(){ + + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_ENCRYPTINFO; + ie.ptr=src[10]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_ENCRYPTINFO,dst.iei); +//CU_ASSERT_EQUAL(3,len); + CU_ASSERT_EQUAL(0x01,dst.param.bm_encryptInfo.algorithm); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_ENCRYPTINFO,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_ENCRYPTINFO,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[10],2)); + + } +void test_aifg_ie_bm_encryptInfo_A5(){ + + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_ENCRYPTINFO; + ie.ptr=src[11]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_ENCRYPTINFO,dst.iei); + //CU_ASSERT_EQUAL(11,len); + CU_ASSERT_EQUAL(0x12,dst.param.bm_encryptInfo.algorithm); + CU_ASSERT_EQUAL(0x08,dst.param.bm_encryptInfo.key[0]); + CU_ASSERT_EQUAL(0x15,dst.param.bm_encryptInfo.key[1]); + CU_ASSERT_EQUAL(0x34,dst.param.bm_encryptInfo.key[2]); + CU_ASSERT_EQUAL(0x67,dst.param.bm_encryptInfo.key[3]); + CU_ASSERT_EQUAL(0xa2,dst.param.bm_encryptInfo.key[4]); + CU_ASSERT_EQUAL(0x8d,dst.param.bm_encryptInfo.key[5]); + CU_ASSERT_EQUAL(0x46,dst.param.bm_encryptInfo.key[6]); + CU_ASSERT_EQUAL(0x8f,dst.param.bm_encryptInfo.key[7]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_ENCRYPTINFO,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_ENCRYPTINFO,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[11],10)); + } + +void test_aifg_ie_bm_channelType_speech() +{ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CHANNELTYPE; + ie.ptr=src[12]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CHANNELTYPE,dst.iei); + //CU_ASSERT_EQUAL(6,len); + CU_ASSERT_EQUAL(0x01,dst.param.bm_channelType.speech_data_ind); + CU_ASSERT_EQUAL(0x09,dst.param.bm_channelType.channel_rate_type); + CU_ASSERT_EQUAL(0x03,dst.param.bm_channelType.ext.speech.ver[0]); + CU_ASSERT_EQUAL(0x79,dst.param.bm_channelType.ext.speech.ver[1]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CHANNELTYPE,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CHANNELTYPE,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[12],5)); +} + +void test_aifg_ie_bm_channelType_data() +{ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CHANNELTYPE; + ie.ptr=src[13]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CHANNELTYPE,dst.iei); + //CU_ASSERT_EQUAL(6,len); + CU_ASSERT_EQUAL(0x02,dst.param.bm_channelType.speech_data_ind); + CU_ASSERT_EQUAL(0x0a,dst.param.bm_channelType.channel_rate_type); + CU_ASSERT_EQUAL(0x01,dst.param.bm_channelType.ext.data_cfg.t_nt); + CU_ASSERT_EQUAL(0x35,dst.param.bm_channelType.ext.data_cfg.rate); + CU_ASSERT_EQUAL(0x07,dst.param.bm_channelType.ext.data_cfg.allowed_data_rate.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CHANNELTYPE,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CHANNELTYPE,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[13],5)); +} +void test_aifg_ie_bm_extResourceInd() +{ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_EXTRESOURCEIND; + ie.ptr=src[14]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_EXTRESOURCEIND,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(0x01,dst.param.bm_extResrcInd.sm); + CU_ASSERT_EQUAL(0x00,dst.param.bm_extResrcInd.tarr); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_EXTRESOURCEIND,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_EXTRESOURCEIND,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[14],1)); +} +void test_aifg_ie_bm_cmInfo2() +{ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CLASSMARKINFO2; + ie.ptr=src[15]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CLASSMARKINFO2,dst.iei); + //CU_ASSERT_EQUAL(5,len); + CU_ASSERT_EQUAL(0x03,dst.param.bm_cmInfo2.rev_level); + CU_ASSERT_EQUAL(0x01,dst.param.bm_cmInfo2.es_ind); + CU_ASSERT_EQUAL(0x01,dst.param.bm_cmInfo2.a5_1); + CU_ASSERT_EQUAL(0x06,dst.param.bm_cmInfo2.rf_power_cap); + CU_ASSERT_EQUAL(0x01,dst.param.bm_cmInfo2.ps_cap); + CU_ASSERT_EQUAL(0x02,dst.param.bm_cmInfo2.ss_screen_ind); + CU_ASSERT_EQUAL(0x00,dst.param.bm_cmInfo2.sm_cap); + CU_ASSERT_EQUAL(0x01,dst.param.bm_cmInfo2.vbs); + CU_ASSERT_EQUAL(0x01,dst.param.bm_cmInfo2.vgcs); + CU_ASSERT_EQUAL(0x01,dst.param.bm_cmInfo2.fc); + CU_ASSERT_EQUAL(0x01,dst.param.bm_cmInfo2.cm3); + CU_ASSERT_EQUAL(0x00,dst.param.bm_cmInfo2.lcsva_cap); + CU_ASSERT_EQUAL(0x00,dst.param.bm_cmInfo2.so_lsa); + CU_ASSERT_EQUAL(0x00,dst.param.bm_cmInfo2.cmsp); + CU_ASSERT_EQUAL(0x01,dst.param.bm_cmInfo2.a5_3); + CU_ASSERT_EQUAL(0x00,dst.param.bm_cmInfo2.a5_2); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CLASSMARKINFO2,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CLASSMARKINFO2,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[15],4)); +} + +/*void test_aifg_ie_bm_l3Info(){ //to resolve + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_L3INFO; + ie.ptr=src[16]; + //test + len=aifg_ie_decode(protocol,&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_L3INFO,dst.iei); + //CU_ASSERT_EQUAL(6,len); + CU_ASSERT_EQUAL(AIFG_MSG_T_CM_ACCEPT,dst.param.bm_l3Info.l3_msg->type); + }*/ + +void test_aifg_ie_bm_cidList_00() //discriminator==0x00 +{ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CELLIDLIST; + ie.ptr=src[17]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CELLIDLIST,dst.iei); + //CU_ASSERT_EQUAL(10,len); + CU_ASSERT_EQUAL(0,dst.param.bm_cellIdList.discriminator); + CU_ASSERT_EQUAL(5,dst.param.bm_cellIdList.cell_id[0].mcc[0]); + CU_ASSERT_EQUAL(8,dst.param.bm_cellIdList.cell_id[0].mcc[1]); + CU_ASSERT_EQUAL(7,dst.param.bm_cellIdList.cell_id[0].mcc[2]); + CU_ASSERT_EQUAL(12,dst.param.bm_cellIdList.cell_id[0].mnc[0]); + CU_ASSERT_EQUAL(9,dst.param.bm_cellIdList.cell_id[0].mnc[1]); + CU_ASSERT_EQUAL(4,dst.param.bm_cellIdList.cell_id[0].mnc[2]); + CU_ASSERT_EQUAL(0x6724,dst.param.bm_cellIdList.cell_id[0].LAC); + CU_ASSERT_EQUAL(0x3d05,dst.param.bm_cellIdList.cell_id[0].CI); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CELLIDLIST,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CELLIDLIST,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[17],9)); +} + +void test_aifg_ie_bm_cidList_01()//discriminator==0x01 +{ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CELLIDLIST; + ie.ptr=src[18]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CELLIDLIST,dst.iei); + //CU_ASSERT_EQUAL(7,len); + CU_ASSERT_EQUAL(1,dst.param.bm_cellIdList.discriminator); + CU_ASSERT_EQUAL(0x2307,dst.param.bm_cellIdList.cell_id[0].LAC); + CU_ASSERT_EQUAL(0x4f39,dst.param.bm_cellIdList.cell_id[0].CI); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CELLIDLIST,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CELLIDLIST,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[18],6)); +} + +void test_aifg_ie_bm_cidList_02()//discriminator==0x02 +{ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CELLIDLIST; + ie.ptr=src[19]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CELLIDLIST,dst.iei); + //CU_ASSERT_EQUAL(5,len); + CU_ASSERT_EQUAL(2,dst.param.bm_cellIdList.discriminator); + CU_ASSERT_EQUAL(0x7764,dst.param.bm_cellIdList.cell_id[0].CI); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CELLIDLIST,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CELLIDLIST,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[19],4)); +} + +void test_aifg_ie_bm_cidList_04() //discriminator==0x04 +{ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CELLIDLIST; + ie.ptr=src[20]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CELLIDLIST,dst.iei); + //CU_ASSERT_EQUAL(8,len); + CU_ASSERT_EQUAL(4,dst.param.bm_cellIdList.discriminator); + CU_ASSERT_EQUAL(14,dst.param.bm_cellIdList.cell_id[0].mcc[0]); + CU_ASSERT_EQUAL(4,dst.param.bm_cellIdList.cell_id[0].mcc[1]); + CU_ASSERT_EQUAL(9,dst.param.bm_cellIdList.cell_id[0].mcc[2]); + CU_ASSERT_EQUAL(3,dst.param.bm_cellIdList.cell_id[0].mnc[2]); + CU_ASSERT_EQUAL(5,dst.param.bm_cellIdList.cell_id[0].mnc[1]); + CU_ASSERT_EQUAL(8,dst.param.bm_cellIdList.cell_id[0].mnc[0]); + CU_ASSERT_EQUAL(0x7c0a,dst.param.bm_cellIdList.cell_id[0].LAC); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CELLIDLIST,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CELLIDLIST,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[20],7)); +} + +void test_aifg_ie_bm_cidList_05() //discriminator==0x05 +{ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CELLIDLIST; + ie.ptr=src[21]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CELLIDLIST,dst.iei); + //CU_ASSERT_EQUAL(5,len); + CU_ASSERT_EQUAL(5,dst.param.bm_cellIdList.discriminator); + CU_ASSERT_EQUAL(0x21f3,dst.param.bm_cellIdList.cell_id[0].LAC); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CELLIDLIST,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CELLIDLIST,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[21],4)); +} + +void test_aifg_ie_bm_cicList() +{ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CICLIST; + ie.ptr=src[22]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CICLIST,dst.iei); + //CU_ASSERT_EQUAL(6,len); + CU_ASSERT_EQUAL(0x32,dst.param.bm_cicList.range); + CU_ASSERT_EQUAL(3,dst.param.bm_cicList.status.len); + CU_ASSERT_EQUAL(0x12,dst.param.bm_cicList.status.content[0]); + CU_ASSERT_EQUAL(0x8d,dst.param.bm_cicList.status.content[1]); + CU_ASSERT_EQUAL(0x36,dst.param.bm_cicList.status.content[2]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CICLIST,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CICLIST,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[22],5)); +} + +void test_aifg_ie_bm_diagnostics(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_DIGNOSTIC; + ie.ptr=src[23]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_DIGNOSTIC,dst.iei); + //CU_ASSERT_EQUAL(6,len); + CU_ASSERT_EQUAL(0x03,dst.param.bm_diagnostics.err_pointer); + CU_ASSERT_EQUAL(0x0a,dst.param.bm_diagnostics.bit_pointer); + CU_ASSERT_EQUAL(2,dst.param.bm_diagnostics.err_msg.len); + CU_ASSERT_EQUAL(0x38,dst.param.bm_diagnostics.err_msg.msg[0]); + CU_ASSERT_EQUAL(0x89,dst.param.bm_diagnostics.err_msg.msg[1]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_DIGNOSTIC,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_DIGNOSTIC,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[23],5)); + } +void test_aifg_ie_bm_chosenChannel() +{ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CHOSENCHANNEL; + ie.ptr=src[24]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CHOSENCHANNEL,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(0x05,dst.param.bm_chosenChannel.mode); + CU_ASSERT_EQUAL(0x06,dst.param.bm_chosenChannel.channel); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CHOSENCHANNEL,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CHOSENCHANNEL,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[24],1)); +} + +void test_aifg_ie_bm_totalResrc() +{ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_TOTALRESOURCE; + ie.ptr=src[25]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_TOTALRESOURCE,dst.iei); + //CU_ASSERT_EQUAL(5,len); + CU_ASSERT_EQUAL(0x8462,dst.param.bm_totalResrc.full_rate_channel); + CU_ASSERT_EQUAL(0xf27e,dst.param.bm_totalResrc.half_rate_channel); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_TOTALRESOURCE,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_TOTALRESOURCE,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[25],4)); +} + +void test_aifg_ie_bm_triggerId() +{ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_TRIGGERID; + ie.ptr=src[26]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_TRIGGERID,dst.iei); + //CU_ASSERT_EQUAL(5,len); + CU_ASSERT_EQUAL(3,dst.param.bm_triggerId.len); + CU_ASSERT_EQUAL(0x9d,dst.param.bm_triggerId.content[0]); + CU_ASSERT_EQUAL(0x20,dst.param.bm_triggerId.content[1]); + CU_ASSERT_EQUAL(0x81,dst.param.bm_triggerId.content[2]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_TRIGGERID,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_TRIGGERID,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[26],4)); +} + +void test_aifg_ie_bm_mobileId(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_MOBILEID; + ie.ptr=src[27]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_MOBILEID,dst.iei); + //CU_ASSERT_EQUAL(4,len); + CU_ASSERT_EQUAL(1,dst.param.mobileId.type); + CU_ASSERT_EQUAL(0,dst.param.mobileId.odd_even_flag); + CU_ASSERT_EQUAL(2,dst.param.mobileId.id_len); + CU_ASSERT_EQUAL(0x03,dst.param.mobileId.id[0]); + CU_ASSERT_EQUAL(0x02,dst.param.mobileId.id[1]); + CU_ASSERT_EQUAL(0x0f,dst.param.mobileId.id[2]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_MOBILEID,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_MOBILEID,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[27],3)); + } +void test_aifg_ie_bm_circuitPoolList(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CIRCUITPOOLLIST; + ie.ptr=src[28]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CIRCUITPOOLLIST,dst.iei); + //CU_ASSERT_EQUAL(7,len); + CU_ASSERT_EQUAL(5,dst.param.bm_circuitPoolList.num); + CU_ASSERT_EQUAL(0x01,dst.param.bm_circuitPoolList.circuit[0]); + CU_ASSERT_EQUAL(0x02,dst.param.bm_circuitPoolList.circuit[1]); + CU_ASSERT_EQUAL(0x03,dst.param.bm_circuitPoolList.circuit[2]); + CU_ASSERT_EQUAL(0x04,dst.param.bm_circuitPoolList.circuit[3]); + CU_ASSERT_EQUAL(0x05,dst.param.bm_circuitPoolList.circuit[4]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CIRCUITPOOLLIST,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CIRCUITPOOLLIST,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[28],6)); + + } +void test_aifg_ie_bm_resrcSit(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_RESOURCESITUATION; + ie.ptr=src[29]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_RESOURCESITUATION,dst.iei); + //CU_ASSERT_EQUAL(7,len); + CU_ASSERT_EQUAL(1,dst.param.bm_resrcSit.band[0].band_ind); + CU_ASSERT_EQUAL(1,dst.param.bm_resrcSit.band[0].channel_type); + CU_ASSERT_EQUAL(0x0304,dst.param.bm_resrcSit.band[0].channel_num); + CU_ASSERT_EQUAL(2,dst.param.bm_resrcSit.band[1].band_ind); + CU_ASSERT_EQUAL(8,dst.param.bm_resrcSit.band[1].channel_type); + CU_ASSERT_EQUAL(0x75,dst.param.bm_resrcSit.band[1].channel_num); + CU_ASSERT_EQUAL(2,dst.param.bm_resrcSit.band_num); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_RESOURCESITUATION,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_RESOURCESITUATION,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[29],6)); + } +void test_aifg_ie_bm_curChannelType1(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CURCHANNELTYPE1; + ie.ptr=src[30]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CURCHANNELTYPE1,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(1,dst.param.bm_curChannelType1.channel_mode); + CU_ASSERT_EQUAL(9,dst.param.bm_curChannelType1.channel); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CURCHANNELTYPE1,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CURCHANNELTYPE1,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[30],1)); + } +void test_aifg_ie_bm_groupRef(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_GROUPCALLREF; + ie.ptr=src[31]; + //test + len=aifg_ie_decode(&ie,&dst); + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_GROUPCALLREF,dst.iei); + //CU_ASSERT_EQUAL(7,len); + CU_ASSERT_EQUAL(0x121c2b0,dst.param.bm_groupRef.binary_code); + CU_ASSERT_EQUAL(1,dst.param.bm_groupRef.sf); + CU_ASSERT_EQUAL(1,dst.param.bm_groupRef.af); + CU_ASSERT_EQUAL(1,dst.param.bm_groupRef.call_priority); + CU_ASSERT_EQUAL(1,dst.param.bm_groupRef.cipher_info); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_GROUPCALLREF,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_GROUPCALLREF,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[31],6)); + } +void test_aifg_ie_bm_lsaId(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_LSAID; + ie.ptr=src[32]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_LSAID,dst.iei); + //CU_ASSERT_EQUAL(5,len); + CU_ASSERT_EQUAL(0x10,dst.param.bm_lsaId.value[0]); + CU_ASSERT_EQUAL(0x39,dst.param.bm_lsaId.value[1]); + CU_ASSERT_EQUAL(0xd2,dst.param.bm_lsaId.value[2]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_LSAID,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_LSAID,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[32],4)); + } +void test_aifg_ie_bm_lsaIdList(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_LSAIDLIST; + ie.ptr=src[33]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_LSAIDLIST,dst.iei); + //CU_ASSERT_EQUAL(9,len); + CU_ASSERT_EQUAL(0x01,dst.param.bm_lsaIdList.ep); + CU_ASSERT_EQUAL(0x22,dst.param.bm_lsaIdList.list[0].id[0]); + CU_ASSERT_EQUAL(0xe4,dst.param.bm_lsaIdList.list[0].id[1]); + CU_ASSERT_EQUAL(0x31,dst.param.bm_lsaIdList.list[0].id[2]); + CU_ASSERT_EQUAL(0x57,dst.param.bm_lsaIdList.list[1].id[0]); + CU_ASSERT_EQUAL(0x69,dst.param.bm_lsaIdList.list[1].id[1]); + CU_ASSERT_EQUAL(0x83,dst.param.bm_lsaIdList.list[1].id[2]); + CU_ASSERT_EQUAL(2,dst.param.bm_lsaIdList.lsa_num); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_LSAIDLIST,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_LSAIDLIST,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[33],8)); + } +void test_aifg_ie_bm_lsaInfo(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_LSAINFO; + ie.ptr=src[34]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_LSAINFO,dst.iei); + //CU_ASSERT_EQUAL(11,len); + CU_ASSERT_EQUAL(0,dst.param.bm_lsaInfo.lsa_only); + CU_ASSERT_EQUAL(2,dst.param.bm_lsaInfo.lsa_num); + CU_ASSERT_EQUAL(0x00,dst.param.bm_lsaInfo.info[0].priority); + CU_ASSERT_EQUAL(0x36,dst.param.bm_lsaInfo.info[0].id[0]); + CU_ASSERT_EQUAL(0x85,dst.param.bm_lsaInfo.info[0].id[1]); + CU_ASSERT_EQUAL(0xef,dst.param.bm_lsaInfo.info[0].id[2]); + CU_ASSERT_EQUAL(0x03,dst.param.bm_lsaInfo.info[1].priority); + CU_ASSERT_EQUAL(0x47,dst.param.bm_lsaInfo.info[1].id[0]); + CU_ASSERT_EQUAL(0x87,dst.param.bm_lsaInfo.info[1].id[1]); + CU_ASSERT_EQUAL(0x42,dst.param.bm_lsaInfo.info[1].id[2]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_LSAINFO,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_LSAINFO,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[34],10)); + } +void test_aifg_ie_bm_locInfo(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_LOCATIONINFO; + ie.ptr=src[35]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_LOCATIONINFO,dst.iei); + //CU_ASSERT_EQUAL(5,len); + CU_ASSERT_EQUAL(3,dst.param.bm_locInfo.len); + CU_ASSERT_EQUAL(0x15,dst.param.bm_locInfo.info[0]); + CU_ASSERT_EQUAL(0x49,dst.param.bm_locInfo.info[1]); + CU_ASSERT_EQUAL(0xf5,dst.param.bm_locInfo.info[2]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_LOCATIONINFO,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_LOCATIONINFO,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[35],4)); + } +void test_aifg_ie_bm_omcId(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_OMCID; + ie.ptr=src[36]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_OMCID,dst.iei); + //CU_ASSERT_EQUAL(5,len); + CU_ASSERT_EQUAL(3,dst.param.bm_omcId.len); + CU_ASSERT_EQUAL(0x39,dst.param.bm_omcId.id[0]); + CU_ASSERT_EQUAL(0xc4,dst.param.bm_omcId.id[1]); + CU_ASSERT_EQUAL(0x08,dst.param.bm_omcId.id[2]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_OMCID,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_OMCID,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[36],4)); + } +void test_aifg_ie_bm_bssOldtoNew(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_BSSOLDTONEW; + ie.ptr=src[37]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_BSSOLDTONEW,dst.iei); + //CU_ASSERT_EQUAL(9,len); + CU_ASSERT_EQUAL(7,dst.param.bm_bssOldtoNew.len); + CU_ASSERT_EQUAL(0xdd,dst.param.bm_bssOldtoNew.content[0]); + CU_ASSERT_EQUAL(0x01,dst.param.bm_bssOldtoNew.content[1]); + CU_ASSERT_EQUAL(0x02,dst.param.bm_bssOldtoNew.content[2]); + CU_ASSERT_EQUAL(0xdd,dst.param.bm_bssOldtoNew.content[3]); + CU_ASSERT_EQUAL(0x02,dst.param.bm_bssOldtoNew.content[4]); + CU_ASSERT_EQUAL(0x06,dst.param.bm_bssOldtoNew.content[5]); + CU_ASSERT_EQUAL(0x01,dst.param.bm_bssOldtoNew.content[6]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_BSSOLDTONEW,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_BSSOLDTONEW,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[37],8)); + } +void test_aifg_ie_bm_periodicity(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_PERIODICITY; + ie.ptr=src[38]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_PERIODICITY,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(255,dst.param.bm_periodicity.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_PERIODICITY,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_PERIODICITY,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[38],1)); + } +void test_aifg_ie_bm_msNum(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_MSNUM; + ie.ptr=src[39]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_MSNUM,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(254,dst.param.bm_msNum.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_MSNUM,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_MSNUM,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[39],1)); + } +void test_aifg_ie_bm_bandUsed(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_BANDUSED; + ie.ptr=src[40]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_BANDUSED,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(0x09,dst.param.bm_bandUsed.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_BANDUSED,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_BANDUSED,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[40],1)); + } +void test_aifg_ie_bm_rrCause(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_RRCAUSE; + ie.ptr=src[41]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_RRCAUSE,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(0x08,dst.param.bm_rrCause.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_RRCAUSE,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_RRCAUSE,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[41],1)); + } +void test_aifg_ie_bm_dlci(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_DLCI; + ie.ptr=src[42]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_DLCI,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(0xC2,dst.param.bm_dlci.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_DLCI,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_DLCI,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[42],1)); + } +void test_aifg_ie_bm_dtx(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_DTXFLAG; + ie.ptr=src[43]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_DTXFLAG,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(0x01,dst.param.bm_dtx.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_DTXFLAG,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_DTXFLAG,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[43],1)); + } +void test_aifg_ie_bm_resrcIndMethod(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_RESOURCEINDMEHTOD; + ie.ptr=src[44]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_RESOURCEINDMEHTOD,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(0x01,dst.param.bm_resrcIndMethod.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_RESOURCEINDMEHTOD,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_RESOURCEINDMEHTOD,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[44],1)); + } +void test_aifg_ie_bm_cipherRespMode(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CIPHERRESPMODE; + ie.ptr=src[45]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CIPHERRESPMODE,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(0x00,dst.param.bm_cipherRespMode.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CIPHERRESPMODE,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CIPHERRESPMODE,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[45],1)); + } +void test_aifg_ie_bm_channelNeeded(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CHANNELNEEDED; + ie.ptr=src[46]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CHANNELNEEDED,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(0x02,dst.param.bm_channelNeeded.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CHANNELNEEDED,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CHANNELNEEDED,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[46],1)); + } +void test_aifg_ie_bm_traceType(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_TRACETYPE; + ie.ptr=src[47]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_TRACETYPE,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(0xdd,dst.param.bm_traceType.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_TRACETYPE,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_TRACETYPE,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[47],1)); + } +void test_aifg_ie_bm_traceRef(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_TRACEREF; + ie.ptr=src[48]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_TRACEREF,dst.iei); + //CU_ASSERT_EQUAL(3,len); + CU_ASSERT_EQUAL(0x3497,dst.param.bm_traceRef.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_TRACEREF,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_TRACEREF,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[48],1)); + } +void test_aifg_ie_bm_transId(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_TRANSACTIONID; + ie.ptr=src[49]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_TRANSACTIONID,dst.iei); + //CU_ASSERT_EQUAL(4,len); + CU_ASSERT_EQUAL(0x1762,dst.param.bm_transId.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_TRANSACTIONID,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_TRANSACTIONID,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[49],3)); + } +void test_aifg_ie_bm_fowardInd(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_FORWARDIND; + ie.ptr=src[50]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_FORWARDIND,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(0x02,dst.param.bm_fowardInd.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_FORWARDIND,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_FORWARDIND,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[50],1)); + } +void test_aifg_ie_bm_chosenEncrypt(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CHOSENENCRYPT; + ie.ptr=src[51]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CHOSENENCRYPT,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(0x03,dst.param.bm_chosenEncrypt.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CHOSENENCRYPT,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CHOSENENCRYPT,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[51],1)); + } +void test_aifg_ie_bm_circuitPool(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CIRCUITPOOL; + ie.ptr=src[52]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CIRCUITPOOL,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(0x10,dst.param.bm_circuitPool.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CIRCUITPOOL,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CIRCUITPOOL,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[52],1)); + } +void test_aifg_ie_bm_timeInd(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_TIMEIND; + ie.ptr=src[53]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_TIMEIND,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(0x11,dst.param.bm_timeId.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_TIMEIND,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_TIMEIND,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[53],1)); + } +void test_aifg_ie_bm_speechVer(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_SPEECHVER; + ie.ptr=src[54]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_SPEECHVER,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(0x21,dst.param.bm_speechVer.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_SPEECHVER,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_SPEECHVER,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[54],1)); + } +void test_aifg_ie_bm_queuingInd(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_QUEUEIND; + ie.ptr=src[55]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_QUEUEIND,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(1,dst.param.bm_queuingInd.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_QUEUEIND,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_QUEUEIND,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[55],1)); + } +void test_aifg_ie_bm_assignReq(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_ASSIGNREQUIREMENT; + ie.ptr=src[56]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_ASSIGNREQUIREMENT,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(1,dst.param.bm_assignReq.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_ASSIGNREQUIREMENT,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_ASSIGNREQUIREMENT,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[56],1)); + } +void test_aifg_ie_bm_eMLPP(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_EMLPP; + ie.ptr=src[57]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_EMLPP,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(6,dst.param.bm_eMLPP.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_EMLPP,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_EMLPP,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[57],1)); + } +void test_aifg_ie_bm_configInd(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_CFGEVOIND; + ie.ptr=src[58]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_CFGEVOIND,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(3,dst.param.bm_cfgEvoInd.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_CFGEVOIND,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_CFGEVOIND,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[58],1)); + } +void test_aifg_ie_bm_tmsi(){ + //precondition + protocol=AIFG_MSG_BSSMAP; + ie.iei=AIFG_IE_ID_BM_TMSI; + ie.ptr=src[59]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_BM_TMSI,dst.iei); + //CU_ASSERT_EQUAL(6,len); + CU_ASSERT_EQUAL(0x33,dst.param.bm_tmsi.value[0]); + CU_ASSERT_EQUAL(0x79,dst.param.bm_tmsi.value[1]); + CU_ASSERT_EQUAL(0x27,dst.param.bm_tmsi.value[2]); + CU_ASSERT_EQUAL(0x46,dst.param.bm_tmsi.value[3]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_BM_TMSI,&(dst.param),buffer, 0); + CU_ASSERT_EQUAL(AIFG_IEI_BM_TMSI,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[59],5)); + } + +///////////////////////// DTAP //////////////////////////////// + +void test_aifg_ie_dt_broadcastRef(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_GROUPREF; + ie.ptr=src[60]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_GROUPREF,dst.iei); + //CU_ASSERT_EQUAL(6,len); + CU_ASSERT_EQUAL(0x81a3c3,dst.param.dt_broadcastRef.binary_code); + CU_ASSERT_EQUAL(0,dst.param.dt_broadcastRef.sf); + CU_ASSERT_EQUAL(1,dst.param.dt_broadcastRef.af); + CU_ASSERT_EQUAL(1,dst.param.dt_broadcastRef.call_priority); + CU_ASSERT_EQUAL(2,dst.param.dt_broadcastRef.cipher_info); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_GROUPREF,&(dst.param),buffer, 0); + // CU_ASSERT_EQUAL(AIFG_IEI_DT_GROUPREF,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[0],src[60],5)); + } +void test_aifg_ie_dt_cmInfo1(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_MSCM1; + ie.ptr=src[61]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_MSCM1,dst.iei); + //CU_ASSERT_EQUAL(6,len); + CU_ASSERT_EQUAL(0,dst.param.dt_cmInfo1.rev_level); + CU_ASSERT_EQUAL(1,dst.param.dt_cmInfo1.es_ind); + CU_ASSERT_EQUAL(0,dst.param.dt_cmInfo1.a5_1); + CU_ASSERT_EQUAL(1,dst.param.dt_cmInfo1.rf_power_cap); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_MSCM1,&(dst.param),buffer, 0); + // CU_ASSERT_EQUAL(AIFG_IEI_DT_MSCM1,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[0],src[61],1)); + + } +void test_aifg_ie_dt_cmInfo2(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_MSCM2; + ie.ptr=src[62]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_MSCM2,dst.iei); + //CU_ASSERT_EQUAL(5,len); + CU_ASSERT_EQUAL(0x01,dst.param.bm_cmInfo2.rev_level); + CU_ASSERT_EQUAL(0x01,dst.param.bm_cmInfo2.es_ind); + CU_ASSERT_EQUAL(0x00,dst.param.bm_cmInfo2.a5_1); + CU_ASSERT_EQUAL(0x03,dst.param.bm_cmInfo2.rf_power_cap); + CU_ASSERT_EQUAL(0x00,dst.param.bm_cmInfo2.ps_cap); + CU_ASSERT_EQUAL(0x02,dst.param.bm_cmInfo2.ss_screen_ind); + CU_ASSERT_EQUAL(0x00,dst.param.bm_cmInfo2.sm_cap); + CU_ASSERT_EQUAL(0x00,dst.param.bm_cmInfo2.vbs); + CU_ASSERT_EQUAL(0x01,dst.param.bm_cmInfo2.vgcs); + CU_ASSERT_EQUAL(0x00,dst.param.bm_cmInfo2.fc); + CU_ASSERT_EQUAL(0x01,dst.param.bm_cmInfo2.cm3); + CU_ASSERT_EQUAL(0x00,dst.param.bm_cmInfo2.lcsva_cap); + CU_ASSERT_EQUAL(0x01,dst.param.bm_cmInfo2.so_lsa); + CU_ASSERT_EQUAL(0x01,dst.param.bm_cmInfo2.cmsp); + CU_ASSERT_EQUAL(0x00,dst.param.bm_cmInfo2.a5_3); + CU_ASSERT_EQUAL(0x01,dst.param.bm_cmInfo2.a5_2); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_MSCM2,&(dst.param),buffer, 0); +// CU_ASSERT_EQUAL(AIFG_IEI_DT_MSCM2,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[0],src[62],4)); + } +void test_aifg_ie_dt_mobileId() +{ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_MOBILEID; + ie.ptr=src[63]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_MOBILEID,dst.iei); + //CU_ASSERT_EQUAL(4,len); + CU_ASSERT_EQUAL(0x03,dst.param.mobileId.type); + CU_ASSERT_EQUAL(0,dst.param.mobileId.odd_even_flag); + CU_ASSERT_EQUAL(0x02,dst.param.mobileId.id_len); + CU_ASSERT_EQUAL(0x07,dst.param.mobileId.id[0]); + CU_ASSERT_EQUAL(0x02,dst.param.mobileId.id[1]); + CU_ASSERT_EQUAL(0x0f,dst.param.mobileId.id[2]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_MOBILEID,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_MOBILEID,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[63],3)); +} + +void test_aifg_ie_dt_lai() +{ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_LAI; + ie.ptr=src[64]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_LAI,dst.iei); + //CU_ASSERT_EQUAL(6,len); + CU_ASSERT_EQUAL(0x08,dst.param.dt_lai.mcc[0]); + CU_ASSERT_EQUAL(0x07,dst.param.dt_lai.mcc[1]); + CU_ASSERT_EQUAL(0x03,dst.param.dt_lai.mcc[2]); + CU_ASSERT_EQUAL(0x0f,dst.param.dt_lai.mnc[2]); + CU_ASSERT_EQUAL(0x06,dst.param.dt_lai.mnc[1]); + CU_ASSERT_EQUAL(0x04,dst.param.dt_lai.mnc[0]); + CU_ASSERT_EQUAL(0x3102,dst.param.dt_lai.LAC); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_LAI,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_LAI,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[64],5)); +} + +void test_aifg_ie_dt_luType(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_LUTYPE; + ie.ptr=src[65]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_LUTYPE,dst.iei); + //CU_ASSERT_EQUAL(1,len); + CU_ASSERT_EQUAL(1,dst.param.dt_luType.fo_req); + CU_ASSERT_EQUAL(1,dst.param.dt_luType.lut); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_LUTYPE,&(dst.param),buffer, 0); +// CU_ASSERT_EQUAL(AIFG_IEI_DT_LUTYPE,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[0],src[65],1)); + } +void test_aifg_ie_dt_nwName(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_FULL_NWNAME; + ie.ptr=src[66]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_FULL_NWNAME,dst.iei); + //CU_ASSERT_EQUAL(5,len); + CU_ASSERT_EQUAL(1,dst.param.dt_nwName.code_scheme); + CU_ASSERT_EQUAL(0,dst.param.dt_nwName.add_ci); + CU_ASSERT_EQUAL(1,dst.param.dt_nwName.spare_num); + CU_ASSERT_EQUAL(2,dst.param.dt_nwName.text_len); + CU_ASSERT_EQUAL(0x35,dst.param.dt_nwName.text[0]); + CU_ASSERT_EQUAL(0x64,dst.param.dt_nwName.text[1]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_FULL_NWNAME,&(dst.param),buffer, 2); +// CU_ASSERT_EQUAL(AIFG_IEI_DT_NWNAME,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[66],4)); + } +void test_aifg_ie_dt_tzTime(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_TZTIME; + ie.ptr=src[67]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_TZTIME,dst.iei); + //CU_ASSERT_EQUAL(8,len); + CU_ASSERT_EQUAL(0x07,dst.param.dt_tzTime.year); + CU_ASSERT_EQUAL(0x04,dst.param.dt_tzTime.month); + CU_ASSERT_EQUAL(0x12,dst.param.dt_tzTime.day); + CU_ASSERT_EQUAL(0x0a,dst.param.dt_tzTime.hour); + CU_ASSERT_EQUAL(0x32,dst.param.dt_tzTime.minute); + CU_ASSERT_EQUAL(0x14,dst.param.dt_tzTime.second); + CU_ASSERT_EQUAL(0xdd,dst.param.dt_tzTime.time_zone); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_TZTIME,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_TZTIME,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[67],7)); + } +void test_aifg_ie_dt_progInd(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_PROGIND; + ie.ptr=src[68]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_PROGIND,dst.iei); + //CU_ASSERT_EQUAL(4,len); + CU_ASSERT_EQUAL(0x02,dst.param.dt_progInd.coding_standard); + CU_ASSERT_EQUAL(0x00,dst.param.dt_progInd.location); + CU_ASSERT_EQUAL(0x02,dst.param.dt_progInd.desc); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_PROGIND,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_PROGIND,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[68],3)); + } +void test_aifg_ie_dt_uu(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_USERUSER; + ie.ptr=src[69]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_USERUSER,dst.iei); + //CU_ASSERT_EQUAL(5,len); + CU_ASSERT_EQUAL(0x01,dst.param.dt_uu.pd); + CU_ASSERT_EQUAL(2,dst.param.dt_uu.info_len); + CU_ASSERT_EQUAL(0x19,dst.param.dt_uu.info[0]); + CU_ASSERT_EQUAL(0x83,dst.param.dt_uu.info[1]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_USERUSER,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_USERUSER,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[69],4)); + } +void test_aifg_ie_dt_bc_0(){//info_trans_cap==0,only octet 3a is extend + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_BEARERCAP; + ie.ptr=src[70]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_BEARERCAP,dst.iei); + //CU_ASSERT_EQUAL(4,len); + CU_ASSERT_EQUAL(1,dst.param.dt_bc.channel_require); + CU_ASSERT_EQUAL(0,dst.param.dt_bc.coding_std); + CU_ASSERT_EQUAL(0,dst.param.dt_bc.trans_mode); + CU_ASSERT_EQUAL(0,dst.param.dt_bc.info_trans_cap); + CU_ASSERT_EQUAL(0,dst.param.dt_bc.coding.value); + CU_ASSERT_EQUAL(1,dst.param.dt_bc.coding.flag); + CU_ASSERT_EQUAL(2,dst.param.dt_bc.speech_ver.value); + CU_ASSERT_EQUAL(1,dst.param.dt_bc.speech_ver.flag); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_BEARERCAP,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_BEARERCAP,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[70],3)); +} + +void test_aifg_ie_dt_bc(){ + //precondition + memset(&dst,0,sizeof(dst)); + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_BEARERCAP; + ie.ptr=src[71]; + //test + + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_BEARERCAP,dst.iei); + //CU_ASSERT_EQUAL(15,len); + CU_ASSERT_EQUAL(1,dst.param.dt_bc.channel_require); + CU_ASSERT_EQUAL(0,dst.param.dt_bc.coding_std); + CU_ASSERT_EQUAL(0,dst.param.dt_bc.trans_mode); + CU_ASSERT_EQUAL(3,dst.param.dt_bc.info_trans_cap); + CU_ASSERT_EQUAL(1,dst.param.dt_bc.compress.flag);//test flag + CU_ASSERT_EQUAL(1,dst.param.dt_bc.compress.value); + CU_ASSERT_EQUAL(0,dst.param.dt_bc.structure.value); + CU_ASSERT_EQUAL(1,dst.param.dt_bc.dupl_mode.value); + CU_ASSERT_EQUAL(0,dst.param.dt_bc.confiure.value); + CU_ASSERT_EQUAL(1,dst.param.dt_bc.nirr.value); + CU_ASSERT_EQUAL(0,dst.param.dt_bc.establishment.value); + CU_ASSERT_EQUAL(0,dst.param.dt_bc.access_id.value); + CU_ASSERT_EQUAL(3,dst.param.dt_bc.rate_adaption.value); + CU_ASSERT_EQUAL(2,dst.param.dt_bc.signal_protocol.value); + CU_ASSERT_EQUAL(0,dst.param.dt_bc.o_itc.value); + CU_ASSERT_EQUAL(0,dst.param.dt_bc.o_rate_adaption.value); + CU_ASSERT_EQUAL(1,dst.param.dt_bc.hdr_nohdr.value); + CU_ASSERT_EQUAL(1,dst.param.dt_bc.multi_frame.value); + CU_ASSERT_EQUAL(0,dst.param.dt_bc.mode.value); + CU_ASSERT_EQUAL(0,dst.param.dt_bc.lli.value); + CU_ASSERT_EQUAL(1,dst.param.dt_bc.assign_or_e.value); + CU_ASSERT_EQUAL(0,dst.param.dt_bc.inb_neg.value); + CU_ASSERT_EQUAL(1,dst.param.dt_bc.layer1_id.value); + CU_ASSERT_EQUAL(0,dst.param.dt_bc.user_info1_protocol.value); + CU_ASSERT_EQUAL(1,dst.param.dt_bc.sync_async.value); + CU_ASSERT_EQUAL(1,dst.param.dt_bc.num_stop_bits.value); + CU_ASSERT_EQUAL(0,dst.param.dt_bc.negotiation.value); + CU_ASSERT_EQUAL(1,dst.param.dt_bc.num_data_bits.value); + CU_ASSERT_EQUAL(3,dst.param.dt_bc.user_rate.value); + CU_ASSERT_EQUAL(2,dst.param.dt_bc.intermed_rate.value); + CU_ASSERT_EQUAL(1,dst.param.dt_bc.nic_on_tx.value); + CU_ASSERT_EQUAL(1,dst.param.dt_bc.nic_on_rx.value); + CU_ASSERT_EQUAL(3,dst.param.dt_bc.parity.value); + CU_ASSERT_EQUAL(3,dst.param.dt_bc.connection_element.value); + CU_ASSERT_EQUAL(0,dst.param.dt_bc.modem_type.value); + CU_ASSERT_EQUAL(1,dst.param.dt_bc.o_modem_type.value); + CU_ASSERT_EQUAL(1,dst.param.dt_bc.fixed_nw_user_rate.value); + CU_ASSERT_EQUAL(11,dst.param.dt_bc.acceptable_chennel_code.value); + CU_ASSERT_EQUAL(7,dst.param.dt_bc.max_traffic_channel.value); + CU_ASSERT_EQUAL(4,dst.param.dt_bc.uimi.value); + CU_ASSERT_EQUAL(7,dst.param.dt_bc.wanted_air_if_user_rate.value); + CU_ASSERT_EQUAL(2,dst.param.dt_bc.layer2_id.value); + CU_ASSERT_EQUAL(6,dst.param.dt_bc.user_info2_protocol.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_BEARERCAP,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_BEARERCAP,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[71],14)); + int n=1; + while(n<15){ + printf("%x ",buffer[n]); + n++; + } +} + +void test_aifg_ie_dt_cause(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_CAUSE; + ie.ptr=src[72]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_CAUSE,dst.iei); + //CU_ASSERT_EQUAL(6,len); + CU_ASSERT_EQUAL(2,dst.param.dt_cause.coding_std); + CU_ASSERT_EQUAL(7,dst.param.dt_cause.location); + CU_ASSERT_EQUAL(1,dst.param.dt_cause.recommendation.flag); + CU_ASSERT_EQUAL(0xdd,dst.param.dt_cause.recommendation.value); + CU_ASSERT_EQUAL(0x16,dst.param.dt_cause.cause_value); + CU_ASSERT_EQUAL(1,dst.param.dt_cause.diag_len); + CU_ASSERT_EQUAL(0x81,dst.param.dt_cause.diagnostic[0]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_CAUSE,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_CAUSE,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[72],5)); + } +void test_aifg_ie_dt_ccCap(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_CCCAP; + ie.ptr=src[73]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_CCCAP,dst.iei); + //CU_ASSERT_EQUAL(3,len); + CU_ASSERT_EQUAL(1,dst.param.dt_ccCap.pcp); + CU_ASSERT_EQUAL(1,dst.param.dt_ccCap.dtmf); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_CCCAP,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_CCCAP,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[73],2)); + } +void test_aifg_ie_dt_connNum(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_CONNNUM; + ie.ptr=src[74]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_CONNNUM,dst.iei); + //CU_ASSERT_EQUAL(6,len); + CU_ASSERT_EQUAL(2,dst.param.dt_connNum.type); + CU_ASSERT_EQUAL(1,dst.param.dt_connNum.presentation_ind.flag); + CU_ASSERT_EQUAL(1,dst.param.dt_connNum.presentation_ind.value); + CU_ASSERT_EQUAL(1,dst.param.dt_connNum.screen_ind.flag); + CU_ASSERT_EQUAL(3,dst.param.dt_connNum.screen_ind.value); + CU_ASSERT_EQUAL(8,dst.param.dt_connNum.num_plan); + CU_ASSERT_EQUAL(4,dst.param.dt_connNum.num_len); + CU_ASSERT_EQUAL(9,dst.param.dt_connNum.number[0]); + CU_ASSERT_EQUAL(8,dst.param.dt_connNum.number[1]); + CU_ASSERT_EQUAL(7,dst.param.dt_connNum.number[2]); + CU_ASSERT_EQUAL(3,dst.param.dt_connNum.number[3]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_CONNNUM,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_CONNNUM,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[74],5)); + } +void test_aifg_ie_dt_connSubAddr(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_CONNSUBADDR; + ie.ptr=src[75]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_CONNSUBADDR,dst.iei); + //CU_ASSERT_EQUAL(5,len); + CU_ASSERT_EQUAL(0,dst.param.dt_connSubAddr.type); + CU_ASSERT_EQUAL(1,dst.param.dt_connSubAddr.odd_even_ind); + CU_ASSERT_EQUAL(2,dst.param.dt_connSubAddr.info_len); + CU_ASSERT_EQUAL(0x50,dst.param.dt_connSubAddr.info[0]); + CU_ASSERT_EQUAL(0x43,dst.param.dt_connSubAddr.info[1]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_CONNSUBADDR,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_CONNSUBADDR,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[75],4)); +} +void test_aifg_ie_dt_ssVer(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_SSVER; + ie.ptr=src[76]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_SSVER,dst.iei); + //CU_ASSERT_EQUAL(3,len); + CU_ASSERT_EQUAL(1,dst.param.dt_ssVer.info_len); + CU_ASSERT_EQUAL(0xdd,dst.param.dt_ssVer.info[0]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_SSVER,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_SSVER,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[76],2)); +} +void test_aifg_ie_dt_hiComp(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_HIGHCOM; + ie.ptr=src[77]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_HIGHCOM,dst.iei); + //CU_ASSERT_EQUAL(5,len); + CU_ASSERT_EQUAL(1,dst.param.dt_hiComp.coding_std.value); + CU_ASSERT_EQUAL(1,dst.param.dt_hiComp.coding_std.flag); + CU_ASSERT_EQUAL(2,dst.param.dt_hiComp.interpret.value); + CU_ASSERT_EQUAL(1,dst.param.dt_hiComp.interpret.flag); + CU_ASSERT_EQUAL(0,dst.param.dt_hiComp.presentat_method.value); + CU_ASSERT_EQUAL(1,dst.param.dt_hiComp.presentat_method.flag); + CU_ASSERT_EQUAL(0x6e,dst.param.dt_hiComp.high_layer_id.value); + CU_ASSERT_EQUAL(1,dst.param.dt_hiComp.high_layer_id.flag); + CU_ASSERT_EQUAL(0x34,dst.param.dt_hiComp.ext_high_layer_id.value); + CU_ASSERT_EQUAL(1,dst.param.dt_hiComp.ext_high_layer_id.flag); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_HIGHCOM,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_HIGHCOM,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[77],4)); +} +void test_aifg_ie_dt_loComp(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_LOWCOM; + ie.ptr=src[78]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_LOWCOM,dst.iei); + //CU_ASSERT_EQUAL(4,len); + CU_ASSERT_EQUAL(2,dst.param.dt_loComp.data_len); + CU_ASSERT_EQUAL(0xdd,dst.param.dt_loComp.data[0]); + CU_ASSERT_EQUAL(0xde,dst.param.dt_loComp.data[1]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_LOWCOM,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_LOWCOM,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[78],3)); +} +void test_aifg_ie_dt_callStat(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_CALLSTAT; + ie.ptr=src[79]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_CALLSTAT,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(3,dst.param.dt_callStat.coding_std); + CU_ASSERT_EQUAL(2,dst.param.dt_callStat.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_CALLSTAT,&(dst.param),buffer, 0); +// CU_ASSERT_EQUAL(AIFG_IEI_DT_CALLSTAT,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[0],src[79],1)); + } +void test_aifg_ie_dt_auxStat(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_AUXSTAT; + ie.ptr=src[80]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_AUXSTAT,dst.iei); + //CU_ASSERT_EQUAL(3,len); + CU_ASSERT_EQUAL(1,dst.param.dt_auxStat.hold_stat); + CU_ASSERT_EQUAL(2,dst.param.dt_auxStat.mpty_stat); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_AUXSTAT,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_AUXSTAT,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[80],2)); + } +void test_aifg_ie_dt_lsaId(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_LSAID; + ie.ptr=src[81]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_LSAID,dst.iei); + //CU_ASSERT_EQUAL(5,len); + CU_ASSERT_EQUAL(0x11,dst.param.dt_lsaId.value[0]); + CU_ASSERT_EQUAL(0x22,dst.param.dt_lsaId.value[1]); + CU_ASSERT_EQUAL(0x33,dst.param.dt_lsaId.value[2]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_LSAID,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_LSAID,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[81],4)); + } +void test_aifg_ie_dt_rejectCause(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_REJCAUSE; + ie.ptr=src[82]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_REJCAUSE,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(0x02,dst.param.dt_rejectCause.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_REJCAUSE,&(dst.param),buffer, 0); +// CU_ASSERT_EQUAL(AIFG_IEI_DT_REJCAUSE,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[0],src[82],1)); + } +void test_aifg_ie_dt_cmType(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_CMTYPE; + ie.ptr=src[83]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_CMTYPE,dst.iei); + //CU_ASSERT_EQUAL(1,len); + CU_ASSERT_EQUAL(0x0B,dst.param.dt_cmType.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_CMTYPE,&(dst.param),buffer, 0); +// CU_ASSERT_EQUAL(AIFG_IEI_DT_CMTYPE,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[0],src[83],1)); + } +void test_aifg_ie_dt_cipherKey(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_CIPHERKEY; + ie.ptr=src[84]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_CIPHERKEY,dst.iei); + //CU_ASSERT_EQUAL(1,len); + CU_ASSERT_EQUAL(0x01,dst.param.dt_cipherKey.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_CIPHERKEY,&(dst.param),buffer, 0); +// CU_ASSERT_EQUAL(AIFG_IEI_DT_CIPHERKEY,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[0],src[84],1)); + } +void test_aifg_ie_dt_priority() +{ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_PRIORITYLEVEL; + ie.ptr=src[85]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_PRIORITYLEVEL,dst.iei); + //CU_ASSERT_EQUAL(1,len); + CU_ASSERT_EQUAL(0x05,dst.param.dt_priority.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_PRIORITYLEVEL,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_PRIORITYLEVEL,buffer[0]&0xF0); + CU_ASSERT_EQUAL(src[85][0],buffer[0]&0x0F); +} + +void test_aifg_ie_dt_idType() +{ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_IDTYPE; + ie.ptr=src[86]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_IDTYPE,dst.iei); + //CU_ASSERT_EQUAL(1,len); + CU_ASSERT_EQUAL(0x03,dst.param.dt_idType.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_IDTYPE,&(dst.param),buffer, 0); +// CU_ASSERT_EQUAL(AIFG_IEI_DT_IDTYPE,buffer[0]); + CU_ASSERT_EQUAL(src[86][0],buffer[0]&0x0F); +} + +void test_aifg_ie_dt_congestLevel() +{ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_CONGESTLEVEL; + ie.ptr=src[87]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_CONGESTLEVEL,dst.iei); + //CU_ASSERT_EQUAL(1,len); + CU_ASSERT_EQUAL(0x0F,dst.param.dt_congestLevel.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_CONGESTLEVEL,&(dst.param),buffer, 0); +// CU_ASSERT_EQUAL(AIFG_IEI_DT_CONGESTLEVEL,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[0],src[87],1)); +} + +void test_aifg_ie_dt_notificationInd() +{ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_NOTIIND; + ie.ptr=src[88]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_NOTIIND,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(0x00,dst.param.dt_notificationInd.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_NOTIIND,&(dst.param),buffer, 0); +// CU_ASSERT_EQUAL(AIFG_IEI_DT_NOTIIND,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[0],src[88],1));} +void test_aifg_ie_dt_signal(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_SIGNAL; + ie.ptr=src[89]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_SIGNAL,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(0x08,dst.param.dt_signal.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_SIGNAL,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_SIGNAL,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[89],1)); +} + +void test_aifg_ie_dt_alertPattern(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_ALERTPATTERN; + ie.ptr=src[90]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_ALERTPATTERN,dst.iei); + //CU_ASSERT_EQUAL(3,len); + CU_ASSERT_EQUAL(0x07,dst.param.dt_alertPattern.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_ALERTPATTERN,&(dst.param),buffer, 0); +// CU_ASSERT_EQUAL(AIFG_IEI_DT_ALERTPATTERN,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[0],src[90],2)); + } +void test_aifg_ie_dt_keypad(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_KEYPAD; + ie.ptr=src[91]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_KEYPAD,dst.iei); + //CU_ASSERT_EQUAL(2,len); + CU_ASSERT_EQUAL(0x0D,dst.param.dt_keypad.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_KEYPAD,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_KEYPAD,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[91],1)); + } +void test_aifg_ie_dt_timeZone(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_TIMEZONE; + ie.ptr=src[92]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_TIMEZONE,dst.iei); + //CU_ASSERT_EQUAL(2,len); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_TIMEZONE,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_TIMEZONE,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[92],1)); + } +void test_aifg_ie_dt_authRAND(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_AUTHRAND; + ie.ptr=src[93]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_AUTHRAND,dst.iei); + //CU_ASSERT_EQUAL(17,len); + CU_ASSERT_EQUAL(0x00,dst.param.dt_authRAND.value[0]); + CU_ASSERT_EQUAL(0x11,dst.param.dt_authRAND.value[1]); + CU_ASSERT_EQUAL(0x22,dst.param.dt_authRAND.value[2]); + CU_ASSERT_EQUAL(0x33,dst.param.dt_authRAND.value[3]); + CU_ASSERT_EQUAL(0x44,dst.param.dt_authRAND.value[4]); + CU_ASSERT_EQUAL(0x55,dst.param.dt_authRAND.value[5]); + CU_ASSERT_EQUAL(0x66,dst.param.dt_authRAND.value[6]); + CU_ASSERT_EQUAL(0x77,dst.param.dt_authRAND.value[7]); + CU_ASSERT_EQUAL(0x88,dst.param.dt_authRAND.value[8]); + CU_ASSERT_EQUAL(0x99,dst.param.dt_authRAND.value[9]); + CU_ASSERT_EQUAL(0xAA,dst.param.dt_authRAND.value[10]); + CU_ASSERT_EQUAL(0xBB,dst.param.dt_authRAND.value[11]); + CU_ASSERT_EQUAL(0xCC,dst.param.dt_authRAND.value[12]); + CU_ASSERT_EQUAL(0xDD,dst.param.dt_authRAND.value[13]); + CU_ASSERT_EQUAL(0xEE,dst.param.dt_authRAND.value[14]); + CU_ASSERT_EQUAL(0xFF,dst.param.dt_authRAND.value[15]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_AUTHRAND,&(dst.param),buffer, 0); +// CU_ASSERT_EQUAL(AIFG_IEI_DT_AUTHRAND,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[0],src[93],16)); + + } + +void test_aifg_ie_dt_authSRES(){ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_AUTHSRES; + ie.ptr=src[94]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_AUTHSRES,dst.iei); + //CU_ASSERT_EQUAL(5,len); + CU_ASSERT_EQUAL(0x11,dst.param.dt_authSRES.value[0]); + CU_ASSERT_EQUAL(0x12,dst.param.dt_authSRES.value[1]); + CU_ASSERT_EQUAL(0x13,dst.param.dt_authSRES.value[2]); + CU_ASSERT_EQUAL(0x14,dst.param.dt_authSRES.value[3]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_AUTHSRES,&(dst.param),buffer, 0); +// CU_ASSERT_EQUAL(AIFG_IEI_DT_AUTHSRES,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[0],src[94],4)); +} + +void test_aifg_ie_dt_rpInd() +{ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_REPEATIND; + ie.ptr=src[95]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_REPEATIND,dst.iei); + //CU_ASSERT_EQUAL(1,len); + CU_ASSERT_EQUAL(0x01,dst.param.dt_rpInd.value); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_REPEATIND,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_REPEATIND,buffer[0]&0xF0); + CU_ASSERT_EQUAL(src[95][0],buffer[0]&0x0F); +} + +void test_aifg_ie_dt_facility() +{ + //precondition + protocol=AIFG_MSG_DTAP; + ie.iei=AIFG_IE_ID_DT_FACILITY; + ie.ptr=src[96]; + //test + len=aifg_ie_decode(&ie,&dst); + + //check result + CU_ASSERT_EQUAL(AIFG_IE_ID_DT_FACILITY,dst.iei); + //CU_ASSERT_EQUAL(1,len); + CU_ASSERT_EQUAL(0xa1,dst.param.dt_facility.components.invoke.tag); + CU_ASSERT_EQUAL(0x0c,dst.param.dt_facility.components.invoke.len); + CU_ASSERT_EQUAL(0x02,dst.param.dt_facility.components.invoke.invoke_id.tag); + CU_ASSERT_EQUAL(0x01,dst.param.dt_facility.components.invoke.invoke_id.len); + CU_ASSERT_EQUAL(0xdd,dst.param.dt_facility.components.invoke.invoke_id.id); + CU_ASSERT_EQUAL(0x80,dst.param.dt_facility.components.invoke.linked_id.tag); + CU_ASSERT_EQUAL(0x01,dst.param.dt_facility.components.invoke.linked_id.len); + CU_ASSERT_EQUAL(0xdd,dst.param.dt_facility.components.invoke.linked_id.id); + CU_ASSERT_EQUAL(1,dst.param.dt_facility.components.invoke.linked_id.flag); + CU_ASSERT_EQUAL(0x02,dst.param.dt_facility.components.invoke.opCode.tag); + CU_ASSERT_EQUAL(0x03,dst.param.dt_facility.components.invoke.opCode.len); + CU_ASSERT_EQUAL(0x0a,dst.param.dt_facility.components.invoke.opCode.op[0]); + CU_ASSERT_EQUAL(0x0b,dst.param.dt_facility.components.invoke.opCode.op[1]); + CU_ASSERT_EQUAL(0x0c,dst.param.dt_facility.components.invoke.opCode.op[2]); + CU_ASSERT_EQUAL(0xdd,dst.param.dt_facility.components.invoke.param.param); + CU_ASSERT_EQUAL(1,dst.param.dt_facility.components.invoke.param.flag); + + CU_ASSERT_EQUAL(0xa2,dst.param.dt_facility.components.return_result.tag); + CU_ASSERT_EQUAL(0x0d,dst.param.dt_facility.components.return_result.len); + CU_ASSERT_EQUAL(0x02,dst.param.dt_facility.components.return_result.invoke_id.tag); + CU_ASSERT_EQUAL(0x01,dst.param.dt_facility.components.return_result.invoke_id.len); + CU_ASSERT_EQUAL(0xdd,dst.param.dt_facility.components.return_result.invoke_id.id); + CU_ASSERT_EQUAL(0x30,dst.param.dt_facility.components.return_result.sequence.tag); + CU_ASSERT_EQUAL(0x04,dst.param.dt_facility.components.return_result.sequence.len); + CU_ASSERT_EQUAL(1,dst.param.dt_facility.components.return_result.sequence.flag); + CU_ASSERT_EQUAL(0x02,dst.param.dt_facility.components.return_result.opCode.tag); + CU_ASSERT_EQUAL(0x02,dst.param.dt_facility.components.return_result.opCode.len); + CU_ASSERT_EQUAL(1,dst.param.dt_facility.components.return_result.opCode.flag); + CU_ASSERT_EQUAL(0x0a,dst.param.dt_facility.components.return_result.opCode.op[0]); + CU_ASSERT_EQUAL(0x0b,dst.param.dt_facility.components.return_result.opCode.op[1]); + CU_ASSERT_EQUAL(0x11,dst.param.dt_facility.components.return_result.param.param[0]); + CU_ASSERT_EQUAL(0x22,dst.param.dt_facility.components.return_result.param.param[1]); + CU_ASSERT_EQUAL(0x33,dst.param.dt_facility.components.return_result.param.param[2]); + CU_ASSERT_EQUAL(0x44,dst.param.dt_facility.components.return_result.param.param[3]); + CU_ASSERT_EQUAL(1,dst.param.dt_facility.components.return_result.param.flag); + + CU_ASSERT_EQUAL(0xa3,dst.param.dt_facility.components.return_error.tag); + CU_ASSERT_EQUAL(0x09,dst.param.dt_facility.components.return_error.len); + CU_ASSERT_EQUAL(0x02,dst.param.dt_facility.components.return_error.invoke_id.tag); + CU_ASSERT_EQUAL(0x01,dst.param.dt_facility.components.return_error.invoke_id.len); + CU_ASSERT_EQUAL(0xdd,dst.param.dt_facility.components.return_error.invoke_id.id); + CU_ASSERT_EQUAL(0x02,dst.param.dt_facility.components.return_error.error.tag); + CU_ASSERT_EQUAL(0x03,dst.param.dt_facility.components.return_error.error.len); + CU_ASSERT_EQUAL(0x01,dst.param.dt_facility.components.return_error.error.er[0]); + CU_ASSERT_EQUAL(0x09,dst.param.dt_facility.components.return_error.error.er[1]); + CU_ASSERT_EQUAL(0x0a,dst.param.dt_facility.components.return_error.error.er[2]); + CU_ASSERT_EQUAL(0xdd,dst.param.dt_facility.components.return_error.param.param); + CU_ASSERT_EQUAL(1,dst.param.dt_facility.components.return_error.param.flag); + + CU_ASSERT_EQUAL(0xa4,dst.param.dt_facility.components.reject.tag); + CU_ASSERT_EQUAL(0x06,dst.param.dt_facility.components.reject.len); + CU_ASSERT_EQUAL(0x02,dst.param.dt_facility.components.reject.invoke_id.tag); + CU_ASSERT_EQUAL(0x01,dst.param.dt_facility.components.reject.invoke_id.len); + CU_ASSERT_EQUAL(0xdd,dst.param.dt_facility.components.reject.invoke_id.id); + CU_ASSERT_EQUAL(0x80,dst.param.dt_facility.components.reject.problem.tag); + CU_ASSERT_EQUAL(1,dst.param.dt_facility.components.reject.problem.len); + CU_ASSERT_EQUAL(0x00,dst.param.dt_facility.components.reject.problem.pro[0]); + //test encode + aifg_ie_encode(protocol,AIFG_IE_ID_DT_FACILITY,&(dst.param),buffer, 2); + CU_ASSERT_EQUAL(AIFG_IEI_DT_FACILITY,buffer[0]); + CU_ASSERT_EQUAL(0,memcmp(&buffer[1],src[96],49)); +} + +//////////////////////////////////////////msg test////////////////////////////////////////// + +aifg_msg_t structed_msg; +aifg_msg_pre_decoded predecoded; +int msg_len; +BYTE msgsrc[][256]= +{ + {0x00,0x0b,0x01,0x0B, 0x05, 0x01, 0x08, 0x91, 0x81, 0x05, 0x01, 0x00, 0x03},//0-assignReq + {0x00,0x1d,0x02,0x15,0x08,0x01,0x01,0x02,0x05,0x08,0x00,0x13,0x42,0x05,0x00, + 0x02,0x00,0x11,0x21,0x56,0x2c,0x03,0x2d,0x10,0x33,0x21,0x3b,0x03,0x10,0x39,0xd2},//1-assignComplete + {0x00,0x0f,0x03, 0x04,0x01,0x09, 0x15,0x08, 0x2d,0x10, 0x2e,0x05,0x01,0x02,0x03,0x04,0x05},//2-assignFailure + {0x00,0x08,0x40, 0x01,0x01,0x02, 0x04,0x01,0x09, 0x36,},//3-block + {0x00,0x04,0x41, 0x01,0x01,0x02},//4-blockAck + {0x00,0x04,0x42, 0x01,0x01,0x02},//5-unblock + {0x00,0x04,0x43, 0x01,0x01,0x02},//6-unblockAck + {0x00,0x25,0x11, 0x04,0x01,0x09, 0x1b, 0x1a,0x08,0x00,0x85,0x47,0x9c,0x67,0x24,0x3d,0x05, + 0x2e,0x05,0x01,0x02,0x03,0x04,0x05, 0x31,0x19, 0x33,0x21, 0x32,0x02, + 0x3a,0X07, 0xdd,0X01,0X02,0xdd ,0X02,0X06,0X01},//7-HORequired + {0x00,0x4c,0x10, 0x0b,0X04,0X01,0X09,0X83,0X79, 0x0a,0x01,0x01, + 0x12,0x03,0x33,0x22,0x8d, 0x05,0x03,0x02,0x00,0x22, 0x06,0x01,0x76, + 0x01,0x01,0x02, 0x19,0x01, 0x05,0x05,0x01,0x00,0x42,0x01,0x03, + 0x14,0x09, 0x04,0x01,0x09, 0x31,0x19, 0x33,0x21, 0x37,0x05,0x24,0x38,0x56,0x19,0x10, + 0x35, 0x39,0x03, 0x2c,0x03, 0X3a,0X07,0xdd,0X01,0X02,0xdd,0X02,0X06,0X01, + 0x3d,0x09,0x00,0x00,0x36,0x85,0xef,0x03,0x47,0x87,0x42},//8-HORequest + {0x00,0x14,0x12, 0x17,0x05,0x05,0x21,0x3f,0x58,0xe1, 0x21,0x56, 0x2c,0x03, 0x2d,0x10, 0x33,0x21, + 0x01,0x01,0x02, 0x3b,0x03,0x10,0x39,0xd2},//9-HORequestAck + {0x00,0x0d,0x13, 0x17,0x05,0x05,0x21,0x3f,0x58,0xe1, 0x05,0x03,0x02,0x00,0x22},//10-HOCmd + {0x00,0x03,0x14, 0x15,0x08},//11-HOComplete + {0x00,0x12,0x18, 0x0e,0xfe, 0x1a,0x08,0x00,0x85,0x47,0x9c,0x67,0x24,0x3d,0x05, 0x05,0x03,0x02,0x00,0x22},//12-HOCandidtateEnq + {0x00,0x08,0x19, 0x0e,0xfe, 0x05,0x03,0x02,0x00,0x22},//13-HOCandidateResp + {0x00,0x0f,0x16, 0x04,0x01,0x09, 0x15,0x08, 0x2d,0x10, 0x2e,0x05,0x01,0x02,0x03,0x04,0x05},//14-HOFailure + {0x00,0x14,0x17, 0x04,0x01,0x09, 0x05,0x03,0x02,0x00,0x22, 0x21,0x56, 0x2c,0x03, + 0x33,0x21, 0x3b,0x03,0x10,0x39,0xd2}, //15-HOPerformed + {0x00,0x04,0x1a, 0x04,0x01,0x09},//16-HOReject + {0x00,0x01,0x15},//17-HOSucceed + {0x00,0x01,0x1b},//18-HODetect + {0x00,0x0c,0x50, 0x0c,0xff, 0x1c,0x01, 0x05,0x03,0x02,0x00,0x22,0x0d,0x02},//19-resrcReq + {0x00,0x22,0x51, 0x1c,0x01, 0x03,0x00,0x09,0x01,0x03,0x00,0x09,0x01,0x03,0x00,0x09,0x01,0x03,0x00,0x09,0x01,0x03,0x02,0x06,0x00,0x0b, + 0x05,0x03,0x02,0x00,0x22, 0x22,0x84,0x62,0xf2,0x7e},//20-resrcInd + {0x00,0x20,0x52, 0x08,0x08,0x49,0x06,0x20,0x12,0x75,0x21,0x07,0x94, 0x09,0X04,0X33,0X79,0X27,0X46, + 0x1a,0x08,0x00,0x85,0x47,0x9c,0x67,0x24,0x3d,0x05, 0x24,0x02, 0x38,0x06},//21-paging + {0x00,0x04,0x22, 0x04,0x01,0x09},//22-clearReq + {0x00,0x08,0x20, 0x07,0X02,0X08,0X02, 0x04,0x01,0x09},//23-clearCmd + {0x00,0x04,0x30, 0x04,0x01,0x09},//24-reset + {0x00,0x09,0x32, 0x04,0x01,0x09, 0x05,0x03,0x02,0x00,0x22},//25-overload + {0x00,0x18,0x36, 0x25,0xdd, 0x26,0x03,0x9d,0x20,0x81, 0x27,0x34,0x97, + 0x28,0x02,0x17,0x62, 0x29,0x02,0x31,0xf2, 0x2a,0x03,0x39,0xc4,0x08},//26-mscInvokeTrace + {0x00,0x16,0x37, 0x25,0xdd, 0x2b,0x02, 0x26,0x03,0x9d,0x20,0x81, + 0x27,0x34,0x97, 0x28,0x02,0x17,0x62, 0x2a,0x03,0x39,0xc4,0x08},//27-bscInvokeTrace + {0x00,0x06,0x54, 0x12,0x03,0x7e,0x67,0x82},//28-cmUpdate + {0x00,0x0a,0x53, 0x07,0X02,0X08,0X02, 0x0a,0x01,0x01, 0x23,0x00},//29-cipherModeCmd + {0x00,0x03,0x55, 0x2c,0x03},//30-cipherModeComplete + {0x00,0x04,0x59, 0x04,0x01,0x09},// 31-cipherModeRej + {0x00,0x1d,0x57, 0x05,0x03,0x02,0x00,0x22, 0x17,0x0B,0x05,0x24, 0xb1, 0x03,0x33,0x22,0x8d, 0x02,0x73,0xf2, 0x85, //cm request + 0x21,0x56, 0x3c,0x07,0x01,0x22,0xe4,0x31,0x57,0x69,0x83, 0x3e,0x03,0x15,0x49,0xf5},//32-completeL3Info + {0x00,0x06,0x25, 0x18,0xc2, 0x04,0x01,0x09},//33-sapi_n_rej + {0x00,0x07,0x34, 0x01,0x01,0x02, 0x04,0x01,0x09},//34-resetCircuit + {0x00,0x04,0x35, 0x01,0x01,0x02},//35-resetCircuitAck + {0x00,0x0d,0x44, 0x04,0x01,0x09, 0x01,0x01,0x02, 0x1e,0x04,0x32,0x12,0x8d,0x36},//36-circuitGrpBlk + {0x00,0x0a,0x45, 0x01,0x01,0x02, 0x1e,0x04,0x32,0x12,0x8d,0x36},//37-circuitGrpBlkAck + {0x00,0x0a,0x46, 0x01,0x01,0x02, 0x1e,0x04,0x32,0x12,0x8d,0x36},//38-circuitGrpUnblk + {0x00,0x0a,0x47, 0x01,0x01,0x02, 0x1e,0x04,0x32,0x12,0x8d,0x36},//39-circuitGrpUnblkAck + {0x00,0x0a,0x26, 0x04,0x01,0x09, 0x1f,0x04,0x03,0x0a,0x38,0x89},//40-confusion + {0x00,0x0a,0x48, 0x01,0x01,0x02, 0x1e,0x04,0x32,0x12,0x8d,0x36},//41-unequippedCircuit + {0x00,0x1d,0x5a, 0x2f,0x11, 0x05,0x03,0x02,0x00,0x22, 0x1a,0x08,0x00,0x85,0x47,0x9c,0x67,0x24,0x3d,0x05, + 0x30,0x05,0x11,0x83,0x04,0x28,0x75, 0x04,0x02,0x89,0x03},//42-loadIndication + {0x00,0x03,0x28, 0x18,0xc2},//43-suspend + {0x00,0x03,0x29, 0x18,0xc2},//44-suspend + {0x00,0x04,0x4e, 0x04,0x01,0x09},//45-changeCircuit + {0x00,0x04,0x4f, 0x01,0x01,0x02},//46-changeCircuitAck + {0x00,0x06,0x2a, 0x3e,0x03,0x15,0x49,0xf5},//47-locCmd + {0x00,0x06,0x2b, 0x3e,0x03,0x15,0x49,0xf5},//48-locReport + {0x00,0x01,0x31},//49-resetAck + {0x00,0x01,0x21},//50-clearComplete + {0x00,0x01,0x56},//51-queueInd + {0x00,0x01,0x58},//52-cmRequest + +////////////dtap............................................... + + {0x01,0x00,0x0d,0x05,0x02, 0x78,0xf3,0x64,0x31,0x02, 0x17,0x02,0x73,0xf2, 0xa1, 0xa2},//53-luAccept + {0x01,0x00,0x03,0x05,0x22, 0x02},//54-cmReject + {0x01,0x00,0x03,0x05,0x04, 0x02},//55-luReject + {0x01,0x00,0x03,0x05,0x29, 0x02},//56-abort + {0x01,0x00,0x03,0x05,0x31, 0x02},//57-mmStatus + {0x05,0x08, 0x19, 0x78,0xf3,0x64,0x31,0x02, 0x11, 0x02,0x73,0xf2},//58-LURequest + {0x01,0x00,0x13,0x05,0x12, 0x01, 0X00,0X11,0X22,0X33,0X44,0X55,0X66,0X77,0X88,0X99,0XAA,0XBB,0XCC,0XDD,0XEE,0XFF},//59-authRequest + {0x01,0x00,0x06,0x05,0x14, 0X11,0X12,0X13,0X14},//60-authResp + {0x01,0x00,0x03,0x05,0x18, 0x03},//61-idRequest + {0x01,0x00,0x05,0x05,0x19, 0x02,0x73,0xf2},//62-idResp + {0x05,0x01, 0x11, 0x02,0x73,0xf2},//63-imsiDetachInd + {0x01,0x00,0x0a,0x05,0x1a, 0x78,0xf3,0x64,0x31,0x02, 0x02,0x73,0xf2},//64-tmsiCmd + {0x05,0x28, 0x01, 0x03,0x33,0x22,0x8d, 0x02,0x73,0xf2, 0x13,0x78,0xf3,0x64,0x31,0x02},//65-cmReEst_request + {0x05,0x24, 0x01, 0x03,0x33,0x22,0x8d, 0x02,0x73,0xf2, 0x85},//66-cmRequest + {0x01,0x00,0x1b,0x05,0x32, 0x43,0x03,0x91,0x35,0x64, 0x45,0x03,0x91,0x35,0x64, 0x46,0xdd, + 0x47,0x07,0x04,0x12,0x0a,0x32,0x14,0xdd, 0x48,0x03,0x11,0x22,0x33},//67-mmInfo + {0x01,0x00,0x03d,0x03,0x01, + 0x1c,0x30,0xa1,0x0c,0x02,0x01,0xdd,0x80,0x01,0xdd,0x02,0x03,0x0a,0x0b,0x0c,0xdd, + 0xa2,0x0d,0x02,0x01,0xdd,0x30,0x04,0x02,0x02,0x0a,0x0b,0x11,0x22,0x33,0x44, + 0xa3,0x09,0x02,0x01,0xdd,0x02,0x03,0x01,0x09,0x0a,0xdd, + 0xa4,0x06,0x02,0x01,0xdd,0x80,0x01,0x00, + 0x1e,0x02,0xc0,0x82, 0x7e,0x03,0x01,0x19,0x83},//68-alert + {0x01,0x00,0x1f,0x03,0x08, 0xd1, 0x04,0x02,0x20,0x02, 0x04,0x0d,0xa3,0xca,0x1a,0x00,0xe4,0x21,0x53,0x5b,0x60,0x21,0x5f,0x47,0xc6, + 0x08,0x04,0x47,0xdd,0x96,0x81, 0x15,0x01,0x03},//69-callConfirm + {0x01,0x00,0x42,0x03,0x02, 0xd1, 0x04,0x02,0x20,0x02, 0x04,0x02,0x20,0x02, + 0x1c,0x30,0xa1,0x0c,0x02,0x01,0xdd,0x80,0x01,0xdd,0x02,0x03,0x0a,0x0b,0x0c,0xdd, + 0xa2,0x0d,0x02,0x01,0xdd,0x30,0x04,0x02,0x02,0x0a,0x0b,0x11,0x22,0x33,0x44, + 0xa3,0x09,0x02,0x01,0xdd,0x02,0x03,0x01,0x09,0x0a,0xdd, + 0xa4,0x06,0x02,0x01,0xdd,0x80,0x01,0x00, + 0x1e,0x02,0xc0,0x82, 0x85},//70-callProceed + {0x01,0x00,0x48,0x03,0x07, + 0x1c,0x30,0xa1,0x0c,0x02,0x01,0xdd,0x80,0x01,0xdd,0x02,0x03,0x0a,0x0b,0x0c,0xdd, + 0xa2,0x0d,0x02,0x01,0xdd,0x30,0x04,0x02,0x02,0x0a,0x0b,0x11,0x22,0x33,0x44, + 0xa3,0x09,0x02,0x01,0xdd,0x02,0x03,0x01,0x09,0x0a,0xdd, + 0xa4,0x06,0x02,0x01,0xdd,0x80,0x01,0x00, + 0x1e,0x02,0xc0,0x82, 0x4c,0x04,0x28,0xa3,0x89,0x37, 0x4d,0x03,0x88,0x50,0x43, 0x7e,0x03,0x01,0x19,0x83},//71-connect + {0x01,0x00,0x06,0x03,0x0e, 0x04,0x02,0x20,0x02},//72-eSetup + {0x01,0x00,0x0a,0x03,0x03, 0x02,0xc0,0x82, 0x7e,0x03,0x01,0x19,0x83},//73-progress + {0x01,0x00,0x81,0x03,0x05, 0xd1, 0x04,0x02,0x20,0x02, 0x04,0x02,0x20,0x02, + 0x1c,0x30,0xa1,0x0c,0x02,0x01,0xdd,0x80,0x01,0xdd,0x02,0x03,0x0a,0x0b,0x0c,0xdd, + 0xa2,0x0d,0x02,0x01,0xdd,0x30,0x04,0x02,0x02,0x0a,0x0b,0x11,0x22,0x33,0x44, + 0xa3,0x09,0x02,0x01,0xdd,0x02,0x03,0x01,0x09,0x0a,0xdd, + 0xa4,0x06,0x02,0x01,0xdd,0x80,0x01,0x00, + 0x1e,0x02,0xc0,0x82, 0x34,0x08, 0x5c,0x04,0x28,0xa3,0x89,0x37, 0x5d,0x03,0x88,0x50,0x43, + 0x5e,0x04,0x88,0xa3,0x89,0x37, 0x6d,0x03,0x88,0x50,0x43, 0x74,0x04,0x28,0xa3,0x89,0x37, + 0x75,0x03,0x88,0x50,0x43, 0xd1, 0x7c,0x02,0xdd,0xde, 0x7c,0x02,0xdd,0xde, 0xd1, 0x7d,0x03,0xa8,0x6e,0xb4, + 0x7d,0x03,0xa8,0x6e,0xb4, 0x7e,0x03,0x01,0x19,0x83, 0x85, 0x19,0x01,0x02},//74-setup + {0x01,0x00,0x0f,0x03,0x17, 0x02,0x20,0x02, 0x7c,0x02,0xdd,0xde, 0x7d,0x03,0xa8,0x6e,0xb4, 0xa3},//75-modify + {0x01,0x00,0x0f,0x03,0x1f, 0x02,0x20,0x02, 0x7c,0x02,0xdd,0xde, 0x7d,0x03,0xa8,0x6e,0xb4, 0xa3},//76-modifyCmp + {0x01,0x00,0x013,0x03,0x13, 0x02,0x20,0x02, 0x04,0x47,0xdd,0x96,0x81, 0x7c,0x02,0xdd,0xde, 0x7d,0x03,0xa8,0x6e,0xb4},//77-modifyRej + {0x01,0x00,0x07,0x03,0x10, 0x03,0x01,0x19,0x83, 0xa0},//78-userInfo + {0x01,0x00,0x07,0x03,0x1a, 0x04,0x47,0xdd,0x96,0x81},//79-holdRej + {0x01,0x00,0x07,0x03,0x1e, 0x04,0x47,0xdd,0x96,0x81},//80-retrieveRej + {0x01,0x00,0x42,0x03,0x25, 0x04,0x47,0xdd,0x96,0x81, + 0x1c,0x30,0xa1,0x0c,0x02,0x01,0xdd,0x80,0x01,0xdd,0x02,0x03,0x0a,0x0b,0x0c,0xdd, + 0xa2,0x0d,0x02,0x01,0xdd,0x30,0x04,0x02,0x02,0x0a,0x0b,0x11,0x22,0x33,0x44, + 0xa3,0x09,0x02,0x01,0xdd,0x02,0x03,0x01,0x09,0x0a,0xdd, + 0xa4,0x06,0x02,0x01,0xdd,0x80,0x01,0x00, + 0x1e,0x02,0xc0,0x82, 0x7e,0x03,0x01,0x19,0x83},//81-disconnect + {0x01,0x00,0x45,0x03,0x2d, 0x08,0x04,0x47,0xdd,0x96,0x81, 0x08,0x04,0x47,0xdd,0x96,0x81, + 0x1c,0x30,0xa1,0x0c,0x02,0x01,0xdd,0x80,0x01,0xdd,0x02,0x03,0x0a,0x0b,0x0c,0xdd, + 0xa2,0x0d,0x02,0x01,0xdd,0x30,0x04,0x02,0x02,0x0a,0x0b,0x11,0x22,0x33,0x44, + 0xa3,0x09,0x02,0x01,0xdd,0x02,0x03,0x01,0x09,0x0a,0xdd, + 0xa4,0x06,0x02,0x01,0xdd,0x80,0x01,0x00, + 0x7e,0x03,0x01,0x19,0x83},//82-release + {0x01,0x00,0x3f,0x03,0x2a, 0x08,0x04,0x47,0xdd,0x96,0x81, + 0x1c,0x30,0xa1,0x0c,0x02,0x01,0xdd,0x80,0x01,0xdd,0x02,0x03,0x0a,0x0b,0x0c,0xdd, + 0xa2,0x0d,0x02,0x01,0xdd,0x30,0x04,0x02,0x02,0x0a,0x0b,0x11,0x22,0x33,0x44, + 0xa3,0x09,0x02,0x01,0xdd,0x02,0x03,0x01,0x09,0x0a,0xdd, + 0xa4,0x06,0x02,0x01,0xdd,0x80,0x01,0x00, + 0x7e,0x03,0x01,0x19,0x83},//83-releaseCmp + {0x01,0x00,0x09,0x03,0x39, 0x0f, 0x08,0x04,0x47,0xdd,0x96,0x81},//84-congestCtrl + {0x01,0x00,0x03,0x03,0x3e, 0x80},//85-notify + {0x01,0x00,0x0b,0x03,0x3d, 0x04,0x47,0xdd,0x96,0x81, 0xc2, 0x24,0x01,0x86},//86-status + {0x01,0x00,0x03,0x03,0x35, 0x0d},//87-startDTMF + {0x01,0x00,0x03,0x03,0x36, 0x0d},//88-startDTMF_ack + {0x01,0x00,0x07,0x03,0x37, 0x04,0x47,0xdd,0x96,0x81},//89-startDTMF_rej + {0x01,0x00,0x02,0x03,0x0f},//90-connectAck + {0x01,0x00,0x02,0x03,0x18},//91-hold + {0x01,0x00,0x02,0x03,0x19},//92-holdAck + {0x01,0x00,0x02,0x03,0x1c},//93-retrieve + {0x01,0x00,0x02,0x03,0x1d},//94-retrieveAck + {0x01,0x00,0x02,0x03,0x34},//95-statusEnq + {0x01,0x00,0x02,0x03,0x31},//96-stopDTMF + {0x01,0x00,0x02,0x03,0x32},//97-stopDTMF_ack + {0x01,0x00,0x33,0x03,0x3a, + 0x30,0xa1,0x0c,0x02,0x01,0xdd,0x80,0x01,0xdd,0x02,0x03,0x0a,0x0b,0x0c,0xdd, + 0xa2,0x0d,0x02,0x01,0xdd,0x30,0x04,0x02,0x02,0x0a,0x0b,0x11,0x22,0x33,0x44, + 0xa3,0x09,0x02,0x01,0xdd,0x02,0x03,0x01,0x09,0x0a,0xdd, + 0xa4,0x06,0x02,0x01,0xdd,0x80,0x01,0x00},//98-facility + {0x01,0x00,0x41,0x03,0x25, 0x04,0x47,0xdd,0x96,0x81, + 0x1c,0x30,0xa1,0x0c,0x02,0x01,0xdd,0x80,0x01,0xdd,0x02,0x03,0x0a,0x0b,0x0c,0xdd, + 0xa2,0x0d,0x02,0x01,0xdd,0x30,0x04,0x02,0x02,0x0a,0x0b,0x11,0x22,0x33,0x44, + 0xa3,0x09,0x02,0x01,0xdd,0x02,0x03,0x01,0x09,0x0a,0xdd, + 0xa4,0x06,0x02,0x01,0xdd,0x80,0x01,0x00, + 0x7e,0x03,0x01,0x19,0x83, 0x7f,0x01,0xdd},//99-disconnect_mobileToNet + {0x00,0x1d,0x57, 0x05,0x03,0x02,0x00,0x22, 0x17,0x10,0x06,0x27, 0x02, 0x03,0x23,0x18,0x01, 0x08,0x49,0x06,0x20,0x12,0x75,0x21,0x07,0x94, //paging response + 0x21,0x56, 0x3c,0x07,0x01,0x22,0xe4,0x31,0x57,0x69,0x83, 0x3e,0x03,0x15,0x49,0xf5},//100-completeL3Info-paing response +}; + + +//bssmap.................................................. + +void test_aifg_msg_assignReq() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + //test + aifg_msg_proc(msgsrc[0], &predecoded); + + structed_msg.id = AIFG_MSG_ID_ASSIGN_REQ; + //channel type + aifg_ie_decode(&(predecoded.msg.assignReq.channelType),&dst); + memcpy(&(structed_msg.msg.assignReq.channelType),&(dst.param.bm_channelType), sizeof(dst.param.bm_channelType)); + structed_msg.msg.assignReq.channelType.flag = 1; + //cic + aifg_ie_decode(&(predecoded.msg.assignReq.cic),&dst); + memcpy(&(structed_msg.msg.assignReq.cic),&(dst.param.bm_cic), sizeof(dst.param.bm_cic)); + structed_msg.msg.assignReq.cic.flag = 1; + + msg_len = aifg_msg_sd_assignReq(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 11); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[0][2], msg_len)); + +} + + +void test_aifg_msg_assignComplete() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[1], &predecoded); + + structed_msg.id = AIFG_MSG_ID_ASSIGN_CMP; + //cellId + aifg_ie_decode(&(predecoded.msg.assignComplete.cellId),&dst); + memcpy(&(structed_msg.msg.assignComplete.cellId),&(dst.param.bm_cellId), sizeof(dst.param.bm_cellId)); + structed_msg.msg.assignComplete.cellId.flag = 1; + //chosen channel + aifg_ie_decode(&(predecoded.msg.assignComplete.chosenChannel),&dst); + memcpy(&(structed_msg.msg.assignComplete.chosenChannel),&(dst.param.bm_chosenChannel), sizeof(dst.param.bm_chosenChannel)); + structed_msg.msg.assignComplete.chosenChannel.flag = 1; + //chosen encrypt + aifg_ie_decode(&(predecoded.msg.assignComplete.chosenEncrypt),&dst); + memcpy(&(structed_msg.msg.assignComplete.chosenEncrypt),&(dst.param.bm_chosenEncrypt), sizeof(dst.param.bm_chosenEncrypt)); + structed_msg.msg.assignComplete.chosenEncrypt.flag = 1; + //cic + aifg_ie_decode(&(predecoded.msg.assignComplete.cic),&dst); + memcpy(&(structed_msg.msg.assignComplete.cic),&(dst.param.bm_cic), sizeof(dst.param.bm_cic)); + structed_msg.msg.assignComplete.cic.flag = 1; + //circuit pool + aifg_ie_decode(&(predecoded.msg.assignComplete.circuitPool),&dst); + memcpy(&(structed_msg.msg.assignComplete.circuitPool),&(dst.param.bm_circuitPool), sizeof(dst.param.bm_circuitPool)); + structed_msg.msg.assignComplete.circuitPool.flag = 1; + //LSA id + aifg_ie_decode(&(predecoded.msg.assignComplete.lsaId),&dst); + memcpy(&(structed_msg.msg.assignComplete.lsaId),&(dst.param.bm_lsaId), sizeof(dst.param.bm_lsaId)); + structed_msg.msg.assignComplete.lsaId.flag = 1; + //rr cause + aifg_ie_decode(&(predecoded.msg.assignComplete.rrcause),&dst); + memcpy(&(structed_msg.msg.assignComplete.rrCause),&(dst.param.bm_rrCause), sizeof(dst.param.bm_rrCause)); + structed_msg.msg.assignComplete.rrCause.flag = 1; + //speech version + aifg_ie_decode(&(predecoded.msg.assignComplete.speechVer),&dst); + memcpy(&(structed_msg.msg.assignComplete.speechVer),&(dst.param.bm_speechVer), sizeof(dst.param.bm_speechVer)); + structed_msg.msg.assignComplete.speechVer.flag = 1; + + msg_len = aifg_msg_sd_assignComplete(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 29); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[1][2], msg_len)); + +} + + +void test_aifg_msg_assignFailure() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + //test + aifg_msg_proc(msgsrc[2], &predecoded); + + structed_msg.id = AIFG_MSG_ID_ASSIGN_FAIL; + + //cause + aifg_ie_decode(&(predecoded.msg.assignFailure.cause),&dst); + memcpy(&(structed_msg.msg.assignFailure.cause),&(dst.param.bm_cause), sizeof(dst.param.bm_cause)); + structed_msg.msg.assignFailure.cause.flag= 1; + + //RR cause + aifg_ie_decode(&(predecoded.msg.assignFailure.rrcause),&dst); + memcpy(&(structed_msg.msg.assignFailure.rrCause),&(dst.param.bm_rrCause), sizeof(dst.param.bm_rrCause)); + structed_msg.msg.assignFailure.rrCause.flag= 1; + + //circuit pool + aifg_ie_decode(&(predecoded.msg.assignFailure.circuitPool),&dst); + memcpy(&(structed_msg.msg.assignFailure.circuitPool),&(dst.param.bm_circuitPool), sizeof(dst.param.bm_circuitPool)); + structed_msg.msg.assignFailure.circuitPool.flag= 1; + + //circuit pool list + aifg_ie_decode(&(predecoded.msg.assignFailure.circuitPoolList),&dst); + memcpy(&(structed_msg.msg.assignFailure.circuitPoolList),&(dst.param.bm_circuitPoolList), sizeof(dst.param.bm_circuitPoolList)); + structed_msg.msg.assignFailure.circuitPoolList.flag= 1; + + msg_len = aifg_msg_sd_assignFailure(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 15); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[2][2], msg_len)); +} + + +void test_aifg_msg_block() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + //test + aifg_msg_proc(msgsrc[3], &predecoded); + + structed_msg.id = AIFG_MSG_ID_BLOCK; + + //circuit identity code + aifg_ie_decode(&(predecoded.msg.block.cic),&dst); + memcpy(&(structed_msg.msg.block.cic),&(dst.param.bm_cic), sizeof(dst.param.bm_cic)); + structed_msg.msg.block.cic.flag= 1; + + //cause + aifg_ie_decode(&(predecoded.msg.block.cause),&dst); + memcpy(&(structed_msg.msg.block.cause),&(dst.param.bm_cause), sizeof(dst.param.bm_cause)); + structed_msg.msg.block.cause.flag= 1; + + //connection release requested + aifg_ie_decode(&(predecoded.msg.block.connectionRelReq),&dst); + memcpy(&(structed_msg.msg.block.connRelReq),&(dst.param.bm_connRelReq), sizeof(dst.param.bm_connRelReq)); + structed_msg.msg.block.connRelReq.flag= 1; + + msg_len = aifg_msg_sd_block(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 8); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[3][2], msg_len)); +} + + +void test_aifg_msg_blockAck() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[4], &predecoded); + + structed_msg.id = AIFG_MSG_ID_BLOCK_ACK; + //circuit identity code + aifg_ie_decode(&(predecoded.msg.blockAck.cic),&dst); + memcpy(&(structed_msg.msg.blockAck.cic),&(dst.param.bm_cic), sizeof(dst.param.bm_cic)); + structed_msg.msg.blockAck.cic.flag= 1; + + + msg_len = aifg_msg_sd_blockAck(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 4); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[4][2], msg_len)); + +} + + +void test_aifg_msg_unblock() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[5], &predecoded); + + structed_msg.id = AIFG_MSG_ID_UNBLOCK; + //circuit identity code + aifg_ie_decode(&(predecoded.msg.unblock.cic),&dst); + memcpy(&(structed_msg.msg.unblock.cic),&(dst.param.bm_cic), sizeof(dst.param.bm_cic)); + structed_msg.msg.unblock.cic.flag= 1; + + + msg_len = aifg_msg_sd_unblock(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 4); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[5][2], msg_len)); + +} + + +void test_aifg_msg_unblockAck() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + //test + aifg_msg_proc(msgsrc[6], &predecoded); + + structed_msg.id = AIFG_MSG_ID_UNBLOCK_ACK; + //circuit identity code + aifg_ie_decode(&(predecoded.msg.unBlockAck.cic),&dst); + memcpy(&(structed_msg.msg.unblockAck.cic),&(dst.param.bm_cic), sizeof(dst.param.bm_cic)); + structed_msg.msg.unblockAck.cic.flag= 1; + + msg_len = aifg_msg_sd_unblockAck(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 4); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[6][2], msg_len)); +} + +void test_aifg_msg_HORequired() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + //test + aifg_msg_proc(msgsrc[7], &predecoded); + + structed_msg.id = AIFG_MSG_ID_HO_REQUIRED; + //cause + aifg_ie_decode(&(predecoded.msg.HORequired.cause),&dst); + memcpy(&(structed_msg.msg.HORequired.cause),&(dst.param.bm_cause), sizeof(dst.param.bm_cause)); + structed_msg.msg.HORequired.cause.flag= 1; + //response request + aifg_ie_decode(&(predecoded.msg.HORequired.respReq),&dst); + memcpy(&(structed_msg.msg.HORequired.respReq),&(dst.param.bm_respReq), sizeof(dst.param.bm_respReq)); + structed_msg.msg.HORequired.respReq.flag= 1; + //cell identifier list + aifg_ie_decode(&(predecoded.msg.HORequired.cellIdList),&dst); + memcpy(&(structed_msg.msg.HORequired.prefer_cidList),&(dst.param.bm_cellIdList), sizeof(dst.param.bm_cellIdList)); + structed_msg.msg.HORequired.prefer_cidList.flag= 1; + //circuit pool list + aifg_ie_decode(&(predecoded.msg.HORequired.circuitPoolList),&dst); + memcpy(&(structed_msg.msg.HORequired.circuitPoolList),&(dst.param.bm_circuitPoolList), sizeof(dst.param.bm_circuitPoolList)); + structed_msg.msg.HORequired.circuitPoolList.flag= 1; + //current channel type 1 + aifg_ie_decode(&(predecoded.msg.HORequired.curChannelType1),&dst); + memcpy(&(structed_msg.msg.HORequired.curChannelType1),&(dst.param.bm_curChannelType1), sizeof(dst.param.bm_curChannelType1)); + structed_msg.msg.HORequired.curChannelType1.flag= 1; + //speech verssion + aifg_ie_decode(&(predecoded.msg.HORequired.speechVer),&dst); + memcpy(&(structed_msg.msg.HORequired.speechVer),&(dst.param.bm_speechVer), sizeof(dst.param.bm_speechVer)); + structed_msg.msg.HORequired.speechVer.flag= 1; + //queueing indicator + aifg_ie_decode(&(predecoded.msg.HORequired.queInd),&dst); + memcpy(&(structed_msg.msg.HORequired.queuingInd),&(dst.param.bm_queuingInd), sizeof(dst.param.bm_queuingInd)); + structed_msg.msg.HORequired.queuingInd.flag= 1; + //old bss to new bss infomation + aifg_ie_decode(&(predecoded.msg.HORequired.oldBssToNew),&dst); + memcpy(&(structed_msg.msg.HORequired.bssOldtoNew),&(dst.param.bm_bssOldtoNew), sizeof(dst.param.bm_bssOldtoNew)); + structed_msg.msg.HORequired.bssOldtoNew.flag= 1; + + msg_len = aifg_msg_sd_HORequired(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 37); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[7][2], msg_len)); +} + +/* +void test_aifg_msg_HORequest() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[8], &predecoded); + + structed_msg.id = AIFG_MSG_ID_HO_REQUEST; + //channel type + aifg_ie_decode(&(predecoded.msg.HORequest.channelType),&dst); + memcpy(&(structed_msg.msg.HORequest.channelType),&(dst.param.bm_channelType), sizeof(dst.param.bm_channelType)); + structed_msg.msg.HORequest.channelType.flag= 1; + //encryption infomation + aifg_ie_decode(&(predecoded.msg.HORequest.encryptInfo),&dst); + memcpy(&(structed_msg.msg.HORequest.encryptInfo),&(dst.param.bm_encryptInfo), sizeof(dst.param.bm_encryptInfo)); + structed_msg.msg.HORequest.encryptInfo.flag= 1; + //classmark 2 + aifg_ie_decode(&(predecoded.msg.HORequest.cmInfo2),&dst); + memcpy(&(structed_msg.msg.HORequest.cmInfo.cm2),&(dst.param.bm_cmInfo2), sizeof(dst.param.bm_cmInfo2)); + structed_msg.msg.HORequest.cmInfo.cm2.flag= 1; + //cell identifier (serving) + aifg_ie_decode(&(predecoded.msg.HORequest.serving_cellId),&dst); + memcpy(&(structed_msg.msg.HORequest.servingCellId),&(dst.param.bm_cellId), sizeof(dst.param.bm_cellId)); + structed_msg.msg.HORequest.servingCellId.flag= 1; + //priority + aifg_ie_decode(&(predecoded.msg.HORequest.priority),&dst); + memcpy(&(structed_msg.msg.HORequest.priority),&(dst.param.bm_priority), sizeof(dst.param.bm_priority)); + structed_msg.msg.HORequest.priority.flag= 1; + //circuit identity code + aifg_ie_decode(&(predecoded.msg.HORequest.cic),&dst); + memcpy(&(structed_msg.msg.HORequest.cic),&(dst.param.bm_cic), sizeof(dst.param.bm_cic)); + structed_msg.msg.HORequest.cic.flag= 1; + //dtx flag + aifg_ie_decode(&(predecoded.msg.HORequest.dtxFlag),&dst); + memcpy(&(structed_msg.msg.HORequest.dtxFlag),&(dst.param.bm_dtx), sizeof(dst.param.bm_dtx)); + structed_msg.msg.HORequest.dtxFlag.flag= 1; + //cell identifier (target) + aifg_ie_decode(&(predecoded.msg.HORequest.target_cellId),&dst); + memcpy(&(structed_msg.msg.HORequest.targetCellId),&(dst.param.bm_cellId), sizeof(dst.param.bm_cellId)); + structed_msg.msg.HORequest.targetCellId.flag= 1; + //band to be used + aifg_ie_decode(&(predecoded.msg.HORequest.bandUsed),&dst); + memcpy(&(structed_msg.msg.HORequest.bandUsed),&(dst.param.bm_bandUsed), sizeof(dst.param.bm_bandUsed)); + structed_msg.msg.HORequest.bandUsed.flag= 1; + //cause + aifg_ie_decode(&(predecoded.msg.HORequest.cause),&dst); + memcpy(&(structed_msg.msg.HORequest.cause),&(dst.param.bm_cause), sizeof(dst.param.bm_cause)); + structed_msg.msg.HORequest.cause.flag= 1; + //current channel type 1 + aifg_ie_decode(&(predecoded.msg.HORequest.curChanneltype1),&dst); + memcpy(&(structed_msg.msg.HORequest.curChannelType1),&(dst.param.bm_curChannelType1), sizeof(dst.param.bm_curChannelType1)); + structed_msg.msg.HORequest.curChannelType1.flag= 1; + //speech version + aifg_ie_decode(&(predecoded.msg.HORequest.speechVer),&dst); + memcpy(&(structed_msg.msg.HORequest.speechVer),&(dst.param.bm_speechVer), sizeof(dst.param.bm_speechVer)); + structed_msg.msg.HORequest.speechVer.flag= 1; + //group call reference + aifg_ie_decode(&(predecoded.msg.HORequest.groupCallRef),&dst); + memcpy(&(structed_msg.msg.HORequest.gourpRef),&(dst.param.bm_groupRef), sizeof(dst.param.bm_groupRef)); + structed_msg.msg.HORequest.gourpRef.flag= 1; + //talker flag + aifg_ie_decode(&(predecoded.msg.HORequest.talkerFlag),&dst); + memcpy(&(structed_msg.msg.HORequest.talkerFlag),&(dst.param.bm_talkerFlag), sizeof(dst.param.bm_talkerFlag)); + structed_msg.msg.HORequest.talkerFlag.flag= 1; + //configuration evolution indication + aifg_ie_decode(&(predecoded.msg.HORequest.cfgEvoInd),&dst); + memcpy(&(structed_msg.msg.HORequest.cfgEvoInd),&(dst.param.bm_cfgEvoInd), sizeof(dst.param.bm_cfgEvoInd)); + structed_msg.msg.HORequest.cfgEvoInd.flag= 1; + //chosen encryption algnorithm + aifg_ie_decode(&(predecoded.msg.HORequest.chosenEncrypt),&dst); + memcpy(&(structed_msg.msg.HORequest.chosenEncrypt),&(dst.param.bm_chosenEncrypt), sizeof(dst.param.bm_chosenEncrypt)); + structed_msg.msg.HORequest.chosenEncrypt.flag= 1; + //old bss to new bss + aifg_ie_decode(&(predecoded.msg.HORequest.oldBssToNew),&dst); + memcpy(&(structed_msg.msg.HORequest.bssOldtoNew),&(dst.param.bm_bssOldtoNew), sizeof(dst.param.bm_bssOldtoNew)); + structed_msg.msg.HORequest.bssOldtoNew.flag= 1; + //LSA infomation + aifg_ie_decode(&(predecoded.msg.HORequest.lsaInfo),&dst); + memcpy(&(structed_msg.msg.HORequest.lsaInfo),&(dst.param.bm_lsaInfo), sizeof(dst.param.bm_lsaInfo)); + structed_msg.msg.HORequest.lsaInfo.flag= 1; + + msg_len = aifg_msg_sd_HORequest(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 76); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[8][2], msg_len)); + +} + +void test_aifg_msg_HORequestAck() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[9], &predecoded); + + structed_msg.id = AIFG_MSG_ID_HO_REQ_ACK; + //layer 3 infomation +// aifg_ie_decode(&(predecoded.msg.HORequestAck.l3Info),&dst); +// memcpy(&(structed_msg.msg.HORequestAck.l3Info),&(dst.param.bm_l3Info), sizeof(dst.param.bm_l3Info)); +// structed_msg.msg.HORequestAck.l3Info.flag= 1; + //chosen channel + aifg_ie_decode(&(predecoded.msg.HORequestAck.chosenChannel),&dst); + memcpy(&(structed_msg.msg.HORequestAck.chosenChannel),&(dst.param.bm_chosenChannel), sizeof(dst.param.bm_chosenChannel)); + structed_msg.msg.HORequestAck.chosenChannel.flag= 1; + //chosen encryption algnorithm + aifg_ie_decode(&(predecoded.msg.HORequestAck.chosenEncrypt),&dst); + memcpy(&(structed_msg.msg.HORequestAck.chosenEncrypt),&(dst.param.bm_chosenEncrypt), sizeof(dst.param.bm_chosenEncrypt)); + structed_msg.msg.HORequestAck.chosenEncrypt.flag= 1; + //circuit pool + aifg_ie_decode(&(predecoded.msg.HORequestAck.circuitPool),&dst); + memcpy(&(structed_msg.msg.HORequestAck.circuitPool),&(dst.param.bm_circuitPool), sizeof(dst.param.bm_circuitPool)); + structed_msg.msg.HORequestAck.circuitPool.flag= 1; + //speech version + aifg_ie_decode(&(predecoded.msg.HORequestAck.speechVer),&dst); + memcpy(&(structed_msg.msg.HORequestAck.speechVer),&(dst.param.bm_speechVer), sizeof(dst.param.bm_speechVer)); + structed_msg.msg.HORequestAck.speechVer.flag= 1; + //circuit identity code + aifg_ie_decode(&(predecoded.msg.HORequestAck.cic),&dst); + memcpy(&(structed_msg.msg.HORequestAck.cic),&(dst.param.bm_cic), sizeof(dst.param.bm_cic)); + structed_msg.msg.HORequestAck.cic.flag= 1; + //LSA identity + aifg_ie_decode(&(predecoded.msg.HORequestAck.lsaId),&dst); + memcpy(&(structed_msg.msg.HORequestAck.lsaId),&(dst.param.bm_lsaId), sizeof(dst.param.bm_lsaId)); + structed_msg.msg.HORequestAck.lsaId.flag= 1; + + + msg_len = aifg_msg_sd_HORequestAck(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 17); + CU_ASSERT_EQUAL(0, memcmp(&buffer[1], &msgsrc[9][10], msg_len-1)); + +} + +void test_aifg_msg_HOCmd() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[10], &predecoded); + + structed_msg.id = AIFG_MSG_ID_HO_CMD; + + //l3Info not be test + + //cell identifier + aifg_ie_decode(&(predecoded.msg.HOCmd.cellId),&dst); + memcpy(&(structed_msg.msg.HOCmd.cellId),&(dst.param.bm_cellId), sizeof(dst.param.bm_cellId)); + structed_msg.msg.HOCmd.cellId.flag= 1; + + + msg_len = aifg_msg_sd_HOCmd(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 6); + CU_ASSERT_EQUAL(0, memcmp(&buffer[1], &msgsrc[10][10], msg_len-1)); + +} + + +void test_aifg_msg_HOComplete() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[11], &predecoded); + + structed_msg.id = AIFG_MSG_ID_HO_CMP; + + + //RR cause + aifg_ie_decode(&(predecoded.msg.HOComplete.rrcause),&dst); + memcpy(&(structed_msg.msg.HOComplete.rrCause),&(dst.param.bm_rrCause), sizeof(dst.param.bm_rrCause)); + structed_msg.msg.HOComplete.rrCause.flag= 1; + + + msg_len = aifg_msg_sd_HOComplete(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 3); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[11][2], msg_len)); + +} +*/ +void test_aifg_msg_HOCandidateEnq() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[12], &predecoded); + + structed_msg.id = AIFG_MSG_ID_HO_CAN_ENQ; + + + //number of mss + aifg_ie_decode(&(predecoded.msg.HOCandEnq.msNum),&dst); + memcpy(&(structed_msg.msg.HOCandidateEnq.msNum),&(dst.param.bm_msNum), sizeof(dst.param.bm_msNum)); + structed_msg.msg.HOCandidateEnq.msNum.flag= 1; + //cell identifier list + aifg_ie_decode(&(predecoded.msg.HOCandEnq.cellIdList),&dst); + memcpy(&(structed_msg.msg.HOCandidateEnq.cidList),&(dst.param.bm_cellIdList), sizeof(dst.param.bm_cellIdList)); + structed_msg.msg.HOCandidateEnq.cidList.flag= 1; + //cell identifier + aifg_ie_decode(&(predecoded.msg.HOCandEnq.cellId),&dst); + memcpy(&(structed_msg.msg.HOCandidateEnq.cellId),&(dst.param.bm_cellId), sizeof(dst.param.bm_cellId)); + structed_msg.msg.HOCandidateEnq.cellId.flag= 1; + + msg_len = aifg_msg_sd_HOCandEnq(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 18); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[12][2], msg_len)); + +} + + +void test_aifg_msg_HOCandidateResp() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[13], &predecoded); + + structed_msg.id = AIFG_MSG_ID_HO_CAN_RESP; + + + //number of mss + aifg_ie_decode(&(predecoded.msg.HOCandResp.msNum),&dst); + memcpy(&(structed_msg.msg.HOCandidateResp.msNum),&(dst.param.bm_msNum), sizeof(dst.param.bm_msNum)); + structed_msg.msg.HOCandidateResp.msNum.flag= 1; + + //cell identifier + aifg_ie_decode(&(predecoded.msg.HOCandResp.cellId),&dst); + memcpy(&(structed_msg.msg.HOCandidateResp.cellId),&(dst.param.bm_cellId), sizeof(dst.param.bm_cellId)); + structed_msg.msg.HOCandidateResp.cellId.flag= 1; + + msg_len = aifg_msg_sd_HOCandResp(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 8); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[13][2], msg_len)); + +} + + +void test_aifg_msg_HOFailure() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[14], &predecoded); + + structed_msg.id = AIFG_MSG_ID_HO_FAIL; + + + //cause + aifg_ie_decode(&(predecoded.msg.HOFailure.cause),&dst); + memcpy(&(structed_msg.msg.HOFailure.cause),&(dst.param.bm_cause), sizeof(dst.param.bm_cause)); + structed_msg.msg.HOFailure.cause.flag= 1; + //RR cause + aifg_ie_decode(&(predecoded.msg.HOFailure.rrcause),&dst); + memcpy(&(structed_msg.msg.HOFailure.rrCause),&(dst.param.bm_rrCause), sizeof(dst.param.bm_rrCause)); + structed_msg.msg.HOFailure.rrCause.flag= 1; + //circuit pool + aifg_ie_decode(&(predecoded.msg.HOFailure.circuitPool),&dst); + memcpy(&(structed_msg.msg.HOFailure.circuitPool),&(dst.param.bm_circuitPool), sizeof(dst.param.bm_circuitPool)); + structed_msg.msg.HOFailure.circuitPool.flag= 1; + //circuit pool list + aifg_ie_decode(&(predecoded.msg.HOFailure.circuitPoolList),&dst); + memcpy(&(structed_msg.msg.HOFailure.circuitPoolList),&(dst.param.bm_circuitPoolList), sizeof(dst.param.bm_circuitPoolList)); + structed_msg.msg.HOFailure.circuitPoolList.flag= 1; + + + msg_len = aifg_msg_sd_HOFailure(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 15); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[14][2], msg_len)); + +} + + +void test_aifg_msg_HOPerformed() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[15], &predecoded); + + structed_msg.id = AIFG_MSG_ID_HO_PERFORMED; + + + //cause + aifg_ie_decode(&(predecoded.msg.HOPerformed.cause),&dst); + memcpy(&(structed_msg.msg.HOPerformed.cause),&(dst.param.bm_cause), sizeof(dst.param.bm_cause)); + structed_msg.msg.HOPerformed.cause.flag= 1; + //cell identifier + aifg_ie_decode(&(predecoded.msg.HOPerformed.cellId),&dst); + memcpy(&(structed_msg.msg.HOPerformed.cellId),&(dst.param.bm_cellId), sizeof(dst.param.bm_cellId)); + structed_msg.msg.HOPerformed.cellId.flag= 1; + //chosen channel + aifg_ie_decode(&(predecoded.msg.HOPerformed.chosenChannel),&dst); + memcpy(&(structed_msg.msg.HOPerformed.chosenChannel),&(dst.param.bm_chosenChannel), sizeof(dst.param.bm_chosenChannel)); + structed_msg.msg.HOPerformed.chosenChannel.flag= 1; + //chosen encryption algnorithm + aifg_ie_decode(&(predecoded.msg.HOPerformed.chosenEncrypt),&dst); + memcpy(&(structed_msg.msg.HOPerformed.chosenEncrypt),&(dst.param.bm_chosenEncrypt), sizeof(dst.param.bm_chosenEncrypt)); + structed_msg.msg.HOPerformed.chosenEncrypt.flag= 1; + //speech version + aifg_ie_decode(&(predecoded.msg.HOPerformed.speechVer),&dst); + memcpy(&(structed_msg.msg.HOPerformed.speechVer),&(dst.param.bm_speechVer), sizeof(dst.param.bm_speechVer)); + structed_msg.msg.HOPerformed.speechVer.flag= 1; + //LSA identifier + aifg_ie_decode(&(predecoded.msg.HOPerformed.lsaId),&dst); + memcpy(&(structed_msg.msg.HOPerformed.lsaId),&(dst.param.bm_lsaId), sizeof(dst.param.bm_lsaId)); + structed_msg.msg.HOPerformed.lsaId.flag= 1; + + msg_len = aifg_msg_sd_HOPerformed(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 20); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[15][2], msg_len)); + +} + + +void test_aifg_msg_HOReject() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[16], &predecoded); + + structed_msg.id = AIFG_MSG_ID_HO_REQ_REJ; + + + //cause + aifg_ie_decode(&(predecoded.msg.HORequiredRej.cause),&dst); + memcpy(&(structed_msg.msg.HOReject.cause),&(dst.param.bm_cause), sizeof(dst.param.bm_cause)); + structed_msg.msg.HOReject.cause.flag= 1; + + + msg_len = aifg_msg_sd_HORequiredRej(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 4); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[16][2], msg_len)); + +} + + +void test_aifg_msg_HOSucceed() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[17], &predecoded); + + structed_msg.id = AIFG_MSG_ID_HO_SUC; + + msg_len = aifg_msg_sd_HOSucceed(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 1); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[17][2], msg_len)); + +} + + +void test_aifg_msg_HODetect() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[18], &predecoded); + + structed_msg.id = AIFG_MSG_ID_HO_DETECT; + + + msg_len = aifg_msg_sd_HODetect(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 1); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[18][2], msg_len)); + +} + + + +void test_aifg_msg_resrcReq() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[19], &predecoded); + + structed_msg.id = AIFG_MSG_ID_RESRC_REQ; + + + //periodicity + aifg_ie_decode(&(predecoded.msg.resrcReq.periodicity),&dst); + memcpy(&(structed_msg.msg.resourceReq.periodicity),&(dst.param.bm_periodicity), sizeof(dst.param.bm_periodicity)); + structed_msg.msg.resourceReq.periodicity.flag= 1; + //resource indication method + aifg_ie_decode(&(predecoded.msg.resrcReq.resrcIndMethod),&dst); + memcpy(&(structed_msg.msg.resourceReq.resrcIndMethod),&(dst.param.bm_resrcIndMethod), sizeof(dst.param.bm_resrcIndMethod)); + structed_msg.msg.resourceReq.resrcIndMethod.flag= 1; + //cell identifier + aifg_ie_decode(&(predecoded.msg.resrcReq.cellId),&dst); + memcpy(&(structed_msg.msg.resourceReq.cellId),&(dst.param.bm_cellId), sizeof(dst.param.bm_cellId)); + structed_msg.msg.resourceReq.cellId.flag= 1; + //extend resource indicator + aifg_ie_decode(&(predecoded.msg.resrcReq.extResrcInd),&dst); + memcpy(&(structed_msg.msg.resourceReq.extResrcInd),&(dst.param.bm_extResrcInd), sizeof(dst.param.bm_extResrcInd)); + structed_msg.msg.resourceReq.extResrcInd.flag= 1; + + + msg_len = aifg_msg_sd_resrcReq(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 12); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[19][2], msg_len)); + +} + + +void test_aifg_msg_resrcInd() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[20], &predecoded); + + structed_msg.id = AIFG_MSG_ID_RESRC_IND; + + //resource indication method + aifg_ie_decode(&(predecoded.msg.resrcInd.resrcIndMethod),&dst); + memcpy(&(structed_msg.msg.resourceInd.resrcIndMethod),&(dst.param.bm_resrcIndMethod), sizeof(dst.param.bm_resrcIndMethod)); + structed_msg.msg.resourceInd.resrcIndMethod.flag= 1; + + //resource available + aifg_ie_decode(&(predecoded.msg.resrcInd.resrcAvail),&dst); + memcpy(&(structed_msg.msg.resourceInd.resrcAvail),&(dst.param.bm_resrcAvail), sizeof(dst.param.bm_resrcAvail)); + structed_msg.msg.resourceInd.resrcAvail.flag= 1; + + //cell identifier + aifg_ie_decode(&(predecoded.msg.resrcInd.cellId),&dst); + memcpy(&(structed_msg.msg.resourceInd.cellId),&(dst.param.bm_cellId), sizeof(dst.param.bm_cellId)); + structed_msg.msg.resourceInd.cellId.flag= 1; + + //total resource accessable + aifg_ie_decode(&(predecoded.msg.resrcInd.totalResrc),&dst); + memcpy(&(structed_msg.msg.resourceInd.totalResrc),&(dst.param.bm_totalResrc), sizeof(dst.param.bm_totalResrc)); + structed_msg.msg.resourceInd.totalResrc.flag= 1; + + msg_len = aifg_msg_sd_resrcInd(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 34); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[20][2], msg_len)); +} + + +void test_aifg_msg_paging() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + //test + aifg_msg_proc(msgsrc[21], &predecoded); + + structed_msg.id = AIFG_MSG_ID_PAGING; + + //imsi + aifg_ie_decode(&(predecoded.msg.paging.imsi),&dst); + memcpy(&(structed_msg.msg.paging.imsi),&(dst.param.bm_imsi), sizeof(dst.param.bm_imsi)); + structed_msg.msg.paging.imsi.flag= 1; + + //tmsi + aifg_ie_decode(&(predecoded.msg.paging.tmsi),&dst); + memcpy(&(structed_msg.msg.paging.tmsi),&(dst.param.bm_tmsi), sizeof(dst.param.bm_tmsi)); + structed_msg.msg.paging.tmsi.flag= 1; + + //cell identifier list + aifg_ie_decode(&(predecoded.msg.paging.cellIdList),&dst); + memcpy(&(structed_msg.msg.paging.cidList),&(dst.param.bm_cellIdList), sizeof(dst.param.bm_cellIdList)); + structed_msg.msg.paging.cidList.flag= 1; + + //channel needed + aifg_ie_decode(&(predecoded.msg.paging.channelNeeded),&dst); + memcpy(&(structed_msg.msg.paging.channelNeeded),&(dst.param.bm_channelNeeded), sizeof(dst.param.bm_channelNeeded)); + structed_msg.msg.paging.channelNeeded.flag= 1; + + //eMLPP priority + aifg_ie_decode(&(predecoded.msg.paging.eMLPPpri),&dst); + memcpy(&(structed_msg.msg.paging.eMLPP),&(dst.param.bm_eMLPP), sizeof(dst.param.bm_eMLPP)); + structed_msg.msg.paging.eMLPP.flag= 1; + + msg_len = aifg_msg_sd_paging(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 31); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[21][2], msg_len)); + + //for unit test + memcpy(&bm_paging, &structed_msg, sizeof(structed_msg)); +} + + +void test_aifg_msg_clearReq() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[22], &predecoded); + + structed_msg.id = AIFG_MSG_ID_CLR_REQ; + + + //cause + aifg_ie_decode(&(predecoded.msg.clearReq.cause),&dst); + memcpy(&(structed_msg.msg.clearReq.cause),&(dst.param.bm_cause), sizeof(dst.param.bm_cause)); + structed_msg.msg.clearReq.cause.flag= 1; + + + msg_len = aifg_msg_sd_clearReq(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 4); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[22][2], msg_len)); + + //for unit test use + memcpy(&bm_clearReq, &structed_msg, sizeof(structed_msg)); +} + + +void test_aifg_msg_clearCmd() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[23], &predecoded); + + structed_msg.id = AIFG_MSG_ID_CLR_CMD; + + + //layer 3 header infomation + aifg_ie_decode(&(predecoded.msg.clearCmd.l3HeaderInfo),&dst); + memcpy(&(structed_msg.msg.clearCmd.l3HeaderInfo),&(dst.param.bm_L3HeaderInfo), sizeof(dst.param.bm_L3HeaderInfo)); + structed_msg.msg.clearCmd.l3HeaderInfo.flag= 1; + //cause + aifg_ie_decode(&(predecoded.msg.clearCmd.cause),&dst); + memcpy(&(structed_msg.msg.clearCmd.cause),&(dst.param.bm_cause), sizeof(dst.param.bm_cause)); + structed_msg.msg.clearCmd.cause.flag= 1; + + msg_len = aifg_msg_sd_clearCmd(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 8); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[23][2], msg_len)); + + //for unit test use + memcpy(&bm_clearCmd, &structed_msg, sizeof(structed_msg)); +} + + +void test_aifg_msg_reset() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[24], &predecoded); + + structed_msg.id = AIFG_MSG_ID_RESET; + + + //cause + aifg_ie_decode(&(predecoded.msg.reset.cause),&dst); + memcpy(&(structed_msg.msg.reset.cause),&(dst.param.bm_cause), sizeof(dst.param.bm_cause)); + structed_msg.msg.reset.cause.flag= 1; + + msg_len = aifg_msg_sd_reset(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 4); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[24][2], msg_len)); + +} + +void test_aifg_msg_overload() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + //test + aifg_msg_proc(msgsrc[25], &predecoded); + + structed_msg.id = AIFG_MSG_ID_OVERLOAD; + + + //cause + aifg_ie_decode(&(predecoded.msg.overload.cause),&dst); + memcpy(&(structed_msg.msg.overload.cause),&(dst.param.bm_cause), sizeof(dst.param.bm_cause)); + structed_msg.msg.overload.cause.flag= 1; + //cell identifier + aifg_ie_decode(&(predecoded.msg.overload.cellId),&dst); + memcpy(&(structed_msg.msg.overload.cellId),&(dst.param.bm_cellId), sizeof(dst.param.bm_cellId)); + structed_msg.msg.overload.cellId.flag= 1; + + msg_len = aifg_msg_sd_overload(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 9); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[25][2], msg_len)); + +} + +void test_aifg_msg_mscInvokeTrace() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + //test + aifg_msg_proc(msgsrc[26], &predecoded); + + structed_msg.id = AIFG_MSG_ID_MSC_INVK_TRACE; + + //trace type + aifg_ie_decode(&(predecoded.msg.mscTrace.traceType),&dst); + memcpy(&(structed_msg.msg.mscInvokeTrace.traceType),&(dst.param.bm_traceType), sizeof(dst.param.bm_traceType)); + structed_msg.msg.mscInvokeTrace.traceType.flag= 1; + //triggerid + aifg_ie_decode(&(predecoded.msg.mscTrace.triggerId),&dst); + memcpy(&(structed_msg.msg.mscInvokeTrace.tiggerId),&(dst.param.bm_triggerId), sizeof(dst.param.bm_triggerId)); + structed_msg.msg.mscInvokeTrace.tiggerId.flag= 1; + //trace reference + aifg_ie_decode(&(predecoded.msg.mscTrace.traceRef),&dst); + memcpy(&(structed_msg.msg.mscInvokeTrace.traceRef),&(dst.param.bm_traceRef), sizeof(dst.param.bm_traceRef)); + structed_msg.msg.mscInvokeTrace.traceRef.flag= 1; + //transactionid + aifg_ie_decode(&(predecoded.msg.mscTrace.transId),&dst); + memcpy(&(structed_msg.msg.mscInvokeTrace.transId),&(dst.param.bm_transId), sizeof(dst.param.bm_transId)); + structed_msg.msg.mscInvokeTrace.transId.flag= 1; + //mobile identity + aifg_ie_decode(&(predecoded.msg.mscTrace.mobileId),&dst); + memcpy(&(structed_msg.msg.mscInvokeTrace.mobileId),&(dst.param.mobileId), sizeof(dst.param.mobileId)); + structed_msg.msg.mscInvokeTrace.mobileId.flag= 1; + //OMCId + aifg_ie_decode(&(predecoded.msg.mscTrace.omcId),&dst); + memcpy(&(structed_msg.msg.mscInvokeTrace.omcId),&(dst.param.bm_omcId), sizeof(dst.param.bm_omcId)); + structed_msg.msg.mscInvokeTrace.omcId.flag= 1; + + msg_len = aifg_msg_sd_mscTrace(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 24); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[26][2], msg_len)); +} + +void test_aifg_msg_bscInvokeTrace() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + //test + aifg_msg_proc(msgsrc[27], &predecoded); + + structed_msg.id = AIFG_MSG_ID_BSC_INVK_TRACE; + + //trace type + aifg_ie_decode(&(predecoded.msg.bscTrace.traceType),&dst); + memcpy(&(structed_msg.msg.bscInvokeTrace.traceType),&(dst.param.bm_traceType), sizeof(dst.param.bm_traceType)); + structed_msg.msg.bscInvokeTrace.traceType.flag= 1; + //triggerid + aifg_ie_decode(&(predecoded.msg.bscTrace.triggerId),&dst); + memcpy(&(structed_msg.msg.bscInvokeTrace.tiggerId),&(dst.param.bm_triggerId), sizeof(dst.param.bm_triggerId)); + structed_msg.msg.bscInvokeTrace.tiggerId.flag= 1; + //trace reference + aifg_ie_decode(&(predecoded.msg.bscTrace.traceRef),&dst); + memcpy(&(structed_msg.msg.bscInvokeTrace.traceRef),&(dst.param.bm_traceRef), sizeof(dst.param.bm_traceRef)); + structed_msg.msg.bscInvokeTrace.traceRef.flag= 1; + //transactionid + aifg_ie_decode(&(predecoded.msg.bscTrace.transId),&dst); + memcpy(&(structed_msg.msg.bscInvokeTrace.transId),&(dst.param.bm_transId), sizeof(dst.param.bm_transId)); + structed_msg.msg.bscInvokeTrace.transId.flag= 1; + //forward indicator + aifg_ie_decode(&(predecoded.msg.bscTrace.forwardInd),&dst); + memcpy(&(structed_msg.msg.bscInvokeTrace.forwardInd),&(dst.param.bm_fowardInd), sizeof(dst.param.bm_fowardInd)); + structed_msg.msg.bscInvokeTrace.forwardInd.flag= 1; + //OMCId + aifg_ie_decode(&(predecoded.msg.bscTrace.omcId),&dst); + memcpy(&(structed_msg.msg.bscInvokeTrace.omcId),&(dst.param.bm_omcId), sizeof(dst.param.bm_omcId)); + structed_msg.msg.bscInvokeTrace.omcId.flag= 1; + + msg_len = aifg_msg_sd_bscTrace(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 22); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[27][2], msg_len)); +} + + +void test_aifg_msg_cmUpdate() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + //test + aifg_msg_proc(msgsrc[28], &predecoded); + + structed_msg.id = AIFG_MSG_ID_CM_UPDATE; + + //classmark information type 2 + aifg_ie_decode(&(predecoded.msg.cmUpdate.cmInfo2),&dst); + memcpy(&(structed_msg.msg.cmUpdate.cm2),&(dst.param.bm_cmInfo2), sizeof(dst.param.bm_cmInfo2)); + structed_msg.msg.cmUpdate.cm2.flag= 1; + //classmark information type 3 not be tested + + msg_len = aifg_msg_sd_cmUpdate(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 6); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[28][2], msg_len)); +} + + +void test_aifg_msg_cipherModeCmd() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + //test + aifg_msg_proc(msgsrc[29], &predecoded); + + structed_msg.id = AIFG_MSG_ID_CIPHER_MODE_CMD; + + //layer 3 header infomation + aifg_ie_decode(&(predecoded.msg.cipherModeCmd.l3HeaderInfo),&dst); + memcpy(&(structed_msg.msg.cipherModeCmd.l3HeaderInfo),&(dst.param.bm_L3HeaderInfo), sizeof(dst.param.bm_L3HeaderInfo)); + structed_msg.msg.cipherModeCmd.l3HeaderInfo.flag= 1; + //encryption information + aifg_ie_decode(&(predecoded.msg.cipherModeCmd.encryptInfo),&dst); + memcpy(&(structed_msg.msg.cipherModeCmd.encryptInfo),&(dst.param.bm_encryptInfo), sizeof(dst.param.bm_encryptInfo)); + structed_msg.msg.cipherModeCmd.encryptInfo.flag= 1; + //cipher response mode + aifg_ie_decode(&(predecoded.msg.cipherModeCmd.cipherRespMode),&dst); + memcpy(&(structed_msg.msg.cipherModeCmd.cipherRespMode),&(dst.param.bm_cipherRespMode), sizeof(dst.param.bm_cipherRespMode)); + structed_msg.msg.cipherModeCmd.cipherRespMode.flag= 1; + + msg_len = aifg_msg_sd_cipherModeCmd(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 10); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[29][2], msg_len)); +} + + +void test_aifg_msg_cipherModeComplete() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[30], &predecoded); + + structed_msg.id = AIFG_MSG_ID_CIPHER_MODE_CMP; + + + //layer 3 message contents not be tested because not done in the ie_decode&ie_encode + + //chosen encryption algorithm + aifg_ie_decode(&(predecoded.msg.cipherModeComp.chosenEncrypt),&dst); + memcpy(&(structed_msg.msg.cipherModeComplete.chosenEncrypt),&(dst.param.bm_chosenEncrypt), sizeof(dst.param.bm_chosenEncrypt)); + structed_msg.msg.cipherModeComplete.chosenEncrypt.flag= 1; + + + msg_len = aifg_msg_sd_cipherModeComplete(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 3); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[30][2], msg_len)); + +} + + +void test_aifg_msg_cipherModeReject() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[31], &predecoded); + + structed_msg.id = AIFG_MSG_ID_CIPHER_MODE_REJ; + + + //cause + aifg_ie_decode(&(predecoded.msg.cipherModeRej.cause),&dst); + memcpy(&(structed_msg.msg.cipherModeReject.cause),&(dst.param.bm_cause), sizeof(dst.param.bm_cause)); + structed_msg.msg.cipherModeReject.cause.flag= 1; + + + msg_len = aifg_msg_sd_cipherModeRej(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 4); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[31][2], msg_len)); + +} + +void test_aifg_msg_completeL3Info() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + memset(&l3Info,0,sizeof(l3Info)); + + //test + aifg_msg_proc(msgsrc[32], &predecoded); + + structed_msg.id = AIFG_MSG_ID_L3_INFO; + + //cell identifier + aifg_ie_decode(&(predecoded.msg.completeL3Info.cellId),&dst); + memcpy(&(structed_msg.msg.completeL3Info.cellId),&(dst.param.bm_cellId), sizeof(dst.param.bm_cellId)); + structed_msg.msg.completeL3Info.cellId.flag= 1; + + //layer 3 infomation + //CM service type + structed_msg.msg.completeL3Info.l3Info.ptr = &msgsrc[32][10]; + structed_msg.msg.completeL3Info.l3Info.len = 11; +/* + l3Info.id = AIFG_MSG_ID_CM_REQUEST; + aifg_ie_decode(&(predecoded.msg.completeL3Info.l3msg.msg.cmRequest.type),&dst); + memcpy(&(l3Info.msg.cmRequest.cmType),&(dst.param.dt_cmType), sizeof(dst.param.dt_cmType)); + l3Info.msg.cmRequest.cmType.flag= 1; + + //ciphering key sequence number + aifg_ie_decode(&(predecoded.msg.completeL3Info.l3msg.msg.cmRequest.cipherKeySeq),&dst); + memcpy(&(l3Info.msg.cmRequest.cipherKey),&(dst.param.dt_cipherKey), sizeof(dst.param.dt_cipherKey)); + l3Info.msg.cmRequest.cipherKey.flag= 1; + //mobile station classmark 2 + aifg_ie_decode(&(predecoded.msg.completeL3Info.l3msg.msg.cmRequest.cm2),&dst); + memcpy(&(l3Info.msg.cmRequest.cmInfo2),&(dst.param.dt_cmInfo2), sizeof(dst.param.dt_cmInfo2)); + l3Info.msg.cmRequest.cmInfo2.flag= 1; + + //mobile identity + aifg_ie_decode(&(predecoded.msg.completeL3Info.l3msg.msg.cmRequest.mobileId),&dst); + memcpy(&(l3Info.msg.cmRequest.mobileId),&(dst.param.mobileId), sizeof(dst.param.mobileId)); + l3Info.msg.cmRequest.mobileId.flag= 1; + + //priority level + aifg_ie_decode(&(predecoded.msg.completeL3Info.l3msg.msg.cmRequest.priority),&dst); + memcpy(&(l3Info.msg.cmRequest.priority),&(dst.param.dt_priority), sizeof(dst.param.dt_priority)); + l3Info.msg.cmRequest.priority.flag= 1; + + memcpy(&(structed_msg.msg.completeL3Info.l3Info), &l3Info, sizeof(l3Info)); +*/ + + //chosen channel + aifg_ie_decode(&(predecoded.msg.completeL3Info.chosenChannel),&dst); + memcpy(&(structed_msg.msg.completeL3Info.chosenChannel),&(dst.param.bm_chosenChannel), sizeof(dst.param.bm_chosenChannel)); + structed_msg.msg.completeL3Info.chosenChannel.flag= 1; + + //LSA identity list + aifg_ie_decode(&(predecoded.msg.completeL3Info.lsaIdList),&dst); + memcpy(&(structed_msg.msg.completeL3Info.lsaIdList),&(dst.param.bm_lsaIdList), sizeof(dst.param.bm_lsaIdList)); + structed_msg.msg.completeL3Info.lsaIdList.flag= 1; + + //location information + aifg_ie_decode(&(predecoded.msg.completeL3Info.locInfo),&dst); + memcpy(&(structed_msg.msg.completeL3Info.locInfo),&(dst.param.bm_locInfo), sizeof(dst.param.bm_locInfo)); + structed_msg.msg.completeL3Info.locInfo.flag= 1; + + msg_len = aifg_msg_sd_completeL3Info(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 35); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[32][2],35)); + + //for unit test use + memcpy(&bm_completeL3, &structed_msg, sizeof(structed_msg)); +} + + +void test_aifg_msg_SAPI_n_Reject() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[33], &predecoded); + + structed_msg.id = AIFG_MSG_ID_SAPI_REJ; + + + //dlci + aifg_ie_decode(&(predecoded.msg.sapi_n_rej.dlci),&dst); + memcpy(&(structed_msg.msg.SAPI_n_Reject.dlci),&(dst.param.bm_dlci), sizeof(dst.param.bm_dlci)); + structed_msg.msg.SAPI_n_Reject.dlci.flag= 1; + //cause + aifg_ie_decode(&(predecoded.msg.sapi_n_rej.cause),&dst); + memcpy(&(structed_msg.msg.SAPI_n_Reject.cause),&(dst.param.bm_cause), sizeof(dst.param.bm_cause)); + structed_msg.msg.SAPI_n_Reject.cause.flag= 1; + + + + msg_len = aifg_msg_sd_sapi_n_rej(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 6); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[33][2], msg_len)); + +} + +void test_aifg_msg_resetCircuit() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[34], &predecoded); + + structed_msg.id = AIFG_MSG_ID_RESET_CC; + + + //circuit identifier code + aifg_ie_decode(&(predecoded.msg.resetCircuit.cic),&dst); + memcpy(&(structed_msg.msg.resetCircuit.cic),&(dst.param.bm_cic), sizeof(dst.param.bm_cic)); + structed_msg.msg.resetCircuit.cic.flag= 1; + //cause + aifg_ie_decode(&(predecoded.msg.resetCircuit.cause),&dst); + memcpy(&(structed_msg.msg.resetCircuit.cause),&(dst.param.bm_cause), sizeof(dst.param.bm_cause)); + structed_msg.msg.resetCircuit.cause.flag= 1; + + + msg_len = aifg_msg_sd_resetCircuit(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 7); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[34][2], msg_len)); + +} + + +void test_aifg_msg_resetCircuitAck() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + //test + aifg_msg_proc(msgsrc[35], &predecoded); + + structed_msg.id = AIFG_MSG_ID_RESET_CC_ACK; + + //circuit identifier code + aifg_ie_decode(&(predecoded.msg.resetCircuitAck.cic),&dst); + memcpy(&(structed_msg.msg.resetCircuitAck.cic),&(dst.param.bm_cic), sizeof(dst.param.bm_cic)); + structed_msg.msg.resetCircuitAck.cic.flag= 1; + + msg_len = aifg_msg_sd_resetCircuitAck(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,4); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[35][2], msg_len)); +} + + +void test_aifg_msg_circuitGrpBlk() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + //test + aifg_msg_proc(msgsrc[36], &predecoded); + + structed_msg.id = AIFG_MSG_ID_CC_GROUP_BLK; + + //cause + aifg_ie_decode(&(predecoded.msg.ccGroupBlock.cause),&dst); + memcpy(&(structed_msg.msg.ccGroupBlock.cause),&(dst.param.bm_cause), sizeof(dst.param.bm_cause)); + structed_msg.msg.ccGroupBlock.cause.flag= 1; + + //cic + aifg_ie_decode(&(predecoded.msg.ccGroupBlock.cic),&dst); + memcpy(&(structed_msg.msg.ccGroupBlock.cic),&(dst.param.bm_cic), sizeof(dst.param.bm_cic)); + structed_msg.msg.ccGroupBlock.cic.flag= 1; + + //cic list + aifg_ie_decode(&(predecoded.msg.ccGroupBlock.cicList),&dst); + memcpy(&(structed_msg.msg.ccGroupBlock.cicList),&(dst.param.bm_cicList), sizeof(dst.param.bm_cicList)); + structed_msg.msg.ccGroupBlock.cicList.flag= 1; + + msg_len = aifg_msg_sd_ccGrpBlk(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,13); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[36][2], msg_len)); +} + +void test_aifg_msg_circuitGrpBlkAck() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[37], &predecoded); + + structed_msg.id = AIFG_MSG_ID_CC_GROUP_BLK_ACK; + + + //cic + aifg_ie_decode(&(predecoded.msg.ccGroupBlockAck.cic),&dst); + memcpy(&(structed_msg.msg.ccGroupBlockAck.cic),&(dst.param.bm_cic), sizeof(dst.param.bm_cic)); + structed_msg.msg.ccGroupBlockAck.cic.flag= 1; + + //cic list + aifg_ie_decode(&(predecoded.msg.ccGroupBlockAck.cicList),&dst); + memcpy(&(structed_msg.msg.ccGroupBlockAck.cicList),&(dst.param.bm_cicList), sizeof(dst.param.bm_cicList)); + structed_msg.msg.ccGroupBlockAck.cicList.flag= 1; + + msg_len = aifg_msg_sd_ccGroupBlockAck(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,10); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[37][2], msg_len)); + +} + +void test_aifg_msg_circuitGrpUnblk() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[38], &predecoded); + + structed_msg.id = AIFG_MSG_ID_CC_GROUP_UNBLK; + + + //cic + aifg_ie_decode(&(predecoded.msg.ccGroupUnblock.cic),&dst); + memcpy(&(structed_msg.msg.ccGroupUnblock.cic),&(dst.param.bm_cic), sizeof(dst.param.bm_cic)); + structed_msg.msg.ccGroupUnblock.cic.flag= 1; + + //cic list + aifg_ie_decode(&(predecoded.msg.ccGroupUnblock.cicList),&dst); + memcpy(&(structed_msg.msg.ccGroupUnblock.cicList),&(dst.param.bm_cicList), sizeof(dst.param.bm_cicList)); + structed_msg.msg.ccGroupUnblock.cicList.flag= 1; + + msg_len = aifg_msg_sd_ccGroupUnblock(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,10); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[38][2], msg_len)); + +} + +void test_aifg_msg_circuitGrpUnblkAck() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[39], &predecoded); + + structed_msg.id = AIFG_MSG_ID_CC_GROUP_UNBLK_ACK; + + + //cic + aifg_ie_decode(&(predecoded.msg.ccGroupUnblockAck.cic),&dst); + memcpy(&(structed_msg.msg.ccGroupUnblockAck.cic),&(dst.param.bm_cic), sizeof(dst.param.bm_cic)); + structed_msg.msg.ccGroupUnblockAck.cic.flag= 1; + + //cic list + aifg_ie_decode(&(predecoded.msg.ccGroupUnblockAck.cicList),&dst); + memcpy(&(structed_msg.msg.ccGroupUnblockAck.cicList),&(dst.param.bm_cicList), sizeof(dst.param.bm_cicList)); + structed_msg.msg.ccGroupUnblockAck.cicList.flag= 1; + + msg_len = aifg_msg_sd_ccGroupUnblockAck(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,10); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[39][2], msg_len)); + +} + +void test_aifg_msg_confusion() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[40], &predecoded); + + structed_msg.id = AIFG_MSG_ID_CONFUSION; + + + //cause + aifg_ie_decode(&(predecoded.msg.confusion.cause),&dst); + memcpy(&(structed_msg.msg.confusion.cause),&(dst.param.bm_cause), sizeof(dst.param.bm_cause)); + structed_msg.msg.confusion.cause.flag= 1; + + //diagnostics + aifg_ie_decode(&(predecoded.msg.confusion.diagnostics),&dst); + memcpy(&(structed_msg.msg.confusion.diagnostics),&(dst.param.bm_diagnostics), sizeof(dst.param.bm_diagnostics)); + structed_msg.msg.confusion.diagnostics.flag= 1; + + msg_len = aifg_msg_sd_confusion(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,10); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[40][2], msg_len)); + +} + +void test_aifg_msg_unequippedCircuit() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[41], &predecoded); + + structed_msg.id = AIFG_MSG_ID_UNEQUIP_CC; + + + //cic + aifg_ie_decode(&(predecoded.msg.upequipCircuit.cic),&dst); + memcpy(&(structed_msg.msg.unequippedCircuit.cic),&(dst.param.bm_cic), sizeof(dst.param.bm_cic)); + structed_msg.msg.unequippedCircuit.cic.flag= 1; + + //cic list + aifg_ie_decode(&(predecoded.msg.upequipCircuit.cicList),&dst); + memcpy(&(structed_msg.msg.unequippedCircuit.cicList),&(dst.param.bm_cicList), sizeof(dst.param.bm_cicList)); + structed_msg.msg.unequippedCircuit.cicList.flag= 1; + + msg_len = aifg_msg_sd_unequippedCircuit(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,10); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[41][2], msg_len)); + +} + +void test_aifg_msg_loadIndication() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[42], &predecoded); + + structed_msg.id = AIFG_MSG_ID_LOAD_IND; + + + //time indication + aifg_ie_decode(&(predecoded.msg.loadInd.timeInd),&dst); + memcpy(&(structed_msg.msg.loadInd.timeInd),&(dst.param.bm_timeId), sizeof(dst.param.bm_timeId)); + structed_msg.msg.loadInd.timeInd.flag= 1; + //cell identity + aifg_ie_decode(&(predecoded.msg.loadInd.cellId),&dst); + memcpy(&(structed_msg.msg.loadInd.cellId),&(dst.param.bm_cellId), sizeof(dst.param.bm_cellId)); + structed_msg.msg.loadInd.cellId.flag= 1; + //cell identity list + aifg_ie_decode(&(predecoded.msg.loadInd.cellIdList),&dst); + memcpy(&(structed_msg.msg.loadInd.cidList),&(dst.param.bm_cellIdList), sizeof(dst.param.bm_cellIdList)); + structed_msg.msg.loadInd.cidList.flag= 1; + //resource situation + aifg_ie_decode(&(predecoded.msg.loadInd.resrcSit),&dst); + memcpy(&(structed_msg.msg.loadInd.resrcSit),&(dst.param.bm_resrcSit), sizeof(dst.param.bm_resrcSit)); + structed_msg.msg.loadInd.resrcSit.flag= 1; + //cause + aifg_ie_decode(&(predecoded.msg.loadInd.cause),&dst); + memcpy(&(structed_msg.msg.loadInd.cause),&(dst.param.bm_cause), sizeof(dst.param.bm_cause)); + structed_msg.msg.loadInd.cause.flag= 1; + + + msg_len = aifg_msg_sd_loadInd(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,29); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[42][2], msg_len)); + +} + +void test_aifg_msg_suspend() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[43], &predecoded); + + structed_msg.id = AIFG_MSG_ID_SUSPEND; + + + //dlci + aifg_ie_decode(&(predecoded.msg.suspend.dlci),&dst); + memcpy(&(structed_msg.msg.suspend.dlci),&(dst.param.bm_dlci), sizeof(dst.param.bm_dlci)); + structed_msg.msg.suspend.dlci.flag= 1; + + + msg_len = aifg_msg_sd_suspend(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,3); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[43][2], msg_len)); + +} + +void test_aifg_msg_resume() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[44], &predecoded); + + structed_msg.id = AIFG_MSG_ID_RESUME; + + + //dlci + aifg_ie_decode(&(predecoded.msg.resume.dlci),&dst); + memcpy(&(structed_msg.msg.resume.dlci),&(dst.param.bm_dlci), sizeof(dst.param.bm_dlci)); + structed_msg.msg.resume.dlci.flag= 1; + + + msg_len = aifg_msg_sd_resume(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,3); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[44][2], msg_len)); + +} + +void test_aifg_msg_changeCircuit() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[45], &predecoded); + + structed_msg.id = AIFG_MSG_ID_CHANGE_CC; + + + //cause + aifg_ie_decode(&(predecoded.msg.changeCC.cause),&dst); + memcpy(&(structed_msg.msg.changeCircuit.cause),&(dst.param.bm_cause), sizeof(dst.param.bm_cause)); + structed_msg.msg.changeCircuit.cause.flag= 1; + + + msg_len = aifg_msg_sd_changeCircuit(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,4); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[45][2], msg_len)); + +} + +void test_aifg_msg_changeCCAck() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[46], &predecoded); + + structed_msg.id = AIFG_MSG_ID_CHANGE_CC_ACK; + + + //cic + aifg_ie_decode(&(predecoded.msg.changeCCAck.circuitId),&dst); + memcpy(&(structed_msg.msg.changeCircuitAck.cic),&(dst.param.bm_cic), sizeof(dst.param.bm_cic)); + structed_msg.msg.changeCircuitAck.cic.flag= 1; + + + msg_len = aifg_msg_sd_changeCircuitAck(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,4); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[46][2], msg_len)); + +} + +void test_aifg_msg_locCmd() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[47], &predecoded); + + structed_msg.id = AIFG_MSG_ID_LOC_INFO_CMD; + + + //location information + aifg_ie_decode(&(predecoded.msg.locInfoCmd.locInfo),&dst); + memcpy(&(structed_msg.msg.locCmd.locInfo),&(dst.param.bm_locInfo), sizeof(dst.param.bm_locInfo)); + structed_msg.msg.locCmd.locInfo.flag= 1; + + + msg_len = aifg_msg_sd_locCmd(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,6); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[47][2], msg_len)); + +} + +void test_aifg_msg_locReport() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[48], &predecoded); + + structed_msg.id = AIFG_MSG_ID_LOC_INFO_RPT; + + + //location information + aifg_ie_decode(&(predecoded.msg.locInfoReport.locInfo),&dst); + memcpy(&(structed_msg.msg.locReport.locInfo),&(dst.param.bm_locInfo), sizeof(dst.param.bm_locInfo)); + structed_msg.msg.locReport.locInfo.flag= 1; + + /*/cause + aifg_ie_decode(&(predecoded.msg.locInfoReport.cause),&dst); + memcpy(&(structed_msg.msg.locReport.cause),&(dst.param.bm_cause), sizeof(dst.param.bm_cause)); + structed_msg.msg.locReport.cause.flag= 1;*/ + + msg_len = aifg_msg_sd_locReport(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,6); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[48][2], msg_len)); + +} + +void test_aifg_msg_resetAck() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[49], &predecoded); + + structed_msg.id = AIFG_MSG_ID_RESET_ACK; + + msg_len = aifg_msg_sd_resetAck(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,1); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[49][2], msg_len)); + +} + +void test_aifg_msg_clearComplete() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[50], &predecoded); + + structed_msg.id = AIFG_MSG_ID_CLR_CMP; + + msg_len = aifg_msg_sd_clearComplete(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,1); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[50][2], msg_len)); + +} + +void test_aifg_msg_queueInd() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[51], &predecoded); + + structed_msg.id = AIFG_MSG_ID_QUEUE_IND; + + msg_len = aifg_msg_sd_queueInd(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,1); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[51][2], msg_len)); + +} + +void test_aifg_msg_cmkRequest() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[52], &predecoded); + + structed_msg.id = AIFG_MSG_ID_CLASSMARK_REQ; + + msg_len = aifg_msg_sd_classmarkReq(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,1); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[52][2], msg_len)); + +} + +///////////////dtap msg //////////////////////////////////////////////////////////// +void test_aifg_msg_luAccept() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + //test + aifg_msg_proc(msgsrc[53], &predecoded); + + structed_msg.id = AIFG_MSG_ID_LU_ACCEPT; + + //location area identification + aifg_ie_decode(&(predecoded.msg.luAccept.lai),&dst); + memcpy(&(structed_msg.msg.luAccept.lai),&(dst.param.dt_lai), sizeof(dst.param.dt_lai)); + structed_msg.msg.luAccept.lai.flag= 1; + + //mobile identity + aifg_ie_decode(&(predecoded.msg.luAccept.mobileId),&dst); + memcpy(&(structed_msg.msg.luAccept.mobileId),&(dst.param.mobileId), sizeof(dst.param.mobileId)); + structed_msg.msg.luAccept.mobileId.flag= 1; + + //follow on proceed + aifg_ie_decode(&(predecoded.msg.luAccept.followOnProc),&dst); + memcpy(&(structed_msg.msg.luAccept.followOnProceed),&(dst.param.dt_followOnProceed), sizeof(dst.param.dt_followOnProceed)); + structed_msg.msg.luAccept.followOnProceed.flag= 1; + + //CTS permission + aifg_ie_decode(&(predecoded.msg.luAccept.ctsPerm),&dst); + memcpy(&(structed_msg.msg.luAccept.CTSPermission),&(dst.param.dt_CTSPermission), sizeof(dst.param.dt_CTSPermission)); + structed_msg.msg.luAccept.CTSPermission.flag= 1; + + msg_len = aifg_msg_sd_luAccept(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,12); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[53][4], msg_len)); +} + +void test_aifg_msg_cmReject() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[54], &predecoded); + + structed_msg.id = AIFG_MSG_ID_CM_REJECT; + + + //reject cause + aifg_ie_decode(&(predecoded.msg.cmRej.rejCause),&dst); + memcpy(&(structed_msg.msg.cmReject.rejectCause),&(dst.param.dt_rejectCause), sizeof(dst.param.dt_rejectCause)); + structed_msg.msg.cmReject.rejectCause.flag= 1; + + + msg_len = aifg_msg_sd_cmRej(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,2); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[54][4], msg_len)); + +} + +void test_aifg_msg_luReject() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + //test + aifg_msg_proc(msgsrc[55], &predecoded); + + structed_msg.id = AIFG_MSG_ID_LU_REJECT; + + //reject cause + aifg_ie_decode(&(predecoded.msg.luReject.rejCause),&dst); + memcpy(&(structed_msg.msg.luReject.rejectCause),&(dst.param.dt_rejectCause), sizeof(dst.param.dt_rejectCause)); + structed_msg.msg.luReject.rejectCause.flag= 1; + + msg_len = aifg_msg_sd_luReject(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,2); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[55][4], msg_len)); +} + +void test_aifg_msg_abort() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[56], &predecoded); + + structed_msg.id = AIFG_MSG_ID_ABORT; + + + //reject cause + aifg_ie_decode(&(predecoded.msg.abort.rejCause),&dst); + memcpy(&(structed_msg.msg.abort.rejectCause),&(dst.param.dt_rejectCause), sizeof(dst.param.dt_rejectCause)); + structed_msg.msg.abort.rejectCause.flag= 1; + + + msg_len = aifg_msg_sd_abort(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,2); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[56][4], msg_len)); + +} + +void test_aifg_msg_mmStatus() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[57], &predecoded); + + structed_msg.id = AIFG_MSG_ID_MM_STATUS; + + + //reject cause + aifg_ie_decode(&(predecoded.msg.mmStatus.rejCause),&dst); + memcpy(&(structed_msg.msg.mmStatus.rejectCause),&(dst.param.dt_rejectCause), sizeof(dst.param.dt_rejectCause)); + structed_msg.msg.mmStatus.rejectCause.flag= 1; + + + msg_len = aifg_msg_sd_mmStatus(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,2); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[57][4], msg_len)); + +} + +void test_aifg_msg_luRequest() +{ + memset(&l3Info,0,sizeof(l3Info)); + memset(&predecode_l3msg,0,sizeof(predecode_l3msg)); + + //test + aifg_msg_decode_embeded_l3msg(msgsrc[58], &predecode_l3msg); + + l3Info.id = AIFG_MSG_ID_LU_REQUEST; + + //location updating type + aifg_ie_decode(&(predecode_l3msg.msg.luRequest.type),&dst); + memcpy(&(l3Info.msg.luRequest.luType),&(dst.param.dt_luType), sizeof(dst.param.dt_luType)); + l3Info.msg.luRequest.luType.flag= 1; + + //ciphering key sequence number + aifg_ie_decode(&(predecode_l3msg.msg.luRequest.cipherKeySeq),&dst); + memcpy(&(l3Info.msg.luRequest.cipherKey),&(dst.param.dt_cipherKey), sizeof(dst.param.dt_cipherKey)); + l3Info.msg.luRequest.cipherKey.flag= 1; + + //location area identification + aifg_ie_decode(&(predecode_l3msg.msg.luRequest.lai),&dst); + memcpy(&(l3Info.msg.luRequest.lai),&(dst.param.dt_lai), sizeof(dst.param.dt_lai)); + l3Info.msg.luRequest.lai.flag= 1; + + //mobile station classmark 1 + aifg_ie_decode(&(predecode_l3msg.msg.luRequest.cm1),&dst); + memcpy(&(l3Info.msg.luRequest.cmInfo1),&(dst.param.dt_cmInfo1), sizeof(dst.param.dt_cmInfo1)); + l3Info.msg.luRequest.cmInfo1.flag= 1; + + //mobile identity + aifg_ie_decode(&(predecode_l3msg.msg.luRequest.mobileId),&dst); + memcpy(&(l3Info.msg.luRequest.mobileId),&(dst.param.mobileId), sizeof(dst.param.mobileId)); + l3Info.msg.luRequest.mobileId.flag= 1; + + msg_len = aifg_msg_encode_embeded_l3msg(&l3Info, buffer); + CU_ASSERT_EQUAL(msg_len,12); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[58][0], msg_len)); +} + + +void test_aifg_msg_authRequest () +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + //test + aifg_msg_proc(msgsrc[59], &predecoded); + + structed_msg.id = AIFG_MSG_ID_AUTH_REQUEST; + + //ciphering key sequence number + aifg_ie_decode(&(predecoded.msg.authReq.cipherKeySeq),&dst); + memcpy(&(structed_msg.msg.authRequest.cipherKey),&(dst.param.dt_cipherKey), sizeof(dst.param.dt_cipherKey)); + structed_msg.msg.authRequest.cipherKey.flag= 1; + + //authentication parameter RAND + aifg_ie_decode(&(predecoded.msg.authReq.authParamRAND),&dst); + memcpy(&(structed_msg.msg.authRequest.authRAND),&(dst.param.dt_authRAND), sizeof(dst.param.dt_authRAND)); + structed_msg.msg.authRequest.authRAND.flag= 1; + + msg_len = aifg_msg_sd_authReq(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,18); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[59][4], msg_len)); +} + +void test_aifg_msg_authResp () +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[60], &predecoded); + + structed_msg.id = AIFG_MSG_ID_AUTH_RESPONSE; + + + //authentication parameter SRES + aifg_ie_decode(&(predecoded.msg.authResp.authParamSRES),&dst); + memcpy(&(structed_msg.msg.authResp.authSRES),&(dst.param.dt_authSRES), sizeof(dst.param.dt_authSRES)); + structed_msg.msg.authResp.authSRES.flag= 1; + + msg_len = aifg_msg_sd_authResp(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,5); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[60][4], msg_len)); + +} + +void test_aifg_msg_idRequest () +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[61], &predecoded); + + structed_msg.id = AIFG_MSG_ID_ID_REQUEST; + + + //identity type + aifg_ie_decode(&(predecoded.msg.idReq.type),&dst); + memcpy(&(structed_msg.msg.idRequest.idType),&(dst.param.dt_idType), sizeof(dst.param.dt_idType)); + structed_msg.msg.idRequest.idType.flag= 1; + + msg_len = aifg_msg_sd_idReq(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,2); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[61][4], msg_len)); + +} + +void test_aifg_msg_idResp () +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[62], &predecoded); + + structed_msg.id = AIFG_MSG_ID_ID_RESPONSE; + + + //mobile identity + aifg_ie_decode(&(predecoded.msg.idResp.mobileId),&dst); + memcpy(&(structed_msg.msg.idResp.mobileId),&(dst.param.mobileId), sizeof(dst.param.mobileId)); + structed_msg.msg.idResp.mobileId.flag= 1; + + msg_len = aifg_msg_sd_idResp(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,4); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[62][4], msg_len)); + +} + +void test_aifg_msg_imsiDetachInd () +{ + memset(&l3Info,0,sizeof(l3Info)); + memset(&predecode_l3msg,0,sizeof(predecode_l3msg)); + + //test + aifg_msg_decode_embeded_l3msg(msgsrc[63], &predecode_l3msg); + + l3Info.id = AIFG_MSG_ID_IMSI_DETACH_IND; + + //mobile station classmark 1 + aifg_ie_decode(&(predecode_l3msg.msg.imsiDetachInd.cm1),&dst); + memcpy(&(l3Info.msg.imsiDetachInd.cmInfo1),&(dst.param.dt_cmInfo1), sizeof(dst.param.dt_cmInfo1)); + l3Info.msg.imsiDetachInd.cmInfo1.flag= 1; + + //mobile identity + aifg_ie_decode(&(predecode_l3msg.msg.imsiDetachInd.mobileId),&dst); + memcpy(&(l3Info.msg.imsiDetachInd.mobileId),&(dst.param.mobileId), sizeof(dst.param.mobileId)); + l3Info.msg.imsiDetachInd.mobileId.flag= 1; + + msg_len = aifg_msg_encode_embeded_l3msg(&l3Info, buffer); + CU_ASSERT_EQUAL(msg_len,6); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[63][0], msg_len)); +} + +void test_aifg_msg_tmsiCmd() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + //test + aifg_msg_proc(msgsrc[64], &predecoded); + + structed_msg.id = AIFG_MSG_ID_TMSI_REALLOC_CMD; + + //location area identification + aifg_ie_decode(&(predecoded.msg.tmsiReallocCmd.lai),&dst); + memcpy(&(structed_msg.msg.tmsiCmd.lai),&(dst.param.dt_lai), sizeof(dst.param.dt_lai)); + structed_msg.msg.tmsiCmd.lai.flag= 1; + + //mobile identity + aifg_ie_decode(&(predecoded.msg.tmsiReallocCmd.mobileId),&dst); + memcpy(&(structed_msg.msg.tmsiCmd.mobileId),&(dst.param.mobileId), sizeof(dst.param.mobileId)); + structed_msg.msg.tmsiCmd.mobileId.flag= 1; + + msg_len = aifg_msg_sd_tmsiReallocCmd(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,9); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[64][4], msg_len)); +} + +void test_aifg_msg_cmReEst_Request () +{ + memset(&l3Info,0,sizeof(l3Info)); + memset(&predecode_l3msg,0,sizeof(predecode_l3msg)); + + //test + aifg_msg_decode_embeded_l3msg(msgsrc[65], &predecode_l3msg); + + l3Info.id = AIFG_MSG_ID_CM_REEST_REQUEST; + + //ciphering key sequence number + aifg_ie_decode(&(predecode_l3msg.msg.cmReEstReq.cipherKeySeq),&dst); + memcpy(&(l3Info.msg.cmReEstReq.cipherKey),&(dst.param.dt_cipherKey), sizeof(dst.param.dt_cipherKey)); + l3Info.msg.cmReEstReq.cipherKey.flag= 1; + + //mobile station classmark 2 + aifg_ie_decode(&(predecode_l3msg.msg.cmReEstReq.cm2),&dst); + memcpy(&(l3Info.msg.cmReEstReq.cmInfo2),&(dst.param.dt_cmInfo2), sizeof(dst.param.dt_cmInfo2)); + l3Info.msg.cmReEstReq.cmInfo2.flag= 1; + + //mobile identity + aifg_ie_decode(&(predecode_l3msg.msg.cmReEstReq.mobileId),&dst); + memcpy(&(l3Info.msg.cmReEstReq.mobileId),&(dst.param.mobileId), sizeof(dst.param.mobileId)); + l3Info.msg.cmReEstReq.mobileId.flag= 1; + + //location area identification + aifg_ie_decode(&(predecode_l3msg.msg.cmReEstReq.lai),&dst); + memcpy(&(l3Info.msg.cmReEstReq.lai),&(dst.param.dt_lai), sizeof(dst.param.dt_lai)); + l3Info.msg.cmReEstReq.lai.flag= 1; + + msg_len = aifg_msg_encode_embeded_l3msg(&l3Info, buffer); + CU_ASSERT_EQUAL(msg_len,16); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[65][0], msg_len)); + +} + +void test_aifg_msg_cmRequest() +{ + memset(&l3Info,0,sizeof(l3Info)); + memset(&predecode_l3msg,0,sizeof(predecode_l3msg)); + + //test + aifg_msg_decode_embeded_l3msg(msgsrc[66], &predecode_l3msg); + + l3Info.id = AIFG_MSG_ID_CM_REQUEST; + + //CM service type + aifg_ie_decode(&(predecode_l3msg.msg.cmRequest.type),&dst); + memcpy(&(l3Info.msg.cmRequest.cmType),&(dst.param.dt_cmType), sizeof(dst.param.dt_cmType)); + l3Info.msg.cmRequest.cmType.flag= 1; + + //ciphering key sequence number + aifg_ie_decode(&(predecode_l3msg.msg.cmRequest.cipherKeySeq),&dst); + memcpy(&(l3Info.msg.cmRequest.cipherKey),&(dst.param.dt_cipherKey), sizeof(dst.param.dt_cipherKey)); + l3Info.msg.cmRequest.cipherKey.flag= 1; + //mobile station classmark 2 + aifg_ie_decode(&(predecode_l3msg.msg.cmRequest.cm2),&dst); + memcpy(&(l3Info.msg.cmRequest.cmInfo2),&(dst.param.dt_cmInfo2), sizeof(dst.param.dt_cmInfo2)); + l3Info.msg.cmRequest.cmInfo2.flag= 1; + + //mobile identity + aifg_ie_decode(&(predecode_l3msg.msg.cmRequest.mobileId),&dst); + memcpy(&(l3Info.msg.cmRequest.mobileId),&(dst.param.mobileId), sizeof(dst.param.mobileId)); + l3Info.msg.cmRequest.mobileId.flag= 1; + + //priority level + aifg_ie_decode(&(predecode_l3msg.msg.cmRequest.priority),&dst); + memcpy(&(l3Info.msg.cmRequest.priority),&(dst.param.dt_priority), sizeof(dst.param.dt_priority)); + l3Info.msg.cmRequest.priority.flag= 1; + + msg_len = aifg_msg_encode_embeded_l3msg(&l3Info, buffer); + CU_ASSERT_EQUAL(msg_len,11); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[66][0], msg_len)); +} + +void test_aifg_msg_mmInfo () +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + //test + aifg_msg_proc(msgsrc[67], &predecoded); + + structed_msg.id = AIFG_MSG_ID_MM_INFO; + + //full name for network + aifg_ie_decode(&(predecoded.msg.mmInfo.fullNetworkName),&dst); + memcpy(&(structed_msg.msg.mmInfo.fullName),&(dst.param.dt_nwName), sizeof(dst.param.dt_nwName)); + structed_msg.msg.mmInfo.fullName.flag= 1; + + //short name for network + aifg_ie_decode(&(predecoded.msg.mmInfo.shortNetworkName),&dst); + memcpy(&(structed_msg.msg.mmInfo.shortName),&(dst.param.dt_nwName), sizeof(dst.param.dt_nwName)); + structed_msg.msg.mmInfo.shortName.flag= 1; + + //time zone + aifg_ie_decode(&(predecoded.msg.mmInfo.timeZone),&dst); + memcpy(&(structed_msg.msg.mmInfo.timeZone),&(dst.param.dt_timeZone), sizeof(dst.param.dt_timeZone)); + structed_msg.msg.mmInfo.timeZone.flag= 1; + + //time zone and time + aifg_ie_decode(&(predecoded.msg.mmInfo.timeZoneAndTime),&dst); + memcpy(&(structed_msg.msg.mmInfo.tzTime),&(dst.param.dt_tzTime), sizeof(dst.param.dt_tzTime)); + structed_msg.msg.mmInfo.tzTime.flag= 1; + + //LSA identifier + aifg_ie_decode(&(predecoded.msg.mmInfo.lsaId),&dst); + memcpy(&(structed_msg.msg.mmInfo.lsaId),&(dst.param.dt_lsaId), sizeof(dst.param.dt_lsaId)); + structed_msg.msg.mmInfo.lsaId.flag= 1; + + msg_len = aifg_msg_sd_mmInfo(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,26); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[67][4], msg_len)); +} + +void test_aifg_msg_alert () +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[68], &predecoded); + + structed_msg.id = AIFG_MSG_ID_ALERTING; + + //facility ..........dt_facility not done + aifg_ie_decode(&(predecoded.msg.alert.facility),&dst); + memcpy(&(structed_msg.msg.alert.facility),&(dst.param.dt_facility), sizeof(dst.param.dt_facility)); + structed_msg.msg.alert.facility.flag= 1; + + //progress indicator + aifg_ie_decode(&(predecoded.msg.alert.progressInd),&dst); + memcpy(&(structed_msg.msg.alert.progInd),&(dst.param.dt_progInd), sizeof(dst.param.dt_progInd)); + structed_msg.msg.alert.progInd.flag= 1; + //user-user + aifg_ie_decode(&(predecoded.msg.alert.user_user),&dst); + memcpy(&(structed_msg.msg.alert.uu),&(dst.param.dt_uu), sizeof(dst.param.dt_uu)); + structed_msg.msg.alert.uu.flag= 1; + + + msg_len = aifg_msg_sd_alert(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,60); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[68][4], msg_len)); + +} + +void test_aifg_msg_callConfirm () +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + //test + aifg_msg_proc(msgsrc[69], &predecoded); + + structed_msg.id = AIFG_MSG_ID_CALL_CONFIRMED; + + //repeat indicator + aifg_ie_decode(&(predecoded.msg.callConfirm.reptInd),&dst); + memcpy(&(structed_msg.msg.callConfirm.rpInd),&(dst.param.dt_rpInd), sizeof(dst.param.dt_rpInd)); + structed_msg.msg.callConfirm.rpInd.flag= 1; + + //bearer capability 1 + aifg_ie_decode(&(predecoded.msg.callConfirm.bearCap1),&dst); + memcpy(&(structed_msg.msg.callConfirm.bc1),&(dst.param.dt_bc), sizeof(dst.param.dt_bc)); + structed_msg.msg.callConfirm.bc1.flag= 1; + + //bearer capability 2 + aifg_ie_decode(&(predecoded.msg.callConfirm.bearCap2),&dst); + memcpy(&(structed_msg.msg.callConfirm.bc2),&(dst.param.dt_bc), sizeof(dst.param.dt_bc)); + structed_msg.msg.callConfirm.bc2.flag= 1; + + //cause + aifg_ie_decode(&(predecoded.msg.callConfirm.cause),&dst); + memcpy(&(structed_msg.msg.callConfirm.cause),&(dst.param.dt_cause), sizeof(dst.param.dt_cause)); + structed_msg.msg.callConfirm.cause.flag= 1; + + //call control capabilities + aifg_ie_decode(&(predecoded.msg.callConfirm.ccCap),&dst); + memcpy(&(structed_msg.msg.callConfirm.ccCap),&(dst.param.dt_ccCap), sizeof(dst.param.dt_ccCap)); + structed_msg.msg.callConfirm.ccCap.flag= 1; + + msg_len = aifg_msg_sd_callConfirm(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,30); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[69][4], msg_len)); +} + +void test_aifg_msg_callProceed() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[70], &predecoded); + + structed_msg.id = AIFG_MSG_ID_CALL_PROCEEDING; + + + //repeat indicator + aifg_ie_decode(&(predecoded.msg.callProceed.reptInd),&dst); + memcpy(&(structed_msg.msg.callProceed.rpInd),&(dst.param.dt_rpInd), sizeof(dst.param.dt_rpInd)); + structed_msg.msg.callProceed.rpInd.flag= 1; + //bearer capability 1 + aifg_ie_decode(&(predecoded.msg.callProceed.bearCap1),&dst); + memcpy(&(structed_msg.msg.callProceed.bc1),&(dst.param.dt_bc), sizeof(dst.param.dt_bc)); + structed_msg.msg.callProceed.bc1.flag= 1; + //bearer capability 2 + aifg_ie_decode(&(predecoded.msg.callProceed.bearCap2),&dst); + memcpy(&(structed_msg.msg.callProceed.bc2),&(dst.param.dt_bc), sizeof(dst.param.dt_bc)); + structed_msg.msg.callProceed.bc2.flag= 1; + + //test facility + aifg_ie_decode(&(predecoded.msg.callProceed.facility),&dst); + memcpy(&(structed_msg.msg.callProceed.facility),&(dst.param.dt_facility), sizeof(dst.param.dt_facility)); + structed_msg.msg.callProceed.facility.flag= 1; + + //progress indicator + aifg_ie_decode(&(predecoded.msg.callProceed.progressInd),&dst); + memcpy(&(structed_msg.msg.callProceed.progInd),&(dst.param.dt_progInd), sizeof(dst.param.dt_progInd)); + structed_msg.msg.callProceed.progInd.flag= 1; + //priority level + aifg_ie_decode(&(predecoded.msg.callProceed.priority),&dst); + memcpy(&(structed_msg.msg.callProceed.priority),&(dst.param.dt_priority), sizeof(dst.param.dt_priority)); + structed_msg.msg.callProceed.priority.flag= 1; + + + msg_len = aifg_msg_sd_callProceed(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,65); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[70][4], msg_len)); + +} + +void test_aifg_msg_connect() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[71], &predecoded); + + structed_msg.id = AIFG_MSG_ID_CONNECT; + + + // test facility + aifg_ie_decode(&(predecoded.msg.connect.facility),&dst); + memcpy(&(structed_msg.msg.connect.facility),&(dst.param.dt_facility), sizeof(dst.param.dt_facility)); + structed_msg.msg.connect.facility.flag= 1; + + //progress indicator + aifg_ie_decode(&(predecoded.msg.connect.progressInd),&dst); + memcpy(&(structed_msg.msg.connect.progInd),&(dst.param.dt_progInd), sizeof(dst.param.dt_progInd)); + structed_msg.msg.connect.progInd.flag= 1; + //connected number + aifg_ie_decode(&(predecoded.msg.connect.connNum),&dst); + memcpy(&(structed_msg.msg.connect.connNum),&(dst.param.dt_connNum), sizeof(dst.param.dt_connNum)); + structed_msg.msg.connect.connNum.flag= 1; + //connected subaddress + aifg_ie_decode(&(predecoded.msg.connect.connSubaddr),&dst); + memcpy(&(structed_msg.msg.connect.connSubAddr),&(dst.param.dt_connSubAddr), sizeof(dst.param.dt_connSubAddr)); + structed_msg.msg.connect.connSubAddr.flag= 1; + //user-user + aifg_ie_decode(&(predecoded.msg.connect.user_user),&dst); + memcpy(&(structed_msg.msg.connect.uu),&(dst.param.dt_uu), sizeof(dst.param.dt_uu)); + structed_msg.msg.connect.uu.flag= 1; + + msg_len = aifg_msg_sd_connect(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,0x47); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[71][4], msg_len)); + +} + +void test_aifg_msg_eSetup() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[72], &predecoded); + + structed_msg.id = AIFG_MSG_ID_EMERGENCY_SETUP; + + //bearer capability + aifg_ie_decode(&(predecoded.msg.eSetup.bearCap),&dst); + memcpy(&(structed_msg.msg.eSetup.bc),&(dst.param.dt_bc), sizeof(dst.param.dt_bc)); + structed_msg.msg.eSetup.bc.flag= 1; + + msg_len = aifg_msg_sd_eSetup(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,5); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[72][4], msg_len)); + +} + +void test_aifg_msg_progress() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[73], &predecoded); + + structed_msg.id = AIFG_MSG_ID_PROGRESS; + + //progress indicator + aifg_ie_decode(&(predecoded.msg.progress.progressInd),&dst); + memcpy(&(structed_msg.msg.progress.progInd),&(dst.param.dt_progInd), sizeof(dst.param.dt_progInd)); + structed_msg.msg.progress.progInd.flag= 1; + //user-user + aifg_ie_decode(&(predecoded.msg.progress.user_user),&dst); + memcpy(&(structed_msg.msg.progress.uu),&(dst.param.dt_uu), sizeof(dst.param.dt_uu)); + structed_msg.msg.progress.uu.flag= 1; + + + msg_len = aifg_msg_sd_progress(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,9); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[73][4], msg_len)); + +} + +void test_aifg_msg_setup() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + //test + aifg_msg_proc(msgsrc[74], &predecoded); + + structed_msg.id = AIFG_MSG_ID_SETUP; + + //BC repeat indicator + aifg_ie_decode(&(predecoded.msg.setup.reptInd_bc),&dst); + memcpy(&(structed_msg.msg.setup.bc_rpInd),&(dst.param.dt_rpInd), sizeof(dst.param.dt_rpInd)); + structed_msg.msg.setup.bc_rpInd.flag= 1; + + //bearer capability 1 + aifg_ie_decode(&(predecoded.msg.setup.bearCap1),&dst); + memcpy(&(structed_msg.msg.setup.bc1),&(dst.param.dt_bc), sizeof(dst.param.dt_bc)); + structed_msg.msg.setup.bc1.flag= 1; + //bearer capability 2 + aifg_ie_decode(&(predecoded.msg.setup.bearCap2),&dst); + memcpy(&(structed_msg.msg.setup.bc2),&(dst.param.dt_bc), sizeof(dst.param.dt_bc)); + structed_msg.msg.setup.bc2.flag= 1; + + //test facility + aifg_ie_decode(&(predecoded.msg.setup.facility),&dst); + memcpy(&(structed_msg.msg.setup.facility),&(dst.param.dt_facility), sizeof(dst.param.dt_facility)); + structed_msg.msg.setup.facility.flag= 1; + + //progress indicator + aifg_ie_decode(&(predecoded.msg.setup.progressInd),&dst); + memcpy(&(structed_msg.msg.setup.progInd),&(dst.param.dt_progInd), sizeof(dst.param.dt_progInd)); + structed_msg.msg.setup.progInd.flag= 1; + //signal + aifg_ie_decode(&(predecoded.msg.setup.signal),&dst); + memcpy(&(structed_msg.msg.setup.signal),&(dst.param.dt_signal), sizeof(dst.param.dt_signal)); + structed_msg.msg.setup.signal.flag= 1; + //calling party BCD number + aifg_ie_decode(&(predecoded.msg.setup.callingBCD),&dst); + memcpy(&(structed_msg.msg.setup.callingNum),&(dst.param.dt_callingNum), sizeof(dst.param.dt_callingNum)); + structed_msg.msg.setup.callingNum.flag= 1; + //calling party subaddress + aifg_ie_decode(&(predecoded.msg.setup.callingSubaddr),&dst); + memcpy(&(structed_msg.msg.setup.callingSubAddr),&(dst.param.dt_callingSubAddr), sizeof(dst.param.dt_callingSubAddr)); + structed_msg.msg.setup.callingSubAddr.flag= 1; + //called party BCD number + aifg_ie_decode(&(predecoded.msg.setup.calledBCD),&dst); + memcpy(&(structed_msg.msg.setup.calledNum),&(dst.param.dt_calledNum), sizeof(dst.param.dt_calledNum)); + structed_msg.msg.setup.calledNum.flag= 1; + //called party subaddress + aifg_ie_decode(&(predecoded.msg.setup.calledSubaddr),&dst); + memcpy(&(structed_msg.msg.setup.calledSubAddr),&(dst.param.dt_calledSubAddr), sizeof(dst.param.dt_calledSubAddr)); + structed_msg.msg.setup.calledSubAddr.flag= 1; + //redirecting party BCD + aifg_ie_decode(&(predecoded.msg.setup.redirBCD),&dst); + memcpy(&(structed_msg.msg.setup.redirNum),&(dst.param.dt_redirNum), sizeof(dst.param.dt_redirNum)); + structed_msg.msg.setup.redirNum.flag= 1; + //redirecting party subaddr + aifg_ie_decode(&(predecoded.msg.setup.redirSubaddr),&dst); + memcpy(&(structed_msg.msg.setup.redirSubAddr),&(dst.param.dt_redirSubAddr), sizeof(dst.param.dt_redirSubAddr)); + structed_msg.msg.setup.redirSubAddr.flag= 1; + //LLC repeat indicator + aifg_ie_decode(&(predecoded.msg.setup.reptInd_llc),&dst); + memcpy(&(structed_msg.msg.setup.llc_rpInd),&(dst.param.dt_rpInd), sizeof(dst.param.dt_rpInd)); + structed_msg.msg.setup.llc_rpInd.flag= 1; + //low layer compatibility 1 + aifg_ie_decode(&(predecoded.msg.setup.lowLComp1),&dst); + memcpy(&(structed_msg.msg.setup.loComp1),&(dst.param.dt_loComp), sizeof(dst.param.dt_loComp)); + structed_msg.msg.setup.loComp1.flag= 1; + //low layer compatibility 2 + aifg_ie_decode(&(predecoded.msg.setup.lowLComp2),&dst); + memcpy(&(structed_msg.msg.setup.loComp2),&(dst.param.dt_loComp), sizeof(dst.param.dt_loComp)); + structed_msg.msg.setup.loComp2.flag= 1; + //HLC repeat indicator + aifg_ie_decode(&(predecoded.msg.setup.reptInd_hlc),&dst); + memcpy(&(structed_msg.msg.setup.hlc_rpInd),&(dst.param.dt_rpInd), sizeof(dst.param.dt_rpInd)); + structed_msg.msg.setup.hlc_rpInd.flag= 1; + //high layer compatibility 1 + aifg_ie_decode(&(predecoded.msg.setup.highLComp1),&dst); + memcpy(&(structed_msg.msg.setup.hiComp1),&(dst.param.dt_hiComp), sizeof(dst.param.dt_hiComp)); + structed_msg.msg.setup.hiComp1.flag= 1; + //high layer compatibility 2 + aifg_ie_decode(&(predecoded.msg.setup.highLComp2),&dst); + memcpy(&(structed_msg.msg.setup.hiComp2),&(dst.param.dt_hiComp), sizeof(dst.param.dt_hiComp)); + structed_msg.msg.setup.hiComp2.flag= 1; + //user-user + aifg_ie_decode(&(predecoded.msg.setup.user_user),&dst); + memcpy(&(structed_msg.msg.setup.uu),&(dst.param.dt_uu), sizeof(dst.param.dt_uu)); + structed_msg.msg.setup.uu.flag= 1; + //priority + aifg_ie_decode(&(predecoded.msg.setup.priority),&dst); + memcpy(&(structed_msg.msg.setup.priority),&(dst.param.dt_priority), sizeof(dst.param.dt_priority)); + structed_msg.msg.setup.priority.flag= 1; + //alert + aifg_ie_decode(&(predecoded.msg.setup.alert),&dst); + memcpy(&(structed_msg.msg.setup.alertPattern),&(dst.param.dt_alertPattern), sizeof(dst.param.dt_alertPattern)); + structed_msg.msg.setup.alertPattern.flag= 1; + + + msg_len = aifg_msg_sd_setup(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,0x80); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[74][4], msg_len)); + + //for unit test + memcpy(&bm_setup, &structed_msg, sizeof(structed_msg)); +} + +void test_aifg_msg_modify() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[75], &predecoded); + + structed_msg.id = AIFG_MSG_ID_MODIFY; + + //bearer capability + aifg_ie_decode(&(predecoded.msg.modify.bearCap),&dst); + memcpy(&(structed_msg.msg.modify.bc),&(dst.param.dt_bc), sizeof(dst.param.dt_bc)); + structed_msg.msg.modify.bc.flag= 1; + //low layer compatibility + aifg_ie_decode(&(predecoded.msg.modify.lowLComp),&dst); + memcpy(&(structed_msg.msg.modify.loComp),&(dst.param.dt_loComp), sizeof(dst.param.dt_loComp)); + structed_msg.msg.modify.loComp.flag= 1; + //high layer compatibility + aifg_ie_decode(&(predecoded.msg.modify.highLComp),&dst); + memcpy(&(structed_msg.msg.modify.hiComp),&(dst.param.dt_hiComp), sizeof(dst.param.dt_hiComp)); + structed_msg.msg.modify.hiComp.flag= 1; + //reverse call setup direction + aifg_ie_decode(&(predecoded.msg.modify.revCallSetDir),&dst); + memcpy(&(structed_msg.msg.modify.revCallDir),&(dst.param.dt_revCallDir), sizeof(dst.param.dt_revCallDir)); + structed_msg.msg.modify.revCallDir.flag= 1; + + + msg_len = aifg_msg_sd_modify(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,14); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[75][4], msg_len)); + +} + +void test_aifg_msg_modifyCmp() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[76], &predecoded); + + structed_msg.id = AIFG_MSG_ID_MODIFY_CMP; + + //bearer capability + aifg_ie_decode(&(predecoded.msg.modifyComplete.bearCap),&dst); + memcpy(&(structed_msg.msg.modifyCmp.bc),&(dst.param.dt_bc), sizeof(dst.param.dt_bc)); + structed_msg.msg.modifyCmp.bc.flag= 1; + //low layer compatibility + aifg_ie_decode(&(predecoded.msg.modifyComplete.lowLComp),&dst); + memcpy(&(structed_msg.msg.modifyCmp.loComp),&(dst.param.dt_loComp), sizeof(dst.param.dt_loComp)); + structed_msg.msg.modifyCmp.loComp.flag= 1; + //high layer compatibility + aifg_ie_decode(&(predecoded.msg.modifyComplete.highLComp),&dst); + memcpy(&(structed_msg.msg.modifyCmp.hiComp),&(dst.param.dt_hiComp), sizeof(dst.param.dt_hiComp)); + structed_msg.msg.modifyCmp.hiComp.flag= 1; + //reverse call setup direction + aifg_ie_decode(&(predecoded.msg.modifyComplete.revCallSetDir),&dst); + memcpy(&(structed_msg.msg.modifyCmp.revCallDir),&(dst.param.dt_revCallDir), sizeof(dst.param.dt_revCallDir)); + structed_msg.msg.modifyCmp.revCallDir.flag= 1; + + + msg_len = aifg_msg_sd_modifyCmp(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,14); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[76][4], msg_len)); + +} + +void test_aifg_msg_modifyRej() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[77], &predecoded); + + structed_msg.id = AIFG_MSG_ID_MODIFY_REJECT; + + //bearer capability + aifg_ie_decode(&(predecoded.msg.modifyRej.bearCap),&dst); + memcpy(&(structed_msg.msg.modifyRej.bc),&(dst.param.dt_bc), sizeof(dst.param.dt_bc)); + structed_msg.msg.modifyRej.bc.flag= 1; + //cause + aifg_ie_decode(&(predecoded.msg.modifyRej.cause),&dst); + memcpy(&(structed_msg.msg.modifyRej.cause),&(dst.param.dt_cause), sizeof(dst.param.dt_cause)); + structed_msg.msg.modifyRej.cause.flag= 1; + //low layer compatibility + aifg_ie_decode(&(predecoded.msg.modifyRej.lowLComp),&dst); + memcpy(&(structed_msg.msg.modifyRej.loComp),&(dst.param.dt_loComp), sizeof(dst.param.dt_loComp)); + structed_msg.msg.modifyRej.loComp.flag= 1; + //high layer compatibility + aifg_ie_decode(&(predecoded.msg.modifyRej.highLComp),&dst); + memcpy(&(structed_msg.msg.modifyRej.hiComp),&(dst.param.dt_hiComp), sizeof(dst.param.dt_hiComp)); + structed_msg.msg.modifyRej.hiComp.flag= 1; + + + msg_len = aifg_msg_sd_modifyRej(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,18); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[77][4], msg_len)); + +} + + +void test_aifg_msg_userInfo() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[78], &predecoded); + + structed_msg.id = AIFG_MSG_ID_USER_INFO; + + //user-user + aifg_ie_decode(&(predecoded.msg.userInfo.user_user),&dst); + memcpy(&(structed_msg.msg.userInfo.uu),&(dst.param.dt_uu), sizeof(dst.param.dt_uu)); + structed_msg.msg.userInfo.uu.flag= 1; + //more data + aifg_ie_decode(&(predecoded.msg.userInfo.moreDate),&dst); + memcpy(&(structed_msg.msg.userInfo.moreData),&(dst.param.dt_moreData), sizeof(dst.param.dt_moreData)); + structed_msg.msg.userInfo.moreData.flag= 1; + + + msg_len = aifg_msg_sd_userInfo(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,6); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[78][4], msg_len)); + +} + +void test_aifg_msg_holdRej() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[79], &predecoded); + + structed_msg.id = AIFG_MSG_ID_HOLD_REJECT; + + //cause + aifg_ie_decode(&(predecoded.msg.holdRej.cause),&dst); + memcpy(&(structed_msg.msg.holdRej.cause),&(dst.param.dt_cause), sizeof(dst.param.dt_cause)); + structed_msg.msg.holdRej.cause.flag= 1; + + + msg_len = aifg_msg_sd_holdRej(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,6); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[79][4], msg_len)); + +} + +void test_aifg_msg_retrieveRej() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[80], &predecoded); + + structed_msg.id = AIFG_MSG_ID_RETRIEVE_REJECT; + + //cause + aifg_ie_decode(&(predecoded.msg.retrieveRej.cause),&dst); + memcpy(&(structed_msg.msg.retrieveRej.cause),&(dst.param.dt_cause), sizeof(dst.param.dt_cause)); + structed_msg.msg.retrieveRej.cause.flag= 1; + + + msg_len = aifg_msg_sd_retrieveRej(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,6); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[80][4], msg_len)); + +} + +void test_aifg_msg_disconnect() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[81], &predecoded); + + structed_msg.id = AIFG_MSG_ID_DISCONNECT; + + //cause + aifg_ie_decode(&(predecoded.msg.disconnect.cause),&dst); + memcpy(&(structed_msg.msg.disconnect.cause),&(dst.param.dt_cause), sizeof(dst.param.dt_cause)); + structed_msg.msg.disconnect.cause.flag= 1; + + // test facility + aifg_ie_decode(&(predecoded.msg.disconnect.facility),&dst); + memcpy(&(structed_msg.msg.disconnect.facility),&(dst.param.dt_facility), sizeof(dst.param.dt_facility)); + structed_msg.msg.disconnect.facility.flag= 1; + + //progress indicator + aifg_ie_decode(&(predecoded.msg.disconnect.progressInd),&dst); + memcpy(&(structed_msg.msg.disconnect.progInd),&(dst.param.dt_progInd), sizeof(dst.param.dt_progInd)); + structed_msg.msg.disconnect.progInd.flag= 1; + //user-user + aifg_ie_decode(&(predecoded.msg.disconnect.user_user),&dst); + memcpy(&(structed_msg.msg.disconnect.uu),&(dst.param.dt_uu), sizeof(dst.param.dt_uu)); + structed_msg.msg.disconnect.uu.flag= 1; + + + msg_len = aifg_msg_sd_disconnect(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,0x41); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[81][4], msg_len)); + +} + +void test_aifg_msg_release() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[82], &predecoded); + + structed_msg.id = AIFG_MSG_ID_RELEASE; + + //cause 1 + aifg_ie_decode(&(predecoded.msg.release.cause1),&dst); + memcpy(&(structed_msg.msg.release.cause1),&(dst.param.dt_cause), sizeof(dst.param.dt_cause)); + structed_msg.msg.release.cause1.flag= 1; + //cause 2 + aifg_ie_decode(&(predecoded.msg.release.cause2),&dst); + memcpy(&(structed_msg.msg.release.cause2),&(dst.param.dt_cause), sizeof(dst.param.dt_cause)); + structed_msg.msg.release.cause2.flag= 1; + + // test facility + aifg_ie_decode(&(predecoded.msg.release.facility),&dst); + memcpy(&(structed_msg.msg.release.facility),&(dst.param.dt_facility), sizeof(dst.param.dt_facility)); + structed_msg.msg.release.facility.flag= 1; + + //user-user + aifg_ie_decode(&(predecoded.msg.release.user_user),&dst); + memcpy(&(structed_msg.msg.release.uu),&(dst.param.dt_uu), sizeof(dst.param.dt_uu)); + structed_msg.msg.release.uu.flag= 1; + + + msg_len = aifg_msg_sd_release(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,0x44); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[82][4], msg_len)); + +} + +void test_aifg_msg_releaseCmp() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[83], &predecoded); + + structed_msg.id = AIFG_MSG_ID_RELEASE_CMP; + + //cause + aifg_ie_decode(&(predecoded.msg.releaseComp.cause),&dst); + memcpy(&(structed_msg.msg.releaseCmp.cause),&(dst.param.dt_cause), sizeof(dst.param.dt_cause)); + structed_msg.msg.releaseCmp.cause.flag= 1; + + //test facility + aifg_ie_decode(&(predecoded.msg.releaseComp.facility),&dst); + memcpy(&(structed_msg.msg.releaseCmp.facility),&(dst.param.dt_facility), sizeof(dst.param.dt_facility)); + structed_msg.msg.releaseCmp.facility.flag= 1; + + //user-user + aifg_ie_decode(&(predecoded.msg.releaseComp.user_user),&dst); + memcpy(&(structed_msg.msg.releaseCmp.uu),&(dst.param.dt_uu), sizeof(dst.param.dt_uu)); + structed_msg.msg.releaseCmp.uu.flag= 1; + + + msg_len = aifg_msg_sd_releaseCmp(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,0x3e); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[83][4], msg_len)); + +} + +void test_aifg_msg_congestCtrl() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[84], &predecoded); + + structed_msg.id = AIFG_MSG_ID_CONGESTION_CTRL; + + //congestion level + aifg_ie_decode(&(predecoded.msg.congestCtrl.congestLev),&dst); + memcpy(&(structed_msg.msg.congestCtrl.congestLevel),&(dst.param.dt_congestLevel), sizeof(dst.param.dt_congestLevel)); + structed_msg.msg.congestCtrl.congestLevel.flag= 1; + //cause + aifg_ie_decode(&(predecoded.msg.congestCtrl.cause),&dst); + memcpy(&(structed_msg.msg.congestCtrl.cause),&(dst.param.dt_cause), sizeof(dst.param.dt_cause)); + structed_msg.msg.congestCtrl.cause.flag= 1; + + msg_len = aifg_msg_sd_congestCtrl(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,8); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[84][4], msg_len)); + +} + +void test_aifg_msg_notify() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[85], &predecoded); + + structed_msg.id = AIFG_MSG_ID_NOTIFY; + + //notification indicator + aifg_ie_decode(&(predecoded.msg.notify.notifyInd),&dst); + memcpy(&(structed_msg.msg.notify.notificationInd),&(dst.param.dt_notificationInd), sizeof(dst.param.dt_notificationInd)); + structed_msg.msg.notify.notificationInd.flag= 1; + + + msg_len = aifg_msg_sd_notify(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,2); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[85][4], msg_len)); + +} + +void test_aifg_msg_status() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[86], &predecoded); + + structed_msg.id = AIFG_MSG_ID_STATUS; + + //cause + aifg_ie_decode(&(predecoded.msg.status.cause),&dst); + memcpy(&(structed_msg.msg.status.cause),&(dst.param.dt_cause), sizeof(dst.param.dt_cause)); + structed_msg.msg.status.cause.flag= 1; + //call state + aifg_ie_decode(&(predecoded.msg.status.callState),&dst); + memcpy(&(structed_msg.msg.status.callStat),&(dst.param.dt_callStat), sizeof(dst.param.dt_callStat)); + structed_msg.msg.status.callStat.flag= 1; + //auxiliary states + aifg_ie_decode(&(predecoded.msg.status.auxState),&dst); + memcpy(&(structed_msg.msg.status.auxStat),&(dst.param.dt_auxStat), sizeof(dst.param.dt_auxStat)); + structed_msg.msg.status.auxStat.flag= 1; + + + msg_len = aifg_msg_sd_status(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,10); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[86][4], msg_len)); + +} + +void test_aifg_msg_startDTMF() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[87], &predecoded); + + structed_msg.id = AIFG_MSG_ID_START_DTMF; + + //keypad facility + aifg_ie_decode(&(predecoded.msg.startDTMF.keypadFacility),&dst); + memcpy(&(structed_msg.msg.startDTMF.keypad),&(dst.param.dt_keypad), sizeof(dst.param.dt_keypad)); + structed_msg.msg.startDTMF.keypad.flag= 1; + + + msg_len = aifg_msg_sd_startDTMF(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,2); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[87][4], msg_len)); + +} + +void test_aifg_msg_startDTMF_ack() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[88], &predecoded); + + structed_msg.id = AIFG_MSG_ID_START_DTMF_ACK; + + //keypad facility + aifg_ie_decode(&(predecoded.msg.startDTMFAck.keypadFacility),&dst); + memcpy(&(structed_msg.msg.startDTMF_ack.keypad),&(dst.param.dt_keypad), sizeof(dst.param.dt_keypad)); + structed_msg.msg.startDTMF_ack.keypad.flag= 1; + + + msg_len = aifg_msg_sd_startDTMFAck(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,2); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[88][4], msg_len)); + +} + +void test_aifg_msg_startDTMF_rej() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[89], &predecoded); + + structed_msg.id = AIFG_MSG_ID_START_DTMF_REJECT; + + //cause + aifg_ie_decode(&(predecoded.msg.startDTMFRej.cause),&dst); + memcpy(&(structed_msg.msg.startDTMF_rej.cause),&(dst.param.dt_cause), sizeof(dst.param.dt_cause)); + structed_msg.msg.startDTMF_rej.cause.flag= 1; + + + msg_len = aifg_msg_sd_startDTMFRej(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,6); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[89][4], msg_len)); + +} + + +//////////////////////////////// + +void test_aifg_msg_connectAck() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[90], &predecoded); + + structed_msg.id = AIFG_MSG_ID_CONNECT_ACK; + + + msg_len = aifg_msg_sd_connectAck(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,1); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[90][4], msg_len)); + +} + +void test_aifg_msg_hold() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[91], &predecoded); + + structed_msg.id = AIFG_MSG_ID_HOLD; + + + msg_len = aifg_msg_sd_hold(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,1); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[91][4], msg_len)); + +} + +void test_aifg_msg_holdAck() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[92], &predecoded); + + structed_msg.id = AIFG_MSG_ID_HOLD_ACK; + + + msg_len = aifg_msg_sd_holdAck(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,1); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[92][4], msg_len)); + +} + +void test_aifg_msg_retrieve() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[93], &predecoded); + + structed_msg.id = AIFG_MSG_ID_RETRIEVE; + + + msg_len = aifg_msg_sd_retrieve(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,1); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[93][4], msg_len)); + +} + +void test_aifg_msg_retrieveAck() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[94], &predecoded); + + structed_msg.id = AIFG_MSG_ID_RETRIEVE_ACK; + + + msg_len = aifg_msg_sd_retrieveAck(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,1); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[94][4], msg_len)); + +} + +void test_aifg_msg_statusEnq() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[95], &predecoded); + + structed_msg.id = AIFG_MSG_ID_STATUS_ENQ; + + + msg_len = aifg_msg_sd_statusEnq(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,1); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[95][4], msg_len)); + +} + +void test_aifg_msg_stopDTMF() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[96], &predecoded); + + structed_msg.id = AIFG_MSG_ID_STOP_DTMF; + + + msg_len = aifg_msg_sd_stopDTMF(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,1); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[96][4], msg_len)); + +} + +void test_aifg_msg_stopDTMF_ack() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[97], &predecoded); + + structed_msg.id = AIFG_MSG_ID_STOP_DTMF_ACK; + + + msg_len = aifg_msg_sd_stopDTMFAck(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,1); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[97][4], msg_len)); + +} + +void test_aifg_msg_facility() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + + //test + aifg_msg_proc(msgsrc[98], &predecoded); + + structed_msg.id = AIFG_MSG_ID_FACILITY; + + //facility + aifg_ie_decode(&(predecoded.msg.facility.facility),&dst); + memcpy(&(structed_msg.msg.facility.facility),&(dst.param.dt_facility), sizeof(dst.param.dt_facility)); + structed_msg.msg.facility.facility.flag= 1; + + msg_len = aifg_msg_sd_facility(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,0x32); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[98][4], msg_len)); + +} + + +void test_aifg_msg_disconnect_mobileToNet() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + + //test + aifg_msg_proc(msgsrc[99], &predecoded); + + structed_msg.id = AIFG_MSG_ID_DISCONNECT; + + //cause + aifg_ie_decode(&(predecoded.msg.disconnect.cause),&dst); + memcpy(&(structed_msg.msg.disconnect.cause),&(dst.param.dt_cause), sizeof(dst.param.dt_cause)); + structed_msg.msg.disconnect.cause.flag= 1; + + //facility + aifg_ie_decode(&(predecoded.msg.disconnect.facility),&dst); + memcpy(&(structed_msg.msg.disconnect.facility),&(dst.param.dt_facility), sizeof(dst.param.dt_facility)); + structed_msg.msg.disconnect.facility.flag= 1; + + //user-user + aifg_ie_decode(&(predecoded.msg.disconnect.user_user),&dst); + memcpy(&(structed_msg.msg.disconnect.uu),&(dst.param.dt_uu), sizeof(dst.param.dt_uu)); + structed_msg.msg.disconnect.uu.flag= 1; + + //SS version + aifg_ie_decode(&(predecoded.msg.disconnect.ssVer),&dst); + memcpy(&(structed_msg.msg.disconnect.ssVer),&(dst.param.dt_ssVer), sizeof(dst.param.dt_ssVer)); + structed_msg.msg.disconnect.ssVer.flag= 1; + + msg_len = aifg_msg_sd_disconnect(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len,0x40); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[99][4], msg_len)); +} +/* +void test_aifg_msg_pagingResp() +{ + memset(&l3Info,0,sizeof(l3Info)); + memset(&predecode_l3msg,0,sizeof(predecode_l3msg)); + + //test + aifg_msg_decode_embeded_l3msg(msgsrc[100], &predecode_l3msg); + + l3Info.id = AIFG_MSG_ID_PAGING_RESP; + + //ciphering key sequence number + aifg_ie_decode(&(predecode_l3msg.msg.pagingResp.cipherKeySeq),&dst); + memcpy(&(l3Info.msg.pagingResp.cipherKey),&(dst.param.dt_cipherKey), sizeof(dst.param.dt_cipherKey)); + l3Info.msg.pagingResp.cipherKey.flag= 1; + + //Mobile Station Classmark 2 + aifg_ie_decode(&(predecode_l3msg.msg.pagingResp.cm2),&dst); + memcpy(&l3Info.msg.pagingResp.cmInfo2,&dst.param.dt_cmInfo2, sizeof(dst.param.dt_cmInfo2)); + l3Info.msg.pagingResp.cmInfo2.flag= 1; + + //mobile identity + aifg_ie_decode(&(predecode_l3msg.msg.pagingResp.mobileId),&dst); + memcpy(&(l3Info.msg.pagingResp.mobileId),&(dst.param.mobileId), sizeof(dst.param.mobileId)); + l3Info.msg.pagingResp.mobileId.flag= 1; + + msg_len = aifg_msg_encode_embeded_l3msg(&l3Info, buffer); + CU_ASSERT_EQUAL(msg_len,16); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[100][0], msg_len)); + + //for unit test + memcpy(&rr_pagingResp, &structed_msg, sizeof(structed_msg)); +} +*/ +void test_aifg_msg_pagingResp() +{ + memset(&structed_msg,0,sizeof(structed_msg)); + memset(&predecoded,0,sizeof(predecoded)); + memset(&l3Info,0,sizeof(l3Info)); + + //test + aifg_msg_proc(msgsrc[100], &predecoded); + + structed_msg.id = AIFG_MSG_ID_L3_INFO; + + //cell identifier + aifg_ie_decode(&(predecoded.msg.completeL3Info.cellId),&dst); + memcpy(&(structed_msg.msg.completeL3Info.cellId),&(dst.param.bm_cellId), sizeof(dst.param.bm_cellId)); + structed_msg.msg.completeL3Info.cellId.flag= 1; + + //layer 3 infomation + //Paging response + structed_msg.msg.completeL3Info.l3Info.ptr = &msgsrc[100][10]; + structed_msg.msg.completeL3Info.l3Info.len = 16; +/* l3Info.id = AIFG_MSG_ID_PAGING_RESP; + //ciphering key sequence number + aifg_ie_decode(&(predecoded.msg.completeL3Info.l3msg.msg.pagingResp.cipherKeySeq),&dst); + memcpy(&(l3Info.msg.pagingResp.cipherKey),&(dst.param.dt_cipherKey), sizeof(dst.param.dt_cipherKey)); + l3Info.msg.pagingResp.cipherKey.flag= 1; + + //Mobile Station Classmark 2 + aifg_ie_decode(&(predecoded.msg.completeL3Info.l3msg.msg.pagingResp.cm2),&dst); + memcpy(&l3Info.msg.pagingResp.cmInfo2,&dst.param.dt_cmInfo2, sizeof(dst.param.dt_cmInfo2)); + l3Info.msg.pagingResp.cmInfo2.flag= 1; + + //mobile identity + aifg_ie_decode(&(predecoded.msg.completeL3Info.l3msg.msg.pagingResp.mobileId),&dst); + memcpy(&(l3Info.msg.pagingResp.mobileId),&(dst.param.mobileId), sizeof(dst.param.mobileId)); + l3Info.msg.pagingResp.mobileId.flag= 1; + + memcpy(&(structed_msg.msg.completeL3Info.l3Info), &l3Info, sizeof(l3Info)); +*/ + //chosen channel + aifg_ie_decode(&(predecoded.msg.completeL3Info.chosenChannel),&dst); + memcpy(&(structed_msg.msg.completeL3Info.chosenChannel),&(dst.param.bm_chosenChannel), sizeof(dst.param.bm_chosenChannel)); + structed_msg.msg.completeL3Info.chosenChannel.flag= 1; + + //LSA identity list + aifg_ie_decode(&(predecoded.msg.completeL3Info.lsaIdList),&dst); + memcpy(&(structed_msg.msg.completeL3Info.lsaIdList),&(dst.param.bm_lsaIdList), sizeof(dst.param.bm_lsaIdList)); + structed_msg.msg.completeL3Info.lsaIdList.flag= 1; + + //location information + aifg_ie_decode(&(predecoded.msg.completeL3Info.locInfo),&dst); + memcpy(&(structed_msg.msg.completeL3Info.locInfo),&(dst.param.bm_locInfo), sizeof(dst.param.bm_locInfo)); + structed_msg.msg.completeL3Info.locInfo.flag= 1; + + msg_len = aifg_msg_sd_completeL3Info(&structed_msg, buffer); + CU_ASSERT_EQUAL(msg_len, 40); + CU_ASSERT_EQUAL(0, memcmp(buffer, &msgsrc[100][2],40)); + + //for unit test use + memcpy(&rr_pagingResp, &structed_msg, sizeof(structed_msg)); +} + + +//////////////////////////////////////////////////////////////////////////// +int aifg_code_test() +{ + CU_pSuite pSuite = NULL; + ie.hi_lo_flag=0; + + aifg_init(); + + /* initialize the CUnit test registry */ + if (CUE_SUCCESS != CU_initialize_registry()) + goto ERR_PROC; + + /* add static test suite to the registry */ + pSuite = CU_add_suite("Test ie encode/decode", NULL, NULL); + if (NULL == pSuite) { + CU_cleanup_registry(); + goto ERR_PROC; + } + + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_cic,src={0x01,0x02}", test_aifg_ie_bm_cic)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_resrcAvail,src={0x00,0x09,0x01,0x03,0x00,0x09,0x01,0x03,0x00,0x09,0x01,0x03,0x00,0x09,0x01,0x03,0x02,0x06,0x00,0x0b}", test_aifg_ie_bm_resrcAvail)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_cause,src={0x01,0x09}", test_aifg_ie_bm_cause)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_cause_ext,src={0x02,0x89,0x10}", test_aifg_ie_bm_cause_ext)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_cellId_00,src={0x08,0x00,0x13,0x42,0x05,0x00,0x02,0x00,0x11}", test_aifg_ie_bm_cellId_00)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_cellId_01,src={0x05,0x01,0x00,0x42,0x01,0x03}", test_aifg_ie_bm_cellId_01)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_cellId_02,src={0x03,0x02,0x00,0x22}", test_aifg_ie_bm_cellId_02)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_priority,src={0x03,0x42,0x00,0x22}", test_aifg_ie_bm_priority)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_tsmi,src={0x04,0xf7,0x03,0x12,0x2a}", test_aifg_ie_bm_tmsi)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_encryptInfo_Noencryption,src={0x01,0x01}", test_aifg_ie_bm_encryptInfo_NOencryption)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_encryptInfo_A5,src={0x09,0x12,0x08,0x15,0x34,0x67,0xa2,0x8d,0x46,0x8f}", test_aifg_ie_bm_encryptInfo_A5)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_channelType_speech,src={0X04,0X01,0X09,0X83,0X79}", test_aifg_ie_bm_channelType_speech)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_channelType_data,src={0x04,0x02,0x0a,0xf5,0x07}", test_aifg_ie_bm_channelType_data)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_extResourceInd,src={0x02}", test_aifg_ie_bm_extResourceInd)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_cmInfo2,src={0x03,0x7e,0x67,0x82}", test_aifg_ie_bm_cmInfo2)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ //to resolve + /*if (NULL == CU_add_test(pSuite, "aifg_ie_bm_l3Info,src={0x04,0x05,0x21,0x3f,0x58,0xe1}", test_aifg_ie_bm_l3Info)){ + CU_cleanup_registry(); + goto ERR_PROC; + }*/ + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_cidList_00,src={0x08,0x00,0x85,0x47,0x9c,0x67,0x24,0x3d,0x05}", test_aifg_ie_bm_cidList_00)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_cidList_01,src={0x05,0x01,0x23,0x07,0x4f,0x39}", test_aifg_ie_bm_cidList_01)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_cidList_02,src={0x03,0x02,0x77,0x64}", test_aifg_ie_bm_cidList_02)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_cidList_04,src={0x06,0x04,0x4e,0x39,0x58,0x7c,0x0a}", test_aifg_ie_bm_cidList_04)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_cidList_05,src={0x03,0x05,0x21,0xf3}", test_aifg_ie_bm_cidList_05)){//<<<<<<<<<<<<<<<<<<<<<<<<<<<< + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_cicList,src={0x04,0x32,0x12,0x8d,0x36}", test_aifg_ie_bm_cicList)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_diagnostics,src={0x04,0x03,0x0Fa,0x38,0x89}", test_aifg_ie_bm_diagnostics)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_chosenChannel,src={0x56}", test_aifg_ie_bm_chosenChannel)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_totalResrc,src={0x84,0x62,0xf2,0x7e}", test_aifg_ie_bm_totalResrc)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_triggerId,src={0x03,0x9d,0x20,0x81}", test_aifg_ie_bm_triggerId)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_mobileId,src={0x02,0x31,0xf2}", test_aifg_ie_bm_mobileId)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_circuitPoolList,src={0x05,0x01,0x02,0x03,0x04,0x05}", test_aifg_ie_bm_circuitPoolList)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_resrcSit,src={0x05,0x11,0x83,0x04,0x28,0x75}", test_aifg_ie_bm_resrcSit)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_curChannelType1,src={0x19}", test_aifg_ie_bm_curChannelType1)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_groupRef,src={0x05,0x24,0x38,0x56,0x19,0x10}", test_aifg_ie_bm_groupRef)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_lsaId,src={0x03,0x10,0x39,0xd2}", test_aifg_ie_bm_lsaId)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_lsaIdList,src={0x07,0x01,0x22,0xe4,0x31,0x57,0x69,0x83}", test_aifg_ie_bm_lsaIdList)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_lsaInfo,src={0x09,0x00,0x00,0x36,0x85,0xef,0x03,0x47,0x87,0x42}", test_aifg_ie_bm_lsaInfo)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_locInfo,src={0x03,0x15,0x49,0xf5}", test_aifg_ie_bm_locInfo)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_omcId,src={0x03,0x39,0xc4,0x08}", test_aifg_ie_bm_omcId)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_bssOldtoNew,src={0X07, ,0X01,0X02, ,0X02,0X06,0X01}", test_aifg_ie_bm_bssOldtoNew)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_periodicity,src={0Xff}", test_aifg_ie_bm_periodicity)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_msNum,src={0Xfe}", test_aifg_ie_bm_msNum)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_bandUsed,src={0x09}", test_aifg_ie_bm_bandUsed)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_rrCause,src={0X08}", test_aifg_ie_bm_rrCause)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_dlci,src={0XC2}", test_aifg_ie_bm_dlci)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_dtx,src={0x01}", test_aifg_ie_bm_dtx)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_resrcIndMethod,src={0X01}}", test_aifg_ie_bm_resrcIndMethod)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_cipherRespMode,src={0X00}", test_aifg_ie_bm_cipherRespMode)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_channelNeeded,src={0X02}", test_aifg_ie_bm_channelNeeded)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_traceType,src={0xdd}", test_aifg_ie_bm_traceType)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_traceRef,src={0x34,0x97}", test_aifg_ie_bm_traceRef)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_transId,src={0x02,0x17,0x62}", test_aifg_ie_bm_transId)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_forwardInd,src={0x02}", test_aifg_ie_bm_fowardInd)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_chosenEncrypt,src={0X03}", test_aifg_ie_bm_chosenEncrypt)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_circuitPool,src={0X10}", test_aifg_ie_bm_circuitPool)){ + CU_cleanup_registry(); + goto ERR_PROC; + }/* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_timeInd,src={0X11}", test_aifg_ie_bm_timeInd)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_speechVer,src={0X21}", test_aifg_ie_bm_speechVer)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_queuingInd,src={0X02}", test_aifg_ie_bm_queuingInd)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_assignReq,src={0X01}", test_aifg_ie_bm_assignReq)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_eMLPP,src={0X06}", test_aifg_ie_bm_eMLPP)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_configInd,src={0x03}", test_aifg_ie_bm_configInd)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_bm_tmsi,src={0X04,0X33,0X79,0X27,0X46}", test_aifg_ie_bm_tmsi)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + ////////////////////////TEST DTAP//////////////////////////////// + + /* add test cases to test suite */ + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_broadcastRef,src={0x10,0x34,0x78,0x69,0x20}", test_aifg_ie_dt_broadcastRef)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_cmInfo1,src={0x11}", test_aifg_ie_dt_cmInfo1)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_cmInfo2,src={0x03,0x33,0x22,0x8d}", test_aifg_ie_dt_cmInfo2)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_mobileId,src={0x02,0x73,0xf2}", test_aifg_ie_dt_mobileId)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_lai,src={0x78,0xf3,0x64,0x31,0x02}", test_aifg_ie_dt_lai)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_luType,src={0x09}", test_aifg_ie_dt_luType)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_nwName,src={0x03,0x91,0x35,0x64}", test_aifg_ie_dt_nwName)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_tzTime,src={0x07,0x04,0x12,0x0a,0x32,0x14,0xdd}", test_aifg_ie_dt_tzTime)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_progInd,src={0x02,0xc0,0x82}", test_aifg_ie_dt_progInd)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_uu,src={0x03,0x01,0x19,0x83}", test_aifg_ie_dt_uu)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_bc_0,src={0x02,0x20,0x02}", test_aifg_ie_dt_bc_0)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_bc,src={0x13,0xa3,0xca,0x1a,0x00,0xe4,0x21,0x53,0x5b,0x60,0x21,0x5f,0x47,0xc6}", test_aifg_ie_dt_bc)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_cause,src={0x04,0x47,0xdd,0x96,0x81}", test_aifg_ie_dt_cause)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_ccCap,src={0x01,0x03}", test_aifg_ie_dt_ccCap)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_connNum,src={0x04,0x28,0xa3,0x89,0x37}", test_aifg_ie_dt_connNum)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_connSubAddr,src={0x03,0x88,0x50,0x43}", test_aifg_ie_dt_connSubAddr)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_ssVer,src={0x01,0xdd}", test_aifg_ie_dt_ssVer)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_hiComp,src={0x03,0xa8,0x6e,0xb4}", test_aifg_ie_dt_hiComp)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_loComp,src={0x02,0xdd,0xde}", test_aifg_ie_dt_loComp)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_callStat,src={0xc2}", test_aifg_ie_dt_callStat)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_auxStat,src={0x01,0x86}", test_aifg_ie_dt_auxStat)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_lsaId,src={0x03,0x11,0x22,0x33}", test_aifg_ie_dt_lsaId)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_rejectCause,src={0X02}", test_aifg_ie_dt_rejectCause)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_cmType,src={0X0B}", test_aifg_ie_dt_cmType)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_cipherKey,src={0X01}", test_aifg_ie_dt_cipherKey)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_priority,src={0X05}", test_aifg_ie_dt_priority)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_idType,src={0X03}", test_aifg_ie_dt_idType)){ + CU_cleanup_registry(); + goto ERR_PROC; + }if (NULL == CU_add_test(pSuite, "aifg_ie_dt_congestLevel,src={0X0F}", test_aifg_ie_dt_congestLevel)){ + CU_cleanup_registry(); + goto ERR_PROC; + }if (NULL == CU_add_test(pSuite, "aifg_ie_dt_notificationInd,src={0x80}", test_aifg_ie_dt_notificationInd)){ + CU_cleanup_registry(); + goto ERR_PROC; + }if (NULL == CU_add_test(pSuite, "aifg_ie_dt_signal,src={0x08}", test_aifg_ie_dt_signal)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_alertPattern,src={0X01,0X07}", test_aifg_ie_dt_alertPattern)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_keypad,src={0X0D}", test_aifg_ie_dt_keypad)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_timeZone,src={0XDD}", test_aifg_ie_dt_timeZone)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_authRAND,src={0X00,0X11,0X22,0X33,0X44,0X55,0X66,0X77,0X88,0X99,0XAA,0XBB,0XCC,0XDD,0XEE,0XFF}", test_aifg_ie_dt_authRAND)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_authSRES,src={0X11,0X12,0X13,0X14}", test_aifg_ie_dt_authSRES)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_rpInd,src={0X01}", test_aifg_ie_dt_rpInd)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + if (NULL == CU_add_test(pSuite, "aifg_ie_dt_facility", test_aifg_ie_dt_facility)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + + //message decode/encode test + /* add static test suite to the registry */ + pSuite = CU_add_suite("Test message encode/decode", NULL, NULL); + if (NULL == pSuite) { + CU_cleanup_registry(); + goto ERR_PROC; + } + //assign request + if (NULL == CU_add_test(pSuite, "assign request", test_aifg_msg_assignReq)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //assign complete + if (NULL == CU_add_test(pSuite, "assign complete", test_aifg_msg_assignComplete)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //assign failure + if (NULL == CU_add_test(pSuite, "assign failure", test_aifg_msg_assignFailure)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //block + if (NULL == CU_add_test(pSuite, "block", test_aifg_msg_block)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //blocking acknowledge +// if (NULL == CU_add_test(pSuite, "blocking acknowledge", test_aifg_msg_blockAck)){ +// CU_cleanup_registry(); +// goto ERR_PROC; +// } + //unblock + if (NULL == CU_add_test(pSuite, "unblock", test_aifg_msg_unblock)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //unblock Ack +// if (NULL == CU_add_test(pSuite, "unblock acknowledge", test_aifg_msg_unblockAck)){ +// CU_cleanup_registry(); +// goto ERR_PROC; +// } + //handover required + if (NULL == CU_add_test(pSuite, "handover required", test_aifg_msg_HORequired)){ + CU_cleanup_registry(); + goto ERR_PROC; + } +/* //handover request + if (NULL == CU_add_test(pSuite, "handover request", test_aifg_msg_HORequest)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //handover request ack + if (NULL == CU_add_test(pSuite, "handover request Ack", test_aifg_msg_HORequestAck)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //handover command + if (NULL == CU_add_test(pSuite, "handover command", test_aifg_msg_HOCmd)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //handover complete + if (NULL == CU_add_test(pSuite, "handover complete", test_aifg_msg_HOComplete)){ + CU_cleanup_registry(); + goto ERR_PROC; + } +*/ //handover candidate enquire + if (NULL == CU_add_test(pSuite, "handover candidate enquire", test_aifg_msg_HOCandidateEnq)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //handover candidate response + if (NULL == CU_add_test(pSuite, "handover candidate response", test_aifg_msg_HOCandidateResp)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //handover failure + if (NULL == CU_add_test(pSuite, "handover failure", test_aifg_msg_HOFailure)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //handover performed + if (NULL == CU_add_test(pSuite, "handover performed", test_aifg_msg_HOPerformed)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //handover reject + if (NULL == CU_add_test(pSuite, "handover reject", test_aifg_msg_HOReject)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //handover succeed + if (NULL == CU_add_test(pSuite, "handover succeed", test_aifg_msg_HOSucceed)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //handover detect + if (NULL == CU_add_test(pSuite, "handover detect", test_aifg_msg_HODetect)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //resource request + if (NULL == CU_add_test(pSuite, "resource request", test_aifg_msg_resrcReq)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //resource indication + if (NULL == CU_add_test(pSuite, "resource indication", test_aifg_msg_resrcInd)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //paging + if (NULL == CU_add_test(pSuite, "paging", test_aifg_msg_paging)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //clear request + if (NULL == CU_add_test(pSuite, "clear request", test_aifg_msg_clearReq)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //clear command + if (NULL == CU_add_test(pSuite, "clear command", test_aifg_msg_clearCmd)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //reset + if (NULL == CU_add_test(pSuite, "reset", test_aifg_msg_reset)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //overload + if (NULL == CU_add_test(pSuite, "overload", test_aifg_msg_overload)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //MSC invoke trace + if (NULL == CU_add_test(pSuite, "MSC invoke trace", test_aifg_msg_mscInvokeTrace)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //BSC invoke trace + if (NULL == CU_add_test(pSuite, "BSC invoke trace", test_aifg_msg_bscInvokeTrace)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //classmark update + if (NULL == CU_add_test(pSuite, "classmark update", test_aifg_msg_cmUpdate)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //cipher mode command + if (NULL == CU_add_test(pSuite, "cipher mode command", test_aifg_msg_cipherModeCmd)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //cipher mode complete + if (NULL == CU_add_test(pSuite, "cipher mode complete", test_aifg_msg_cipherModeComplete)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //cipher mode reject + if (NULL == CU_add_test(pSuite, "cipher mode reject", test_aifg_msg_cipherModeReject)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //complete layer 3 information + if (NULL == CU_add_test(pSuite, "complete layer 3 information", test_aifg_msg_completeL3Info)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //SAPI_n_reject + if (NULL == CU_add_test(pSuite, "SAPI_n_Reject", test_aifg_msg_SAPI_n_Reject)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //reset circuit + if (NULL == CU_add_test(pSuite, "reset circuit", test_aifg_msg_resetCircuit)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //reset circuit Ack +// if (NULL == CU_add_test(pSuite, "reset circuit Ack", test_aifg_msg_resetCircuitAck)){ +// CU_cleanup_registry(); +// goto ERR_PROC; +// } + //circuit group block + if (NULL == CU_add_test(pSuite, "circuit group block", test_aifg_msg_circuitGrpBlk)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //circuit group block Ack +// if (NULL == CU_add_test(pSuite, "circuit group block Ack", test_aifg_msg_circuitGrpBlkAck)){ +// CU_cleanup_registry(); +// goto ERR_PROC; +// } + //circuit group unblock + if (NULL == CU_add_test(pSuite, "circuit group unblock", test_aifg_msg_circuitGrpUnblk)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //circuit group unblock Ack +// if (NULL == CU_add_test(pSuite, "circuit group unblock Ack", test_aifg_msg_circuitGrpUnblkAck)){ +// CU_cleanup_registry(); +// goto ERR_PROC; +// } + //confusion + if (NULL == CU_add_test(pSuite, "confusion", test_aifg_msg_confusion)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //unequipped circuit + if (NULL == CU_add_test(pSuite, "unequipped circuit", test_aifg_msg_unequippedCircuit)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //load indication + if (NULL == CU_add_test(pSuite, "load indication", test_aifg_msg_loadIndication)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //suspend + if (NULL == CU_add_test(pSuite, "suspend", test_aifg_msg_suspend)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //resume + if (NULL == CU_add_test(pSuite, "resume", test_aifg_msg_resume)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //change circuit +// if (NULL == CU_add_test(pSuite, "change circuit", test_aifg_msg_changeCircuit)){ +// CU_cleanup_registry(); +// goto ERR_PROC; +// } + //change circuit Ack +// if (NULL == CU_add_test(pSuite, "change circuit Ack", test_aifg_msg_changeCCAck)){ +// CU_cleanup_registry(); +// goto ERR_PROC; +// } + //location information command + if (NULL == CU_add_test(pSuite, "location information command", test_aifg_msg_locCmd)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //location information report + if (NULL == CU_add_test(pSuite, "location information report", test_aifg_msg_locReport)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //reset Ack + if (NULL == CU_add_test(pSuite, "reset Ack", test_aifg_msg_resetAck)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //clear complete + if (NULL == CU_add_test(pSuite, "clear complete", test_aifg_msg_clearComplete)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //queuing indication + if (NULL == CU_add_test(pSuite, "queuing indication", test_aifg_msg_queueInd)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //classmark request + if (NULL == CU_add_test(pSuite, "classmark request", test_aifg_msg_cmkRequest)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + +//...................................dtap................................................................ + + //location updating accept + if (NULL == CU_add_test(pSuite, "location updating accept", test_aifg_msg_luAccept)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //classmark reject + if (NULL == CU_add_test(pSuite, "classmark reject", test_aifg_msg_cmReject)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + + //location updating reject + if (NULL == CU_add_test(pSuite, "locatin updating reject", test_aifg_msg_luAccept)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //abort + if (NULL == CU_add_test(pSuite, "abort", test_aifg_msg_abort)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //MM status + if (NULL == CU_add_test(pSuite, "MM status", test_aifg_msg_mmStatus)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //loaction updating request + if (NULL == CU_add_test(pSuite, "location updating request", test_aifg_msg_luRequest)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //authentication request + if (NULL == CU_add_test(pSuite, "authentication request", test_aifg_msg_authRequest)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //authentication response + if (NULL == CU_add_test(pSuite, "authentication response", test_aifg_msg_authResp)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //identity request + if (NULL == CU_add_test(pSuite, "identity request", test_aifg_msg_idRequest)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //identity response + if (NULL == CU_add_test(pSuite, "identity response", test_aifg_msg_idResp)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //IMSI detach indication + if (NULL == CU_add_test(pSuite, "IMSI detach indication", test_aifg_msg_imsiDetachInd)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //TMSI command + if (NULL == CU_add_test(pSuite, "TMSI command", test_aifg_msg_tmsiCmd)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //CM re-establishment request + if (NULL == CU_add_test(pSuite, "CM re-establishment request", test_aifg_msg_cmReEst_Request)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //CM service request + if (NULL == CU_add_test(pSuite, "CM service request", test_aifg_msg_cmRequest)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //MM information + if (NULL == CU_add_test(pSuite, "MM information", test_aifg_msg_mmInfo)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //alerting + if (NULL == CU_add_test(pSuite, "alerting", test_aifg_msg_alert)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //call confirmed + if (NULL == CU_add_test(pSuite, "call confirmed", test_aifg_msg_callConfirm)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //call proceeding + if (NULL == CU_add_test(pSuite, "call proceeding", test_aifg_msg_callProceed)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //connect + if (NULL == CU_add_test(pSuite, "connect", test_aifg_msg_connect)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //emergency setup + if (NULL == CU_add_test(pSuite, "emergency setup", test_aifg_msg_eSetup)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //progress + if (NULL == CU_add_test(pSuite, "progress", test_aifg_msg_progress)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //setupu + if (NULL == CU_add_test(pSuite, "setup", test_aifg_msg_setup)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //modify + if (NULL == CU_add_test(pSuite, "modify", test_aifg_msg_modify)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //modify complete + if (NULL == CU_add_test(pSuite, "modify complete", test_aifg_msg_modifyCmp)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //modify reject + if (NULL == CU_add_test(pSuite, "modify reject", test_aifg_msg_modifyRej)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //user information + if (NULL == CU_add_test(pSuite, "user information", test_aifg_msg_userInfo)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //hold reject + if (NULL == CU_add_test(pSuite, "hold reject", test_aifg_msg_holdRej)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //retrieve reject + if (NULL == CU_add_test(pSuite, "retrieve reject", test_aifg_msg_retrieveRej)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //disconnect + if (NULL == CU_add_test(pSuite, "disconnect", test_aifg_msg_disconnect)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //release + if (NULL == CU_add_test(pSuite, "release", test_aifg_msg_release)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //release complete + if (NULL == CU_add_test(pSuite, "release complete", test_aifg_msg_releaseCmp)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //congestion control + if (NULL == CU_add_test(pSuite, "congestion control", test_aifg_msg_congestCtrl)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //notify + if (NULL == CU_add_test(pSuite, "notify", test_aifg_msg_notify)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //status + if (NULL == CU_add_test(pSuite, "status", test_aifg_msg_status)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //start DTMF + if (NULL == CU_add_test(pSuite, "start DTMF", test_aifg_msg_startDTMF)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //start DTMF acknowledge + if (NULL == CU_add_test(pSuite, "start DTMF acknowledge", test_aifg_msg_startDTMF_ack)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //start DTMF reject + if (NULL == CU_add_test(pSuite, "start DTMF reject", test_aifg_msg_startDTMF_rej)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //connect acknowledge + if (NULL == CU_add_test(pSuite, "connect acknowledge", test_aifg_msg_connectAck)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //hold + if (NULL == CU_add_test(pSuite, "hold", test_aifg_msg_hold)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //hold acknowledge + if (NULL == CU_add_test(pSuite, "hold acknowledge", test_aifg_msg_holdAck)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //retrieve + if (NULL == CU_add_test(pSuite, "retrieve", test_aifg_msg_retrieve)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //retrieve acknowledge + if (NULL == CU_add_test(pSuite, "retrieve acknowledge", test_aifg_msg_retrieveAck)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //status enquiry + if (NULL == CU_add_test(pSuite, "status enquiry", test_aifg_msg_statusEnq)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //stop DTMF + if (NULL == CU_add_test(pSuite, "stop DTMF", test_aifg_msg_stopDTMF)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //stop DTMF acknowledge + if (NULL == CU_add_test(pSuite, "stop DTMF acknowledge", test_aifg_msg_stopDTMF_ack)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //facility + if (NULL == CU_add_test(pSuite, "facility", test_aifg_msg_facility)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //disconnect(mobile station to network) + if (NULL == CU_add_test(pSuite, "disconnect_mobileToNet", test_aifg_msg_disconnect_mobileToNet)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + //paging response + if (NULL == CU_add_test(pSuite, "paging response", test_aifg_msg_pagingResp)){ + CU_cleanup_registry(); + goto ERR_PROC; + } + + /* Run all tests using the automated interface */ +// CU_basic_set_mode(CU_BRM_VERBOSE); +// CU_basic_run_tests(); + CU_automated_run_tests(); + CU_list_tests_to_file(); + /* Clean up registry and return */ + CU_cleanup_registry(); + return 1; + +ERR_PROC: + return 0; +} + +//Dynamic test---------------------------------------------------------------------- +//stub function definition +#define MSC_SPC 0 +#define BSC_SPC 1 +#define MSC_PORT 4321 +#define BSC_PORT 1234 +#define MSC_LINK 10 +#define BSC_LINK 20 + +int bsc_cg, msc_cg; +SP_UiPriPara msg_buffer[64]; +int pMsg_h = 0 ,pMsg_t = 0; +aifg_msg_pre_decoded aifg_msg; + +static u8 ascii[16] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46}; +void HexToDisplay(u8 *from_hex, u8 from_len) +{ + int i = 0; + + for (i = 0; i < from_len; i++) + { + putchar(ascii[from_hex[i] >> 4]); + putchar(ascii[from_hex[i] & 0x0f]); + putchar(' '); + } + putchar('\n'); +} + +int PostSp ( SP_UiPriPara * pUiPriParam ) +{ + if(pMsg_h != ((pMsg_t+1) & 0x3F)){ + printf("\nSCCP SD:"); + switch(pUiPriParam->uUiPri){ + case N_UNITDATA_REQ: + if(pUiPriParam->tPriUnion.tPriNUDataReq.tCDA.DPC == BSC_SPC) + pUiPriParam->tPriUnion.tPriNUDataReq.tCGA.DPC = MSC_SPC; + else + pUiPriParam->tPriUnion.tPriNUDataReq.tCGA.DPC = BSC_SPC; + + msg_buffer[pMsg_t].uUiPri = N_UNITDATA_IND; + memcpy(&msg_buffer[pMsg_t].tPriUnion.tPriNUDataInd.tCDA, + &pUiPriParam->tPriUnion.tPriNUDataReq.tCDA, + sizeof(pUiPriParam->tPriUnion.tPriNUDataReq.tCDA)); + memcpy(&msg_buffer[pMsg_t].tPriUnion.tPriNUDataInd.tCGA, + &pUiPriParam->tPriUnion.tPriNUDataReq.tCGA, + sizeof(pUiPriParam->tPriUnion.tPriNUDataReq.tCGA)); + memcpy(&msg_buffer[pMsg_t].tPriUnion.tPriNUDataInd.tUD, + &pUiPriParam->tPriUnion.tPriNUDataReq.tUD, + sizeof(pUiPriParam->tPriUnion.tPriNUDataReq.tUD)); + + printf("TYPE: UDT\n"); + printf("%d => %d\n", + pUiPriParam->tPriUnion.tPriNUDataInd.tCGA.DPC, + pUiPriParam->tPriUnion.tPriNUDataInd.tCDA.DPC); + printf("CONTENT: "); + HexToDisplay(pUiPriParam->tPriUnion.tPriNUDataReq.tUD.aUserData, + pUiPriParam->tPriUnion.tPriNUDataReq.tUD.uDataLen); + break; + + case N_CONNECT_REQ: + if(MSC_SPC == pUiPriParam->tPriUnion.tPriNConnReq.tCDA.DPC){ + pUiPriParam->wConnId = BSC_LINK; + msg_buffer[pMsg_t].wConnId = MSC_LINK; + } + else{ + pUiPriParam->wConnId = MSC_LINK; + msg_buffer[pMsg_t].wConnId = BSC_LINK; + } + msg_buffer[pMsg_t].uUiPri = N_CONNECT_IND; + msg_buffer[pMsg_t].tPriUnion.tPriNConnInd.uOptFlag = 0x04; + memcpy(&msg_buffer[pMsg_t].tPriUnion.tPriNConnInd.tCDA, + &pUiPriParam->tPriUnion.tPriNConnReq.tCDA, + sizeof(pUiPriParam->tPriUnion.tPriNConnReq.tCDA)); + memcpy(&msg_buffer[pMsg_t].tPriUnion.tPriNConnInd.tUD, + &pUiPriParam->tPriUnion.tPriNConnReq.tUD, + sizeof(pUiPriParam->tPriUnion.tPriNUDataReq.tUD)); + + printf("TYPE: CR\n"); + printf("CDA: %d\n", pUiPriParam->tPriUnion.tPriNConnReq.tCDA.DPC); + printf("LINK ID: %d\n", pUiPriParam->wConnId); + printf("CONTENT: "); + HexToDisplay(pUiPriParam->tPriUnion.tPriNConnReq.tUD.aUserData, + pUiPriParam->tPriUnion.tPriNConnReq.tUD.uDataLen); + break; + + case N_CONNECT_RSP: + if(pUiPriParam->wConnId == MSC_LINK) + msg_buffer[pMsg_t].wConnId = BSC_LINK; + else + msg_buffer[pMsg_t].wConnId = MSC_LINK; + + msg_buffer[pMsg_t].uUiPri = N_CONNECT_CFM; + + if(0x08 == pUiPriParam->tPriUnion.tPriNConnRsp.uOptFlag) + msg_buffer[pMsg_t].tPriUnion.tPriNConnCfm.uOptFlag = 0x04; + else + msg_buffer[pMsg_t].tPriUnion.tPriNConnCfm.uOptFlag = 0; + memcpy(&msg_buffer[pMsg_t].tPriUnion.tPriNConnCfm.tUD, + &pUiPriParam->tPriUnion.tPriNConnRsp.tUD, + sizeof(pUiPriParam->tPriUnion.tPriNConnRsp.tUD)); + + printf("TYPE: CC\n"); + printf("LINK ID: %d\n", pUiPriParam->wConnId); + printf("CONTENT: "); + HexToDisplay(pUiPriParam->tPriUnion.tPriNConnRsp.tUD.aUserData, + pUiPriParam->tPriUnion.tPriNConnRsp.tUD.uDataLen); + break; + + case N_DISCONNECT_REQ: + if(pUiPriParam->wConnId == MSC_LINK) + msg_buffer[pMsg_t].wConnId = BSC_LINK; + else + msg_buffer[pMsg_t].wConnId = MSC_LINK; + msg_buffer[pMsg_t].uUiPri = N_DISCONNECT_IND; + printf("TYPE: RLSD\n"); + printf("LINK ID: %d\n", pUiPriParam->wConnId); + break; + + case N_DATA_REQ: + if(pUiPriParam->wConnId == MSC_LINK) + msg_buffer[pMsg_t].wConnId = BSC_LINK; + else + msg_buffer[pMsg_t].wConnId = MSC_LINK; + + msg_buffer[pMsg_t].uUiPri = N_DATA_IND; + memcpy(&msg_buffer[pMsg_t].tPriUnion.tPriNDataInd.tUD, + &pUiPriParam->tPriUnion.tPriNDataReq.tUD, + sizeof(pUiPriParam->tPriUnion.tPriNDataReq.tUD)); + + printf("TYPE: DT1\n"); + printf("LINK ID: %d\n", pUiPriParam->wConnId); + printf("CONTENT: "); + HexToDisplay(pUiPriParam->tPriUnion.tPriNDataReq.tUD.aUserData, + pUiPriParam->tPriUnion.tPriNDataReq.tUD.uDataLen); + break; + + default: + assert(0); + break; + } + + pMsg_t = ((pMsg_t + 1) & 0x3F); + } + + return 0; +} + +int SpSubmit ( SP_UiPriPara * pUiPriParam , BYTE uUlSapId ) +{ + if(pMsg_h != pMsg_t){ + memcpy(pUiPriParam, &msg_buffer[pMsg_h], sizeof(SP_UiPriPara)); + pMsg_h = ((pMsg_h + 1) & 0x3F); + + //print + printf("\nSCCP RV:"); + switch(pUiPriParam->uUiPri){ + case N_UNITDATA_IND: + printf("TYPE: UDT\n"); + printf("%d <= %d\n", + pUiPriParam->tPriUnion.tPriNUDataInd.tCDA.DPC, + pUiPriParam->tPriUnion.tPriNUDataInd.tCGA.DPC); + printf("CONTENT: "); + HexToDisplay(pUiPriParam->tPriUnion.tPriNUDataInd.tUD.aUserData, + pUiPriParam->tPriUnion.tPriNUDataInd.tUD.uDataLen); + break; + + case N_CONNECT_IND: + printf("TYPE: CR\n"); + printf("CDA: %d\n", pUiPriParam->tPriUnion.tPriNConnInd.tCDA.DPC); + printf("LINK ID: %d\n", pUiPriParam->wConnId); + printf("CONTENT: "); + HexToDisplay(pUiPriParam->tPriUnion.tPriNConnInd.tUD.aUserData, + pUiPriParam->tPriUnion.tPriNConnInd.tUD.uDataLen); + break; + + case N_CONNECT_CFM: + printf("TYPE: CC\n"); + printf("LINK ID: %d\n", pUiPriParam->wConnId); + printf("CONTENT: "); + HexToDisplay(pUiPriParam->tPriUnion.tPriNConnCfm.tUD.aUserData, + pUiPriParam->tPriUnion.tPriNConnCfm.tUD.uDataLen); + break; + + case N_DISCONNECT_IND: + printf("TYPE: RLC\n"); + printf("LINK ID: %d\n", pUiPriParam->wConnId); + break; + + case N_DATA_IND: + printf("TYPE: DT1\n"); + printf("LINK ID: %d\n", pUiPriParam->wConnId); + printf("CONTENT: "); + HexToDisplay(pUiPriParam->tPriUnion.tPriNDataInd.tUD.aUserData, + pUiPriParam->tPriUnion.tPriNDataInd.tUD.uDataLen); + break; + + default: + assert(0); + break; + } + + return 1; + } + return 0; +} + +int test_call_back_msc(aifg_indication ind, aifg_msg_pre_decoded *msg) +{ + printf("MSC call back called\n"); + memcpy(&aifg_msg, msg, sizeof(aifg_msg)); + + if(msg->port == -1){ + msg->port = MSC_PORT; + } + + return 1; +} + + +int test_call_back_bsc(aifg_indication ind, aifg_msg_pre_decoded *msg) +{ + printf("BSC call back called\n"); + memcpy(&aifg_msg, msg, sizeof(aifg_msg)); + + if(msg->port == -1){ + msg->port = BSC_PORT; + } + + return 1; +} + +//end of stub function definition + +int test_aifg_reset_proc() +{ + int i=0; + + //Precondition + printf("\nTest case: Creating and reseting circuit group\n"); + aifg_bind(AIFG_SAP_MSC, test_call_back_msc); + aifg_bind(AIFG_SAP_BSC, test_call_back_bsc); + msc_cg = aifg_createCircuitGroup(AIFG_SAP_MSC, BSC_SPC, AIFG_NI_INTERNATIONAL); + bsc_cg = aifg_createCircuitGroup(AIFG_SAP_BSC, MSC_SPC, AIFG_NI_INTERNATIONAL); + aifg_set_running_mode(AIFG_RUN_MODE_SINGLE, 0); + + //waiting reset completed + while(i++ < 6000){ + aifg_proc(); + } + + //Post condition + + printf("\nTest case: Creating and reseting circuit group completed!\n"); + return 1; +} + +int test_aifg_sccp_link_setup() +{ + int msc_status = 0; + int bsc_status = 0; + + printf("\nTest case: Sccp link setup and release\n"); + + while(1){ + switch(bsc_status){ + case 0: //send complete l3 information + aifg_send(AIFG_SAP_BSC, bsc_cg, BSC_PORT, &bm_completeL3); + bsc_status++; + break; + + case 1: //wait cm accept + if(aifg_msg.type == AIFG_MSG_ID_CM_ACCEPT) + bsc_status++; + break; + + case 2: //send clear request + aifg_send(AIFG_SAP_BSC, bsc_cg, BSC_PORT, &bm_clearReq); + bsc_status++; + break; + + case 3: //wait clear command + if(aifg_msg.type == AIFG_MSG_ID_CLR_CMD) + bsc_status++; + break; + + case 4: //send clear completed + bm_clearComplete.id = AIFG_MSG_ID_CLR_CMP; + aifg_send(AIFG_SAP_BSC, bsc_cg, BSC_PORT, &bm_clearComplete); + bsc_status++; + break; + + default: + break; + } + + switch(msc_status){ + case 0: //wait complete l3 information + if(aifg_msg.type == AIFG_MSG_ID_L3_INFO) + msc_status++; + break; + + case 1: //send cm service accept + dt_cmAccept.id = AIFG_MSG_ID_CM_ACCEPT; + aifg_send(AIFG_SAP_MSC, msc_cg, MSC_PORT, &dt_cmAccept); + msc_status++; + break; + + case 2: //wait clear request + if(aifg_msg.type == AIFG_MSG_ID_CLR_REQ) + msc_status++; + break; + + case 3: //send clear command + aifg_send(AIFG_SAP_MSC, msc_cg, MSC_PORT, &bm_clearCmd); + msc_status++; + break; + + case 4: //wait clear completed + if(aifg_msg.type == AIFG_MSG_ID_CLR_CMP) + msc_status++; + break; + + default: + printf("Test case: Sccp link setup and release completed!\n"); + return 1; + break; + } + + aifg_proc(); + } + + return 0; +} + +int test_aifg_paging() +{ + int msc_status = 0; + int bsc_status = 0; + + printf("\nTest case: Paging procedure\n"); + + while(1){ + switch(msc_status){ + case 0: //send paging request + aifg_paging(AIFG_SAP_MSC, msc_cg, MSC_PORT, &bm_paging); + msc_status++; + break; + + case 1: //wait paging resp + if(aifg_msg.type == AIFG_MSG_ID_L3_INFO + && aifg_msg.msg.completeL3Info.l3msg.id == AIFG_MSG_ID_PAGING_RESP) + msc_status++; + break; + + case 2: //send setup + aifg_send(AIFG_SAP_MSC, msc_cg, MSC_PORT, &bm_setup); + msc_status++; + break; + + case 3: //wait call confirm + if(aifg_msg.type == AIFG_MSG_ID_CALL_CONFIRMED) + msc_status++; + break; + + case 4: //send clear command + aifg_send(AIFG_SAP_MSC, msc_cg, MSC_PORT, &bm_clearCmd); + msc_status++; + break; + + case 5: //wait clear completed + if(aifg_msg.type == AIFG_MSG_ID_CLR_CMP) + msc_status++; + break; + + default: + printf("Test case: Paging procedure completed!\n"); + return 1; + break; + } + + switch(bsc_status){ + case 0: //wait paging request + if(aifg_msg.type == AIFG_MSG_ID_PAGING){ + bsc_status++; + memset(&aifg_msg, 0, sizeof(aifg_msg)); + } + break; + + case 1: //wait a second paging request + if(aifg_msg.type == AIFG_MSG_ID_PAGING){ + bsc_status++; + } + break; + + case 2: //send paging response + aifg_send(AIFG_SAP_BSC, bsc_cg, BSC_PORT, &rr_pagingResp); + bsc_status++; + break; + + case 3: //wait setup + if(aifg_msg.type == AIFG_MSG_ID_SETUP){ + bsc_status++; + } + break; + + case 4: //send call confirm + dt_callCfm.id = AIFG_MSG_ID_CALL_CONFIRMED; + dt_callCfm.msg.dtap_msg.ptr = msgsrc[69]; + dt_callCfm.msg.dtap_msg.len = 34; + aifg_send(AIFG_SAP_BSC, bsc_cg, BSC_PORT, &dt_callCfm); + bsc_status++; + break; + + case 5: //wait clear cmd + if(aifg_msg.type == AIFG_MSG_ID_CLR_CMD) + bsc_status++; + break; + + case 6: //send clear complete + bm_clearComplete.id = AIFG_MSG_ID_CLR_CMP; + aifg_send(AIFG_SAP_BSC, bsc_cg, BSC_PORT, &bm_clearComplete); + bsc_status++; + break; + + default: + break; + } + + aifg_proc(); + } + + printf("\nTest case: Paging completed\n"); + return 0; +} + +int aifg_unit_test() +{ + int status = 0; + + //init + pMsg_h = pMsg_t = 0; + aifg_init(); + + while(1){ + switch(status){ + case 0: + //creat sap and circuit group + if(1 == test_aifg_reset_proc()) + status++; + break; + + case 1: + //setup up sccp link + if(1 == test_aifg_sccp_link_setup()) + status++; + break; + + + case 2: + //paging + if(1 == test_aifg_paging()) + status++; + break; + + default: + goto FINISH; + break; + } + } + +FINISH: + return 0; +} + diff --git a/omc/plat/aif/ut/makefile b/omc/plat/aif/ut/makefile new file mode 100644 index 0000000..f299966 --- /dev/null +++ b/omc/plat/aif/ut/makefile @@ -0,0 +1,40 @@ +#WXC2 R9.0 AIFG makefile +#Create by Roy Jiang +#2007-3-12 + +CC = gcc +CFLAG = -g -Wall -c #-fprofile-arcs -ftest-coverage + +AIFG_LIB_OBJ = aifg_m.o aifg.o aifg_mpp.o aifg_debug.o aifg_ie.o +AIFG_TST_OBJ = aifg_main.o aifg_test.o + +AIFG_LIB = -L../lib -laif +TEST_LIB = -L/usr/local/lib/CUnit -lcunit -lgcov + +aifg_main: $(AIFG_TST_OBJ) + $(CC) $(AIFG_TST_OBJ) -o test_main $(AIFG_LIB) $(TEST_LIB) + +aifg_main.o: aifg_main.c + $(CC) $(CFLAG) $< + +aifg_test.o: aifg_test.c + $(CC) $(CFLAG) $< + +aifg.o: aifg.c + $(CC) $(CFLAG) $< + +aifg_m.o: aifg_m.c + $(CC) $(CFLAG) $< + +aifg_mpp.o: aifg_mpp.c + $(CC) $(CFLAG) $< + +aifg_debug.o: aifg_debug.c + $(CC) $(CFLAG) $< + +aifg_ie.o: aifg_ie.c + $(CC) $(CFLAG) $< + +clean: + rm -f main *.o *.a *.xml *.gcov *.gcda *.gcno core test_main + diff --git a/omc/plat/bicc/.copyarea.db b/omc/plat/bicc/.copyarea.db new file mode 100644 index 0000000..1c553f9 --- /dev/null +++ b/omc/plat/bicc/.copyarea.db @@ -0,0 +1,10 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\bicc +2 +6 +3:doc|2|0|0|0|bb796660bfa411dc8505001c23e19543|0 +2:ut|2|0|0|0|c7696890bfa411dc8505001c23e19543|0 +3:src|2|0|0|0|96f644919a8511dd8b36001c23e19543|0 +7:src.old|2|0|0|0|95c644659a8511dd8b36001c23e19543|0 +8:Makefile|1|11d70a3e184|b31|3d53c002|bca96698bfa411dc8505001c23e19543|0 +3:lib|2|0|0|0|bc09667cbfa411dc8505001c23e19543|0 diff --git a/omc/plat/bicc/Makefile b/omc/plat/bicc/Makefile new file mode 100644 index 0000000..b2bd77f --- /dev/null +++ b/omc/plat/bicc/Makefile @@ -0,0 +1,98 @@ + +##----------------------------------------------------------## +## ## +## Universal Makefile for module template : V1.6.3 ## +## ## +## Created : Wei Liu 07/04/11 ## +## Revision: [Last]Wei Liu 07/07/07 ## +## ## +##----------------------------------------------------------## + +##---------------------------------------------------------------------## +##-------------------------------------- +## +## Project correlation(Customer define) +## +##-------------------------------------- + +## MODULE= [Module Name] +## TYPE = app/plat => Module Type + +## DBUG_FLAGS_ADD = [Module Define Gcc Flags for Debug ] +## DBUG_FLAGS_ADD = [Module Define Gcc Flags for Release] + +## BUILD = lib/exef => Output file format +## CFG = debug/release => Build Configuration + +## SRC_PATH = [Source file path] +## INC_PATH = [Include file path] +## APP_PATH = [App Module path] +## PLT_PATH = [Plat Module path] + +## PLT_LIB = [Needed plat lib for Link] => just for test or wxc2main +## APP_LIB = [Needed app lib for Link] => just for test or wxc2main +## LIB_ADD = [Needed Extend lib for Link] => just for test or wxc2main + +## PLT_LIB e.g. = haepub fsm mng proto kernel aif mgc mgcp sip rtp \ +## 8ecp bicc smpp xapp tcap mtp3 m2ua \ +## snmp iptrans debug sccp public +## +## APP_LIB e.g. = msc vlr ssf hlr ae pps mnp smsc vms aas +## LIB_ADD e.g. = -liba3a8 -lm + +## OBJ_ADD = [Extend third party object files needed] +## TEST_OBJ_PATH = [module object files Path for test ] => just for test +##---------------------------------------------------------------------## + +MODULE = bicc +TYPE = plat + +DBUG_FLAGS_ADD = +RELS_FLAGS_ADD = + +##Default commonly as below + +BUILD = lib +CFG = debug + + +PLT_LIB = + +APP_LIB = +LIB_ADD = + +SRC_PATH = ./src +INC_PATH = ./src/include +PLT_PATH = ../../plat +APP_PATH = ../../mss + +OBJ_ADD = +TEST_OBJ_PATH = + +PREPROC_CMD = +POSTPROC_CMD = + +##---------------------------------------------------------------------## +##-------------------------------------- +## +## Make configuration(Customer define) +## +##-------------------------------------- + +## CCFLAG_SWITCH = on/off => gcc flag show on/off +## COVER_NEED = yes/no => PTF cover report needed +## COVER_REPORT_PATH = [path ] => PTF cover report path + +CCFLAG_SWITCH = off +COVER_NEED = no +COVER_REPORT_PATH = ./output + +##---------------------------------------------------------------------## + + +##-------------------------------------- +## +## include makefile.rules (Do not change) +## +##-------------------------------------- +include Makefile.rules diff --git a/omc/plat/bicc/lib/libbicc.a b/omc/plat/bicc/lib/libbicc.a new file mode 100644 index 0000000000000000000000000000000000000000..13d4ca95365112622196aab6d03d08667adff467 GIT binary patch literal 328886 zcmeFa3w%`7wLgAlCMTIZC%oS>ASeig@DLFrB*4J%jzAO@9g@i;nVQF#%tlpwL)r5mVFlbGzJ`jcgi~Q9fq$L&&L|R*d3Q>&KP+e=Nt-)#xw?zZNdUdXD zY)rU=;nrXbq!57ubRg2w%0V@;wjF__x3(#wCld`fg<2KR*is(|wQ3$zDFikMS+(J| zNMrSm0BPLRR!=5vQn^cj)?&=x(&}inwQo>0^ZHiRH<5F~D^4oAby^^%!jbz@CqOYk;; zG+C{orj}?ZO#tZFk_H9|)s3;{G$Be-+Mv+ZP;)fUP~BYH$U4`?svFxv;XA;Xnlg}P zSSxsy6-kOSOW8}NqR?n-tob%DKy|R8x(3o{tBpuYZD|eH>;7O%bF=Qp0@wZ3(P(S9 zMn{@Lwc+ZD)L06OMs;3cRtl3*ar%cODr-VYKO_wG zKGGK1nyPv#DzRH2r@<&D*c!S$HA0%8M6BkzDAW-{>y{KW$!+duMyNRnjCu8;=1^-m z2yl&b8>t~n!}Z~4n^G|$yR|jcNS!N;4^$V}f@!3shUn77>Mi}GaXQrMk{vDc4V1Zc z+iKC8DcYo9%xkWWQUlVpPQjRmtxi?DgvB`hG$9f^|l@XozrPHEp5W6KS)&wp291ZG)~k#k6g)B*d&JWU~#r z6|+M3!@l~gIW2rtp5C&5%u)b9fgQ~2Bg{$@S zp^0i?t&Kc5Q~IrKDLyG&3WK86;PRF2egEu8t8&A6Hux1w0?6bN0-aQCWox*J zhl_2k;b=(nFUEPr^`X`_97||G4!~?A3YB&v&R*1%qczYJrF5;uE0!#w3G3ES0B1Yo zuZ6KP3I$FGC9W!3II70u`cSkoT)TM3l5kK(XsT@ssMOhVrhf+*nz`^ER3ss<|o|fo84b!WkXSSd}luR20in#SN;Jw5V(8OjpqJ z=FX)H=UH>Fo~Jll^6vJnUgmT-;6hp*4r`&6^a*NNk-15CIXTO%k=6+7Po7KOsPe~u z>5uR1^T%Un<0tm{&iFfgea~4AIGyzzDMsJEO7i*JyBrC`x&M}Lo6%JiBKPg1nEp-` z)pMlWxzBmj32AH5+Ru0|oU-SL?@VXqd8LOFPbkcDq|4t?b=Ke63aVB0`8!v-{PAb} z@fS~H_Vz!Y)UEwYu_V$@Kgggi%Eh7_nkW^ASde{9?*Cwuq0XwXtgh49?cENr4A`yx zHAiQ`V9$|CXZve^&Hc{4O0=dB+q=grR%gM#qX`u)N2h_&)5~+QJg^_hLt=aPB9Zq1 z%LAGV<+)Um{uOoFSDA$;D2J?MkxDt(S~*-)k)AjWnSQ!En>3(8?mF#qkP*->?az3r zdSZyHAJ^4&+8KWuwF0iw@tp)!)6h;+=`i!0kM=It-@T^%ed^~$qzYB6>*;Q{DkC&C z)Ea`(2^a2TY@2x8z2F{lcbJIWlfrHHBV7^)Br zr>C*C_~S48q-pv1Kh*x4A11pHg+ z55QS~0_I?f4hOlfM7QlC_f>@Fl6yY7v-2py1-a;PlKYxm6vJBo0-U7vF;2A1bvHni z-gg&{hry5HEOKLf8cKDJ+&2%x!pDpYCkT)K>3yO2ocwL*DDkuQ8`GRP(fg@Rq60vWC*rff2ndlU4HZ0V& z*|0L94OR-$W_5aPz98DHPO;7EYbgM=X%uaI{k8dvXycoPPSM7fVjEx5HfSuWU1hp9 zUrglg8tA}*0z=mr-8N-cQvhl+4T7mEm5MetRe3Du`ye*iru1@jiZ-S5bla3JPS^$; z64_>|u1&I}o)>MVrf4(uY6?JY?trwZ-b@s2k|i|^+B|79@p5#EHWO2{nV8fDn>g8K zjIK?x9^QaLFqtuuy3+$+EUSrFz<3A5o*f6;<`MTQRXG7EV* zLmaN6{Cp*MLa_rN_arMne__6>$g*-FO^~9cnOEXiG)hvPU|&9J#gIXc!8zq4?-+$~ z^HYMeFCV1`79?{pA$P@)!u;DH6NR7_B;gdjifq!$lOjk<=T1teI3+ldjtU&)aI6@D z+6j zn@ouYC?l0dU52GJ9sa4BTENr}eM+an);~ZGZUc8MfDVV_&7wj)LG8l{0ywZ&?0+~N zDK&hwVYT?TPLi?aL0^qc+)N-1Ur225jnKd+a8AJYd74_B>K*Y8k4Ys??}@d;D?x znoV};VLP|PE`_X>*`sD6Sh~s1J#J41q{N;#6XT5&-3Ncc9(VD&4?LH`92T=jy=+f` ze7tPum)MSWDTTrHR0MVSJ9ws@YnDjP9y|Lc+m70Kdu-Q3_Epa5!)*JoJ;MEUyYOY( zZnx(_sP3PC0e=~X|B~aE8~$rbl{^U_QOd*-uFYP1^vm|x!}jE;?QmUw+|F`shP=2Y zc^BE)P&JD8*jc;nqSbbB%+7N^X&3Fbht0I}U(OsbC{v7#0Yf0h;Y1pzl4%Uf6fihb z0Hon)cRHcDwT15p1)^33Ej)tfZGkpe^bm~d>u)0Xm{D7#RHGIOwKUcSa2ki}d_uKe zSR&DC)irJ-Z28(M?~++pd1uWknOjooozVn~hCb4!tutKS&xh2*%Bi6hPof%G_*?AqmfWp%P+6CfTvGUSZ-p~ z1fvm)*J;%R1N~P+aadwe)8gO?d<4aIjWx5qL?3?YX{?swC%*|Hl!cVIZ4I#W$eRLz zI_f!VGdSQGZWLCGz_V9+o>viRs%nFWc>Ri3UvtK~BvMuDOz^^Wad0Co1(Wzn-GI5~ z3#=;Z%s2;NF13a%p(#}qrM+PTj;$i#bFXMiu%*!owlqal#-N;5Bx)$ARUd7Dg-KBF z^nz8jbMcamm7;7)-DPzktpKW8vy}^5p0%g0Wn+r~8w|RE!ZyM>H<7%QSF?$~WM*4y za3($XghWe%)=YRJKa-xN&TMH4&cx@b6r4GLL|95t$;@zburXE}VtTk{W_>U?6B#S;8A@&IIQJM zmMrj2sj7)JM`PTMXUvL`ch+6AXP1=DoystbyfEJ4JQPQ6X!yu?{^LP&MPE_zz0M_t*;|1C7>1Q$ARIIkmGI_d_+}Ms(acxE zotue(@$cktnpY>n*CoOaa(Jfnzro>|(tm}+>8d0l|6D@;IS!|5o<#U(65(TU<^xBj z^vgIrQ~H}P5dY2##6QU4ne6io4qt~#CiGvH(Ek+bfnT9B*%Yv(eG>1!F!=;4a z9kjuko>aDgUBbBdsZ0UGOIze`g)<&hm*HFi|8#wapmzAdjr^Z7CfAHNGCqfGF6rFH zcq`+Q?oP%(&$wJ!e~|IVc{WXT7qEvJzl9sN$p0GS2N@Un&oll5ga0bygRzr8p+G!n(#+(JwttlYxuV{9Ph0Ne+XYGBfn6? zgBtG9@ULq4APvvuE)3V`Cr|Ts&i7(}Hnq=S|j88G}n_2#J z0}n8c{WBhtZjkZ03QpkljL$dlUvj!-20oqnVo$6ioF!sn-M|BJq+X96IIvFQfw;s) zKh`}w1jo99$7pqeo>Jw3z19`%Kt8KT$V?4q6$!c4z(33Ff2n~-7++)HVKg8d8`UY1 zuYYC!%?7@h{WS)@jpalP{1p4Q8Tix8f7rk!Z-)*1QuZG;@JCqAO9n1-UNdmKuaC!X z)hUr*k^dJ17x^V@4=fjyEpiqaxQy2;4P4}3Z{Q-o#lS_*E(1Tw`ga((Ozb~q;OfDY zWj$ixL)iaC1OG6~|GI&XWBizbU&{Vd1}=J@HSiktLY2YG1Zr~#S(*`bbzG~nLS^iT7F7m%) z;3EGQ1}<`5H}KPJ&taU7*nb}56Ab)^jL$IeK9+m6fxp0fpMhV?_;m(;70Z!%t>|+j z^WSIiMgR93_*<%2tcML;#W}LVNUl}#wA}ePmdXVN%vz0E_dw@8gk@1;Aw*|a$YoW z(f=0)ZnIs^81m)%!^MNHX`jgkzLWEN1>=%mxxQIv@I}vC3|#cQ-N38Z{&yJi<+|#C z!58^oHSkj`=cpk^>i5qKzR2k{aMAO;fj`Ic-8^X!JIM9oc*ae8Rv5UE8C*g^ChW8gAB zn8diqm+Sj$48F*}#lXjKJ+Cq3$bE(T48F*Dz`#Y%&l~uEp<-}+#gH%e0iHMbBEQ$b zm$RI+h8!gw)`;<>R_rEnE;Vq`lg&^48#i$hCD$EdPmw>79Vj0~Ucvs$415XuC0zI` z7%wsSc>e{D+3H04p#0tJm-)ZQ`5@yJ2LI#iUuNL{#Qs$V{y6(94P550RR;bv`vZJ7 z?c-$}t36kJLdp$X%6*H0OMTmA;8LFt8Mw5gE(4c#+HK&{KhOmYgo&Qg|9CM&8ZP}_ zxq(Z+y2ZeyKi_5GGF}`qa2cn%3|z*+ZUdKbS&S?C%Y48pY1`2RkH6p?ZB^$6ap60j zCDG9Ks8v#n?|_%ow6$3!gtoRQggo*BJiK>TqTJOrHLano%w~E1I`+f!h!S{o6M>hocCg$~L!hp;8s3L~w}%%5 zped!ji@b7nm`e`W>_W4~fD8MF@&uwBQzojjloQ@F!MNPrs8w{}$Nm9v?q*`d z(;Q~{cz*$9zSH>gATG+p`l26GIQ?=R1h?K7V$dwc%F&}8u>OUPU92$XABTK1|JWaz zdBTVdoc>i30YNxS?n1!Q*?-?;qFd#7(+&__qL-PXFT^QR1Wi(#NA5(I5LoQznMTIQ{#LieYkZ2X4Cb`#51Q zN5J&)UYu#a-GCuQ^aLjzE>>`DhV(^`PGF~te;qa~IKHD!iC>8)=TAaNy7*)G#-7}N z69E!W&Y$7<5-#WEa$`^cK1)1-kAMT~mDzs$9N#NMK8yVX{vJ3`rWwD1T;P0yXKbuJ2Dko<- z^!uX|@2bY%h@ah8b!H#D(cwF9@%vZ)ICggyBKzT0oAW8JdU@l0@LH>S>Ciq}1Uz^n zEB+F`u$A%>SG>UaobN5G=O2hs^%lm6zYOo#+yhTb_W90(|1Eg2=P2IU&nQ7c;bokD z2^`CUB|8{*4ZO~Zb;Kezyv&2Ih;?3x2*1*UY2o`kzPEPmd~2BJ-bPTtcxkA#*58pe zc?!hAH-=_)Jx3<6_*8dHc`d&+YSRd&cOV zBHiP_3i4`atGjl-n&r9oDk!(3 z*o^Rn(OUnsp;TZ|`!qmS@*U9){(H{!LC@lkf7AWu`Sbqx*ZdICAAg{dPMw?Jv^u_b z3!OR};IyYJdZ}mX-Uv87Q`hYBOs(4QnR?41&(zSDJX4#xJX2#QJX3deYjtGreBjRN zI<|Ktq<}rkvAtu#g<}cS0eDGzuNRZ<+*=Mj@J%7#1IYGwbdp+~drQ$5|DL>gmN4uw z%8)<)ZHTWpj5tpEuRRYfW*d|UhdgJ*>K&Ca2;QqBwZU?#s~?|s1iPUXi<9a}`x$q|brqF2Tz{P}{$pSKMEs@r zGl{HgMmP$3Sjv9w&z2?_$C7w&)_!YtAVE;x z4K^8&HN1)JX&LCv*{=-J?t9&F&(7D+gFc@7XF;tsdPt)t>_=Xjnh@Q|3T7qswmnDi zCCt8#h~z3w>0Vb6|4T*u?0|AooHi%@%hh|#M^)jN?+mE>j*6G!_e_Ug2VQ$j7B9T% zzw<0qdp86?*6>|*D&99S8Gd&ii}!cn=hSvRHWYd z{?5?Jn=3X~+){CCMIdD!4MWa3XglwyPwK;nJzs+#X!rwbE@ckS-dz_LA(qRN&fXk$ zbokD7`W^8#=Q`H(t$-o;LUu_rUbg%CpmXRuKOVb{g~lk;Q3x8sRFx*%&|M{5T@~@; z1L&~Qq?bCIDSgg&5+?3yP=NDUOt0>k?ik&*M;CO|o+qI5?wV}5 zEo*OAbO{DOiI+A{p^0UN3s!v%CiOqYi@5@*`eZ5SS6-`&XAQyt7-0AR0W$G#aAA!i zp2C}C5*se8)UX@96~gFSJ8z%FP-$JBCkkNr^ZnTKMAd5!b*(Bvb#S4|DG$e#@o6}v zT$VQFTP`}~ED&Gy5b%Qi6K{`JQX2ECDVnvtrLntMk} zAdEiNlGYkHl68Y!A*$8W28kpmuRXPYqcr~m()*unZjvl;un9)j}J$PFuvo6t<5cXc^ zVfFfs`A%WY>7CKxJ2fEPt#;oj=;BXd7k}4xdb6-|+_m$h6&s$ePw5?+4&~b}RA;p- zwg1Kod+x8HOKa~g-V4`l^PzPA4p;kU@oN9Jq>WVf8&8b9juXeMF*nbdRd=jBs|otF z40i=CDBvn3pm(FXm!(9~5bz#I-9Mlk4{$|L3iJN>nv?N2>f%*r;(vtS(=cS5!aI@h z57p?rBNm0aeKIj5(Cv_|-bDV=PSAQMt2ha(WthjM8S|)X=(Uf+Oyzv)Ed!Vr#^6@y zIT$?7wf9wc?mGt~$3VVil_r&*AL6K!F5v5#0zRE7Af728k}2SZOaZuJEv;6QGX)f6 z3iuO_H0d(*UZ&J=(P zJ=4Z`JX62}nF46wOP6>sQw&@^n>KM=_L(*S*W0BHz&ikG1Adh$0Pm2bjqxv;0zQ!` zV0VUq-o|tZ^j@D9El-PHkrqumkYVQl_o~zPH`>SscdW~CJ|6$(Nw_BrmsXuGzq0=dleMLu5ThM({Nj+f*lz~<8dn38B3cR z=*Ce!HSOvRq#Bw_xGqn?+u;!p zJm8pJ0{cdI;hWeqn_HSg0L&o(Hj-#*^|mz6Y^kfuEA)Ejmf$`W-eCRBGlKPNTW;|p zcqM~sLk9>^4hRN0^Hd=2TygUZ{8jK(3Wg6m1805-e8o8!f^?Vx*wup7)oJnas4`>g zFb`;_^z0bd?w}jmKAmxGEc)>u1{C6m8=rxrJKbU8=!c=0)&`+_pz<-zfgJBtKI$}( zLH}bIzE|dl?1E4kn=gR8(khgReLK`Y7z4(0vsFAtohb0Ao z!=iyX&={cVd%g3#-mARc`CjkU5L629tb1q8_RgB)oi*1x>&m>s4Y8UCh|4SVHRJat z@(PzM_reGG`&DEVo|-MHW-eTtSGaaXUg6TpCH-{L%LLO*)ekJ- z^)6XK+t-MV5R&7a>j#-ewU(?{;-v+Id4+yo#ZpM?ZB)cmQ}v_okyqkZEdD0OTee}1 zcLQwufJF+5vQsx%TDPajv;OK?*OvxLXHmGS77Hdre%q=ekZ*Ew7m787{9CJA!_}}E z4So=VfJkc?wxo#eAWw5Bx~--4Hi_I42`-r22m))x5rwUaKrmvW6nu*%v|ZJ2?-JEv zPidR#^{x#?A;{~6`r!4h!=H`IF_zam8BjR*q&X50BtVSB2_kCw3&K}YRQ4KRrvPs- z%xZ!|m9xqje8WO`7Hf&EpmKG^Mp6K*4Vp?$5_%}T6563sQ$V4+?t-5L8`i=_VCkqA z2O?#Uwn!^{siO(>+MZVkR&9dahhTpJLEsZ2p;p*^DgmIfupTuUdOr?*UT?j^E1(QBaQ~!K zzY&gGHl+~iTT>XIgV-Ef&e|5tjTiUI*r2MqwPNj(b!%3vU2d(b+PHijI!wbugvo7E zJQj@bUVPnsYiI!!NnRm+ti+2SD#1b~NNvI74M)J+2&DiY)T#H%%tQCo)sYXhp)<}@ zES$g4=21T)2mXOf$p*0++yQW7y%zyKdD4NLhS7ocADrs=#I!-f){Y z+S201@8lp%8LU{cWVI)$0~4hWz5*Rp6;e zc)%dHHMeYoZI9|hwA6V?7!YV*gU#+7gR+sq&yW46k?_ zLjNSLTa$)53XGSzeV!mbQZycVxgzCpbw=D;?yo2b06MePE==Pb0K8kqOKkEm^j9 z!4lYNDMlYTTC$FO&G4BhYstEe7y?_B!R~E4tYsBT7A&g{h8w}-1z$zdR~-z7BGFK- zwQT*$B-$E!ABtI4v0lfZJlX&R*~?m5w^g^+dTD=?I;c%6mabp0q81j$hwH+yQx$%Q z3U&)2{tB>rzaUja&|a425VcGz;SXodJi8PA&H{#w$)WKA3Sib;2e>Ef8G6R}Wt6rt7s%C8L z&E6(x*I*TE3Ol?wm|t7EeKHKgFsfWTxprzHKHvMl11$je%jYz$4+TRwa*VmTvf zO&efPO?c-50k*<|cBCNhLmr0; z`E7O>SWbMv3)hyvbD^992VTHh1@I+OI4)J694}Cx9G~Pa{27KR$}n24uP#k;87`y>989=KX9NCrdga1TVFQ!-{v#q@V;fFme zv_#UCMcBྋpB{^sA$Y~I%@Dv1k51A**suoxE(hdMdcDNCK) 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 z zg;%hd=w0V#;8G%)a=q)hP)8agu^ZjV0pm?!#+zNQzcA*+Zgpz|#@pNsT-QY7?XEW$ z>hchQKK{9zG6lLLqolOjxtnIrjFOsa=N_8JGD_;IoqK7L$tbO>aPFgNB%`!qiE}@V z+@ny-12h@|ZE|+f2qW}C8Z{Xe^$pH08VOJ=aUP;v&w#g&IuBDaXH=F{JC9JJWz?5f zIlC$H8TD1A&Z87RKpUJr6rqfUrUvIRia|yLh&@iNzSU30>*rly^r7-Mo3gmW_=lh$Q6HW{6Brlk7%8FO%zr=xtKn5PeLh8{#OF=sqqr z34Jrrfn3N;7zzC-(L1Q9M2mZ<@>?u=t9 zdUZeR97^jIBsxy6PQoznLTU4rZo<(oLYs}tBgkbA+DKYA-!?59MLz!35Tj|Wde2xI zLzddHrDMnvyg9{K%JZ{A24ha$m|D( zD5MqnBSTCiv!5Gc5?TF{jZXI70Hc%zISECLfz7Er2#jmfypy4Zb7jWWP&UpSXJWv* zW_oL&h8l2#n=pF-Jj2+SJl?FJMrIDlnEh+QTx#08hHW0LpYIuBzS(XV;smqXFvN)z z(a%go7f{o>a70g{w!!sGg_8rjW=AuM4nIyLu(8ToH(@vPI4eiJaxlii@0mTOe|d zEpl#1WR160L~;_={x%RY8@QSp{E><%j4nucMf;%#XdJ}Uk=4P!*b+tV-*RNRq951=<;xWhXRa9RVsgvstw zXdf+>2}LelQDthXYp!6Kx@m^u4P?S}Hb+4P|x$3G)nP_CN{q4aNI{gcICI1K6W&+-x^tfxD@bG~r~!$<|LXlsQXHSm-A0 zg>GaEiwtFM)+C&2I9nUfiVfAqP>T)K)=(vGIyN@NP)po&j9&*smAa{TD<<2lp$TPf zauO#}xwYRo+DV*5LgAkA_ItFPT~|IIs!4= zNh~6w3lN}pDiPU0jBpaC5zz|>uri&9zCeJP8AJ>O0_+?|#9+U1=wK&tCK1Dd0FP%8 zF$xIq0KO^+-sb}W9vn|Z0T7^V4iOXm#$ix1mxv-Dz_)os%m4y>n@_}Szi~L&If00I zK!BYSiC6#x*jYftLLflfNklBBQJ;8nTlApJ%rl7#BY&1C4@^Au42ZJfDsC6QT9&w& z9{FI_g2a-3<}wfss>CH;A;@HdM(2r0V)>hJ@6jk&O1;TMMFL(JX9dgBkmzODYN%$S zA!>;zGejK`=Nsa5B5pE70}+oKqLGN#Y1vC`A|h&*y~Gtn^bBKyYjP-Mg>c!L=q9!tR9#LgXttIMwrq&U46I1JHh&;~J z1w`%Tt!Cnd-Z}{P5Dd5DK|XFwoz_hvzNs%ppI*=5BwpMP`|=6avbi6Q!B3d_uYM?W zFftUiByQ<<3Q+h=3#T)VGNkBE>o?t<&N#zVS%B&EOCleErM@Vh)CsFQ<6`kci;wEs zbX$jYcw%suRW}Uf+-TZ$fVG1AOXe7k9|@Pav6lhP#F-!yOOA&#OFyhk{5#grpGbEo zQG$A?-9z*Jktb~TukI=(PVTYvUN6*p9{In@i6cno_&$YR|1nqQ`STLnx|y5$ydTA{}ML&YBU2m zBU_Eh*TjY~`MQu`5>E=r+S4sqyGN`&9k%wHu(jVtGmulPJtOLkwS7W@H9S`(YkLA~ z8ys`E&3+GV+a9sDkRtSWG{c0`G-hu!(Zp|=QFUveswN0iji|a+RGFUnv8XaVb9=NM za*E?SM6+@H4$E;o8z;xt1=hNfbJ!^d#M(Mz&D*-`T&i3jj?)Fv3}h8^7m9vkZiA4^ zNOohC_9v08vm6gED3J9|f%VT}HpRnjJ}rmC)=63K61Ltont`lhy_=Xb*1HR7tY=%+ z@j?z+e?1tt^4b))`43|KbuTmq-t;oG`0=*z4Si`GlWNmi~*6tQ-yTjJ@gsna1wMR~| z_PD6$bQKb;;YB^Nc1K`se$cj@Ufi}jyexY*`AOK?U0!?S6l*^f^~T!Igam7N<&msi z-Ga3(V(sd1+nS}{OeC-MGLTcOZ4>pz+I2#LHM~4Z)-G(p+CRkFh2ges47cqfuRU^# zwN0YlSi4wAu!h%g$(p>Y)p6pHtm@5?Yz((;McCRIUIucCwUwgYSX(6|Si=j=WUXJ& zw#=yHX{KC>0|;kKoQt)+*p zwevENQ>boaPg1U(<{Q(u8M@_lB**b$SKyY5%s2R%|e1TyqN=MrjD~U zvR4`hpYyovHdlfkyfO_8y?9YcsB5eTavD~F3CEiXO5haIaW(`lFGUg#xB189GDvKQ zjKXqc>oU@}Au+Fmq83bBg3xC)d|_f-X6 zoEUhqSG=f-48gK^Q57j*FGzh=WJWQ_M7Az;JiHr5p;;Poiu?o~w>haFJGC^@#dd0G zWIR@pQ{zDig~kkA^arfd;WkePE(*=!NFJ8Osl}0FgV5j|I`ZP=!+5bpyf``1!}j9j z$V99nFJj`wydX4jFZPKS^CCmBEMCluj1RoP8z1Dw%)@xm0XDm>uvs(1v6vYdi&f;s zQ=o)mA@6RrV{syIQ7nog1F$S!6h+1aUf>M`^5W=_7ymHvgdX|5cyV;3yNN{+={!18 zfK`#L1!ozYM zz}{y^a;cZ-s*-BAC2 z?G|8_>EFMb%QmKe|L%tR_aEj0kM!?1ZoGe=OXBSOkj*(xW8i&s5J%)gHy6tikq_OG zCc=v;A|JYiK}7I=9cBBAfxgy3LpF=P7u{SeOTN75hVtb_*Upze*$w+sxM44a8}?^6 zo-cSCk@DrqP*krD8utM>K<+>3@(i+oy5>oDB38l4AlLHTXiit2c74;I4 z1#P`7P=6|%?2^8R+@V;8Jq_u5$mRLPsDH>k&gh%LwF?YsCW}WbYk0MXa_zQIgW_rO zC$K_FZgY9fGSk3qZV^_QG`Zc5=I!BV?g&To4l7N1Nt$d8ni}ucvOI3;R(AxJrCYbU zyw(+vTU*`Zv28pJTH45G@rB`CY0Y|f5SAtB*Sq;V4LBa&J0~yB4tX&$ z=>0sneotPU9rogEcN|uc7w0Cj7b^lU#smuLfQ!;+g*yn#;>8Nf3%qAfUetxWh{xg{ z@uE&94m11Ixdm87USx48H4@NSAtgQ7C%5^2Q8G)EnB<=27Gaf1Zn(Z5&#B|XImK7|C8y@P zNxVonUac4(6EZ$GFn;tDb8L3&KuYmMr#YZZwlby{S2#6i5-(6g~iVfWc8;LG%>msls1GlT25{y**N+w&oWQT3;?+y% zUF;4yMg)$u8tyn`>|LHLipZ^Z^RWW@wL_(IK=w@?PIC^(vI#%+FDn*9`SD3*~+PZeSX4ahQSLZBc%DD;F*UGk+e7p7-tf02+5)GHz8sfe2 zN6~P(oa>T?%ZsprG@K^w*}`V6)47hY>Jk5z5m=P=Y>A)e;iQTS9xPL{XXcpIz|1`}Cu4@o3X zEyvTdj|L592&-xpmVP3W74Maj0l@kzDMk+tTZ=0p`hdH zEVP^|-USNMpz&dU)5(_}2_`^})6UQ_6P{7vTn5FU2O>Sv(arWDoBmN*Q`;GcJBdx_?FX6XbRn;gPiC%gCOalQMr9!#N}mT&SLW+^HAg90Dvw)UX@jE2v^#6$6Qqc@2%tDc#E)#!@&a|zE@KV znCrSFgOen$(3{)xd4-SGFR=J1kS zKbE-8Z@t3LZ1UTFo;1|Y_&DC@ zBO#|3_*oU`BIfQ%CbwaHb#C%|H~ML7{jN=Z>P|na$?v+>PhAV@3NZIu)J>z}JJ*Cd z9S1xOjsLCgJ{`L|^~l{F43$A^{p@^yRIWb^;+N|m3xUl4caE6^m|s%1$0wuCYyGxs zeF$Hh9e&3L{hS?0LihFD;inJ|BfJd`p5zDp^hV!rG(&i>-wQ|UHkoRO+CmcvjBA=> zuJhX?%M*T<8Q#6|V=qxK@uXhnC+zTXasVQ!!f!v_k9oBi&2)%nG;t=*f<0E?EZ&3W z^3dc*6USiq)(;to;YYroiXYG%{McdY^8E~?7RXFPoF6GpVqvFGm-z-JMrdm^zs0#R zHG8-pfu+bztSIo)KlgjA^^cn7568Yd38!mF{0S!BEJhg#!2%_>clU z^8L}de!*IQSiV0!A9*GdPjVgyxjVW&*top~HqX?gp7^oNPs5LVpQt?3&Mp2?2tF^( zrC7t{iJ^!1CSQh=O~O(?V>(ZrNuS|lp0m~;w7~BRe&^ysl#X5Pr{vj_z7I>Lna^>> zkOc?kETncA&z4FuuxB*o=NWLVNroMMUliCP4pN4+FuP~)?7m{C-wIY=H*xS0W(nL1 z9BEY@`Ylt?5vG$+*8L|fxn>@L8HBR#-#LS{PW%bY7ce@S{7%dKuG?@%Yn$(nG|4sw zKeqW}@gv`#2_KOK{_*&+&7X%Kz)T`pp>HP}OtwPC;qsZG{)h_z_|inSfzYON!hnMPwNZmsQ8FhUO9S{%B{{M*wa3TtfU zGQV@9-xhY7u%&7AyFQ3p&J38_n*4S7BFGE&d;hNBH{oj3y5+SU=gg%(ECK(nz3%tDiCRZ1x4YDD zz06N;@*{Wnt*7}B7ZyvTCC2H>f9Eq z+e>v`i`70`=*ccJG9*Twqva}!<=B+jPVG!xr5jp+@jqh zwD|~L|A)5uI|p;%cTS~$Hmpat81;WG5&yF~rG?lHZNf8$Hi?aX#yUS~o8N1lO6c}2 z4Cn8x=P=X4ch&;~?0fO&FnWT4icx{h&3B8+KPi2fSbX;>^8W+#!Nb7{&_5Wq{ioyp z5Z8jiK`A#V!TOLy>jSJnDP#R%oSwOU<~lrefHQMQ(zJEox^{Hl&a;2ZBf5)Jx4bxH zN_ERi%Mp|xq525Qk5JuCTx)qz%#iBCENfDIm}L#BTUyo%!pmB`OCjIwt{TW=Cfrpp ztC(dTeL8fRZx2Rk7l1w;TJ0akC)mim;kUz?DKWg!2*w~>NQBn#{^8K2_HfHi0V+h!`yq!S2Q<^WR~Q@O|h|9Rj-un#ADJFHP+}bVW-Y9P!}Bz=WF8sb$3t zjrC2Xjn0zF($eC(`s$(84HeGhlG3R);i|Io(%Q1};?k0;s`9eB##J><)eaJsH5IcP zSIq=!0%!oi;yLA~8*Sw^B!bVqXjoQT-Ll+S27t9k^LsR?=8Pt(jQ9q^Ux9r;m(R%_st88vl z!<_O4tBb2Emc&E11XDo*T-P|Eq;xsP9@w3R@``Hgs_}Kz7+UcF9XheTvax)2ePwlV zQ%xl_hP1F(oG6esr6rJRtk9{)wpU>8*d`S-IwNXoYnC?Fm!k^H#hQ{v$e9XoN)35L}8jA6hne(#?hm6b~G9-6+?%?b})zFpYV=GK216fjEx@_#q zQ6mP87@j?-B74x%l7>|^rOWDTYigSs1~t{3QCU+qsIg>8Re1wcHZ($;24NaNqSn?A zf}W|ZK`B#FT2<1pOsXL`P*J+nqN$VW)wtob$8ccPy!w)whU3c1AaNw@C8dp(D>Iy4Mr_|TYty>`qmsZt6Z%+V$DfJCBW&|iRA}Aw28dpW|Xgh$$(l+0SA)}m1mY0!z^F1q{JzOE|clF zo+sG3O-mZePqznVZ4-0E+khUiBr486vOg0?lI9WioBn-`-ID?48+~lAE z6Q&jx78gz}WEJE*ce|N=B)bctrJ}^*{C#iwW!iWEu}cxV8q;PAW>5mDEENtLx^%REy~dhRLpJS(ETVf)HFns|l*Iy@t7> zq8y!s#EFj;Tz@e^>djOb8afTqF^-u#%?d5naKzKH$b*f%M6jx6ISw!w__9opJk3B; zt%Vo8p9t%!C=5A^%K&8&JZy{_MYS?i%<3=GAWkc|MxvL&-b1vC4^})U6waG1)eUv^ zFxyr048&=`Q@*5LkXq28hxnp+!37%gX4`;X+0BAMRZ(BpP`84{A?=J{I>bQCh0cd* z+!|P5%$ab~yh$*0&A_DO!~mLc4+}(nrPEkfUg?}TYtBSl5=WXHFDtEUN(+|-YcviT zoDxgzxry9?8GziOc^j4r3X%9}&rBRKS#WU;flXR%J!Sw-AvlOF*Pty9B_dfV#_orW zgBb_MNuR*jqA<_Jd0jvnwbcz}xFfCQi7-fqU}^=cH2&>8!@(DH1WkANd^&6l3~*Y! z3Spqm!%c*hB(P6~T${O8_yp&0bmO?qp|_Io@O0BErGKPvqOO=@K!V~b9j!fFRzBJV{s)6 zPnhn53}9bjvB0r}Cjl58+SocUAyil5{x3eGF+0rwJfE7~5S~&^FlQmwz5&O53&R^* z6W_|jBVXT8>Y!F~Z}J&s=!z9w+%0leWB(l2P{Ahx<|GfFIBds1JUe3l2Qwl^+*(sG zWo_Xg=n!MJLN;k%N_(@K+Q!PIxY>YAzzyM{dqvV`W(eHm(4NCu*4YUR28?1jbHM=^ zmw};TQLs&d&@6%TP8?I(Tcx84&qi@SW48zv0NQ4ld?*g0MGnH67h3e5MoS%;k&Iz;I?Ilh;wlO5kobJ}F}Bn)}%ThL~9Jd{s-ib|Ur<37Y? zd0@%TBS}MR4+7~M&uR`Wx5AD>e5#|l7lR2WvBl;r8@dR#XxKbszl_e#X;*TFI`=Gv z{i9(58Cvyf%Ha&a1Q%9oTIq}`I;p_{M*|PyRR;Se9EjwX%ns!=+=AUK#&-^EL@>Ts zF2qeXlu5?QoZw1{x&9GMi#WN^$~f0-(comDzPNG7V5hpgy0mVU(Fywxjw)}m(9(F= zAu-xuTnDq%L4~zVblye2!RFBJ5i@g^a>~Yc)P;DV!RmSPpP2D6s&;G4nHxNlm7<2H zM{;o`ShO+CDa5c-m-9Gk2}Oz`41EEg=wTtO)8ZkVqG3l1jPn2tHa;6LUXV}tL|EG= z>oN(|Ll43%H_u#>VdXS!o3mzAN&^cG&7*BFGv($r)R*RwYM4-ROPxHJaPx4guF9*e zF3qchQ#qdGZ~6{V$laPgpc#PC5dOqx~>s;Fto8!{xXvZl1EsjS>F7ITHp z%gyC~aPB>fykX9GO(kSLY!F(mtb>!N%2K=TpEsd7O)JDxD=Jp8p|Py2d};17#~6kJ zIu0MFj~sDy@zLd28ZvtD(BffOM8Qhr2Bq+KMM-^e`N~EpLHuEIg@QAsuy9Ov-}y@* zhnx7C%%CAnL=HJ;=+NB3!}~D|-!+cH|5W&oUrC1RIQV7h-H6E}RWhKAhkNE6$6cA~ zc5a=JxCOoo4bMWO|5!&qyqMHB^@2!Yo0xZt3oKNZkCkxHk36J4@-$Xc{X$c1en=wq zr&Bf6ujYFCnTpic#Os^6o_^(O@N%}21m z>j?H=I)ePcBgl8*ud5%n{ak<8_H#Y`4pZ9abqeCUn(OJ8p+WtipuU;w=_jl~{gj}7 z7uVBIZKXc)We~rYxPF-3Kc~g}=OEY9Z;nOYn-=Kr!h@s-#wn=p7}V!;eLq|O;<)~W zTz|Out>*f}#jly`>4#Wi-x@!=xc+eC=cOaqKX?TDU2vj+gC05{_B}7&ey*pdAq4e3 zgZhPBe;F!~`pCsW|E%Wvt3&l$gZkzp*x$wVjUoBvf&5Ece>ndRa{c^}{ER@p3r?DF z94>$Ix&E;I&-HszNzndXf&SH8|Bq1pr$K!)*B>r_c5!`gTi%*~UOIyO!6V3b;h)|e z&VD}EAI|*LawK$mId|Y!T4Cs_4Ew2puTNX z^fz-oJ<%dmTvSi}caZDpv7%D%4Gh}X1)gJo z$KmSpxqe}2eV9w~M)J_V$QpG%{N~Ua+>`NwtSUY8gEEC8KX;(2@yugz6^i_=55W-d z%ujk8=9}j{8h~z+*y)U-;w)!Q%mMiGK$3ujjRy);_>W z7=MIuTJr!~!T4v4%kQp#!1y=3#>p?hZ)Lnc&wcXq^gWE1@ti<=LcnkjiS7Lnhq^D& zczg!`5&t#gGzS8f3SEf!M~urO19BKQ51n@$+VcTFK7a)Iuj5=4{nHr#CF7!hG2;gm z|5=P@a83&U<&2MJT=ef?yhQQuVf+HdT=1&q6ChL-l?UK08HF)s1>8RIh}C2fv_ z;}iSkGWaDk9<&#N&-So4L;TWC1P714=*#$nj7vWr!}xy1KbP^u&PI>$FK2uZ5p+f*~DNl|$3_krZ_=3aW6@a5ZH)R{gjK9{?;PRx_ zb&Mb1+u-uN*sY8&;{=hX)?UZ>L;VfE;P`|Mw408<_=ZDp+yf(CF(`~b#rUpVgUhp% zUu67~yfFS2;{%5n92P}7J{5epp=qxIMGw{qv`Y_*2U?zjoyK@UzTuZRbZ7j|u?F8@ zKAb^}k2ux1z}Zlhzxx_3a*v~-*^gcKO9;Ue1jy= zatIRKfeyJIMnyV&n>{4ZLRBCo-+BlOgwQxI-QrN3ag6!Gw-SjvT*J5O?V9kNSldDi z+PFWs#?~f16~9Fe_jPSM@ms>S4TZ9|a_7|M3}MVCx6^ID5XOAr?*Q7|E!40K-DKd~ z9(-@X7PPAg7cu%`UU0|DM(I+0NJp5LLm0mYY3sGV|HXV3!dBwlH=^+*~J4Lxt~g!uKfRb$G8OMA=^x!`q>DWs_YAcP*_-{4$!w z3U_MbRB*qCya{fC8Y=YtIJ`9-m&1GIaSCpp+Z5bGa&F^&J8Vzrtn%PD<~S4fyLcdu z=Zb#_6UQVX~9;R6e|^Pz;#Z*-imVqC}hehatb_L_xHw%YZLh1>k;eEy{4 zJlw)@%9J?QSU8><34X7I7g_lGjBEef3;-rL5V!pqW#P8}^DNxvuV7sJztO^N{~xn( z+y7)fU)1q0WL*2d#KLWVHe0yu|7{j-^Y3C@`~R|q+x~at^H=1z{ajTxERBs{U2uGw*S=@Zu@_ah1>qW$GG;tH44L_^Jk=m+y2kB zaNGZ-jBEdYWZ_tpc)n-hwx7KRlRJmZ+Y>F^wp(lAwx63U+~(iLxc2kU7H<35o3BqG zzwPHD#&tYbTexla77Mrie9Xda{^uFjetu!$ZLN3~z=N~#K>lR-FLA!s!tMF?D+{;h z+Y|Z1BI>c{+q*5?o^N~eb(%xs!}uZbv2eS+w^(>6J{E5CKhO9f@v(56G9?b}j|Kt` zuyE{B!QZxUY>MFcyjna^kDU*q+x@%E!tH$6Y2h~iuNg-_?fqB>>^wLSZx8>)pXC;Aw`;G3+wB^ik6Mf# zyIrRNl>vUD@Ov5mNa5Eo{f)vq za6E@$2f~5x8^w9p>WajfWnQJ za6eVyqW@Wii~b}|R`Eyl$UC+K-_P;PQT(DmPvN3}n!-iT2?~FM^KFU3TXTNaDf|h~ zczTY)f69Jdtnfl^|J4ew;PG{f!q;*j;HA-YNF2n^eF}e{^Wo15m-xJ^aEZ_73jYiH z3D5cq*%ke13jaM%R9zJ=cKa(_>`qd+=s8~DZ!sOE{l?qj2%(9fb@3R|?ZyF8<^x{9?{y`EIZ1-_89sRq>0TCny}huY^aL!o{B^g`dp)7brZ&>(M0& z7ys{2xbQ!$@E3R;c~aq`=R<`{zx+et(%xhqml7Z8mn?;g-Tn$6#Ph=lg^NFh3NK@N zw!+WndGAz(i~d@LKgRugmcqsE4GNby{6ygrhg}MnI6SFvvHK^DGyRsr#h*_U4sY+F z!{vO$YHZSZJnq^m{8xN_)LG$uIj{OD{4usSM&X+opP}$Zj^{}V7ym01E^%v8xWw&z zg^T{n75){s_eO<_-A5EI{QDGsC+{y`R=DW-O5wsU=Qk4nF}#jvab629dX84O@J~_r zpH25V^As+6HY;5CuT%JmJa6t$xairbai0I5P`KpD3knzg?P1(@Vj_iEK>MNo+no-{3_133l#nY`~O3Q zPv`jGpzu#PpYBq4D$|cBT>N}m;c^|}ErpB!pDJAZ#8+wIA@Ro-9paIuaPhOd!o|;A zg^NGODEvasgA)#emnwWEkE7ES-pupW#R`}9UafHRPF2UbRpHW)_bOcC^SHt#KF=y# z;J5d9o=+4m z{4UE$+%h=MZ51whx++}w`z!ov?%z=gmpq@VaLL;eg-hPnDqQmRY=ukSUaWBO=PHHY z!}IMe3jZz7pZ6%dBh!y5{8Y~WeF}e_^Zylv%XRIq6h7WeV@@K+Px|Fn#^pM(;1ai9 zivKg-?+#V?T|A!_DEvHbul#;U^f$Afg^FLU@0_M^>6euXmwvfW;S&EJD!h=-->+A= z%zHmkxY&J2;bQk`g^T_d75+TaZz^2ueyVWcm+KG`w}Tw#6z+e)Jsw}(6fXP&6y6mD z;TWZG(KAKi!aq;p%Xs}NQFt3(-|G}E{AVltB%b#lQ}`*|t``;FlkuWx1soDj8SkAHF5|tQ!ezXVRJe@yNeY+oK3Cx~?n)Fc|z?E`GLYZ|bFAWZvkc zaPj{rh0A_>xWdK%@d_9JXDM9#JVoJ4+5ZZK%RJDeaN$2s;TQ5eaLr-xTNM5So)_*` zxa^02qi~7mpA;_p;kOkoasE`{66XltIG28rJV{Zw#JQ`&CC&pCF6|nn@G@@iM1_l= z$17ayo~m%MTcvQ(zf$32czrrw;bQj^g$w^Sg-3ZF{;|Sk-ML@k!vDC!<@(?=3Ku;u zD_r>BRrp_c-u_JCvVZn6!{bi&t7!@sJzW((nd8<^;i7+p!bSf?g^Qlq3V(pt--QYn z{gnzA{bwj#^sH0(yWC$tP`K!CR=DW@vBE{qy$ZjL=jS~N7d_7?T=-v7_#gQ^?&}r4m(LT=R`@WUZ#O7>6JKAtRN*JGo^1-p-woq&o5D}!{=Hk_%lZ7|5rwa2 z{qlPyiQ8qo?|n}3x8*qOSGepu|EloU+3sfw-_8B&W|?+~-S@d4TPu79?>{pY{wHp4 zPlZcA<|(`z`;Tub$3yJS;(30W!Z)z~1qxrm{#Pjcb@sDS;UBZz^AvuN_548L!#Qr( zDtrX@*X;_I=WINn@ISJiUn=~5_VYP~w_$%?SNMC3f2i>DI1j&3_`4jpHhhCm;=IL# z-RZ3GXIW1_h0FIXMk@S6KHr(7@P|2X=PEoE9e|@m;Wu*}Y89Tu_}L2Y!0ozN;WOFp zRSKWQ*As45_@g}D?^bvL`?*Kqn^^xog^T`|75)Y1bN?=;-4g$cI1fiDT=*v{{MS5R z%~tpWoL7q!ejDpQP2sXGtW>z@KVRWpd4IcA;qP!9wkdoj`+2*<<$E^wD|{vQ%U*>a z$MJtw;mPdJD+;gTJUO6nc-1N$Un*S2d#r1?Uu3*zC|t&Sj>2WU4_3I0_hS_<<9&w0 zWxSuP@Cx>SnZk>C{#l{$WWMfnzQPxCd@fP=KGS?>yTae%ez{ZOSFxU53LnJz_N2l` z^Emy3!sU5KZz){z?PG;k@jT;o3-{L}od2l`AHe+G6n=o?Gf?55ay-W$}Lw~9GuV($PE1c8BN$ehu&!yZieHGrH`?pBp zZ*qI96rRrWnEYNC*)Wvb3yi%h75_BeKir~ld_D~x_bU7o&Xc_g|AOQ8io&{5ekHCvd;aWnBD`=eMj<{Nm3Bh5wM_c7?*l zpPLmf{yeDg-kevDGA{neb7tOB{Nm4N3KzSv9u6JYOq>EP;kdPCT=dKHZH6j-(LY|{ z5AnF0t#GkhtZ->>qr$J_ebJeWyWk_{r#y$}dc`mP+@lv$X@pFd4#m`d|E`HW2{5;OX6^sXd z4l({UD}M3wc7=CiJv$XHe*Q|~;^)f>e~lc{28fm z@n?p@`|>(ChjH;oo-4Id@k@LzRQR);x0fqi{P~f>#h;xD{|Arv-HeMr^8Bke6~FlN zslxB#_(Xe!<0<~MQ@HrkSK)GBIhS$qN1oF)Pw|UCr3(KvV*IFAxcGCP!o{D<75*US zVKd|6k33IokKz}9_9=W2&sX~uF8=&Y;o?uUcQ~HE;PIQpxcDQ_JsYg}#h-BsznT4+ zsc`XUk;28FdWFBl>(@%g#UFV-+cw27{@kJP-?N@w3KxH#Qn>iDU*SV}T)fG+_#@Ae zYuzUtPw}U-!qfOVVSj~-Kcf{c{>)VP?W|`WCRN)1_iObhYk37GzN8gs? zHbUV~aK9HYF7c7)L!PMk#haG*>6hnT z9#H(EKeb;t4tMbQ?ZCLSSDvexulPmJ@e1$3ex9QA$a6dE6~E}YT;c2Ze5YCIk>`T$ zQT(Fk1%=P$e*BBlBhMZELh*~9F8#ytxt80N!??spo@-j9_(jhmgIbmj%#dykwbCRFLv82T=H<7!o{DN z3KxG$6`sxhS2HgD$n$2;SN!77tqPalW!do?(#u5xZR!E^(NwaPeop z!o{D{6h06Q!O_UL_#@Bv-lX`&pPwlFLEh)wqx8sq%s(l9(er`A{NieKzz4h{Fa*zKcmv3rcd<$3<&85g_qeEtf>FLqZbT*lodh4~I8QG1I8PWC ze}emfieL21QTWw7pPZ=l$oo51D}K?lMd5R~U#?PmNQ0Ivk(TZ4BL>aq&mq zb2L!#i$60JerH>wXRgw-p7VC4;uk#^EBq9r#<@c2k@q*s9SGep$B)DQ%_Bq)ISnZO1RDr@}pSD=xvY%X|aM|B(SGerMcPm`Z7xpV$&Qs)l zJy?zZ<-94ICkw&lJgz|Da-O(Y;c_0jM&WXvyItXO9=%)Pa-P0l;c^{79&RXp%5?_$ zKAqrlJ*0r=SHb1_%wmPhb)+>4m+M;F6)xA`b}L-2`|Ve_T!(acKPdjlbc z-y-~S{dTe9m+Q=H6fW1jw<}z(tM690T({q^aJer)7q6{6m-`Ocyzq#ha$loB;d0+( zvBKqk%^HQv{h;j%m-|h-6)yL)_A6ZOm&wB}#ZS2(m(Axxg3Eow0)^j{4ULCmvBKp( z>>7p3{o?Hkm;2hg6)yMR_bXh!C*a8Sa_|9tmG3iTD_p*JA@iTKOTHhnSn|-(v~?_5x@$9=Q#xsvAp|z-ME< z`CKL?c&$rGZX>)7-pMU1X)JMamozjuxrCOLFKMbMrWX$7nsUjKCH3ViLe(Ya9Y!In zsf9SC`j-$(q{6@?3a@{2+KoQt5K0D{7i@>*{Ok%Ih0fvEK4! z#Y^i;s>@At{?)(Ppa7RFPWwPz0hbPr4hLf6)RKHE zztH%pI4hO3JiXitUS^hCo0pBpVESwRn6mjhV)$?ZhYcS+!XS&2&Yd)4a>R{mbe&@l z>0dOuWo_Jv0xA~3{F&)|oYL*9`9&MwC|Y+QwP@qnUleU@`k-jjqz_W=O@)syHsD_% zoP4)w85WB+7sarmXx;9}&No3((Z=5tZT#iisM4?&c)Q<@t=sPwZJPfDd_1~8w(-%F zdnZKJ?SG`z6B{N(;#>(E_n@kc`yTyELdw0fBkNv0x7CvyW=FRC>al;`t(5gQ7}H<; zqQFHL;4>nwL|SykV^=(O1-O(e9=n1ZUw~`Tb+7(?!|Z6B^5T@g?p1fgY#((&aIkq8 zoR|(yxKY^>>y6KBm~;STc7oT=!xTmiXUe^k4y^lPe9DDwU~q2SU9>r4JymbUHNe>v zjTBv3w7ES&?lZ@Jv%hH5aoBZV?8IDD-BPsKcn_XMi#9%Q_gInt0rEp{6`i-|0BUwN zQYRJppTsMWC*?k8DOYXY@EO%XTm6rqv=e>OHvO-OhZKJf#gP2psSf48gwoD+NXAp? zolY?3z$a>uc6jp!bdv(@W8$^gVE=E#L&pCK#gOq21Nrw*z7LXdGr73jQ8>vWPt*OJfVhu6Mj6`?{=3w07J@C%-Z>!9uN}N7;kg5TSLv!;*R;K@= zXyb2#88KfEEFxX zK0ei++&OR0I8{|7Rhus|#o38Po1l?y(Z=JUggv=o0rB7zfu$Bb-@M`MfC)>7VY(q; z!cxmK?XAQ^d18u(c;w$NEa&aPqSe&R8+KA1I*X-4hUsQXA~P9pO6OS%R}vHZsI4p5 z9>lbozfJ{yn$S_lUyl*W4E(DJyV0}ukMzAVKGhnA6`t&(nPZ%u9@*^)>>r` znP%gol&0Ah7gJn8Dd6Yr!FAP+`377<%_zrZRR{i^Zr{3?;+QeQ=zEJRjF0mQ8^?7u zWE>|JBah2a%WDMAD=d%eYDgX@79)?#>LJdTSc|5$Jias4!tJ%=+ZIz?LX9b0R$FZ9 z<_)SnEiR_2GvmE%t+KeTh8h~*GU2k?a-eVpLGy|_1#xS|GSGk zON*5m$9CAiWy!woyNgtj$YB=KS>IMUlqz8g=DF$6bwTpI#qPH={g6FxJTqv|+v2v- z%Jh!91LK*FYttbec*g(!V!C;DE@jxd-LRmBPZKt8z-83rAGzP+f{Lps=P$0UR{r|9 zigFdMt#;M_EvS&N|H}(1OiBND{9gpD2>dz=uQ$7i2;nt)ho1w1MRO#jN{O%jdHXW) zVt4CA*k!>-gg&}N{Ytny(b|P=2!K%nyC$|angx#Ft_LK|hj}MZ>qJUc2hB}%k-!s%mQ`gE+qlk(nfhfq0Au3{s zV_Km?cKs_TlIy=@)A`;efXMW(Bgc+`)yYVWOSIxzK!mvh85y5~N+hlmyco!E(9+g~TmHC^{7mlxk&i}Ze-+3dZ_CfI<>w||i!tK% z&+~pE@^3~?xCk~DsSP!iPGmt6g+7*AUkcPohDtE8IXUB1>K2OiDQTDvQB$)p9XmhS z5R1|=oNWzpY6iyUPlhONj}3j<5Q{U=>sQ&I5-$cmP&^MrOH!afT+t=erH)?$?nFyl zQ3ZJ#EjNkKjXaGmHB|T12H;zkgiUpOP>w_^iHhZli%IJ zDkX_)oQl?Xmy1(gv<@F(V5CluQIgOQiPp!Ax6l}9K!b-*AccR9(>vPqKp?V$MQTdG zzcYw%VdkiDqAQ7r_%(G_f%%I_#4&-|M1;ilVs9R>k;l>K51t4_wwMk#R<@d6HN+)En9&`*ln9=PqL+CW zin2)bimwA@SK9Wk3faHf`+Z!bITxmHW93>~WLrq&Ixhj($mK}%`jSB823zFDkjPEm z7!m0cy%`^3Z>-$HBGfOp8WEELw-Ldu{4o(8^~LQ}=4{wO1b56G)E6=Ci#xq)F&T;8 zl>iHpG5J#x;lB785z-ew_wZ{S+^~Db1S0p^BKL(v?)TaO8;N+)oz;QJgSN=7(9n3u zn=B%!(WieIi2NoiKIKM#ON5znqt6h*vDinNIZ2<*!W(;u+~nVRt3aC>fX{bB&D@rk zVz9uQ=KtAt?B!5fUh!TLk>1h2R0krjvIuq3YevL$((6R9V{Z__j=f0)_tINDW{qcW zd+DH>Jj;o`dq-gAuOz~59w36-{~pQnlpTHFTP5*?B-`7H$V3t5Ho)C%bLKG-2{dlCnwq62{_EOup4qo!Vql?;ZjXomxDp_DXxd#>?8R|n){x}r?Y$;+-FJ6A-y*dkp+BHdgMf4WDGt;=>V6_Fky zf_tnS79lTtx-sO6n3?@XDALTn#(3S!^@>HG*T;QL^z~(Z)P#PlkBI(;h#2_+ZUkQ) zMgI7M+_A~r>O5P1uq{7?BF4HM(Y4QrIM&U?P=8ItIJYClUs}@B?{bu>FxwEG=mKpuH#&USQnLVYg3my_w(xx!vm&H`a#zS?Ffq zvS^%JH#)UGMgQtHJ%Na5aXwnp|%m)KEulbI)++ zx8+u@w6k@Uovmk@9x&N@mg#|ys0UV?9_VO#;B3clVy}cEGtQfn?UZnYh<$MLB+f@h+EqxX{hSZC)qi z!v?n_Zehk7YNPSI&`=k-nZE;5MTXksX5tFBz)%;v8Mu&~ZK%y|2F~|480x>=v@?Oa z)lfe$ZNA@7TTGjGa+@!4y%Gp0_0+~6x*Mg*mzj(`K?04>BYl zz1sbW$X~Aosf7 zAZQ0|Mc(#14}dTE&{o3lVr{9$PxjUYo}HYE zWopYtf8p_gXN$-RyLl=pxzx19!qJrl)qj#BiO(3x>70WDf+FOCd@{mN8_v=8SDizBl(aW#t0}G;wR;}3| z7^05%2gcy(-Zz2x>8V&|@rLq1ywMhK3W=}qjs-TOYDFrRS$yS9f%qz0{LGN}S>D-! z_*tn~X7RIM3&hW{#m^0iukm&T;%ic|OyW8I+V+rurn&1#LVP^m`#O*~KNZU?alw>8 z;=+)`25%75m=m+$?xEssX&7oM{x}U| zNX6UJFgR4)k%q120N&v}1_U+kC#S>eNE~;iwuo zN7Cj>ad+B!DL$HZ9~8N9d%W$?U!Aa%#x8Yi+Bx*V?pI3x&3{ z+7>OX-&$+0b!N{_MzFoT-~E2S@BEUPz5aXcwbx#I?X~yW=P{mrn-x{*5Vc8BD{!mD zvu~qC3z=MW9uioLCGlA43cOeZ7Ei#W2rQnj#4CZt%UyxkS0oF1M;$-mZ+k!f+5ssr za116z*1!utLewTJ7f%v%aUoEIg>2ktQ^&{o+ulzCGRLYSs&$zcDsh{jNRH(lFgN>x z?DMmi=Ffqk55F9g1YmVX`9&EQIKq&TZ+i!1XH%J?fDJz50FPgn0jEzOqsUQGVNpmj zMF=cdSp*?UMpkM)ute`iQWeX0_ ztfGjkpav#&gpyO?pMtYG!2n7f`V~IG@OwC(ivjOONZYpkw*fi$g;NFmLt?b+oXD*o z9(%MWm(F5nVxbSJna(XJMIRLG9oW9jQhI@mq0UhMJSPx$`ZqZlac9&Dr{8YJyW1&# z%NhETQ|wPTLytPPf5rS%zWhC%&X`Uo@RBnISOQ0#T>o;X;AJQ9vNP&s7Gb|V-|_f6 z{TrM~p7KFX_A)19*;~$d|2l&I8<5e+WngC2x&g~gztZGlAGY%|CHKW~7skfZ5<t#ZdM z79Sa-`AE?9k+HpcsYseq47H(_;3H#PAK~r=&*faF4}Rcgtd0pkPDl`;U&?SPF6v|rELusX01u2WG!fOpI{OReGeUHP$p8 z9%}+4w6sLRag+-Ri^P`pwx%F`B-&Uk-X#);2Vi3>BMsOz*a0Fd!j26*H;c8mcC3js zwPH6xUj}5SpqF2IveecZqTn z)dN!LMY_EOM5m2%i=g)!YNO4qb%{1Ke2T-9xti+hR)d`}eQC5g9?_U%k$9qm+`so= zf$dcFK)EXfDhzc*n@JKxh>&Q53=6_;0EumGkH&*3dZ>D$pv8iYjLiLEXwsdqTFMu&h>Y`hr7gBIx-^CKEBP}9Ssepcoe!Qr8Yb1J6IGg}iYOq#? z;utwKyMqI$p0dDs7sA8s=t^2XI4#s{HD29-8CHE8s0qr18zJPOd==1eIMm0%pP;fB z_C&ZD0&vHgj;$7K1(T6sFFFJ!M7uVy^Wo)42t^?_YJG}P$yrcmY~GrXYvG0Awd8be zbIC5~5D=*9a2#Wm;LFlgCU8T>cB8vJ$ zS)2R^yIK#Bt~xF4VG3Cm*$R~-AHtA^2E%5MFOgcP3Q{YfVJdi_qoQmy2HAdL)!JH7 z0(y_IYSCFTa6y75Z%efD{GloVVOVjpLX4P^ws3nxWKDQ;1YQw=I$_BU2x!E&RC982 ziv(E~42CwOIV@&X$-oi?C=%d&CIIxRwkohtb8I?}T$pUBCR_}0N5NVM+z~1e05v8z z0PX9y!bCwX0K^&`^TLHvvB!`b7fdWoxgc7RGTPfD16Lf_*flf`*TN{39Fc(b!8tUt zMQcke8dh!x)xa80%EW}v>LX&+126b@>vZs0QbYM6_6CM93W($wtg{Nqv@jC+IDw|B9s38%V8gMDSO)E=IKibblbAptbqdhrm++12 zEK#|%3|d_#ttbs!Wr&UBFne=-SyMP% z2J5i8Su;x@ekZn-z?)3UrcFy_lv0M2veHuiYmIlzAXS+&nbQoB0v4NnXLi7Xr8%tU zsYNX`AKI!ld&}%u=hdATDcx+v;tdUvMo4U#c7FNvx*3QeV>4pVi_kZaP=X<0Evc%S z8=SbV9@el4UX7MaOAtBj+Ue6v%V$nvSZ#g7`ZLuzEn?Mo(3a&vQF)sJsf5ZP8w&oBusGANP3hpnXrt z_b$pr29$jbSsf|nAZm``7Q(WMc=_k};M;d;G2X>j=sPg9@m2*6?D52e9>kp>@#0j3W*`09eb z@cK0Pb!qTVX}E5GdaSvRdf(Ofb^G8g!+q(~ng;)R8vF$f*Y)|chU@jlIMkSSzB>&r zzo}^Q2YLLOcvBku%W3e}HC!Ke9&8L8=+@{;>PkFZVM>EfW!%(fiH5^f26x=utKqtR zdeY#hHC&f75(~p&)_X-7{L^XhuW7h0AMYF#`8w`L0uHm@k~H{@Y4B&#;P0ftr}ETe z)?1ebzcUT~-sF#aO^tK z^XWAB@ih1Vp0dq$ZApV4PJ_!NY|0^{!3T~n{FmP`f}y`ocX63 z_%9hRH}DON&ouCFF^=mUJVeh&7_U&Ui_34^R~q<1=3ivs?=W6t;D2X)g@LPEH!Z8y zz#WcXYYjY$@%09t!}vx6{{q{8lY#$=9jC#-S1|u(10TtFi-F@aK6rGfFV}A4Sf99o zPhxzVftN5YYkTRJX^ihO_|Ic}kAcg(h;KIVdCY&SfiGaZ+rXJvW&CafU&;7> z1HYK@dkuUY_4g3n`f5^Z?j6ZDPMclt%HSlKUKWyNwj6Y%ETNpoL;0eZ` zHt_9?A2slujDOF-uV?%P1HXas9~*cVdx6GUl%}@KubjHSpDp zuQ%{Z7~g2%modJ{z^`Py!NC98U+KNsz{?nyeFN#=PcYtL@PCN$xPkwe@ofgamG!yC zz;`gd%fPQ?e2;D`~c(k z8~A4!f6%}mVEiEi-^k9!0noN_zm30cz*-`0{6RL6{Ed3 zUeXc5?nO9mIf#GD4W$@aCsMSvw_R{qr;H~Izx zmwmun4SWpy$6W^gVaC5~;GbmraRdJm+u^8z%l_`K4P4~>!N7O%J`}zp4iD@{ghald z^%7j3bDgzfe_ZavmI6laA4XJk)`@w%1{38D)17F28TeLgARJ#Z@DXh1 z#|`}FZ0F|;T_Zs*&***si zTO$ILh)@I;R?+ydMf&2GH0~dYnGVn0--)rC><#GKb0~h&^8TdesC(jtT)cZRF z7duFQik-y{nJiCmvBMw(mwJl~{EMpltP%qkePq2L^50_pe zeRZLMi$2Q?d>`{)YT!*AXSW!51>5IZ1HYK{+-utYu?2C)tq+LA*|0lRz zCk^~T_N#Xc{4M5}`z}Pj$jRpoKEYpNIin3+&@Ndp)D z(*`cr6CJ)UMfy?ve6)d!-%d4f@!RtaT>N&4fs5Z>V&I}ry@9{N>yUN>Z|8A$je&1t zKkPE_0c^LA8Ted|^Pe^F2*=@X7`XaTE6e(>fsbMT{HcM9-F{=>x3WL{*}$*mdcAzz zPx@sc<9P=D6t`=%fy@0BB?d12a)E(MzbrFwvHv9oUch#)H*kr2?FKIOUSr@=?=1!{ z@;_$a2iXpvF>tB(VFMTbCk*^a_Mf8$K92F13|#nsW#9|AAAfJ)BIk^O3%{SQ!$|+W z#r7;Pa9J-F8@TY78u&^cFL48x`&Q+;rPTXFuJ;{-U*tG>s)54)4UUs}1}^KaQ3fvi zbyE#o48u%1mmp)|RqW?1nE^+2Z z1}^RDF>qO*|IWarUGEyWw95}~LBT`%OY|%-@Tg+5f(AaB+dI|3C7#SRaN%EU;BRt# zSZ&~wIS#j^!M7Q>>|gIO@G~r@+rVWV{sjYg?UNdmxan(F8a?laM5Rxfr~z?4P4}3Y2dH&eD@&( zznsVWRs$D(_87SEcN_Q@IG*n}@bx_I9yD;7HxC)O@IPhXyV#!38~FX~|35Quk$=p< zh5u~>Kgsgd+h&vFu_Hre^dF?YrQhXzVW@%2`h0?ci<}t-F3)?+H*ow#0z8%*xYWDe zz@^?s0~a|_1K-8{b*+KptHJQN#lWTBj~lqu`#A#_Isa+kzv2G+hJjCI|9sBCrQVke zTpD9OT=;J^@Y^^J+-cy47(Za(BL5)+7yiQrzKivL+Q4VC-JUn_ zf$R@IHSkB6|8)buhx_*r27ZYB{9OZokK5(&g>30}<^Axiqk;c`FF zAMZ2pY_`J}4SYG{hYb8(#-B9s5p0L=8F-lO`Lcn3i`O&1GVp!O|2qT!F5{;S+{g8L z3zcV}SrA&q_8(y2U*UR(8u&5x=dlL<63Z_$@WX89xd#3j?w4uG$XQpo%MOi;NQmfdELPO!S?)< zfsbH38(vb0hx8ZSSO|20ajCb3`*DK7FY?bbaM7pAz@^?x4g6(p??%R@-j9=ZmK8Jj zPcweKf&YQ~<&y^9&idbH$Y(LuR}FrV|CE7?d^R81jfWzM;%$Ro_h%M!Mc7R2!pTgJ zH}EQ^C13cLGG1!%Z(w@5f$wH|mVw{Fbftm+iRo$s|2xym3|#IcAmfPXc%^}hUu`mQ@$+2@s-kj>3`%pRY=OC{t|mINBn0i zq)nNazm4l3&GR>6c$mCf0PCy%Q(XUME`ar8SDNKm1*?tlG0GD?eIPn`UZ{ku;@I#P5zcSp! zI>zOL!pPrZKY^cz1j;na`zsa4-RjHzG|N8+Ieqot`s-DZOa>;H;dQYFmt{Jx|1vYDAs1KMEp8B_%3h{0*_*${qFY zx|*&xx=wc`PTyR8X4lR$_SVe9$Z?|h85($Y?jicVnLhVcpYEc>VH9}9w?%;Bwd9!q zc$v6f%3!YPJQ?WPd8Vc-acb|nGw}P^r)s(a>g(BKSawwqXM%Saeo~cn6SZcbSrS_8|luA*i98GnsYu)QzD|=RSRljm` z^+{1G_fYl8y(@e6t~<6Dl>OkEy&{@T&png?Nyn6eE0lr@x=x*|jPyFM(_mZ`L0_M!U)n9$`nA27L z#NO&BlGc0$y6^?);0imj8M^!xD;@&mmE1$M87imJp7T_EC8qaQX4KqwC1*2yQXX1 zQE2{`hYo03*{gmHmCF9sIEUQRo;LZ)EP8 z&g!Ecz_EdQj^ysyuh@}9f3d5N9zP8|qH&Cc)-eejou{|OSHnl{9q^k=R_Ezx?jD?3 zFmcC&giOxeGl3I#e2fy4a`*h4cqZlEfsf&Kp7z8q?mQjL-7^EI<6GbZD}djbhbTyD zpw72NLCAe%hT&9T?rXxp1)W$1 z?=xajCX73iGXzd4PbNv8FxqIsSPM7}&ynB~G(7R17nlrk_k0KJiHTdw37M69#{^2` z<=#396UXv8PmjyJX&|J}ZH`PonRw1R4!(_EkE6*Qy}!rqKHE4rzE{enna6Iy+2pLX z_l_N>WdcBHHQ-E*nE_f!_dR-Lu&ZtO@`JN(4$S=)YMMXK2`YMr&}|JlKF9>$LQ z;Z&vj_yPC?eQ+UF2;c8FE^-g40dM1y8Ak;~-`qn3a}T`;s}~qNxSE-nr&cpNJYNS> zfGub}b9_#+mSO+CT3+n$wq@wQua=f%EyMqPwfK^?&?<&Zo??F@xF>F_q2LAf$L~{L z2h)R3@iOIccxC}m?BYrAt)l%oi^6VnMRl;K_g$MWPu7>2#z6YoyuV`CCZXeB!qJ!v z#`sbISMejbHm{^m+W|O4*m#1%EIz8$c^XzhzXXjjaYrp7umI1X1T2SkLDuo}fkJWr z!b;o?LvHXq1(MG?ijSXl34_;f&Kf-3Fyz)=h)p_M_&UoHW*EpgTh;%wVQ46vrXL>( zTV~zIhrlQF$uV>+I2-4EgI}bgeb4N#`jbWBe9@0$o~ay+0|8y01_T8s%|38?sBmRL zSnWSk)Ae%7sUw_{)jH%Rsd-WkUE3^&d3_A8Bkva}mt|>2XT4Act})(*tyEW}I&HlU zb_W?kjxQxiT7^u$Zgc19emiF#uY`=wW0B6&1-UoPg!DNqC_0bz!;^!X@Hf8Ch5hvQ z+&g|s3z*2xj~vG*k;x=!=Eh~ET02umpPb)*_ADZ9ITsf_euYSJN5_J586C&R^(t3& zPUU`wT&WF8JuRs@hkMl&L(B&xk$l_yzkqh&zy^tv&K5yNI9!d^p177 z;rg$}I^5McTh;%wv91Q*qCbJtx1R)F*zZoBsT%?0 zP)c~9O{A~jM5SuL0P@QuNdY7np9^zmVjHp~PYwRRY4bsNj`$52*4@V+h0o;9%?(H5 z{h)z3Jp@kRvX}cJchAi#2vCk@r8vh1UT(o=-20v=d;YJTC}aP1AO8xD9M$ZB$8pmr z+43~oth0E?dkQ9>Bmk8>vxUrTXcbnujpIgpaw zdD{6u)-flFyHAYnJ~5*E#L(^&gS$`Ucb^D!pUCMx(XabNX7`DVZrE_lJ+zK?=%1|V zItsh}utSeuutQImnriGP(XV0oa!O_57i69XEw^fHJvi*z`N)t&zvL(YdXhmeNKD6k zzOZ0k47hD(0CMT%;;}^_zDu28fE-(uQ?w?*yfgul)t3J=86F#*5?pZI>4usq1$2ce z?$8p3(7kX6YUqyuRghTsCxxPyP|jeEmR1u4t*Ve zouj4;i=EzE>4#sk4svo*&uk02sbT{?X3+U#72LnG6z@Vr=PL#3uG6NB~RZB z7rqd#9E@Q^ud|o8_eXg>blr>250u{IwI}dI8fwJ38f5sPS?;w@+G!=LQR-~ADpiu` zwB>zll}W-*Y*iJ0U_*g9t~ZLNYwz7SE|UF3?fpN~2)x*LE}hneKJ{;HM6;oZ8S2ux zEcC>UMp3gTY#j4Fd#x_dIT`x*ZjZND%?3bm%jRE zTJ^z3%~ggbA0UQh8%52oQ85fAw8sB~Q4H_yIhP*5SzH?}QtICp#r}o@-CX@P+^F^TI6Tj~ z;YjWcH^O9rK<8;+?oEFI;v9B`l}4ph7hGT|mrF;4?-~q3SdDqfZNL;< zThL2#VK1H$y?BDXc*gePnb?bGYA>GhUOY2<@yzMPQ_+j3vRB&|9qxfA6ZE#%9DV_= z`sm1tUXp8j$ywVAS%3IuxWQeQv#}SlsaL6n)W8sg{)Ri0-7Z&d{+Q*R&9{QOXT9WL zuyMd6;o0gl$do)6hOjO-eV^(3Y+3U%yiXfy-n;JP2j32WtB3uQdYr(UX>s3VaD@l= zxI&s`&Qk69bdxfF0=moz*=yOn&pX9)mH)Jje0G6;A#n zptw6)9ncQkk%F6o<8VhdrD=DIBaeI2`Vww%1~m8rkc4-xS08(}`gI)ZC&u6n<<+m# zR#(y*$y6ugb?$t9^wyVAyX$xM;N7CRH+~4Vx01?3bF=8_8x)y5!lAYxJg^pQio}B* z?a_F!etR(791f0am>LW>!B_C|aWVK|N#SdR-_AA|gAEN5;!Lzq8260@Xmrey@9u7zv zpz~mODV}udu8D_WATL~6RTXS)Z%DL6g3WEs@lraZjF}sR$5%UABJoI35Q>Md3dWju zMCJy^wKPCPh(}^lBgBc?=7xpat6;q0f$^XY^{T7iUWbG5&1v|9>$V>=r{c#*{Lqh+ zWl0Jyb;5IFKO6!}5-VT5Z#~}wQz<;WnBg?H#Vz0Em}C18DqM@{49YI`=c_sjo0AOr z9(u4N-><$hGO$#>pTDRa=LJyIA^4}7M_azfA+3Jr!dpNhNi*-zp$i~md}7)x%Ui0S+UnPX%I%CHcK`@~@XT9bzfSyi zAb?sKLo<=^I}k>#jA29s9JFZ0@XXVYQ>e;}$i#|9II-q-D`O-PBb}B=o0Ty-^C;xd ziqy&oW}+@ZrD8^r2Q~5aK)w&{MW*mNg@K;|41b`*&`iu=Vi*y&vo+LWIm3zYC{fM` zFJ6Qs0h!LIz(lynssxPI1q4|DD&`a^0ZLkNCKdtvV0CjK$@U^!I%B+Vigd3tIk4T8 zK1G*4m8Fw08!oFcP^Tc^QHt1h zq1T2o+&PN^SGxkL_0})eTfZcw^)=pwNde0Ohg|{7bpb1M0V`7ktnzk>fDETL@Qy3s zVqL&$UBDXukHMnSgtgwMMZlZRC4pOD> z=b=~N-G9(e8wa8b;He!DR}4gx4p79E1!$iCRz%$(Z0c)@*i?XO|B5>$R8JOfj+))7G;pCzKC*%QKYJ`QBk9Z$AE8hKWwaB6ogM0N<{gJhsRo? zmhUQ}GAAkVtpl;`KIP{@sFhsBR$BSmydM*-yuOaWT34$rG(IgFE54{tsSC{kQ8DjS zV563d^CbdLxMj9-nYIvUcr_6=1kX0hw~Yvo)7Akw+llZh^>z@UtnB-+4~02O*Y81+ zbREsQUgO;)^-l0z8(0CcSjo7KWLOT>yNd|hfxh-#Pid}pHxXQIClMJCy)54zN;^u{ z4Mg}9aUufj==M7nQqnVs-AtS zYZY-P5o)0O?jpj=8hq4yt4QuPwQn4q?EbG zi?0eLtv$Z`0v~eAd`2(x*_1N(dlyQX@xBKF_?sF^x6gAK>YWEw8RZE7K?Jw-3q*LS zN4`jDc8Z6H;O;p{J>p|~e9602>h$;?4h)3JUe)=ZREB%xD?~_-JmURrvdq^4_}d$* z%ptwZqbX$$dq)8q6oZ)Sdn|yzr=iL`u9tZtWt4owyIRTweBTS;Z*;3N&ks!oVc!pk zP(j%D0ugMFAChQx*B6K03x)mM>>qjYmpjy8d}$O)Ce=K?R|ELd7pj_{>#Dt$(wtv- z@s~EJ%sAgK1Nd{os?4vr40YA7RT38OCioo*;2`e%y|+sQjPsoejEBXaQuL2XfEw|CQUa8sZxO+YzD)!x z`e!0o(Z8f9`d9CNNj;A5oxt^OJ?~N(uJmt2u%c&(;ClW}1lRKqA~Lvt-t$ZcX>dP2 z1Wwzg&KiJ3u`kW{U(*NaH6Z@k?fY@yVj$RZUr ziDfEkvZ6dJWQy(iu?TT|C3dSTq%1{9d5Vx}EJTT%t|;}!I^PUMWpD*EZO>4UIRd+M zm+hNl|JJSHe0wm?t=6DWM~5}nF2IRcofh~munTZnIHfA6u!mr{eOpoU>_XJ?FN(U* z9)dmaH$~023(-!0=gKQ>?+&SazwKLSZ-868sJbdu9UE+s(&VHPQmv}{gQ6DO`53qV zn2Rk~qG}sr6IG*XgXKF^0v@~6_TtYQQzxJFEw`_i+E#FF%(v3^HbNHJ1n0*u&7$%|Dn_0x8~)k?|VE5R7i zLw*Uh)hKGOJp`xD^@_UHF2MO|r=o7N3vd?sjG}J0^KJv`K}Fr6ntoVO-Kyzu5lRiL zJ8kdNpcZvWm+vF?U)`2}R5?D|;bTe)2a%5}DLxi*x9$BFlp`S-zE9dgcve@L;ZrPx z8TZ@X49Fu!kMDrJ)MdQKF2JcpJmo&yTask_tQ~b3?@wiX!1i7ujK#hO?N7Ok|6v#4 zj3*MmXnU`NymCaKj~}sfWAK1+9_-RuU!};I2m7wVg*sZTLlk84U{BV1l)^|} zxT)ScOe1#!O8GjCMnDtRV>H4DeVj&3UQ;w?JwYP@k|FCGjF`MhXL*m{!e2WZTCiY$}|d%4!P$p(2bDE2h9l1=&@+xsB23w#J#nmOM8 zHE0#BS~4d%I3+VN(bofMwH(QuM1)@z+L$>tPz{$~RG|{RP$>~=36fbxgj#}RmJ{Kn zEu740N;YlbWKLJIm9!a|4?wN`6)}^Dsfsu+e-|jaLJ_lksN8zBhRK}m#Wqlb0-5Ir z4!XL{)pff-*R6sCaO>s~f%`xpm$}bE#g< zGQFDRM6d}~5TRCKnJe?rguDvNT;=^bP=zRw#1~}N1~!QJi*@mIKkT1Gv2(CZ1KU5DV&^=jrqEJmK2uXU zb}G&ij-84s<=CmHGLD^!D(Bd#sA;qWI?OVs(-H_`C!KKkXLx=rARem*xa8|oct$!79iCX?D;!^5^ zzo}3wH40RaLpg`=(odO90bcJ{DNz zmXGV@6Dj4lddCBslC?E}X)eDlaJyT6yIy`rO8F0a8{P6B4q%$g?+iTemcLdne_cxX zUET-W^1A|iOyg7hr zD&p~X2b$a>cMimzBVoJCv%)QMS1zWx$VUU8bc=jEUoUdE=Q_8@-MN^ai1I$!Ib6LQ z(E8LsjM=cjw5<-(*rT4Q1UFNh{}zLEDcNq#dgN1E}iyh=$P$%{$y z$-D<3$&Gu;dk6GaA-2nh)4#6;QnZ@(`WM@e071)ce~nES8kkyY)4Z)Vc>K#0#b=oQ z<+kU;A|%tl(k_P!mrBS*ijk?>6d@P05XHG#QEHpQzeZ8&RKdSiQR*bgzfMtn;^4o; z_8fuA;m@*aZU1`v6}R@w6erhyxuUoU8|{8QP=af?LQ(2^r~gXD*Go7ZBo<# zMTP8v*w|b})!PHneuEViwgY&*GN=~W{s!AK4_K$6p8iIgu4R(h{r=7NPL^x;u6G)_SyE$uq;Lg!74aTQgSqrjoDF*5DtgMBU&T!(ht*k0a z`aXK!Dt(LcIjo=b>W3k1}2DG}>|fO^&wu@MN6wtPLCA5=3OERY}%XqQ)|HHBpP0+D23ZQ`?E!!_*F+`phzsfcOqI}-OZJC>m=;Uqb%jNNjM7MX6p7ySm=yr21?25p7badgGUD~8fHk* z-3jlFwgMP%j%onS!&!HFRsjZCP+L|IuiUG2zhTI$(%Hjt%m!$VDNagMnf*tc2F3u+ zuH$=U=8PHySWy;yI0ac$Bi2-eoW4OC@MDmXnUMr$BAe~+kDi-Ei%tStzrh;t1}Kr8 zp9BK9)$t`$54(TyrvW<;g=P=&9fkBbaC#$!#$q0QOiFU$ew42RYE@h_a;hPJ~Roqm#8F6&iMs0(1*r= zTaSuiLJo8qY*6Ee#(+DOilI1X1m@8PGFU#`;Z%8}a^_(keQ1SoLsT)0%()U7=tE<` zy;Q|ema_vH=tD`zU00PiI_G1UM;|H=_h(h!#GJ2S9(|}h+{smWlX9NNJo-?1xaX_# zN^{=EJo>;q&1-yWo`4qGMLB`-kVhX%0`BQ63FqZZ#XR~@d3bq2<(1^rU><#_JiJDs z^2X*gV;+6DHCsNsWTF@b=Ila-9#DXhsX6-*p%1MHUbs<3rsNz(2KrF-;UylGH!J7I zm`5Kf4=)C(yfHbaFpoY|9$q$5dBL2#36Mu0TBUfENimGbnT`zfp)ue^Da9~6XB9Hg zhmww0uT^8}Xdkq=ct=9c1L0vG_rTJZCVAA`hXNTd6?NL_jI9xB^vq)tWgu zGm$~XLRBt7{UZn8#Z6q51wZMGoZK`76_ zPdrwsFU#KVp9G;CMfJ}p>;crXuSGHc-OD^ytINDdnE&o&W>xQd-U7_>Kt(>BjH$Li zxB_;#0zLv<7)`7{cnfOa%d>AIlVcURp4#z8udj!4TP!GGS>Ja>sXZ?+;Qkjx)c3u^ zSQM50fwus&NEe*kNtYX40VN(3hywB^W6R;^Pj2*%Y61jGkS;fR$2Sw%peoMTO+}4kzsWcTy?Xoo(?B-GY_sdl(@e`GEb(FSyIByKA9@> zq-P3diOkdrpEWhurk> zyP^!+4WYl)GqeY4@a$Vb0kG9mf-{w8Uu6zf-0tbGa@7pf?#WlA3e_Ewt7d{No{{DwWF{_n`%A_jf}sRk(6w4?wW;P}D5teVeR#$Y@umXb*#& z4w!@S+rA(rcY(@;wvng{=y3=Ue8IRL$i}JKvf=vifVtThWS^hCG=EMuppLZ^F4cMm zYdGu$F`FZ74gh|=oG;hPF7jj1%zWEBAUj)S+5q@V?fFBcmI*^Eh9a0n5{vw*W;o?f zQN)1(>0k{-&@Qag197H5>qG#YQ_n;db%p_M&CdBn0jwog)#6h^=789MZ7E|WBHB&oto^TD>@$YMBG zJNWG_Whoa4l3h|{7tOSmbs&H)DM$IFSjvM&<0EMXAVWRr{>w?2IOaZ zM-Ly3>fz6xlyJ}a;lew3DcG?LPXDZOsv0d0Dr2>{LrC>&-rRld9=%vie ziquS9;V6|Ftv=HMGuRq2^Ng49s1*98f>-a!mgp^w{`<)+xFiEYg_c&S45k1IX=6LRP?8oOjBm5hjyiO;>U+Uy< zbqWtSRqLH;acA;+$6tY>JX@VC&zO8A#{Zn+jXMLkI)e{5)$5%Zac5!*Zwd0wc+44e z(iwTs8QSSMApLcx-*RWzea^@O&W!cWtOL%N3TH*BbI}2(qQVK6I%^L&{Ysq$7dpPU zGrbf)gY=obOJ#+Us{SP=<%N;0?8F%{c zaVk8aK~CmF&a?_AbGI|pU*zPzda>ykQepYPyZ$-ZZIuA8ZF*{ z79Rl~b~z5i{tyj6>yAf-ja}gkxk-Xc#s=_mh+HXO8#XwX9&lDt7c8i7mSPt;*$`mT zhoW2TKAT=kZd7eVktJst<$agx8?B)l<{338bf{kjX5T~O1ILXOrpafc$ycDsXUd=+ zyWAPl=`8O=v&|<9+s;3U673x1_>5qQd)%RpI?M{6A?`fOSS!I8G&GIv($!pi{QY@l-gY{N4DK z;Tf0jcwr>m!=ICyoM9D?7ZwH?5TCr8o#FR5<6*}4j4OcEkS8PSGT-aItDTYlX}I{v z*|QI)|NI2b_Bfzkc7k7W%Hqy|MyFtdQy#~eGNZ)tUJk+rZFELG?&NhlqdM`k09H+p zI|Yr-=zaJ(o<1Qxc{eT%@+zFrR>$KRKM?11k7x2gn8Ur^)|VXHTM(S)_`!2vy^^`y znFyb8$MG+7vX?vK?sc-`P9d&1GIl#7S2%@nXLtf#b7TV3#dl%t{o>TZEN?$pg?ZbZ zJkMBIR$ZB1>QR4|D>oC8xk=9NM?c$%C%B#~BcJMq_Ubi(?N2 zVQq(fbpXQeg^qpsG>EVNRLPC!q$l^)pPVf0s`N!P8%p~yp;;en2+hiWyc0%Kr!%u6&?!GiUlR{HlMXtQ4?504XZ&TzG4U|VLl`z(e z9p_Cy^wvGtq}+QP51jV-J1d=nHz3l$2^mBh?{dd}z!~Y?UW$rR8H*?cGW>$`s1?qD-Hz`i zXRd;$D7gO$Cwrgcz=#9dTkiPq>mYvI<4nM>PdWqP3#5;MFOT=?Mybu?9eC8S@AY`$ zoO)q%IJ`R2Qn$3N!CKfBUfNI>i$@dTxV1PG223dYJ?pxLNVvTrQWp-jv_u*@;@jI2 zt?&}5mKJzfQ*C_vDxlzLpSo~cqlHpIK;7!d7Av+H-$8{hei0Pw3OCh-;_+y6z0{zj zvYh6Q`fx`bJW&*nK)HA{6pqw2wuG82(xbJhK3dliZ4X=Fc2Ff8uL32oDqYL=XmgX2 ziE84zaq8g7r@APxg`-iB-P#%gJsLqv)OcMi5?$MlpG(^s+eN9W_O>=?myjr+8M3XG zy84#(@KqMQC8r@24^i6|Md}kx!rKu7Q#41ziRO46UQO+Yf(aU}c%rQhj0D=p+d+FO zM>V4UXrKix5qR?sQrLpkk%s2z>PRRC4_9F>u~J{TtVCh+(D>0mMRhVNJ^!HxxwY>$?}IBIXhQYs_d5{hk>Y%l_3 zgc~*567M7hsV~t78XM7;YonpI*vd!)xP|x^+O?`FK?64wjyG?OSm0ohC_J%V*9skt z7J^1k?}&nN<1m`GMxyY7A#fu!0QEi&1u)nmC>y;f98Q4iH&|<$o7zGxYr#}fQ!GJ) z4PA<)lJTI&o1t&oVDxN`!Z-vw)5su>a7VaZ4bWI!YrF&Xu&^g^9K=E}u$$^=P=bzY zBJo5=-D+^#);1hFp}2Axj7c1c#IH#-$Dmla5!6xRk=5cHd@u<;Qi*D8X$KdA#~5kg zw?PjoHMfSM%^?m+OQJCqsKSj)8>|-WH2O%i#lRMk28vw`iD)Q}=EH!2qio?t7pSPXCG zS`zJ8)3MbB@Ev0?%t4`K#MbRYquPQ8H7U4J4#g@K*bs@u>l)fyL(Of_U~qyu3>wf9 z(#VZr4WvafRwuY~mWJG@vM||);7(W5$g(1BI4Ef7tNuk3h)ZLMs-}7}Ia)+Q6*_Yj zL}KKFfkmZ}56eP_LTth}sByodkR{QO*aJE^q@0r?3JgFhUU!M^^UyIW{*yV_T_Rf{ zWRd4m$3h$MEopVofzZ#WMl=#?&_WkHCmRBT)T?O@hY}5hC{GA$67{jj7A*j&(H0A< z;eZk7qDIxZAVr^tKsVj{jY^>-RW3~k7%`>kY);n{RAJT9Dv^dN(qu&=KyfEr?gbsK z=!_x^12YUq<)}Ezs!DZ(LF8zRgHbpz!`$2!YlS(kG0_&bLM;%1utQ}qKoX`A@Isz$ zTiYRQw1c&v|0pcLBgkZC93ZL(sYmKI!{iJugd-WJ>;(|vz}J%t5^82^gBUivIRsIN zr`yzpMXb5CV+~AA=top7*`1aTYz?>ds8qZiL)HvyGxR&X{SKMHOv+!~;DGBH6$oj1 zNr@FPaROd;(2S0)P}7rI<4C0#_DBQ=8)^xHEox}ACnsAfPtlr|0X&vbzeTVF5rJAz zQSD_P-&|p|twYFCBU~$o)mTs|* zC`=Zu;2W+phc`#USJfeXb*LFeVH3?q4LBcBB#Omm*U{Suxo6dS3uloyRMlYB)h%AP zs%q`hi&oXu(STo!YfcQ#V3RfAIxt_tvIJ)sT;pN*z!$nK+_1LVT8m47Iy9VGg`i0- z3V1NBM4P#DsjiMlGsZxu@Y0J`FLH&8{Z$ZvMI#yz*3ea(-SLD07$*yQC#1w{3w@q= zK}!g0q$SPWF!7Rw&^aTq7>pCB6WfAZ=)W-7np9j>nnRF6ctJ;pS|NzlsYhTIZdPGO z4VG8~MoPEt^7q5~KCIAWubR#=7CHN(IIw?G$x5e=tP@$D&H1CtA^2_WWx zm-8|RJQItcR6PAc8`Aj%g(IpO&VRXa7%L%aZ3P6Pnr;#bwPX}rnd71n&s`U)vp3BF za99h8Q3SM!#7SS0M$Sm~hDjICL!lXb+SsJMvlT0%LX<$&7hm0gnrr=sqfS<3SQEqs zUZBIO9HNa3$(3M1b&jS^!SU@L<6@r_C7^9INsx)*mAcK1xb6baMO*h? zyVHcPtz=>mSVx55H7Lz(^{~uX3idPAL=_<(!6_(CnBE3UC9z>*m;mSNZx5w1py-8Cb2r_zX2RU>Xe z?MiEvIyu%nfvUyGMvg`7iMHed5yBO^j+zsBXLk(GuqmV5dO==y5&80OV_7jF!wS~fKD?0Nf_frb0vl%|MX`l@m zT3uajY(db(=FSeVHh{Ibl7JHx_Fk{oAj>Q(F3BB@{e@8miqL5lL>;yVdVc(RHgTjEtJ^Km%aCh9^kky}0I6n&pn!jo~U4sNHH%E<(WrviCXv^}AWuGWOiU0N24hRe_*&5fmDs|+TKGV-pn_SSG2o-b2o z`V11l+0FH3P2q4EY$nysnppzlCb6xgsVz}9ZCY7#Tev0B5V2H!r9zjLmhvB-j*u?Q znapX1kprh+eP?#S_FHpU&pY=jOiq(dssKY+HBp-38q7_^;tdUv#?sA}(g+gRBKX=e zd)9e%=S46z?fmlTbu%yt0^ySjZ-x*Z1`@Vw>LT0XoB{Cx{0<0^+}uvzu(^tWwWO+Q zZgAqddhqT9@9ULJOAtBj+Ue6v%V$nvSUuMs;CsPfD-a(0vyR{$V)9%I-PjAXy<@dy zZwuJN`)B&Q;YKugLPb5*58rfSZS{b_jh?C;-!@?2Ji5CV(sWy{mQetDH}Fy}S8$+me5V z^XV>oH-C(qPrsJ~Jl{b+$@e_r)?a})?ZJ^Qe9H@7?;Yzw2K0|JoKMe{x%t0N_CF7j9Vzm+xbiDFzcnRa4FHtCk@Huj zJm$wQuSNHgYKTgD)yq=)z@@g-EU$VKN-7AH*MeJSjpKZv z^S~0xqlS|Bsc=QZ+ZPF6PdFPK(o!nyhi{C(=5ZeY$S-{IXu~6nw{Zb^V&WN~`;zlx=Kmz~Q!Isa5B&GV|5h3tRqu-* zf1eBW{4RXsAy4g$O~a4&=u1vz8vNok_{KDNV;a0Q4ZbT4{?Rn}=hEPhroq3T2FF*# z^<{^@rNMI{7WKtHDh)n84PKK5uTO(-OM`c(!S7FlA5Me6mA5{1Am(F$Ht_}`4QvYV^i_h8E+h?a9SHd@=uHh$EWhY z2Y6romE$No|AqNQ&M?Lwo}lE=+6a=982{u%g?~qVS@?Vx_E#M|_Krub`m&ZV{$kyM ztkAAHZ6Z^NqhNsT4-ZE>!IZy-^E;p&Fl zjqW7{%5wK8l{T=GnUtEmj6kf(t$K~*Yh`3M+Fgb1Pq^EPI4ISTi1RI8YKvQe>JCHV za`vf*BW;8$q)Fb)5_A*X`nKVslx zp$r~JG&#Eb;~GD>q_)$l}|7!4K-{29z zPK5)rv0gqMunHN+df^QiuAI3Vj!SrvzfY5c{UZ218m`O7^CUd5-XQ!7|4B`Lk%s?8 z<3~B7zj`TbZ~cd`VNLzdV;t*6k!Ro^j|FM)D-8TH#cnk*j$g&_FZ$o4;bSy>F|0T7 z!0fT`FZ{P^_&5!JTEp?wLHN&TIL0EuXZnDE1LfnXgWy+dIG!R1{tV-0zyHX<#m*-+ zIk-nCaxyc4fJ5wgl_IS?#!(;LK0ncL-3~c^RS@}gyH#uWc*v7__i8wv;t2k24WFpt zzAPZ%K>4~I)-i6{q29p74tHoc`p-2e6pl|YZnhU5XrKe}vG6Z?u4UY;H)P;a@9i3n z^~(O=-I{#e&WAM|_ZFqz4cS1zf%T#siJOr$_+5;f`hQo$_5RA^K!^OgKQGmAy&vz; z@F`G6^n6ys^?uCB0VX(5{v`Mp{)HNjbFtw27&q;Fz`(`MFKBY`lu_gi9smR!SZ^8p z3qDK3b^dEKT<71f;X41XG+gKR;A9U6)~oa5FEZg_>T_2b{IxXrJB*7z98h8{FQ43_ zeBH0cXt>_*FKGB!C?odqW3Yw;<>>vsO2hSjzfr^Wet%BG^?om;w`ui`|Kki?`ggO2 zqyK*ym4hS7xY^zZG`t-6q+L&G_%scFO~a>a_`4cDL&Gn`$r28%cP9Lc{4X#r{UX=M z4yD0=YT&XidLs=!o);=u?^vzg77fQ24vRkbYdEfH1%Fk;_5Lm91ro}it?_Tx@Hra( zB@M@GJ|h2Z4WFywb9rHg^6>>&!XMRe-G9EO;ky51@WRiG4|xVI{&OAUSg#)6-qdit z-buK~h6DNadbcrd)_a42OT7I5zC5qke3lp8N^r^w^_jFYoIuS6c#XHAqRuFr8fNrB14`yBEy@$O&zUFww?1+Ho8-(tIr2FF{3uVHe^2Cb{xj;O}k4UCwsC zH}V!qO4olw6Zg|%~R9=hdiB=AJ_BG z2k_4h;J+Wh9}OoD$;ABIB%R5G0hFIN71c&W~dTET}azBPP@^0$GHR(yMSiToP)Sa}!tczL+4 zElh5Q=c=a93*a@Yq}~(0Ro(}Fzq}v3v+@sw&sBYj;XXeZ3V&Yl!{H0$BjAhVqv1Z! zDSX?`3(35`7C(8UeB5fFID`r@Gs@h!y6u+_U{7t zcEvA(e=mOx?(@JU@I8uO2LDyQ9PT%GR>6Hfxf)(U=XLAgmE{}YN6I(BYsgFC$I8Ei z*Oq?+&yjD3*OPw__xbQHctgeSfuAP-72ZUiU7@4(x|!UsqkDZ1H*yM7g#gK9e^KMX z?@QW?j!5HAuZh1raD0%$;X$ZMb z-URUv%A3I-lAi~ERGtr?ByR<;D-YMnhABLRpSgNpp$&Yd;@iXL$ghF_P2L4QPu>mw zqPzgUP~H>%io6f}b$LH{b@@Q}+wx-g3i(j@d-CD%HS!Vg59OobAInSNpUTI=KbMb( ze=VN?-zJ{||4u#~zF0m3{)=9}o&`TfuNTjSe_mA?kx zAzuOyH^vRqGWd`3)=1B-8R50Dt;6E2ze>oud{y%|AXSc zf!CC8hqqIGzK3s=?}A?}-vb|`_ZxnNyWg`f0w(Pg{vCeY?+5Gr%oGzu_j?V*yWf4ChRgkz>R%i2?)MzH`@J6A{hkX?z8^h1HH5q0PlLPPo50=g;ky1X zx&H3=^Wg6HeE9LIPb+vGd29Gd@;30VHU8Vf8!7%8`04U4@TT%^@N?t^@bl$8;VtBS z;1|pL!CzLt4}`Z>d@-{MvFJ(F&Bj+WCXae~ zpsd{LI$u6tF`+KuXN}GyTESv)ySv%yZ({{kmQT|#wK6g8J z({Y_Y&uDL}cD@er=WBqBg8TXmpNBe+^Up#2)9No@$LRQNiu3uJ{Svk3#slQp0@q?? zeE#A*&R+Ovzo&ROH^SlLrRsFjL?)q47zxV*}7JsWAf)qy*IBlziI#$-Ad?s7ZA9bX9VukHK*xbw_}zop~w z`S2=Q-`|Bh|3~oJs{hw;ms|7DbotyqHI)Ahxa)Hv-1TV-ce&TXeg4}U?)r>`JANGe zc(u<|xbr*>@1SwG0RDpZ?@Qs{f4mQOxf|iL)xO`rU7zw=FWt_LuL}P~>sM{K^PCNL zd`ox}EpL0c^V|$~{O#})w7!gnJI^z4kDq05kDm|V9zUDmF85n_W3|s7xa)J2jyv4W zj`v-~?0UN+(-85_b1B^MSHst9yIKHuo;%@=zaKtc<7Wcgd7gw1(DKiNAEfqq74G(5 z4nJPw^+UMp^ErH>>iHdfv#vw^1@8JEt?i%N-|=%cBlz= zJJg4}+%w@-v^~j(yFP8<1sW$^;nTD|xe@+@_V2}TU&lNO?)v!p|M2hdGfl_0(-429 z+H)@4^q3IERiDE?^p93B7pc;E5PbKwEv+rTf= ze$$_KV4hnK5I+iDLH+nJ-1S)wcl>(za~j8=!=2}Q_?znA-{Br7M`)aSxtzZiyqea> z`f!)q6#kpaZ3*A2ez^+n?Pd@7Agvbz;I7Y|@GrDpJOIB{<75`Ry!J;g!Y69`yafKF z+W$RxuC{xd-~-ie-@;wbJ#e4TAEkWm7uUZI-1YQ++wpU>T<0U+^}GV^dUl1oJ~zTw z>iMVx_`~oqT95t$_va!O!M(hG-^t7MaQGvc)*;^g==Xmd@Aml~@ot~r;clPG>Nn?c z`y2=Na^=F8sb8DI2dW)f!v9C(wgcRGdcc=z``i!i{KMeR{{Y;1Cc%HxamiC~=l6Ml z+sFBrAl`Z2h3{1TKZZO1H*n|w3GO@xYrMNY7wP=E8r*qu;Erzue@VxC=fa)mGPvVA z!TV~Q^@Mwz-vjr!9S8Tgod)-~{VUw#b`jk5c?*8JmUk`uO>I9vgCD7O-U+{7-}nUmr9@+R=tvcevYs34DTHuXz{l?cPSX%iRihxqINwpWLuGJGo!>YP(b&?sDtE9iIok zL+#ugK1bv2a=7C=!_QRv_k=so5V+$HzPfe(C{VtK;*2@YbsT9q^hO zC-=ecR(n1M-=lV!0iUgLI1j!`{q+ibkJ@1^yrar3g%48wcfg-fJNyjquKX4B==QIw z{59cg)DCCBU7ri#xmthQz+G-v_+1(&H^cAI^PzC(zZdRt@&w#pKK3m9M2+*8;j_}= zmRSpbOUqRX_xaHdxL;TIbwh4v=Q&L8!`t)K{x#sRJixcbK%}EFNAx)ybSLB@*24JkEL+$A9upt{=dMxsb3D$ z1p)4_;Tk`6;6C2VgS&m2!+pHh8t(dcg1i2`;I7Xg_yn#0cfrSLd-x#S^`8az@xTjk zFW2jEpGU8Rd$~5iy;9Yba))VgS&LFtYm&d@}FH_(?U!Dzjf4vBIf4u?sI9vsHe|-#he{F?( zxqgJN*7mWSK8NA<+@}3k6}anv9NhKEg}Xjy!JYpixHfN@cJSd^U#^3@K7HYizZJe) z%QX@{T>FuS;6A>c4tM-q_)O(l0RJ#FY%(o{JOBG|$8Usp)A7R=_+V`hcfoyLUruif zxqp2gT@~&;$HD#nWqo*w`lSin<+gyk+$-VEa~*uS^4|#GspGd|xXT?0cexM4oo5={ z*GW7L&(-)@0C%}d;V$=mxbtj;-=}`u0uSF$8>U@w=RZiF$8!HVz6yM;>R$`~gvM2U zxbruKJH7>ckdC+8!aJqa&vb>quJxr4-0{Wme#+zTH}~?c(E2qF@y#0^Hv#bPBw$wln_RmGk6l{kjnG zpQyhshx>D^9pM=r2NuHJkHg_NXuLfD@1_2o3}3H)nGJ8E^?Cu^*NZHLS5f}=;BPC> zCU`yd*EV=9jfXw(A)#TD>Co^Y>SS^|SJ3j-fX`Mx)`fqmj0zSH!1(4@a7t~GvFoKZp@>r9bSV!r~0gb_t1Fw2tG#Z z``7TnYXAR(57l~+{c@b7P269;{<6vmX+zm3s{Xa%>s4+8xbruISJe6Qz4~4n=l`SX z^BCOmPr%1&oIDF(p>g{%e3RPYZMcss*1?^>6y93v`wqBYkNp|GMdRVHoPFDKkovI( z{7JP#9rztu-aPnOs!wzHr5abQ;g_qwI>NmjD1v)CFc9wTz};|f2gbs^9heIDc3>{t z+ku7fS*rgsc#*bCYv9Le|56ICt?mDJ@Lid7`W0SP@s;YN|M$4PQ|){#ylMzYrjy|h zs^6QyC+T(6mT-@^E8%Y{z6ac|%lCtiRQxdbX0=ZV{5-`^f?rTBU9NZFuFrb-N7{~k z24A4<$qx9x)ozvQrscSu>!_XU!@tq`-dtWTna!KFkfBZF>cVW|>m%2Y%6f0)KS=c- z62)tk&c=_9T&rl-Cq}MaSJvkv|0vD$D!iHY*YChPYCE13o`nY9_N6USA7c z?Zh;|?c6ssU^1NoZ>4@|4&SNzw}mfNJ^RBeYh0DUKh$`b3LmHS`VIJGb;1X5UuXFR zd_(zkxhmF6AHBTeHGUeyzgPQQ0l!P_PzZnK;56?jxUUa*3jV3uVHy10G)?9!_%5~2 zp(pKI|6R&c7k;?LgTHsn%UfUhdm{c>tu!OxB?qN5Oow;W%CrbRQ}OHISE-$UhWmS9 zk3MK_Zs-c%H!`1bDpbJpD~EPOYJ-dev9h43VyBD_bu>+%Ksbu&l>-A zbNB79D^&lc@La8@?cpmAP3P|o_k9Nj$V2r)Reax_ClK%Ng)o+(*VFf@ zYK8cd6yFZL<`VIHLT<5_{HU2M=d%1ic zwL1~-`iy}$*7j{8^88pgt;Y()JI`kLMTe*HTam~2fjgnm{+H`ac=w8F-1%}ZSJyhJ z4@SJ}b3gp;Fk>=3f;=;GvYdGv@y@dm{-};~{5^!OkMEOLOWUnVN!sw^JdNT0obWkv z=ka~`1|Z&f{sa&AB@ELzbAKCce<^&xfO zowZ#$4Zb}jOr{Ir-oJE*FH)Yqa<^OA{ZJ9_>vJB4yPl83UC-y>uIEa47ac!*4EOh; zY=yi1e}b>m@%$mDrS0K%?yLRFQE<0UQ+O@q$(Or*{CWEki1%_$hdck@;EUB?3!?mC z24Nm3EdQzU*6_3CZQ=Ry4)Dw5o#7qi-Qd^B3*klb-td0%o8h<1 z-A-g?m5c_lsOl?+0_V+;;D0Jud9tj~5_*W=>k*2)K_!X25-%vjpzrs8YC( z)7-eOkB$XAIBEJeVjZ3?&I(oa3AL{f%|-+6z=np?8Y~$r_Y0Obes}q z3qL+D%ZK~CuK@1z#}RO!w`TH&+|j?duqb&f9-Kb*@n6ZU84L4@dkrnlJ^xjxz>#GU z=^tS?yT9dM{aX6}p*p?^%O4H}x%@2?3*~cqq)95*5X85{O{`zycos&tMKp@3ux z<%j(}%fB))=1eGar*>3VV)+?cbb$F++!V4T$64t^*>BE&ee$3E)qlBeSn2sg{lh+x z^}j7K=1eH_v&tW$_74^&#tuqsf93B{`F`ColwUddVfmw!)AdZAW~ctz5!VVcMw83; z!PJ)^vsvhi(X`KAzv(pZ%4c zgk^FjhToaYc)h-Gbn^H9`ak>|RSdIbo_{?1kST`^E8DMH61Knjm()ljH>7FGesli+ E04+qj^Z)<= literal 0 HcmV?d00001 diff --git a/omc/plat/bicc/obj/bicc_apm.o b/omc/plat/bicc/obj/bicc_apm.o new file mode 100644 index 0000000000000000000000000000000000000000..be6daa3b0b792b12a0a14a6d33872518b50260d9 GIT binary patch literal 14960 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 literal 0 HcmV?d00001 diff --git a/omc/plat/bicc/obj/bicc_debug.o b/omc/plat/bicc/obj/bicc_debug.o new file mode 100644 index 0000000000000000000000000000000000000000..7b4be40fecc31ea49cf8a8ddf71d55eecd0a2386 GIT binary patch literal 44552 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 literal 0 HcmV?d00001 diff --git a/omc/plat/bicc/obj/bicc_ipbcp.o b/omc/plat/bicc/obj/bicc_ipbcp.o new file mode 100644 index 0000000000000000000000000000000000000000..6ccf356989408249507c223173df8c9212fcd5c7 GIT binary patch literal 17448 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 w@KcBb{|= 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 literal 0 HcmV?d00001 diff --git a/omc/plat/bicc/obj/bicc_prm.o b/omc/plat/bicc/obj/bicc_prm.o new file mode 100644 index 0000000000000000000000000000000000000000..4abcb9d9ed5518f8a3451251ed5baea81a7c3731 GIT binary patch literal 34960 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 literal 0 HcmV?d00001 diff --git a/omc/plat/bicc/obj/biccif.o b/omc/plat/bicc/obj/biccif.o new file mode 100644 index 0000000000000000000000000000000000000000..76bce92ae3d7fa17bd425d2b7dbe43daaa3ec9a3 GIT binary patch literal 72600 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 Lh7sex>hk{&$p&q2 literal 0 HcmV?d00001 diff --git a/omc/plat/bicc/src.old/.copyarea.db b/omc/plat/bicc/src.old/.copyarea.db new file mode 100644 index 0000000..bfd2712 --- /dev/null +++ b/omc/plat/bicc/src.old/.copyarea.db @@ -0,0 +1,13 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\bicc\src.old +2 +9 +a:bicc_prm.c|1|11d70a3e27e|33ed|1c8d9a4|e15481366cf311dd91a5001c23e19543|0 +a:bicc_fsm.c|1|11d70a3e433|f45c|d7758e91|5c364a229a8611dd8b36001c23e19543|0 +e:bicc_fsm.c.old|1|11d70a3e3f5|f45c|d7758e91|5b0649aa9a8611dd8b36001c23e19543|0 +a:bicc_msg.c|1|11d70a3e2fb|8563|a0fc75de|e1f481666cf311dd91a5001c23e19543|0 +a:bicc_apm.c|1|11d70a3e2ad|1363|b56b34ff|e1f4814e6cf311dd91a5001c23e19543|0 +7:include|2|0|0|0|c1696778bfa411dc8505001c23e19543|0 +c:bicc_debug.c|1|11d70a3e32a|54e6|55931a29|e294817e6cf311dd91a5001c23e19543|0 +8:biccif.c|1|11d70a3e3b6|800d|713cda1f|56e6486a9a8611dd8b36001c23e19543|0 +c:bicc_ipbcp.c|1|11d70a3e368|1e3d|81f3ff1f|e32481ae6cf311dd91a5001c23e19543|0 diff --git a/omc/plat/bicc/src.old/bicc_apm.c b/omc/plat/bicc/src.old/bicc_apm.c new file mode 100644 index 0000000..90039f9 --- /dev/null +++ b/omc/plat/bicc/src.old/bicc_apm.c @@ -0,0 +1,206 @@ +#include +#include +#include "./include/q765_5e.h" + +void apm_decode_action(ActionInd_struct *ptr, const u8 *flw_ptr, u8 length) +{ + ptr->pres = 1; + ptr->comp_info = flw_ptr[0]; + ptr->val = flw_ptr[1]; +} + +u32 apm_encode_action(u8 *flw_ptr, const ActionInd_struct *ptr) +{ + flw_ptr[0] = ptr->comp_info; + flw_ptr[1] = ptr->val; + return 2; +} + +void apm_decode_bncid(BncId_struct *ptr, const u8 *flw_ptr, u8 length) +{ + ptr->pres = 1; + ptr->comp_info = flw_ptr[0]; + ptr->len = length - 1; + memcpy(ptr->val, flw_ptr+1, ptr->len); +} + +u32 apm_encode_bncid(u8 *flw_ptr, const BncId_struct *ptr) +{ + flw_ptr[0] = ptr->comp_info; + memcpy(flw_ptr+1, ptr->val, ptr->len); + return ptr->len + 1; +} + +void apm_decode_bncchr(BncChr_struct *ptr, const u8 *flw_ptr, u8 length) +{ + ptr->pres = 1; + ptr->comp_info = flw_ptr[0]; + ptr->val = flw_ptr[1]; +} + +u32 apm_encode_bncchr(u8 *flw_ptr, const BncChr_struct *ptr) +{ + flw_ptr[0] = ptr->comp_info; + flw_ptr[1] = ptr->val; + return 2; +} + +void apm_decode_bcinfo(BcInfo_struct *ptr, const u8 *flw_ptr, u8 length) +{ + ptr->pres = 1; + ptr->comp_info = flw_ptr[0]; + ptr->bctp.bvei = (flw_ptr[1] >> 6) & 0x01; + ptr->bctp.btcp_version = flw_ptr[1] & 0x1f; + ptr->bctp.tpei = (flw_ptr[2] >> 6) & 0x01; + ptr->bctp.tunnel_protocol = flw_ptr[2] & 0x3f; + ptr->bctp.ipbcp_len = length - 3; + memcpy(ptr->bctp.ipbcp_content, flw_ptr+3, ptr->bctp.ipbcp_len); +} + +u32 apm_encode_bcinfo(u8 *flw_ptr, const BcInfo_struct *ptr) +{ + flw_ptr[0] = ptr->comp_info; + flw_ptr[1] = (ptr->bctp.bvei << 6) + (1 << 5) + ptr->bctp.btcp_version; + flw_ptr[2] = (ptr->bctp.tpei << 6) + ptr->bctp.tunnel_protocol; + memcpy(flw_ptr+3, ptr->bctp.ipbcp_content, ptr->bctp.ipbcp_len); + return ptr->bctp.ipbcp_len + 3; +} + +void apm_decode_bctunnel(BcTunnel_struct *ptr, const u8 *flw_ptr, u8 length) +{ + ptr->pres = 1; + ptr->comp_info = flw_ptr[0]; + ptr->val = flw_ptr[1]; +} + +u32 apm_encode_bctunnel(u8 *flw_ptr, const BcTunnel_struct *ptr) +{ + flw_ptr[0] = ptr->comp_info; + flw_ptr[1] = ptr->val; + return 2; +} + +void apm_decode_signaltype(SignalType_struct *ptr, const u8 *flw_ptr, u8 length) +{ + ptr->pres = 1; + ptr->comp_info = flw_ptr[0]; + ptr->val = flw_ptr[1]; +} + +u32 apm_encode_signaltype(u8 *flw_ptr, const SignalType_struct *ptr) +{ + flw_ptr[0] = ptr->comp_info; + flw_ptr[1] = ptr->val; + return 2; +} + +void apm_decode_duration(Duration_struct *ptr, const u8 *flw_ptr, u8 length) +{ + ptr->pres = 1; + ptr->comp_info = flw_ptr[0]; + ptr->val = (flw_ptr[1] << 8) + flw_ptr[2]; +} + +u32 apm_encode_duration(u8 *flw_ptr, const Duration_struct *ptr) +{ + flw_ptr[0] = ptr->comp_info; + flw_ptr[1] = ptr->val >> 8; + flw_ptr[2] = ptr->val & 0xff; + return 3; +} + +void apm_decode(ApmUser_struct *ptr, const u8 *flw_ptr, u8 length) +{ + const u8 *old_ptr = flw_ptr; + + while(flw_ptr+flw_ptr[1]+2-old_ptr <= length) + { + if(*flw_ptr == 0) + break; + switch(*flw_ptr) + { + case AP_ACTION: + apm_decode_action(&ptr->action, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case AP_BNCID: + apm_decode_bncid(&ptr->bnc_id, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case AP_BNCCHR: + apm_decode_bncchr(&ptr->bnc_chr, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case AP_BCINFO: + apm_decode_bcinfo(&ptr->bc_info, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case AP_BCTUNNEL: + apm_decode_bctunnel(&ptr->bc_tunnel, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case AP_SIGNALTYPE: + apm_decode_signaltype(&ptr->signal_type, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case AP_DURATION: + apm_decode_duration(&ptr->duration, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + flw_ptr += flw_ptr[1] + 2; + break; + } + } +} + +u32 apm_encode(u8 *flw_ptr, const ApmUser_struct *ptr) +{ + u8 *old_ptr = flw_ptr; + + if(ptr->action.pres == 1) + { + flw_ptr[0] = AP_ACTION; + flw_ptr[1] = apm_encode_action(flw_ptr+2, &ptr->action); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->bnc_id.pres == 1) + { + flw_ptr[0] = AP_BNCID; + flw_ptr[1] = apm_encode_bncid(flw_ptr+2, &ptr->bnc_id); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->bnc_chr.pres == 1) + { + flw_ptr[0] = AP_BNCCHR; + flw_ptr[1] = apm_encode_bncchr(flw_ptr+2, &ptr->bnc_chr); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->bc_info.pres == 1) + { + flw_ptr[0] = AP_BCINFO; + flw_ptr[1] = apm_encode_bcinfo(flw_ptr+2, &ptr->bc_info); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->bc_tunnel.pres == 1) + { + flw_ptr[0] = AP_BCTUNNEL; + flw_ptr[1] = apm_encode_bctunnel(flw_ptr+2, &ptr->bc_tunnel); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->signal_type.pres == 1) + { + flw_ptr[0] = AP_SIGNALTYPE; + flw_ptr[1] = apm_encode_signaltype(flw_ptr+2, &ptr->signal_type); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->duration.pres == 1) + { + flw_ptr[0] = AP_DURATION; + flw_ptr[1] = apm_encode_duration(flw_ptr+2, &ptr->duration); + flw_ptr += flw_ptr[1] + 2; + } + return flw_ptr - old_ptr; +} + + diff --git a/omc/plat/bicc/src.old/bicc_debug.c b/omc/plat/bicc/src.old/bicc_debug.c new file mode 100644 index 0000000..9182253 --- /dev/null +++ b/omc/plat/bicc/src.old/bicc_debug.c @@ -0,0 +1,882 @@ +#include "./include/var_ext.h" + +//static u32 bicc_object_id[BICC_PREOID_LEN] = {1,3,6,1,4,1,1373,1,3,2,2,6}; +//static u16 bicc_sub_page[BICC_DEBUG_PAGE] = {0}; +//static u8 bicc_ascii_in[BICC_ASCIN_LEN] = {0}; +//static u8 bicc_ascii_out[BICC_ASCOUT_LEN] = {0}; + +#define BICC_DEBUG_ID 17 +#define BICC_VER_DEBUG "R91V0_01" + +#define MONITOR_NONE 0x0000 +#define MONITOR_ERROR 0x0010 +#define MONITOR_ALL 0xffff + +#define TRACE_FLAG_ON 1 +#define TRACE_FLAG_OFF 0 + +u8 AsciInBuf[4096]; +u8 AsciOutBuf[4096]; +u8 AsciTempBuf[4096]; +WORD MonitorFg; +u8 info[1024]; + +static u8 log_help[] = { + "BICC debug Help:\n\r\ + \n\r\ + 1.help\n\r\ + 2.log all/none\n\r\ + 3.log error on/off\n\r\ + 4.list cg[-cgNo] \n\r\ + 5.list circuit[-circuitNo]\n\r\ + 6.list port[-portNo]\n\r\ + 7.list dmp\n\r\ + 8.trace on-portNo\n\r\ + 9.trace off[-portNo]\n\r\n\r\ +" +}; + +static WORD disp_page[10]; +static u8 *disp_ptr = (u8 *) disp_page; + +static DWORD debug_status_id[20] = +{ + 1,3,6,1,4,1,1373,1,1,2,3,1,2,BICC_DEBUG_ID + 2,1 +}; + +static BYTE debug_status = 1; + +static DWORD debug_name_id[20] = +{ + 1,3,6,1,4,1,1373,1,1,2,3,1,2,BICC_DEBUG_ID + 2,2 +}; + +static DWORD debug_ascin_id[20] = +{ + 1,3,6,1,4,1,1373,1,1,2,3,1,2,BICC_DEBUG_ID + 2,3 +}; + +static DWORD debug_ascout_id[20] = +{ + 1,3,6,1,4,1,1373,1,1,2,3,1,2,BICC_DEBUG_ID + 2,4 +}; + +static DWORD debug_page_title[20] = +{ + 1,3,6,1,4,1,1373,1,1,2,3,1,2,BICC_DEBUG_ID + 2,1,1 +}; + +static DWORD debug_page_line[20] = +{ + 1,3,6,1,4,1,1373,1,1,2,3,1,2,BICC_DEBUG_ID + 2,1,2,1 +}; + +const static u8 BASE_ID_LEN = 15; +const static u8 PAGE_POINT = 14; +const static u8 LINE_POINT = 15; + +static u8 title1_p[] = +{ +" BICC Page 01 SAP Info\n\r\ + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\ +Subpage\n\r\ +Enable\n\r\ +CG num\n\r" +}; + +static u8 title2_p[] = +{ +" BICC Page 02 CG Info\n\r\ + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\ +Subpage\n\r\ +Enable\n\r\ +SAP id\n\r\ +NI\n\r\ +DPC\n\r" +}; + +static u8 title3_p[] = +{ +" BICC Page 03 CIrcuit Info\n\r\ + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\ +Subpage\n\r\ +CG id\n\r\ +CIC range\n\r\ +HEAD CIC\n\r" +}; + +static u8 title4_p[] = +{ +" BICC Page 04 Port Info\n\r\ + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\ +Subpage\n\r\ +Enable\n\r\ +FSM State\n\r\ +CIC State\n\r" +}; + +static u8 debug_disp_line(u8 page, u8 line) +{ + u8 disp_length; + disp_length = 0; + disp_ptr = (u8 *) disp_page; + switch (page) + { +/* + case 1: // Page 1: sap Info + switch(line) + { + case 0: + disp_ptr = (BYTE *) &disp_page[page]; + disp_length = 2; + break; + case 1: + disp_ptr = (BYTE *) &Bicc_Data.debug_data.sap_enable; + disp_length = 16; + break; + case 2: + disp_ptr = (BYTE *) &Bicc_Data.debug_data.sap_cg_num; + disp_length = 16; + break; + default: + break; + } + break; + case 2: // Page 2: cg Info + //disp_page[page] = (disp_page[page]+1)%BICC_MAX_CG; + switch(line) + { + case 0: + disp_ptr = (BYTE *) &disp_page[page]; //Subpage + disp_length = 2; + break; + case 1: //enable + disp_ptr = (BYTE *) &(BiccResource.cg_pond[disp_page[page]].used_flag); + disp_length = 16; + break; + case 2: //sap_id + disp_ptr = (BYTE *) &(BiccResource.cg_pond[disp_page[page]].sap_id); + disp_length = 16; + break; + case 3: //network_id + disp_ptr = (BYTE *) &(BiccResource.cg_pond[disp_page[page]].attrib.network_id); + disp_length = 16; + break; + case 4: //dpc + disp_ptr = (BYTE *) &(BiccResource.cg_pond[disp_page[page]].attrib.dpc); + disp_length = 16; + break; + default: + break; + } + break; + + case 3: // Page 3: circuit Info + //disp_page[page] = (disp_page[page]+1)%BICC_MAX_CIRCUIT; + switch(line) + { + case 0: + disp_ptr = (BYTE *) &disp_page[page]; //Subpage + disp_length = 16; + break; + case 1: //cg_id + disp_ptr = (BYTE *) &(BiccResource.circuit_pond[disp_page[page]].cg_id); + disp_length = 16; + break; + case 2: //cic_range + disp_ptr = (BYTE *) &(BiccResource.circuit_pond[disp_page[page]].attrib.cic_range); + disp_length = 16; + break; + case 3: //head_cic + disp_ptr = (BYTE *) &(BiccResource.circuit_pond[disp_page[page]].attrib.head_cic); + disp_length = 16; + break; + default: + break; + } + break; + + case 4: // Page 4: port Info + //disp_page[page] = (disp_page[page]+32)%BICC_MAX_PORT; + switch(line) + { + case 0: + disp_ptr = (BYTE *) &disp_page[page]; //Subpage + disp_length = 16; + break; + case 1: //enable + disp_ptr = (BYTE *) &(BiccResource.port_pond[disp_page[page]].used_flag); + disp_length = 16; + break; + case 2: //fsm_state + disp_ptr = (BYTE *) &(BiccResource.port_pond[disp_page[page]].fsm_state); + disp_length = 16; + break; + case 3: //cic_state + disp_ptr = (BYTE *) &(BiccResource.port_pond[disp_page[page]].cic_state); + disp_length = 16; + break; + default: + break; + } + break; +*/ + default: + disp_length = 0; + break; + } + + return disp_length; +} + +static void debug_disp_page(u8 page) +{ + u8 disp_line; + u8 disp_length; + + debug_page_line[PAGE_POINT] = page + 5; + + for (disp_line = 0; disp_line < 22; disp_line++) + { + disp_length = debug_disp_line(page, disp_line); + debug_page_line[LINE_POINT] = disp_line + 2; + debug_page_line[LINE_POINT + 1] = 2; // Data Pointer + debug_set_response(BASE_ID_LEN + 2, debug_page_line, disp_ptr, disp_length); + } +} + +int bicc_debug_init(void) +{ + BYTE page; + BYTE data[10]; + BYTE *ptr; + + strcpy(AsciInBuf, "\0"); + strcpy(AsciOutBuf, "\0"); + MonitorFg = MONITOR_NONE; + bzero(disp_page, 20); + + ptr = data; + + debug_set_response(BASE_ID_LEN, debug_status_id, &debug_status, 1); + debug_set_response(BASE_ID_LEN, debug_name_id, BICC_VER_DEBUG, 10); + debug_set_response(BASE_ID_LEN, debug_ascin_id, AsciInBuf, 4096); + debug_set_response(BASE_ID_LEN, debug_ascout_id, AsciOutBuf, 4096); + + for (page = 1; page < 5; page++) + { + switch (page) + { + case 1: //page 1 + ptr = title1_p; + break; + case 2: //page 2 + ptr = title2_p; + break; + case 3: //page 3 + ptr = title3_p; + break; + case 4: //page 4 + ptr = title4_p; + break; + default: + break; + } + + debug_page_title[PAGE_POINT] = 5 + page; + debug_set_response(BASE_ID_LEN + 1, debug_page_title, ptr, strlen(ptr)); + debug_disp_page(page); + } + + return 1; +} + +void bicc_asciout_proc(const char *fmt, ...) +{ + va_list ap; + char buf[1024]; + + va_start(ap, fmt); + vsprintf(buf, fmt, ap); + if((strlen(AsciOutBuf) + strlen(buf)) < 4096) + strcat(AsciOutBuf, buf); + else + strcpy(AsciOutBuf, buf); + va_end(ap); +} + + +void bicc_debug_refresh(void) +{ +// int i; + #if 0 + for(i=0;i<16;i++) + { + Bicc_Data.debug_data.sap_enable[i] = BiccResource.sap_pond[i].used_flag; + Bicc_Data.debug_data.sap_cg_num[i] = BiccResource.sap_pond[i].cg_num; + } + #endif +} + + +#if 0 +void list_sap(WORD sapNo) +{ + //u8 sapinfo[1024]; + if(sapNo >= BICC_MAX_SAP) + return; + + sprintf(info,"\ +Enable:%d\n\r\ +cg num:%d\n\r", + BiccResource.sap_pond[sapNo].used_flag,BiccResource.sap_pond[sapNo].cg_num); + bicc_asciout_proc(info); +} + +void list_all_sap() +{ + int i; + sprintf(info, "Index CG(s)\n\r"); + bicc_asciout_proc(info); + for(i=0; i= PAL_MAX_CG) + return; + pcg = pal_cg_ptr(cgNo); + if(pcg == NULL) + return; + sprintf(info, "\ +Enable:%d\n\r\ +sap id:%d\n\r\ +circuit num:%d\n\r\ +variant_type:%d\n\r\ +priority:%d\n\r\ +network id:%d\n\r\ +opc:%ld\n\r\ +dpc:%ld\n\r\ +tg_id:%ld\n\r", + pcg->enable,pcg->sap_id,pcg->circuit_num,pcg->attrib.variant,pcg->attrib.priority,pcg->attrib.network_id,pcg->attrib.opc,pcg->attrib.dpc,pcg->attrib.tg_id); + bicc_asciout_proc(info); +} + +void list_all_cg() +{ + int i = 0; + const pal_cg_struct *pcg; + sprintf(info, "Index SAP Circuit(s) NetInd DPC OPC TG\n\r"); + bicc_asciout_proc(info); + for(i=0; ienable==0) + continue; + + if(pcg->attrib.protocol != PROTO_BICC) + continue; + sprintf(info, " %d %d %d %d %ld %ld %ld\n\r", i, pcg->sap_id, pcg->circuit_num, pcg->attrib.network_id, pcg->attrib.dpc, pcg->attrib.opc, pcg->attrib.tg_id); + bicc_asciout_proc(info); + } +} + + +void list_circuit(WORD circuitNo) +{ + const pal_circuit_struct *pcircuit; + if(circuitNo >= PAL_MAX_CIRCUIT) + return; + pcircuit = pal_circuit_ptr(circuitNo); + if(pcircuit == NULL) + return ; + + sprintf(info,"\ +Enable:%d\n\r\ +cg id:%d\n\r\ +head cic:%ld\n\r\ +cic range:%d\n\r\ +plat id:%d\n\r", + pcircuit->enable,pcircuit->cg_id,pcircuit->attrib.head_cic,pcircuit->attrib.cic_range,pcircuit->attrib.plat_id); + bicc_asciout_proc(info); +} + + +void list_all_circuit() +{ + int i = 0, j = 0; + const pal_circuit_struct *pcircuit; + const pal_cg_struct *pcg; +// for(i = 0; i < BICC_MAX_SAP; i ++) + //{ + sprintf(info, "Index CG PLAT CIC(s)\n\r"); + bicc_asciout_proc(info); + for(i=0; ienable == 0) + continue; + if(pcg->attrib.protocol != PROTO_BICC) + continue; + for(j = 0; jenable == 0 || pcircuit->cg_id != pcg->id) + continue; + sprintf(info, " %d %d %d %d (%ld~~%ld)\n\r", i, pcircuit->cg_id, pcircuit->attrib.plat_id, pcircuit->attrib.cic_range, pcircuit->attrib.head_cic, pcircuit->attrib.head_cic+pcircuit->attrib.cic_range); + bicc_asciout_proc(info); + + } + + } +} + +void list_port(WORD portNo) +{ + if(portNo>=BICC_MAX_PORT) + return; + sprintf(info,"\ +upper port:%ld\n\r\ +sprc_cmd:%x\n\r\ +primitive_cmd:%x\n\r\ +internal_cmd:%x\n\r\ +cic state{\n\r\ + call state:%d\n\r\ + suspend state:%d\n\r\ + block state:%d\n\r\ + }\n\r\ +fsm state{\n\r\ + cpc_state:%d\n\r\ + mgbs_state:%d\n\r\ + mgbr_state:%d\n\r\ + crs_state:%d\n\r\ + crr_state:%d\n\r\ + cgrs_state:%d\n\r\ + cgrr_state:%d\n\r\ + }\n\r", + Bicc_Data.port_data[portNo].su_proc_id,Bicc_Data.port_data[portNo].sprc_cmd, + Bicc_Data.port_data[portNo].primitive_cmd,Bicc_Data.port_data[portNo].internal_cmd, + Bicc_Data.port_data[portNo].cic_state.call_state,Bicc_Data.port_data[portNo].cic_state.sus_state, + Bicc_Data.port_data[portNo].cic_state.blo_state,Bicc_Data.port_data[portNo].fsm_state.cpc_state, + Bicc_Data.port_data[portNo].fsm_state.mgbs_state,Bicc_Data.port_data[portNo].fsm_state.mgbr_state, + Bicc_Data.port_data[portNo].fsm_state.crs_state,Bicc_Data.port_data[portNo].fsm_state.crr_state, + Bicc_Data.port_data[portNo].fsm_state.cgrs_state,Bicc_Data.port_data[portNo].fsm_state.cgrr_state); + bicc_asciout_proc(info); +} + +void list_busy_port() +{ + int i,j=0; + sprintf(info, "Index PortNo CallState\n\r"); + bicc_asciout_proc(info); + for(i=0;i 0) + { + in_page = AsciInBuf[0] - 1; + ascii_in_ptr = AsciInBuf + 1; + + if (in_page > 4) + err_fg = 1; + else if (strcmp(ascii_in_ptr,"log error on") == 0) + { + MonitorFg = MonitorFg | MONITOR_ERROR; + } + else if (strcmp(ascii_in_ptr,"log error off") == 0) + { + MonitorFg = MonitorFg & (~MONITOR_ERROR); + } + else if (strcmp(ascii_in_ptr,"log all") == 0) + { + MonitorFg = MONITOR_ALL; + + } + else if (strcmp(ascii_in_ptr,"log none") == 0) + { + MonitorFg = MONITOR_NONE; + + } + else if (strcmp(ascii_in_ptr,"help") == 0) + { + bicc_asciout_proc(log_help); + } + else if (isdigit(ascii_in_ptr[0])) + { + num = strtoul(ascii_in_ptr, NULL, 10); + disp_page[in_page] = num; + debug_disp_page(in_page); + } + else if ((str_start = strstr(ascii_in_ptr, ">")) != NULL) + { + num = strtoul(str_start + 1, NULL, 10); + disp_page[in_page] += num; + debug_disp_page(in_page); + } + else if ((str_start = strstr(ascii_in_ptr, "<"))!= NULL) + { + num = strtoul(str_start + 1, NULL, 10); + disp_page[in_page] -= num; + debug_disp_page(in_page); + } + #if 0 + else if ((strstr (ascii_in_ptr, "list sap")) != NULL) + { + if((tmpStr = strstr (ascii_in_ptr, "-")) != NULL) + { + sapNo = strtoul (tmpStr + 1, NULL, 10); + list_sap(sapNo); + } + else + { + list_all_sap(); + } + } +#endif + else if ((strstr (ascii_in_ptr,"list cg")) != NULL) + { + if((tmpStr = strstr (ascii_in_ptr, "-")) != NULL) + // if((tmpStr = strsep(&&ascii_in_ptr, " \t")) != NULL) + { + cgNo = strtoul (tmpStr+1, NULL, 10); + // strsep(, " \t"); + list_cg(cgNo); + } + else + { + list_all_cg(); + } + } + else if ((strstr (ascii_in_ptr, "list circuit")) != NULL) + { + if((tmpStr = strstr (ascii_in_ptr, "-")) != NULL) + { + circuitNo = strtoul (tmpStr + 1, NULL, 10); + list_circuit(circuitNo); + } + else + { + list_all_circuit(); + } + } + else if ((strstr (ascii_in_ptr, "list port")) != NULL) + { + if((tmpStr = strstr (ascii_in_ptr, "-")) != NULL) + { + portNo = strtoul (tmpStr + 1, NULL, 10); + list_port(portNo); + } + else + { + list_busy_port(); + } + + } + else if((strstr (ascii_in_ptr, "list dmp")) != NULL) + { + list_dmp(); + } + else if((strstr(ascii_in_ptr, "trace on")) != NULL) + { + if((tmpStr = strstr(ascii_in_ptr, "-")) != NULL) + { + portNo = strtoul(tmpStr + 1, NULL, 10); + //trace_port(portNo); + Bicc_Data.port_data[portNo].trace_flag = 1; + } + else + {} + } + else if ((strstr (ascii_in_ptr, "trace off")) != NULL) + { + if((tmpStr = strstr (ascii_in_ptr, "-")) != NULL) + { + portNo = strtoul (tmpStr + 1, NULL, 10); + Bicc_Data.port_data[portNo].trace_flag = 0; + } + else + { + int i; + for(i=0; i= 4096) + sprintf(AsciTempBuf, "log msg is too long!\n\r"); + else + sprintf(AsciTempBuf, "%s\n\r", msg); + bicc_asciout_proc(AsciTempBuf); + return 0; + } + + return -1; +} + +void display_bicc_msgtype(u8 msgtype, u32 cic) +{ + switch(msgtype) + { + case M_ACM: + bicc_asciout_proc("ACM:Address complete"); + break; + case M_ANM: + bicc_asciout_proc("ANM:Answer"); + break; + case M_BLO: + bicc_asciout_proc("BLO:Blocking"); + break; + case M_BLA: + bicc_asciout_proc("BLA:Blocking acknowledgement"); + break; + case M_CPG: + bicc_asciout_proc("CPG:Call progress"); + break; + case M_CGB: + bicc_asciout_proc("CGB:Circuit/CIC group blocking"); + break; + case M_CGBA: + bicc_asciout_proc("CGBA:Circuit/CIC group blocking acknowledgement"); + break; + case M_CQM: + bicc_asciout_proc("CQM:Circuit/CIC group query (national use)"); + break; + case M_CQR: + bicc_asciout_proc("CQR:Circuit/CIC group query response (national use)"); + break; + case M_GRS: + bicc_asciout_proc("GRS:Circuit/CIC group reset"); + break; + case M_GRA: + bicc_asciout_proc("GRA:Circuit/CIC group reset acknowledgement"); + break; + case M_CGU: + bicc_asciout_proc("CGU:Circuit/CIC group unblocking"); + break; + case M_CGUA: + bicc_asciout_proc("CGUA:Circuit/CIC group unblocking acknowledgement"); + break; + case M_CRG: + bicc_asciout_proc("CRG:Charge information (national use)"); + break; + case M_CFN: + bicc_asciout_proc("CFN:Confusion"); + break; + case M_CON: + bicc_asciout_proc("CON:Connect"); + break; + case M_COT: + bicc_asciout_proc("COT:Continuity"); + break; + case M_FAC: + bicc_asciout_proc("FAC:Facility "); + break; + case M_FAA: + bicc_asciout_proc("FAA:Facility accepted"); + break; + case M_FRJ: + bicc_asciout_proc("FRJ:Facility reject"); + break; + case M_FAR: + bicc_asciout_proc("FAR:Facility request"); + break; + case M_FOT: + bicc_asciout_proc("FOT:Forward transfer"); + break; + case M_IDR: + bicc_asciout_proc("IDR:Identification request"); + break; + case M_IRS: + bicc_asciout_proc("IRS:Identification response"); + break; + case M_INF: + bicc_asciout_proc("INF:Information (national use)"); + break; + case M_INR: + bicc_asciout_proc("INR:Information request (national use)"); + break; + case M_IAM: + bicc_asciout_proc("IAM:Initial address"); + break; + case M_NRM: + bicc_asciout_proc("NRM:Network resource management"); + break; + case M_REL: + bicc_asciout_proc("REL:Release"); + break; + case M_RLC: + bicc_asciout_proc("RLC:Release complete"); + break; + case M_RSC: + bicc_asciout_proc("RSC:Reset circuit/CIC"); + break; + case M_RES: + bicc_asciout_proc("RES:Resume"); + break; + case M_SGM: + bicc_asciout_proc("SGM:Segmentation"); + break; + case M_SAM: + bicc_asciout_proc("SAM:Subsequent address"); + break; + case M_SUS: + bicc_asciout_proc("SUS:Suspend"); + break; + case M_UBL: + bicc_asciout_proc("UBL:Unblocking"); + break; + case M_UBA: + bicc_asciout_proc("UBA:Unblocking acknowledgement"); + break; + case M_UCIC: + bicc_asciout_proc("UCIC:Unequipped CIC (national use)"); + break; + case M_APM: + bicc_asciout_proc("APM:Application Transport"); + break; + case M_USR: + bicc_asciout_proc("USR:User-to-user information"); + break; + default: + bicc_asciout_proc("Unknown message"); + + } + + bicc_asciout_proc("(message type=0x%x cic=%d)\r\n",msgtype,cic); +} + + +void monitor_bicc_msg(BYTE *msg,BYTE buf_len, BYTE flag, u32 cic, u32 portNo) +{ + BYTE i,temp_buf[1024]; + if(MonitorFg == MONITOR_ALL) + { + if(flag == 0) + bicc_asciout_proc("\33[33mReceive:\33[0m"); + else if(flag == 1) + bicc_asciout_proc("\33[32mSend:\33[0m"); + else if(flag == 2) + bicc_asciout_proc("\33[34mRedirect:\33[0m"); + display_bicc_msgtype(msg[0], cic); + + if(flag != 2) + { + for (i = 0; i < buf_len; i ++) + { + sprintf(&temp_buf[3*i]," %02x", msg[i]); + } + sprintf(&temp_buf[3*i],"\n\r"); + bicc_asciout_proc(temp_buf); + } + } + if(MonitorFg == MONITOR_NONE) + {} + if(Bicc_Data.port_data[portNo].trace_flag == 1) + { + if(flag == 0) + bicc_asciout_proc("\33[33mReceive:\33[0m"); + else if(flag == 1) + bicc_asciout_proc("\33[32mSend:\33[0m"); + else if(flag == 2) + bicc_asciout_proc("\33[34mRedirect:\33[0m"); + display_bicc_msgtype(msg[0], cic); + + if(flag != 2) + { + for (i = 0; i < buf_len; i ++) + { + sprintf(&temp_buf[3*i]," %02x", msg[i]); + } + sprintf(&temp_buf[3*i],"\n\r"); + bicc_asciout_proc(temp_buf); + } + } +} + diff --git a/omc/plat/bicc/src.old/bicc_fsm.c b/omc/plat/bicc/src.old/bicc_fsm.c new file mode 100644 index 0000000..944719e --- /dev/null +++ b/omc/plat/bicc/src.old/bicc_fsm.c @@ -0,0 +1,2093 @@ +#include "./include/inc.h" +#include "./include/var_ext.h" +#include "./include/biccif.h" +/**************CPCI*************************/ +#define CPCI_IDLE 0 +#define CPCI_WAIT_CONTINUITY 1 +#define CPCI_WAIT_ACM 2 +#define CPCI_WAIT_ANM 3 +#define CPCI_ANSWERED 4 +#define CPCI_SUSPENDED 5 +#define CPCI_WAIT_RLC 6 +#define CPCI_WAIT_REL_COMP 7 +#define CPCI_WAIT_RESET 8 +#define CPCI_WAIT_GROUP_RESET 9 + +/*************CPCO*************************/ +#define CPCO_IDLE 0 +#define CPCO_WAIT_CONTINUITY 1 +#define CPCO_WAIT_ACM 2 +#define CPCO_WAIT_ANM 3 +#define CPCO_ANSWERED 4 +#define CPCO_SUSPENDED 5 +#define CPCO_WAIT_RLC 6 +#define CPCO_WAIT_REL_COMP 7 +#define CPCO_WAIT_RESET 8 +#define CPCO_WAIT_GROUP_RESET 9 + +/********************************************/ +#define MGBS_IDLE 0 +#define MGBS_WAIT_CGBA 1 +#define MGBS_WAIT_CGUA 2 +/********************************************/ +#define MGBR_IDLE 0 +#define MGBR_WAIT_BLOCKING_RESP 1 +#define MGBR_WAIT_UNBLOCKING_RESP 2 +/********************************************/ +#define CRS_IDLE 0 +#define CRS_WAIT_REL 1 +/*******************************************/ +#define CRR_IDLE 0 +#define CRR_WAIT_RESPONSE 1 +#define CRR_RESET 2 +#define CRR_RESET_COMP 3 +/*******************************************/ +#define CGRS_IDLE 0 +#define CGRS_WAIT_GRA 1 +/*******************************************/ +#define CGRR_IDLE 0 +#define CGRR_WAIT_GROUP_RESET_COMP 1 +/********************************************/ +#define BLR_IDLE 0 +#define BLR_WAIT_BLOCKING_RESP 1 +#define BLR_REMOTE_LOCKED 2 +#define BLR_WAIT_UNBLOCKING_RESP 3 +/********************************************/ +#define BLS_IDLE 0 +#define BLS_WAIT_BLA 1 +#define BLS_LOCAL_LOCKED 2 +#define BLS_WAIT_UBA 3 +/*******************************************/ + + + +BiccData_struct Bicc_Data; +const BiccTimer_struct *TIMER_PTR = &Timer_Data; + + +extern BiccReadPrim_union readPrim_union[BICC_MAX_PORT]; +extern BiccWritePrim_union writePrim_union[BICC_MAX_PORT]; +//extern BICC_Resource_pond BiccResource; +extern BiccMsg_union msg_union[BICC_MAX_PORT]; +extern u8 local_platid; + +extern void bicc_send_apm(u32 pid); +extern void bicc_log_err(const char *fmt, ...); +extern void bicc_send_res(u32 pid); +extern void bicc_send_sus(u32 pid); +extern void bicc_send_sam(u32 pid); +extern void bicc_send_rsc(u32 pid); +extern void bicc_send_rlc(u32 pid); +extern void bicc_send_rel(u32 pid); +extern void bicc_send_iam(u32 pid); +extern void bicc_send_con(u32 pid); +extern void bicc_send_gra(u32 pid); +extern void bicc_send_grs(u32 pid); +extern void bicc_send_cgua(u32 pid); +extern void bicc_send_cgu(u32 pid); +extern void bicc_send_cgba(u32 pid); +extern void bicc_send_cgb(u32 pid); +extern void bicc_send_cpg(u32 pid); +extern void bicc_send_anm(u32 pid); +extern void bicc_send_acm(u32 pid); +extern BOOL check_crs_waiting(u32 pid); +extern int check_outbound_route(BYTE nw, long dpc, BYTE sls); + + +void bicc_cpc_clear(u32 pid) +{ + memset(&Bicc_Data.port_data[pid], 0, sizeof(BICC_Port_struct)); +} + + +BOOL bicc_cgrs_func(u32 start_pid, u8 range) +{ + int i; + u32 pid; + + if(start_pid+range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= range; i++) + { + pid = start_pid + i; + Bicc_Data.port_data[pid].cic_state.call_state = BICC_RESET; + + } + return 1; +} + +BOOL bicc_cgrsack_func(u32 start_pid, const RangeStatus_struct *rs_ptr) +{ + int i; + u32 pid; + + if(start_pid+rs_ptr->range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= rs_ptr->range; i++) + { + pid = start_pid + i; + Bicc_Data.port_data[pid].cic_state.call_state = BICC_CIC_IDLE; + memset(&Bicc_Data.port_data[pid], 0, sizeof(BICC_Port_struct)); + + if((rs_ptr->status[i>>3]>>(i&0x07)) & 0x01) + Bicc_Data.port_data[pid].cic_state.blo_state |= M_REMOTE_BLOCK; + else + Bicc_Data.port_data[pid].cic_state.blo_state &= 0x0d; + } + //BiccResource.circuit_pond[start_pid/BICC_CIRCUIT_CIC].active_flag = 1; + return 1; +} + +BOOL bicc_cgrr_func(u32 start_pid, u8 range, RangeStatus_struct *rs_ptr) +{ + int i; + u32 pid; + + rs_ptr->range = range; + memset(rs_ptr->status, 0, 4); + if(start_pid+range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= range; i++) + { + pid = start_pid + i; + Bicc_Data.port_data[pid].cic_state.blo_state &= 0x0d; + if(Bicc_Data.port_data[pid].cic_state.blo_state & M_LOCAL_BLOCK) + { + if(Bicc_Data.port_data[pid].fsm_state.mgbs_state != MGBS_WAIT_CGUA) + rs_ptr->status[i>>3]|= 0x01 << (i&0x07); + } + } + return 1; +} + + +void bicc_set_cause(CauseInd_struct *cause_ptr, u8 val) +{ + cause_ptr->pres = 1; + cause_ptr->codingStd = 0; //CCITT standardized coding + cause_ptr->location = 5; //private network serving the remote user + cause_ptr->causeVal = val; +} + +void bicc_circuit_reset(u32 pid, const char *s) +{ + #ifdef BICC_DEBUG + bicc_log_err("BICC circuit reset!, %s\n", s); + #endif + + if(check_crs_waiting(pid)) + return; + Bicc_Data.port_data[pid].primitive_cmd = BICC_RESET_REQ; +} + + +BOOL bicc_localblocking_func(u32 start_pid, const RangeStatus_struct *rs_ptr) +{ + int i; + u32 pid; + + if(start_pid+rs_ptr->range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= rs_ptr->range; i++) + { + pid = start_pid + i; + if((rs_ptr->status[i>>3]>>(i&0x07)) & 0x01) + Bicc_Data.port_data[pid].cic_state.blo_state &= M_LOCAL_BLOCK; + } + return 1; +} + +BOOL bicc_remoteblocking_func(u32 start_pid, const RangeStatus_struct *rs_ptr) +{ + int i; + u32 pid; + + if(start_pid+rs_ptr->range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= rs_ptr->range; i++) + { + pid = start_pid + i; + if((rs_ptr->status[i>>3]>>(i&0x07)) & 0x01) + Bicc_Data.port_data[pid].cic_state.blo_state &= M_REMOTE_BLOCK; + } + return 1; +} + +BOOL bicc_cpcoblocking_func(u32 start_pid, const RangeStatus_struct *rs_ptr) +{ + int i; + u32 pid; + + if(start_pid+rs_ptr->range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= rs_ptr->range; i++) + { + pid = start_pid + i; + if((rs_ptr->status[i>>3]>>(i&0x07)) & 0x01) + { + if(Bicc_Data.port_data[pid].cic_state.call_state == BICC_OUTGOING) + Bicc_Data.port_data[pid].internal_cmd = (BICC_CMD_BLO|BICC_SI_MGBR); + } + } + return 1; +} + +BOOL bicc_localunblocking_func(u32 start_pid, const RangeStatus_struct *rs_ptr) +{ + int i; + u32 pid; + + if(start_pid+rs_ptr->range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= rs_ptr->range; i++) + { + pid = start_pid + i; + if((rs_ptr->status[i>>3]>>(i&0x07)) & 0x01) + Bicc_Data.port_data[pid].cic_state.blo_state &= 0x0e; + } + return 1; +} + +BOOL bicc_remoteunblocking_func(u32 start_pid, const RangeStatus_struct *rs_ptr) +{ + int i; + u32 pid; + + if(start_pid+rs_ptr->range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= rs_ptr->range; i++) + { + pid = start_pid + i; + if((rs_ptr->status[i>>3]>>(i&0x07)) & 0x01) + Bicc_Data.port_data[pid].cic_state.blo_state &= 0x0d; + } + return 1; +} + + +BOOL bicc_event_handle(u32 pid, BiccReadPrim_union *prm_ptr, u8 primitive, u8 eventType) +{ + BICC_EventHandle_struct *eh_ptr = NULL; + Pst pst; + u32 cic; + int circuit_id, offset, ret = -1; + const pal_circuit_struct *pcircuit = NULL; + const pal_cg_struct *pcg = NULL; + + circuit_id = pid / BICC_CIRCUIT_CIC; + offset = pid % BICC_CIRCUIT_CIC; + pcircuit = pal_circuit_ptr(circuit_id); + if(pcircuit == NULL) + return BICC_CM_FAILED; + cic = pcircuit->attrib.head_cic + offset; + + pst.cg_id = pcircuit->cg_id; + pcg = pal_cg_ptr(pst.cg_id); + if(pcg == NULL) + return BICC_CM_FAILED; + if(pcg->attrib.protocol != PROTO_BICC) + return BICC_CM_FAILED; + pst.tg_id = pcg->attrib.tg_id; + pst.sp_proc_id = pid; + pst.su_proc_id = Bicc_Data.port_data[pid].su_proc_id; + pst.cic = cic; + pst.trace_flag = 0; + + eh_ptr = (BICC_EventHandle_struct *)pal_get_handler(pst.cg_id); + if(eh_ptr == NULL) + return BICC_CM_FAILED; + + switch(primitive) + { + case BICC_SETUP_IND: + if(eh_ptr->h_bicc_setup_ind != NULL) + { + ret = eh_ptr->h_bicc_setup_ind(&pst, prm_ptr); + if(pst.trace_flag == 1) + { + //BiccResource.port_pond[pid].trace_flag = 1; + Bicc_Data.port_data[pid].trace_flag = 1; + monitor_bicc_msg(r_mtp_msg.msgList, r_mtp_msg.len, 0, cic, pid); + } + } + else + bicc_log_err("Setup indicate handle is not registered.\n"); + if(ret != -1) + Bicc_Data.port_data[pid].su_proc_id = pst.su_proc_id; + break; + + case BICC_SETUP_CNF: + if(eventType == EN_CON) + { + if(eh_ptr->h_bicc_setup_con_cnf != NULL) + { + if(!eh_ptr->h_bicc_setup_con_cnf(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("Setup confirm handle is not registered.\n"); + break; + + } + else + { + if(eh_ptr->h_bicc_setup_anm_cnf != NULL) + eh_ptr->h_bicc_setup_anm_cnf(&pst, prm_ptr); + else + bicc_log_err("Setup confirm handle is not registered.\n"); + } + + break; + + case BICC_ALERT_IND: + if(eh_ptr->h_bicc_alert_ind != NULL) + { + if(!eh_ptr->h_bicc_alert_ind(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("Alert indication handle is not registered.\n"); + break; + + case BICC_RELEASE_IND: + if(eh_ptr->h_bicc_release_ind != NULL) + { + if(!eh_ptr->h_bicc_release_ind(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("Release indication is not registered.\n"); + break; + + case BICC_APM_IND: + if(eh_ptr->h_bicc_apm_ind != NULL) + { + if(!eh_ptr->h_bicc_apm_ind(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("APM indication is not registered.\n"); + break; + + case BICC_RELEASE_CNF: + if(eh_ptr->h_bicc_release_cnf != NULL) + { + if(!eh_ptr->h_bicc_release_cnf(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("Release confirm is not registered.\n"); + break; + + case BICC_INFO_IND: + if(eh_ptr->h_bicc_info_ind != NULL) + { + if(!eh_ptr->h_bicc_info_ind(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("info indication is not registered.\n"); + break; + + case BICC_SUSPEND_IND: + if(eh_ptr->h_bicc_suspend_ind != NULL) + { + if(!eh_ptr->h_bicc_suspend_ind(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("Suspend indication is not registered.\n"); + break; + + case BICC_RESUME_IND: + if(eh_ptr->h_bicc_resume_ind != NULL) + { + if(!eh_ptr->h_bicc_resume_ind(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("Resume indication is not registered.\n"); + break; + + case BICC_PROG_IND: + if(eh_ptr->h_bicc_prog_ind != NULL) + eh_ptr->h_bicc_prog_ind(&pst, prm_ptr); + else + bicc_log_err("Call progress indication handle is not registered.\n"); + break; + case BICC_RESET_IND: + if(eh_ptr->h_bicc_reset_ind != NULL) + eh_ptr->h_bicc_reset_ind(&pst, prm_ptr); + + else + bicc_log_err("Reset indicate handle is not registered.\n"); + break; + case BICC_RESET_CNF: + if(eh_ptr->h_bicc_reset_cnf != NULL) + { + if(eventType == EN_GROUP) + eh_ptr->h_bicc_reset_cnf(&pst, prm_ptr); + else + eh_ptr->h_bicc_reset_cnf(&pst, NULL); + } + else + bicc_log_err("Reset cnf handle is not registered.\n"); + break; + case BICC_FAILURE_IND: + if(eh_ptr->h_bicc_failure_ind != NULL) + eh_ptr->h_bicc_failure_ind(&pst, prm_ptr); + else + bicc_log_err("Failure indicate handle is not registered.\n"); + break; + case BICC_REATTEMPT_IND: + if(eh_ptr->h_bicc_reattempt_ind != NULL) + eh_ptr->h_bicc_reattempt_ind(&pst, prm_ptr); + else + bicc_log_err("Reattempt indicate handle is not registered.\n"); + break; + case BICC_BLOCK_IND: + if(eh_ptr->h_bicc_block_ind != NULL) + { + if(eventType == EN_GROUP) + eh_ptr->h_bicc_block_ind(&pst, prm_ptr); + else + eh_ptr->h_bicc_block_ind(&pst, NULL); + } + else + bicc_log_err("Block indicate handle is not registered.\n"); + break; + + case BICC_BLOCK_CNF: + if(eh_ptr->h_bicc_block_cnf != NULL) + { + if(eventType == EN_GROUP) + eh_ptr->h_bicc_block_cnf(&pst, prm_ptr); + else + eh_ptr->h_bicc_block_cnf(&pst, NULL); + } + else + bicc_log_err("Block confirm handle is not registered.\n"); + break; + case BICC_UNBLOCK_IND: + if(eh_ptr->h_bicc_unblock_ind != NULL) + { + if(eventType == EN_GROUP) + eh_ptr->h_bicc_unblock_ind(&pst, prm_ptr); + else + eh_ptr->h_bicc_unblock_ind(&pst, NULL); + } + else + bicc_log_err("Unblock indicate handle is not registered.\n"); + break; + case BICC_UNBLOCK_CNF: + if(eh_ptr->h_bicc_unblock_cnf != NULL) + { + if(eventType == EN_GROUP) + eh_ptr->h_bicc_unblock_cnf(&pst, prm_ptr); + else + eh_ptr->h_bicc_unblock_cnf(&pst, NULL); + } + else + bicc_log_err("Unblock confirm handle is not registered.\n"); + break; + default: + break; + } + return 1; +} + + +void bicc_dualseizure_func(u32 pid) +{ + int cg_id; + const pal_circuit_struct *pcircuit = NULL; + const pal_cg_struct *pcg = NULL; + BiccTimer_struct *tempTimer = &Bicc_Data.timer_data[pid]; + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + pcircuit = pal_circuit_ptr(pid / BICC_CIRCUIT_CIC); + if(pcircuit == NULL) + return; + cg_id = pcircuit->cg_id; + pcg = pal_cg_ptr(cg_id); + if(pcg == NULL) + return; + if(pcg->attrib.priority == 0) + return; + tempTimer->t7 = BICC_TIMER_STOP; + bicc_event_handle(pid, NULL, BICC_REATTEMPT_IND, EN_NONE); + bicc_cpc_clear(pid); + Bicc_Data.port_data[pid].cic_state.call_state = BICC_INCOMING; + port_ptr->sprc_cmd = M_IAM; +} + + +void bicc_cpci_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccTimer_struct *tempTimer = &Bicc_Data.timer_data[pid]; + + switch(port_ptr->fsm_state.cpc_state) + { + case CPCI_IDLE: + if(port_ptr->sprc_cmd == M_IAM) + { + port_ptr->sprc_cmd = 0; + if(readPrim_union[pid].setup_ind.callingPtyCat.val != 0x0d) //test call? + { + if(port_ptr->cic_state.blo_state & M_REMOTE_BLOCK) + port_ptr->cic_state.blo_state &= 0x01; //set remote unblocked + if(port_ptr->cic_state.blo_state & M_LOCAL_BLOCK) + { + bicc_cpc_clear(pid); + return; + } + + } + if(bicc_event_handle(pid, &readPrim_union[pid], BICC_SETUP_IND, EN_NONE)) + { + port_ptr->fsm_state.cpc_state = CPCI_WAIT_ACM; + + } + else + { + bicc_circuit_reset(pid, "setup ind rejected"); + bicc_cpc_clear(pid); + return; + } + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + writePrim_union[pid].rel_rsp.cause.pres = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + bicc_send_rlc(pid); + bicc_cpc_clear(pid); + return ; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_cpc_clear(pid); + return ; + } + else if(port_ptr->sprc_cmd !=0 ) + { + port_ptr->sprc_cmd = 0; + port_ptr->internal_cmd = (BICC_CMD_RESET|BICC_SI_CPCI); + bicc_circuit_reset(pid, "unexpected message"); + bicc_cpc_clear(pid); + return ; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CRR); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CGRR); + bicc_cpc_clear(pid); + return ; + } + + break; + case CPCI_WAIT_CONTINUITY: + break; + case CPCI_WAIT_ACM: + if(port_ptr->primitive_cmd == BICC_ALERT_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_acm(pid); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_ANM; + } + else if(port_ptr->primitive_cmd == BICC_SETUP_RSP) + { + port_ptr->primitive_cmd = 0; + bicc_send_con(pid); + port_ptr->fsm_state.cpc_state = CPCI_ANSWERED; + tempTimer->t9 = TIMER_PTR->t9; + } + else if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_rel(pid); + + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_REL_COMP; + } + else if(port_ptr ->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } +/* else if(port_ptr->sprc_cmd == M_SAM) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_INFO_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_ACM; + } +*/ + else if(port_ptr->sprc_cmd != 0) + { + port_ptr->sprc_cmd = 0; + port_ptr->internal_cmd = (BICC_CMD_RESET|BICC_SI_CPCI); + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_circuit_reset(pid, "unexpected message cpci wait acm"); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_BLO|BICC_SI_MGBS)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd= 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + + case CPCI_WAIT_ANM: + if(port_ptr->primitive_cmd == BICC_SETUP_RSP) + { + port_ptr->primitive_cmd = 0; + bicc_send_anm(pid); + port_ptr->fsm_state.cpc_state = CPCI_ANSWERED; + } + else if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } + else if(port_ptr->primitive_cmd == BICC_PROG_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_cpg(pid); + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_REL_COMP; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } +#ifdef BICC_TOLERANT + // To avoid both side backoff // + else if(port_ptr->sprc_cmd != 0) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_circuit_reset(pid, "unexpected message cpci wait anm"); + bicc_cpc_clear(pid); + return; + } +#endif + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + // break; + else if(tempTimer->t9-- == BICC_TIMER_EXPIRED) + { + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x13); + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } + break; + + case CPCI_ANSWERED: + if(port_ptr->primitive_cmd == BICC_SUSPEND_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_sus(pid); + port_ptr->cic_state.sus_state = BICC_TERM_SUSPEND; + port_ptr->fsm_state.cpc_state = CPCI_SUSPENDED; + } + else if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } + else if(port_ptr->sprc_cmd == M_SUS) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_SUSPEND_IND, EN_NONE); + port_ptr->cic_state.sus_state = BICC_ORIG_SUSPEND; + port_ptr->fsm_state.cpc_state = CPCI_SUSPENDED; + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_REL_COMP; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + case CPCI_SUSPENDED: + if(port_ptr->primitive_cmd == BICC_RESUME_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_res(pid); + if(port_ptr->cic_state.sus_state == BICC_TERM_SUSPEND) + port_ptr->fsm_state.cpc_state = CPCI_ANSWERED; + } + else if(port_ptr->primitive_cmd == BICC_SUSPEND_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_sus(pid); + } + else if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state= CPCI_WAIT_RLC; + } + else if(port_ptr->sprc_cmd == M_RES) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESUME_IND, EN_NONE); + if(port_ptr->cic_state.sus_state == BICC_ORIG_SUSPEND) + port_ptr->fsm_state.cpc_state = CPCI_ANSWERED; + } + else if(port_ptr->sprc_cmd == M_SUS) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_SUSPEND_IND, EN_NONE); + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_REL_COMP; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + + case CPCI_WAIT_RLC: + if(port_ptr->sprc_cmd== M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + writePrim_union[pid].rel_rsp.cause.pres = 0; + bicc_send_rlc(pid); + + } + else if(tempTimer->t1-- == BICC_TIMER_EXPIRED) + { + bicc_send_rel(pid); + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + + } + else if(tempTimer->t5-- == BICC_TIMER_EXPIRED) + { + tempTimer->t1 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_circuit_reset(pid, "t5 expired cpci wait rlc"); + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_cpc_clear(pid); + return; + } + //if(cpc_ptr->crr_cmd == BICC_RESET_IND) + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + //port_ptr->fsm_state.cpc_state = BICC_RESET_RSP; + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CPCI); + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid,&readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + case CPCI_WAIT_REL_COMP: + if(port_ptr->primitive_cmd == BICC_RELEASE_RSP) + { + port_ptr->primitive_cmd = 0; + bicc_send_rlc(pid); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + //port_ptr->fsm_state.cpc_state = BICC_RESET_RSP; + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CPCI); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + bicc_cpc_clear(pid); + return; + } +#ifdef BICC_TOLERANT + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + } + +#endif + break; + case CPCI_WAIT_RESET: + if(port_ptr->primitive_cmd == BICC_RESET_RSP) + { + port_ptr->primitive_cmd = 0; + //port_ptr->fsm_state.cpc_state = BICC_RESET_RSP; + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CPCI); + bicc_cpc_clear(pid); + return; + } + break; + case CPCI_WAIT_GROUP_RESET: + if(port_ptr->primitive_cmd == BICC_RESET_RSP) + { + port_ptr->primitive_cmd = 0; + bicc_cpc_clear(pid); + return; + } + break; + default: + break; + } +} + + +inline void bicc_cpco_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccTimer_struct *tempTimer = &Bicc_Data.timer_data[pid]; + + switch(port_ptr->fsm_state.cpc_state) + { + case CPCO_IDLE: + if(port_ptr->primitive_cmd== BICC_SETUP_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_iam(pid); + tempTimer->t7 = TIMER_PTR->t7; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_ACM; + } + else + bicc_cpc_clear(pid); + break; + case CPCO_WAIT_CONTINUITY: + break; + case CPCO_WAIT_ACM: + if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->primitive_cmd == BICC_INFO_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_sam(pid); + tempTimer->t7 = TIMER_PTR->t7; + port_ptr->w_time = 0; + } + else if(port_ptr->sprc_cmd == M_ACM) + { + port_ptr->sprc_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + tempTimer->t9 = TIMER_PTR->t9; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_ALERT_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_ANM; + } + else if(port_ptr->sprc_cmd == M_CON) + { + port_ptr->sprc_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_SETUP_CNF, EN_CON); + port_ptr->fsm_state.cpc_state = CPCO_ANSWERED; + } +/* else if(port_ptr->sprc_cmd == M_ANM) + { + port_ptr->sprc_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_SETUP_CNF, EN_ANM); + port_ptr->fsm_state.cpc_state = CPCO_ANSWERED; + } +*/ + else if(port_ptr->sprc_cmd == M_CPG) + { + port_ptr->sprc_cmd = 0; //discard... + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + tempTimer->user_t10 = TIMER_PTR->user_t10; + + // fsm_ptr->timer_data.t7 = BICC_TIMER_STOP; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_REL_COMP; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + tempTimer->t7 = BICC_TIMER_STOP; + + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } +#ifdef BICC_REATTEMPT + else if(port_ptr->sprc_cmd == M_IAM) + { + port_ptr->sprc_cmd = 0; + bicc_dualseizure_func(pid); + } +#endif + else if(port_ptr->sprc_cmd != 0) + { + port_ptr->sprc_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_circuit_reset(pid, "unexpected message cpco wait acm"); + bicc_cpc_clear(pid); + return; + } + else if(tempTimer->t7-- == BICC_TIMER_EXPIRED) + { + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x12); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->internal_cmd == (BICC_CMD_BLO|BICC_SI_MGBR)) + { + port_ptr->internal_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd= 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RESET; + tempTimer->user_t10 = TIMER_PTR->user_t10; + + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd= 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + case CPCO_WAIT_ANM: + if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->sprc_cmd == M_ANM) + { + port_ptr->sprc_cmd = 0; + tempTimer->t9 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_SETUP_CNF, EN_ANM); + port_ptr->fsm_state.cpc_state = CPCO_ANSWERED; + } + else if(port_ptr->sprc_cmd == M_CPG) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_PROG_IND, EN_NONE); + } +#ifdef BICC_TOLERANT + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + tempTimer->t9 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + tempTimer->user_t10 = TIMER_PTR->user_t10; + + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_REL_COMP; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + tempTimer->t9 = BICC_TIMER_STOP; + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } +#endif +#ifdef BICC_TOLERANT + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + tempTimer->t9 = BICC_TIMER_STOP; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RESET; + tempTimer->user_t10 = TIMER_PTR->user_t10; + + } +#endif + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + tempTimer->t9 = BICC_TIMER_STOP; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + tempTimer->t9 = BICC_TIMER_STOP; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(tempTimer->t9-- == BICC_TIMER_EXPIRED) + { + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + break; + case CPCO_ANSWERED: + if(port_ptr->primitive_cmd == BICC_SUSPEND_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_sus(pid); + port_ptr->cic_state.sus_state = BICC_ORIG_SUSPEND; + port_ptr->fsm_state.cpc_state = CPCO_SUSPENDED; + } + else if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->sprc_cmd == M_SUS) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid,&readPrim_union[pid], BICC_SUSPEND_IND, EN_NONE); + port_ptr->cic_state.sus_state = BICC_TERM_SUSPEND; + port_ptr->fsm_state.cpc_state = CPCO_SUSPENDED; + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + tempTimer->user_t10 = TIMER_PTR->user_t10; + + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_REL_COMP; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RESET; + tempTimer->user_t10 = TIMER_PTR->user_t10; + + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + case CPCO_SUSPENDED: + if(port_ptr->primitive_cmd== BICC_RESUME_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_res(pid); + if(port_ptr->cic_state.sus_state == BICC_ORIG_SUSPEND) + port_ptr->fsm_state.cpc_state = CPCO_ANSWERED; + } + else if(port_ptr->primitive_cmd == BICC_SUSPEND_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_sus(pid); + } + else if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->sprc_cmd == M_RES) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESUME_IND, EN_NONE); + if(port_ptr->cic_state.sus_state == BICC_TERM_SUSPEND) + port_ptr->fsm_state.cpc_state = CPCO_ANSWERED; + } + else if(port_ptr->sprc_cmd == M_SUS) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_SUSPEND_IND, EN_NONE); + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + tempTimer->user_t10 = TIMER_PTR->user_t10; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_REL_COMP; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RESET; + tempTimer->user_t10 = TIMER_PTR->user_t10; + + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd= 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd= 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + case CPCO_WAIT_RLC: + if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t5 = BICC_TIMER_STOP; + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + writePrim_union[pid].rel_rsp.cause.pres = 0; + // bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + bicc_send_rlc(pid); + } + else if(tempTimer->t1-- == BICC_TIMER_EXPIRED) + { + bicc_send_rel(pid); + tempTimer->t1 = TIMER_PTR->t1; + } + else if(tempTimer->t5-- == BICC_TIMER_EXPIRED) + { + tempTimer->t1 = BICC_TIMER_STOP; + bicc_circuit_reset(pid, "t5 expired cpco wait rlc"); + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + //port_ptr->fsm_state.cpc_state = BICC_SETUP_RSP; + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CPCO); + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd= 0; + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd= 0; + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + case CPCO_WAIT_REL_COMP: + if(port_ptr->primitive_cmd == BICC_RELEASE_RSP) + { + port_ptr->primitive_cmd = 0; + tempTimer->user_t10 = 0; + + bicc_send_rlc(pid); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + //port_ptr->fsm_state.cpc_state = BICC_RESET_RSP; + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CPCO); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + bicc_cpc_clear(pid); + return; + } + else if(tempTimer->user_t10-- == BICC_TIMER_EXPIRED) + { + tempTimer->user_t10 = BICC_TIMER_STOP; + bicc_circuit_reset(pid, "user t10 expired cpco wait release complete"); + //bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_send_rlc(pid); + bicc_cpc_clear(pid); + return; + } + + break; + case CPCO_WAIT_RESET: + if(port_ptr->primitive_cmd == BICC_RESET_RSP) + { + port_ptr->primitive_cmd = 0; + //port_ptr->fsm_state.cpc_state = BICC_RESET_RSP; + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CPCO); + bicc_cpc_clear(pid); + return; + } + else if(tempTimer->user_t10-- == BICC_TIMER_EXPIRED) + { + tempTimer->user_t10 = BICC_TIMER_STOP; + bicc_circuit_reset(pid, "user t10 expired cpco wait release complete"); + bicc_cpc_clear(pid); + return; + } + break; + case CPCO_WAIT_GROUP_RESET: + if(port_ptr->primitive_cmd == BICC_RESET_RSP) + { + port_ptr->primitive_cmd = 0; + bicc_cpc_clear(pid); + return; + } + break; + default: + break; + } +} + + +/********************************************************************/ +/* Maintenance Oriented Circuit Group Blocking/Unbolcking Sending */ +/********************************************************************/ +inline void bicc_mgbs_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccTimer_struct *tempTimer = &Bicc_Data.timer_data[pid]; + + u32 circuit_id; + const pal_circuit_struct *pcircuit = NULL; + + circuit_id = pid / BICC_CIRCUIT_CIC; + pcircuit = pal_circuit_ptr(circuit_id); + if(pcircuit == NULL) + return; + if(pcircuit->attrib.plat_id != local_platid ) + if(Bicc_Data.dmp_data.active == 1) + { + if(port_ptr->fsm_state.mgbs_state != MGBS_IDLE) + { + port_ptr->fsm_state.mgbs_state = MGBS_IDLE; + tempTimer->t18 = 0; + tempTimer->t19 = 0; + } + return ; + } + switch(port_ptr->fsm_state.mgbs_state) + { + case MGBS_IDLE: + if(port_ptr->primitive_cmd == BICC_BLOCK_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_localblocking_func(pid, &writePrim_union[pid].cgb_req.rangeStatus); + bicc_send_cgb(pid); + tempTimer->t18 = TIMER_PTR->t18; + tempTimer->t19 = TIMER_PTR->t19; + port_ptr->fsm_state.mgbs_state = MGBS_WAIT_CGBA; + } + else if(port_ptr->primitive_cmd == BICC_UNBLOCK_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_cgu(pid); + tempTimer->t20 = TIMER_PTR->t20; + tempTimer->t21 = TIMER_PTR->t21; + port_ptr->fsm_state.mgbs_state = MGBS_WAIT_CGUA; + } + if(port_ptr->sprc_cmd == M_CGBA) + { + port_ptr->sprc_cmd = 0; + //discard + } + else if(port_ptr->sprc_cmd == M_CGUA) + { + port_ptr->sprc_cmd = 0; + //discard + } + break; + case MGBS_WAIT_CGBA: + if(port_ptr->sprc_cmd == M_CGBA) + { + port_ptr->sprc_cmd = 0; + if(readPrim_union[pid].cgb_cnf.rangeStatus.range >= 32) + return; + tempTimer->t18 = BICC_TIMER_STOP; + tempTimer->t19 = BICC_TIMER_STOP; + port_ptr->fsm_state.mgbs_state = MGBS_IDLE; + bicc_event_handle(pid, &readPrim_union[pid], BICC_BLOCK_CNF, EN_GROUP); + } + + if(tempTimer->t18 -- == BICC_TIMER_EXPIRED) + { + bicc_send_cgb(pid); + tempTimer->t18 = TIMER_PTR->t18; + } + if(tempTimer->t19 -- == BICC_TIMER_EXPIRED) + { + bicc_send_cgb(pid); + tempTimer->t19 = TIMER_PTR->t19; //ignore first T19 expired + } + if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + tempTimer->t18 = BICC_TIMER_STOP; + tempTimer->t19 = BICC_TIMER_STOP; + port_ptr->fsm_state.mgbs_state = MGBS_IDLE; + + } + break; + case MGBS_WAIT_CGUA: + if(port_ptr->sprc_cmd == M_CGUA) + { + port_ptr->sprc_cmd = 0; + if(readPrim_union[pid].cgu_cnf.rangeStatus.range >= 32) + return; + tempTimer->t20 = BICC_TIMER_STOP; + tempTimer->t21 = BICC_TIMER_STOP; + bicc_localunblocking_func(pid, &readPrim_union[pid].cgu_cnf.rangeStatus); + bicc_event_handle(pid, &readPrim_union[pid], BICC_UNBLOCK_CNF, EN_GROUP); + port_ptr->fsm_state.mgbs_state = MGBS_IDLE; + } + + if(tempTimer->t20 -- == BICC_TIMER_EXPIRED) + { + bicc_send_cgu(pid); + tempTimer->t20 = TIMER_PTR->t20; + } + if(tempTimer->t21 -- == BICC_TIMER_EXPIRED) + { + bicc_send_cgb(pid); + tempTimer->t21 = TIMER_PTR->t21; //ignore first T21 expired + } + if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + tempTimer->t20 = BICC_TIMER_STOP; + tempTimer->t21 = BICC_TIMER_STOP; + port_ptr->fsm_state.mgbs_state = MGBS_IDLE; + } + break; + default: + break; + } +} + +/************************************************************************/ +/* Maintenance Oriented Circuit Group Blocking/Unbolcking Reception */ +/************************************************************************/ +inline void bicc_mgbr_proc(u32 pid) +{ + + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + //BiccTimer_struct *tempTimer = &Bicc_Data.timer_data[pid]; + switch(port_ptr->fsm_state.mgbr_state) + { + case MGBR_IDLE: + if(port_ptr->sprc_cmd == M_CGB) + { + port_ptr->sprc_cmd = 0; + if(readPrim_union[pid].cgb_ind.rangeStatus.range >= 32) + return; + bicc_cpcoblocking_func(pid, &readPrim_union[pid].cgb_ind.rangeStatus); + port_ptr->fsm_state.mgbr_state = MGBR_WAIT_BLOCKING_RESP; + bicc_event_handle(pid, &readPrim_union[pid], BICC_BLOCK_IND, EN_GROUP); + } + else if(port_ptr->sprc_cmd == M_CGU) + { + port_ptr->sprc_cmd = 0; + if(readPrim_union[pid].cgu_ind.rangeStatus.range >= 32) + return; + bicc_event_handle(pid, &readPrim_union[pid], BICC_UNBLOCK_IND, EN_GROUP); + port_ptr->fsm_state.mgbr_state = MGBR_WAIT_UNBLOCKING_RESP; + } + break; + case MGBR_WAIT_BLOCKING_RESP: + if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + port_ptr->fsm_state.mgbr_state = MGBR_IDLE; + } + else + { + bicc_remoteblocking_func(pid, &readPrim_union[pid].cgb_ind.rangeStatus); + memcpy(&writePrim_union[pid].cgb_rsp, &readPrim_union[pid].cgb_ind, sizeof(BiccCgb_Ind)); + bicc_send_cgba(pid); + port_ptr->fsm_state.mgbr_state = MGBR_IDLE; + } + break; + case MGBR_WAIT_UNBLOCKING_RESP: + if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + port_ptr->fsm_state.mgbr_state = MGBR_IDLE; + } + else + { + bicc_remoteunblocking_func(pid, &readPrim_union[pid].cgu_ind.rangeStatus); + memcpy(&writePrim_union[pid].cgu_rsp, &readPrim_union[pid].cgu_ind, sizeof(BiccCgu_Ind)); + bicc_send_cgua(pid); + port_ptr->fsm_state.mgbr_state = MGBR_IDLE; + } + break; + default: + break; + } +} + +/********************************************/ +/* Circuit Reset Sending */ +/********************************************/ +BOOL check_crs_waiting(u32 pid) +{ + if(Bicc_Data.port_data[pid].fsm_state.crs_state == CRS_WAIT_REL) + return 1; + else + return 0; +} +inline void bicc_crs_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccTimer_struct *tempTimer = &Bicc_Data.timer_data[pid]; + + u32 circuit_id; + const pal_circuit_struct *pcircuit = NULL; + + circuit_id = pid / BICC_CIRCUIT_CIC; + pcircuit = pal_circuit_ptr(circuit_id); + if(pcircuit == NULL) + return ; + if(pcircuit->attrib.plat_id != local_platid ) + if(Bicc_Data.dmp_data.active == 1) + { + if(port_ptr->fsm_state.crs_state != CRS_IDLE) + { + port_ptr->fsm_state.crs_state = CRS_IDLE; + + tempTimer->t16 = 0; + } + return ; + } + switch(port_ptr->fsm_state.crs_state) + { + case CRS_IDLE: + if(port_ptr->primitive_cmd == BICC_RESET_REQ) + { + port_ptr->primitive_cmd = 0; + port_ptr->cic_state.blo_state &= 0x0e; + port_ptr->cic_state.blo_state &= 0x0d; + bicc_send_rsc(pid); + tempTimer->t16 = TIMER_PTR->t16; + + port_ptr->fsm_state.crs_state = CRS_WAIT_REL; + } + break; + case CRS_WAIT_REL: + if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + tempTimer->t16 = BICC_TIMER_STOP; + port_ptr->fsm_state.crs_state = CRS_IDLE; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_CNF, EN_NONE); + + } + + if(tempTimer->t16 -- == BICC_TIMER_EXPIRED) + { + bicc_send_rsc(pid); + tempTimer->t16 = TIMER_PTR->t16; + } + break; + default: + break; + } +} + +/********************************************/ +/* Circuit Reset Reception */ +/********************************************/ +inline void bicc_crr_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + + + switch(port_ptr->fsm_state.crr_state) + { + case CRR_IDLE: + if(port_ptr->sprc_cmd == M_RSC) + { + port_ptr->sprc_cmd = 0; + + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + port_ptr->cic_state.call_state = BICC_INCOMING; + + port_ptr->internal_cmd = (BICC_CMD_RESET|BICC_SI_CRR); + + if(port_ptr->cic_state.blo_state & M_LOCAL_BLOCK) + port_ptr->cic_state.blo_state &= 0x0e; + port_ptr->cic_state.blo_state &= 0x0d; + port_ptr->fsm_state.crr_state = CRR_WAIT_RESPONSE; + port_ptr->internal_cmd = (BICC_CMD_RESET|BICC_SI_CRR); + + } + break; + case CRR_WAIT_RESPONSE: + //if((port_ptr->internal_cmd & 0x0F) == CMD_RESET_COMP) + // if(port_ptr->primitive_cmd == BICC_RESET_RSP) + { + port_ptr->internal_cmd = 0; + writePrim_union[pid].rel_rsp.cause.pres = 0; + bicc_send_rlc(pid); + port_ptr->fsm_state.crr_state = CRR_IDLE; + } + break; + default: + break; + } +} + +/************************************************/ +/* Circuit Group Reset Sending */ +/************************************************/ +inline void bicc_cgrs_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccTimer_struct *tempTimer = &Bicc_Data.timer_data[pid]; + u32 circuit_id; + const pal_circuit_struct *pcircuit = NULL; + + circuit_id = pid / BICC_CIRCUIT_CIC; + pcircuit = pal_circuit_ptr(circuit_id); + if(pcircuit == NULL) + return ; + if(pcircuit->attrib.plat_id != local_platid ) + if(Bicc_Data.dmp_data.active == 1) + { + if(port_ptr->fsm_state.cgrs_state != CGRS_IDLE) + { + port_ptr->fsm_state.cgrs_state = CGRS_IDLE; + + tempTimer->t22 = 0; + } + return ; + } + switch(port_ptr->fsm_state.cgrs_state) + { + case CGRS_IDLE: + if(port_ptr->primitive_cmd == BICC_GROUP_RESET_REQ) + { + port_ptr->primitive_cmd = 0; + if(port_ptr->fsm_state.mgbs_state != MGBS_IDLE) + port_ptr->internal_cmd = (BICC_CMD_RESET|BICC_SI_CGRS); + bicc_cgrs_func(pid, writePrim_union[pid].grs_req.rangeStatus.range); + bicc_send_grs(pid); + tempTimer->t22 = TIMER_PTR->t22; + port_ptr->fsm_state.cgrs_state = CGRS_WAIT_GRA; + } + break; + case CGRS_WAIT_GRA: + if(port_ptr->sprc_cmd == M_GRA) + { + port_ptr->sprc_cmd = 0; + tempTimer->t22 = BICC_TIMER_STOP; + port_ptr->fsm_state.cgrs_state = CGRS_IDLE; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_CNF, EN_GROUP); + bicc_cgrsack_func(pid, &readPrim_union[pid].grs_cnf.rangeStatus); + } + + if(tempTimer->t22 -- == BICC_TIMER_EXPIRED) + { + bicc_send_grs(pid); + tempTimer->t22 = TIMER_PTR->t22; + + } + break; + default: + break; + } +} + +/****************************************************/ +/* Circuit Group Reset Reception */ +/****************************************************/ +inline void bicc_cgrr_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + + switch(port_ptr->fsm_state.cgrr_state) + { + case CGRR_IDLE: + if(port_ptr->sprc_cmd == M_GRS) + { + port_ptr->sprc_cmd = 0; + if((readPrim_union[pid].grs_ind.rangeStatus.range >= 32)|| (readPrim_union[pid].grs_ind.rangeStatus.range == 0)) + return; + if(port_ptr->fsm_state.mgbr_state != MGBR_IDLE) + port_ptr->internal_cmd = (BICC_CMD_RESET|BICC_SI_CGRR); + bicc_cgrr_func(pid, readPrim_union[pid].grs_ind.rangeStatus.range, &msg_union[pid].gra.rangeStatus); + port_ptr->fsm_state.cgrr_state = CGRR_WAIT_GROUP_RESET_COMP; + } + break; + case CGRR_WAIT_GROUP_RESET_COMP: + memcpy(&writePrim_union[pid].grs_rsp.rangeStatus, &msg_union[pid].gra.rangeStatus, sizeof(RangeStatus_struct)); + bicc_send_gra(pid); + port_ptr->internal_cmd = 0; + port_ptr->fsm_state.cgrr_state = CGRR_IDLE; + break; + default: + break; + } +} + + + +BOOL bicc_check_blocking(u32 circuit_id, RangeStatus_struct *rs_ptr) +{ + int i; + BOOL ret = 0; + const pal_circuit_struct *pcircuit = NULL; + + pcircuit = pal_circuit_ptr(circuit_id); + if(pcircuit == NULL) + return ret; + memset(rs_ptr, 0, sizeof(RangeStatus_struct)); + rs_ptr->range = BICC_CIRCUIT_CIC- 1; + for(i = pcircuit->attrib.head_cic; i < (pcircuit->attrib.head_cic + pcircuit->attrib.cic_range); i++) + { + if((Bicc_Data.port_data[i].cic_state.blo_state == 0) && (pcircuit->enable== 1)) + { + rs_ptr->status[i>>3]|= 0x01 << (i&0x07); + ret = 1; + } + } + return ret; +} + +BOOL bicc_check_unblocking(u32 circuit_id, RangeStatus_struct *rs_ptr) +{ + int i; + BOOL ret = 0; + const pal_circuit_struct *pcircuit = NULL; + + pcircuit = pal_circuit_ptr(circuit_id); + if(pcircuit == NULL) + return ret; + memset(rs_ptr, 0, sizeof(RangeStatus_struct)); + rs_ptr->range = BICC_CIRCUIT_CIC - 1; + for(i = pcircuit->attrib.head_cic; i < (pcircuit->attrib.head_cic + pcircuit->attrib.cic_range); i++) + { + if((pcircuit->enable== 1) && (Bicc_Data.port_data[i].cic_state.blo_state == 1)) + { + rs_ptr->status[i>>3]|= 0x01 << (i&0x07); + ret = 1; + } + } + return ret; +} + +BOOL bicc_trunk_reachable(u32 cg_id) +{ + const pal_cg_struct *pcg; + pcg = pal_cg_ptr(cg_id); + if(pcg==NULL) + return 0; + if(check_outbound_route(pcg->attrib.network_id, (long)pcg->attrib.dpc, 0) >= 0) + return 1; + else + return 0; +} + diff --git a/omc/plat/bicc/src.old/bicc_fsm.c.old b/omc/plat/bicc/src.old/bicc_fsm.c.old new file mode 100644 index 0000000..944719e --- /dev/null +++ b/omc/plat/bicc/src.old/bicc_fsm.c.old @@ -0,0 +1,2093 @@ +#include "./include/inc.h" +#include "./include/var_ext.h" +#include "./include/biccif.h" +/**************CPCI*************************/ +#define CPCI_IDLE 0 +#define CPCI_WAIT_CONTINUITY 1 +#define CPCI_WAIT_ACM 2 +#define CPCI_WAIT_ANM 3 +#define CPCI_ANSWERED 4 +#define CPCI_SUSPENDED 5 +#define CPCI_WAIT_RLC 6 +#define CPCI_WAIT_REL_COMP 7 +#define CPCI_WAIT_RESET 8 +#define CPCI_WAIT_GROUP_RESET 9 + +/*************CPCO*************************/ +#define CPCO_IDLE 0 +#define CPCO_WAIT_CONTINUITY 1 +#define CPCO_WAIT_ACM 2 +#define CPCO_WAIT_ANM 3 +#define CPCO_ANSWERED 4 +#define CPCO_SUSPENDED 5 +#define CPCO_WAIT_RLC 6 +#define CPCO_WAIT_REL_COMP 7 +#define CPCO_WAIT_RESET 8 +#define CPCO_WAIT_GROUP_RESET 9 + +/********************************************/ +#define MGBS_IDLE 0 +#define MGBS_WAIT_CGBA 1 +#define MGBS_WAIT_CGUA 2 +/********************************************/ +#define MGBR_IDLE 0 +#define MGBR_WAIT_BLOCKING_RESP 1 +#define MGBR_WAIT_UNBLOCKING_RESP 2 +/********************************************/ +#define CRS_IDLE 0 +#define CRS_WAIT_REL 1 +/*******************************************/ +#define CRR_IDLE 0 +#define CRR_WAIT_RESPONSE 1 +#define CRR_RESET 2 +#define CRR_RESET_COMP 3 +/*******************************************/ +#define CGRS_IDLE 0 +#define CGRS_WAIT_GRA 1 +/*******************************************/ +#define CGRR_IDLE 0 +#define CGRR_WAIT_GROUP_RESET_COMP 1 +/********************************************/ +#define BLR_IDLE 0 +#define BLR_WAIT_BLOCKING_RESP 1 +#define BLR_REMOTE_LOCKED 2 +#define BLR_WAIT_UNBLOCKING_RESP 3 +/********************************************/ +#define BLS_IDLE 0 +#define BLS_WAIT_BLA 1 +#define BLS_LOCAL_LOCKED 2 +#define BLS_WAIT_UBA 3 +/*******************************************/ + + + +BiccData_struct Bicc_Data; +const BiccTimer_struct *TIMER_PTR = &Timer_Data; + + +extern BiccReadPrim_union readPrim_union[BICC_MAX_PORT]; +extern BiccWritePrim_union writePrim_union[BICC_MAX_PORT]; +//extern BICC_Resource_pond BiccResource; +extern BiccMsg_union msg_union[BICC_MAX_PORT]; +extern u8 local_platid; + +extern void bicc_send_apm(u32 pid); +extern void bicc_log_err(const char *fmt, ...); +extern void bicc_send_res(u32 pid); +extern void bicc_send_sus(u32 pid); +extern void bicc_send_sam(u32 pid); +extern void bicc_send_rsc(u32 pid); +extern void bicc_send_rlc(u32 pid); +extern void bicc_send_rel(u32 pid); +extern void bicc_send_iam(u32 pid); +extern void bicc_send_con(u32 pid); +extern void bicc_send_gra(u32 pid); +extern void bicc_send_grs(u32 pid); +extern void bicc_send_cgua(u32 pid); +extern void bicc_send_cgu(u32 pid); +extern void bicc_send_cgba(u32 pid); +extern void bicc_send_cgb(u32 pid); +extern void bicc_send_cpg(u32 pid); +extern void bicc_send_anm(u32 pid); +extern void bicc_send_acm(u32 pid); +extern BOOL check_crs_waiting(u32 pid); +extern int check_outbound_route(BYTE nw, long dpc, BYTE sls); + + +void bicc_cpc_clear(u32 pid) +{ + memset(&Bicc_Data.port_data[pid], 0, sizeof(BICC_Port_struct)); +} + + +BOOL bicc_cgrs_func(u32 start_pid, u8 range) +{ + int i; + u32 pid; + + if(start_pid+range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= range; i++) + { + pid = start_pid + i; + Bicc_Data.port_data[pid].cic_state.call_state = BICC_RESET; + + } + return 1; +} + +BOOL bicc_cgrsack_func(u32 start_pid, const RangeStatus_struct *rs_ptr) +{ + int i; + u32 pid; + + if(start_pid+rs_ptr->range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= rs_ptr->range; i++) + { + pid = start_pid + i; + Bicc_Data.port_data[pid].cic_state.call_state = BICC_CIC_IDLE; + memset(&Bicc_Data.port_data[pid], 0, sizeof(BICC_Port_struct)); + + if((rs_ptr->status[i>>3]>>(i&0x07)) & 0x01) + Bicc_Data.port_data[pid].cic_state.blo_state |= M_REMOTE_BLOCK; + else + Bicc_Data.port_data[pid].cic_state.blo_state &= 0x0d; + } + //BiccResource.circuit_pond[start_pid/BICC_CIRCUIT_CIC].active_flag = 1; + return 1; +} + +BOOL bicc_cgrr_func(u32 start_pid, u8 range, RangeStatus_struct *rs_ptr) +{ + int i; + u32 pid; + + rs_ptr->range = range; + memset(rs_ptr->status, 0, 4); + if(start_pid+range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= range; i++) + { + pid = start_pid + i; + Bicc_Data.port_data[pid].cic_state.blo_state &= 0x0d; + if(Bicc_Data.port_data[pid].cic_state.blo_state & M_LOCAL_BLOCK) + { + if(Bicc_Data.port_data[pid].fsm_state.mgbs_state != MGBS_WAIT_CGUA) + rs_ptr->status[i>>3]|= 0x01 << (i&0x07); + } + } + return 1; +} + + +void bicc_set_cause(CauseInd_struct *cause_ptr, u8 val) +{ + cause_ptr->pres = 1; + cause_ptr->codingStd = 0; //CCITT standardized coding + cause_ptr->location = 5; //private network serving the remote user + cause_ptr->causeVal = val; +} + +void bicc_circuit_reset(u32 pid, const char *s) +{ + #ifdef BICC_DEBUG + bicc_log_err("BICC circuit reset!, %s\n", s); + #endif + + if(check_crs_waiting(pid)) + return; + Bicc_Data.port_data[pid].primitive_cmd = BICC_RESET_REQ; +} + + +BOOL bicc_localblocking_func(u32 start_pid, const RangeStatus_struct *rs_ptr) +{ + int i; + u32 pid; + + if(start_pid+rs_ptr->range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= rs_ptr->range; i++) + { + pid = start_pid + i; + if((rs_ptr->status[i>>3]>>(i&0x07)) & 0x01) + Bicc_Data.port_data[pid].cic_state.blo_state &= M_LOCAL_BLOCK; + } + return 1; +} + +BOOL bicc_remoteblocking_func(u32 start_pid, const RangeStatus_struct *rs_ptr) +{ + int i; + u32 pid; + + if(start_pid+rs_ptr->range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= rs_ptr->range; i++) + { + pid = start_pid + i; + if((rs_ptr->status[i>>3]>>(i&0x07)) & 0x01) + Bicc_Data.port_data[pid].cic_state.blo_state &= M_REMOTE_BLOCK; + } + return 1; +} + +BOOL bicc_cpcoblocking_func(u32 start_pid, const RangeStatus_struct *rs_ptr) +{ + int i; + u32 pid; + + if(start_pid+rs_ptr->range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= rs_ptr->range; i++) + { + pid = start_pid + i; + if((rs_ptr->status[i>>3]>>(i&0x07)) & 0x01) + { + if(Bicc_Data.port_data[pid].cic_state.call_state == BICC_OUTGOING) + Bicc_Data.port_data[pid].internal_cmd = (BICC_CMD_BLO|BICC_SI_MGBR); + } + } + return 1; +} + +BOOL bicc_localunblocking_func(u32 start_pid, const RangeStatus_struct *rs_ptr) +{ + int i; + u32 pid; + + if(start_pid+rs_ptr->range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= rs_ptr->range; i++) + { + pid = start_pid + i; + if((rs_ptr->status[i>>3]>>(i&0x07)) & 0x01) + Bicc_Data.port_data[pid].cic_state.blo_state &= 0x0e; + } + return 1; +} + +BOOL bicc_remoteunblocking_func(u32 start_pid, const RangeStatus_struct *rs_ptr) +{ + int i; + u32 pid; + + if(start_pid+rs_ptr->range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= rs_ptr->range; i++) + { + pid = start_pid + i; + if((rs_ptr->status[i>>3]>>(i&0x07)) & 0x01) + Bicc_Data.port_data[pid].cic_state.blo_state &= 0x0d; + } + return 1; +} + + +BOOL bicc_event_handle(u32 pid, BiccReadPrim_union *prm_ptr, u8 primitive, u8 eventType) +{ + BICC_EventHandle_struct *eh_ptr = NULL; + Pst pst; + u32 cic; + int circuit_id, offset, ret = -1; + const pal_circuit_struct *pcircuit = NULL; + const pal_cg_struct *pcg = NULL; + + circuit_id = pid / BICC_CIRCUIT_CIC; + offset = pid % BICC_CIRCUIT_CIC; + pcircuit = pal_circuit_ptr(circuit_id); + if(pcircuit == NULL) + return BICC_CM_FAILED; + cic = pcircuit->attrib.head_cic + offset; + + pst.cg_id = pcircuit->cg_id; + pcg = pal_cg_ptr(pst.cg_id); + if(pcg == NULL) + return BICC_CM_FAILED; + if(pcg->attrib.protocol != PROTO_BICC) + return BICC_CM_FAILED; + pst.tg_id = pcg->attrib.tg_id; + pst.sp_proc_id = pid; + pst.su_proc_id = Bicc_Data.port_data[pid].su_proc_id; + pst.cic = cic; + pst.trace_flag = 0; + + eh_ptr = (BICC_EventHandle_struct *)pal_get_handler(pst.cg_id); + if(eh_ptr == NULL) + return BICC_CM_FAILED; + + switch(primitive) + { + case BICC_SETUP_IND: + if(eh_ptr->h_bicc_setup_ind != NULL) + { + ret = eh_ptr->h_bicc_setup_ind(&pst, prm_ptr); + if(pst.trace_flag == 1) + { + //BiccResource.port_pond[pid].trace_flag = 1; + Bicc_Data.port_data[pid].trace_flag = 1; + monitor_bicc_msg(r_mtp_msg.msgList, r_mtp_msg.len, 0, cic, pid); + } + } + else + bicc_log_err("Setup indicate handle is not registered.\n"); + if(ret != -1) + Bicc_Data.port_data[pid].su_proc_id = pst.su_proc_id; + break; + + case BICC_SETUP_CNF: + if(eventType == EN_CON) + { + if(eh_ptr->h_bicc_setup_con_cnf != NULL) + { + if(!eh_ptr->h_bicc_setup_con_cnf(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("Setup confirm handle is not registered.\n"); + break; + + } + else + { + if(eh_ptr->h_bicc_setup_anm_cnf != NULL) + eh_ptr->h_bicc_setup_anm_cnf(&pst, prm_ptr); + else + bicc_log_err("Setup confirm handle is not registered.\n"); + } + + break; + + case BICC_ALERT_IND: + if(eh_ptr->h_bicc_alert_ind != NULL) + { + if(!eh_ptr->h_bicc_alert_ind(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("Alert indication handle is not registered.\n"); + break; + + case BICC_RELEASE_IND: + if(eh_ptr->h_bicc_release_ind != NULL) + { + if(!eh_ptr->h_bicc_release_ind(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("Release indication is not registered.\n"); + break; + + case BICC_APM_IND: + if(eh_ptr->h_bicc_apm_ind != NULL) + { + if(!eh_ptr->h_bicc_apm_ind(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("APM indication is not registered.\n"); + break; + + case BICC_RELEASE_CNF: + if(eh_ptr->h_bicc_release_cnf != NULL) + { + if(!eh_ptr->h_bicc_release_cnf(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("Release confirm is not registered.\n"); + break; + + case BICC_INFO_IND: + if(eh_ptr->h_bicc_info_ind != NULL) + { + if(!eh_ptr->h_bicc_info_ind(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("info indication is not registered.\n"); + break; + + case BICC_SUSPEND_IND: + if(eh_ptr->h_bicc_suspend_ind != NULL) + { + if(!eh_ptr->h_bicc_suspend_ind(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("Suspend indication is not registered.\n"); + break; + + case BICC_RESUME_IND: + if(eh_ptr->h_bicc_resume_ind != NULL) + { + if(!eh_ptr->h_bicc_resume_ind(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("Resume indication is not registered.\n"); + break; + + case BICC_PROG_IND: + if(eh_ptr->h_bicc_prog_ind != NULL) + eh_ptr->h_bicc_prog_ind(&pst, prm_ptr); + else + bicc_log_err("Call progress indication handle is not registered.\n"); + break; + case BICC_RESET_IND: + if(eh_ptr->h_bicc_reset_ind != NULL) + eh_ptr->h_bicc_reset_ind(&pst, prm_ptr); + + else + bicc_log_err("Reset indicate handle is not registered.\n"); + break; + case BICC_RESET_CNF: + if(eh_ptr->h_bicc_reset_cnf != NULL) + { + if(eventType == EN_GROUP) + eh_ptr->h_bicc_reset_cnf(&pst, prm_ptr); + else + eh_ptr->h_bicc_reset_cnf(&pst, NULL); + } + else + bicc_log_err("Reset cnf handle is not registered.\n"); + break; + case BICC_FAILURE_IND: + if(eh_ptr->h_bicc_failure_ind != NULL) + eh_ptr->h_bicc_failure_ind(&pst, prm_ptr); + else + bicc_log_err("Failure indicate handle is not registered.\n"); + break; + case BICC_REATTEMPT_IND: + if(eh_ptr->h_bicc_reattempt_ind != NULL) + eh_ptr->h_bicc_reattempt_ind(&pst, prm_ptr); + else + bicc_log_err("Reattempt indicate handle is not registered.\n"); + break; + case BICC_BLOCK_IND: + if(eh_ptr->h_bicc_block_ind != NULL) + { + if(eventType == EN_GROUP) + eh_ptr->h_bicc_block_ind(&pst, prm_ptr); + else + eh_ptr->h_bicc_block_ind(&pst, NULL); + } + else + bicc_log_err("Block indicate handle is not registered.\n"); + break; + + case BICC_BLOCK_CNF: + if(eh_ptr->h_bicc_block_cnf != NULL) + { + if(eventType == EN_GROUP) + eh_ptr->h_bicc_block_cnf(&pst, prm_ptr); + else + eh_ptr->h_bicc_block_cnf(&pst, NULL); + } + else + bicc_log_err("Block confirm handle is not registered.\n"); + break; + case BICC_UNBLOCK_IND: + if(eh_ptr->h_bicc_unblock_ind != NULL) + { + if(eventType == EN_GROUP) + eh_ptr->h_bicc_unblock_ind(&pst, prm_ptr); + else + eh_ptr->h_bicc_unblock_ind(&pst, NULL); + } + else + bicc_log_err("Unblock indicate handle is not registered.\n"); + break; + case BICC_UNBLOCK_CNF: + if(eh_ptr->h_bicc_unblock_cnf != NULL) + { + if(eventType == EN_GROUP) + eh_ptr->h_bicc_unblock_cnf(&pst, prm_ptr); + else + eh_ptr->h_bicc_unblock_cnf(&pst, NULL); + } + else + bicc_log_err("Unblock confirm handle is not registered.\n"); + break; + default: + break; + } + return 1; +} + + +void bicc_dualseizure_func(u32 pid) +{ + int cg_id; + const pal_circuit_struct *pcircuit = NULL; + const pal_cg_struct *pcg = NULL; + BiccTimer_struct *tempTimer = &Bicc_Data.timer_data[pid]; + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + pcircuit = pal_circuit_ptr(pid / BICC_CIRCUIT_CIC); + if(pcircuit == NULL) + return; + cg_id = pcircuit->cg_id; + pcg = pal_cg_ptr(cg_id); + if(pcg == NULL) + return; + if(pcg->attrib.priority == 0) + return; + tempTimer->t7 = BICC_TIMER_STOP; + bicc_event_handle(pid, NULL, BICC_REATTEMPT_IND, EN_NONE); + bicc_cpc_clear(pid); + Bicc_Data.port_data[pid].cic_state.call_state = BICC_INCOMING; + port_ptr->sprc_cmd = M_IAM; +} + + +void bicc_cpci_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccTimer_struct *tempTimer = &Bicc_Data.timer_data[pid]; + + switch(port_ptr->fsm_state.cpc_state) + { + case CPCI_IDLE: + if(port_ptr->sprc_cmd == M_IAM) + { + port_ptr->sprc_cmd = 0; + if(readPrim_union[pid].setup_ind.callingPtyCat.val != 0x0d) //test call? + { + if(port_ptr->cic_state.blo_state & M_REMOTE_BLOCK) + port_ptr->cic_state.blo_state &= 0x01; //set remote unblocked + if(port_ptr->cic_state.blo_state & M_LOCAL_BLOCK) + { + bicc_cpc_clear(pid); + return; + } + + } + if(bicc_event_handle(pid, &readPrim_union[pid], BICC_SETUP_IND, EN_NONE)) + { + port_ptr->fsm_state.cpc_state = CPCI_WAIT_ACM; + + } + else + { + bicc_circuit_reset(pid, "setup ind rejected"); + bicc_cpc_clear(pid); + return; + } + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + writePrim_union[pid].rel_rsp.cause.pres = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + bicc_send_rlc(pid); + bicc_cpc_clear(pid); + return ; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_cpc_clear(pid); + return ; + } + else if(port_ptr->sprc_cmd !=0 ) + { + port_ptr->sprc_cmd = 0; + port_ptr->internal_cmd = (BICC_CMD_RESET|BICC_SI_CPCI); + bicc_circuit_reset(pid, "unexpected message"); + bicc_cpc_clear(pid); + return ; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CRR); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CGRR); + bicc_cpc_clear(pid); + return ; + } + + break; + case CPCI_WAIT_CONTINUITY: + break; + case CPCI_WAIT_ACM: + if(port_ptr->primitive_cmd == BICC_ALERT_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_acm(pid); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_ANM; + } + else if(port_ptr->primitive_cmd == BICC_SETUP_RSP) + { + port_ptr->primitive_cmd = 0; + bicc_send_con(pid); + port_ptr->fsm_state.cpc_state = CPCI_ANSWERED; + tempTimer->t9 = TIMER_PTR->t9; + } + else if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_rel(pid); + + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_REL_COMP; + } + else if(port_ptr ->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } +/* else if(port_ptr->sprc_cmd == M_SAM) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_INFO_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_ACM; + } +*/ + else if(port_ptr->sprc_cmd != 0) + { + port_ptr->sprc_cmd = 0; + port_ptr->internal_cmd = (BICC_CMD_RESET|BICC_SI_CPCI); + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_circuit_reset(pid, "unexpected message cpci wait acm"); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_BLO|BICC_SI_MGBS)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd= 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + + case CPCI_WAIT_ANM: + if(port_ptr->primitive_cmd == BICC_SETUP_RSP) + { + port_ptr->primitive_cmd = 0; + bicc_send_anm(pid); + port_ptr->fsm_state.cpc_state = CPCI_ANSWERED; + } + else if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } + else if(port_ptr->primitive_cmd == BICC_PROG_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_cpg(pid); + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_REL_COMP; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } +#ifdef BICC_TOLERANT + // To avoid both side backoff // + else if(port_ptr->sprc_cmd != 0) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_circuit_reset(pid, "unexpected message cpci wait anm"); + bicc_cpc_clear(pid); + return; + } +#endif + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + // break; + else if(tempTimer->t9-- == BICC_TIMER_EXPIRED) + { + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x13); + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } + break; + + case CPCI_ANSWERED: + if(port_ptr->primitive_cmd == BICC_SUSPEND_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_sus(pid); + port_ptr->cic_state.sus_state = BICC_TERM_SUSPEND; + port_ptr->fsm_state.cpc_state = CPCI_SUSPENDED; + } + else if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } + else if(port_ptr->sprc_cmd == M_SUS) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_SUSPEND_IND, EN_NONE); + port_ptr->cic_state.sus_state = BICC_ORIG_SUSPEND; + port_ptr->fsm_state.cpc_state = CPCI_SUSPENDED; + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_REL_COMP; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + case CPCI_SUSPENDED: + if(port_ptr->primitive_cmd == BICC_RESUME_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_res(pid); + if(port_ptr->cic_state.sus_state == BICC_TERM_SUSPEND) + port_ptr->fsm_state.cpc_state = CPCI_ANSWERED; + } + else if(port_ptr->primitive_cmd == BICC_SUSPEND_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_sus(pid); + } + else if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state= CPCI_WAIT_RLC; + } + else if(port_ptr->sprc_cmd == M_RES) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESUME_IND, EN_NONE); + if(port_ptr->cic_state.sus_state == BICC_ORIG_SUSPEND) + port_ptr->fsm_state.cpc_state = CPCI_ANSWERED; + } + else if(port_ptr->sprc_cmd == M_SUS) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_SUSPEND_IND, EN_NONE); + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_REL_COMP; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + + case CPCI_WAIT_RLC: + if(port_ptr->sprc_cmd== M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + writePrim_union[pid].rel_rsp.cause.pres = 0; + bicc_send_rlc(pid); + + } + else if(tempTimer->t1-- == BICC_TIMER_EXPIRED) + { + bicc_send_rel(pid); + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + + } + else if(tempTimer->t5-- == BICC_TIMER_EXPIRED) + { + tempTimer->t1 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_circuit_reset(pid, "t5 expired cpci wait rlc"); + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_cpc_clear(pid); + return; + } + //if(cpc_ptr->crr_cmd == BICC_RESET_IND) + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + //port_ptr->fsm_state.cpc_state = BICC_RESET_RSP; + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CPCI); + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid,&readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + case CPCI_WAIT_REL_COMP: + if(port_ptr->primitive_cmd == BICC_RELEASE_RSP) + { + port_ptr->primitive_cmd = 0; + bicc_send_rlc(pid); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + //port_ptr->fsm_state.cpc_state = BICC_RESET_RSP; + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CPCI); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + bicc_cpc_clear(pid); + return; + } +#ifdef BICC_TOLERANT + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + } + +#endif + break; + case CPCI_WAIT_RESET: + if(port_ptr->primitive_cmd == BICC_RESET_RSP) + { + port_ptr->primitive_cmd = 0; + //port_ptr->fsm_state.cpc_state = BICC_RESET_RSP; + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CPCI); + bicc_cpc_clear(pid); + return; + } + break; + case CPCI_WAIT_GROUP_RESET: + if(port_ptr->primitive_cmd == BICC_RESET_RSP) + { + port_ptr->primitive_cmd = 0; + bicc_cpc_clear(pid); + return; + } + break; + default: + break; + } +} + + +inline void bicc_cpco_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccTimer_struct *tempTimer = &Bicc_Data.timer_data[pid]; + + switch(port_ptr->fsm_state.cpc_state) + { + case CPCO_IDLE: + if(port_ptr->primitive_cmd== BICC_SETUP_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_iam(pid); + tempTimer->t7 = TIMER_PTR->t7; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_ACM; + } + else + bicc_cpc_clear(pid); + break; + case CPCO_WAIT_CONTINUITY: + break; + case CPCO_WAIT_ACM: + if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->primitive_cmd == BICC_INFO_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_sam(pid); + tempTimer->t7 = TIMER_PTR->t7; + port_ptr->w_time = 0; + } + else if(port_ptr->sprc_cmd == M_ACM) + { + port_ptr->sprc_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + tempTimer->t9 = TIMER_PTR->t9; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_ALERT_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_ANM; + } + else if(port_ptr->sprc_cmd == M_CON) + { + port_ptr->sprc_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_SETUP_CNF, EN_CON); + port_ptr->fsm_state.cpc_state = CPCO_ANSWERED; + } +/* else if(port_ptr->sprc_cmd == M_ANM) + { + port_ptr->sprc_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_SETUP_CNF, EN_ANM); + port_ptr->fsm_state.cpc_state = CPCO_ANSWERED; + } +*/ + else if(port_ptr->sprc_cmd == M_CPG) + { + port_ptr->sprc_cmd = 0; //discard... + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + tempTimer->user_t10 = TIMER_PTR->user_t10; + + // fsm_ptr->timer_data.t7 = BICC_TIMER_STOP; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_REL_COMP; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + tempTimer->t7 = BICC_TIMER_STOP; + + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } +#ifdef BICC_REATTEMPT + else if(port_ptr->sprc_cmd == M_IAM) + { + port_ptr->sprc_cmd = 0; + bicc_dualseizure_func(pid); + } +#endif + else if(port_ptr->sprc_cmd != 0) + { + port_ptr->sprc_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_circuit_reset(pid, "unexpected message cpco wait acm"); + bicc_cpc_clear(pid); + return; + } + else if(tempTimer->t7-- == BICC_TIMER_EXPIRED) + { + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x12); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->internal_cmd == (BICC_CMD_BLO|BICC_SI_MGBR)) + { + port_ptr->internal_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd= 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RESET; + tempTimer->user_t10 = TIMER_PTR->user_t10; + + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd= 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + case CPCO_WAIT_ANM: + if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->sprc_cmd == M_ANM) + { + port_ptr->sprc_cmd = 0; + tempTimer->t9 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_SETUP_CNF, EN_ANM); + port_ptr->fsm_state.cpc_state = CPCO_ANSWERED; + } + else if(port_ptr->sprc_cmd == M_CPG) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_PROG_IND, EN_NONE); + } +#ifdef BICC_TOLERANT + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + tempTimer->t9 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + tempTimer->user_t10 = TIMER_PTR->user_t10; + + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_REL_COMP; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + tempTimer->t9 = BICC_TIMER_STOP; + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } +#endif +#ifdef BICC_TOLERANT + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + tempTimer->t9 = BICC_TIMER_STOP; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RESET; + tempTimer->user_t10 = TIMER_PTR->user_t10; + + } +#endif + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + tempTimer->t9 = BICC_TIMER_STOP; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + tempTimer->t9 = BICC_TIMER_STOP; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(tempTimer->t9-- == BICC_TIMER_EXPIRED) + { + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + break; + case CPCO_ANSWERED: + if(port_ptr->primitive_cmd == BICC_SUSPEND_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_sus(pid); + port_ptr->cic_state.sus_state = BICC_ORIG_SUSPEND; + port_ptr->fsm_state.cpc_state = CPCO_SUSPENDED; + } + else if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->sprc_cmd == M_SUS) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid,&readPrim_union[pid], BICC_SUSPEND_IND, EN_NONE); + port_ptr->cic_state.sus_state = BICC_TERM_SUSPEND; + port_ptr->fsm_state.cpc_state = CPCO_SUSPENDED; + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + tempTimer->user_t10 = TIMER_PTR->user_t10; + + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_REL_COMP; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RESET; + tempTimer->user_t10 = TIMER_PTR->user_t10; + + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + case CPCO_SUSPENDED: + if(port_ptr->primitive_cmd== BICC_RESUME_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_res(pid); + if(port_ptr->cic_state.sus_state == BICC_ORIG_SUSPEND) + port_ptr->fsm_state.cpc_state = CPCO_ANSWERED; + } + else if(port_ptr->primitive_cmd == BICC_SUSPEND_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_sus(pid); + } + else if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->sprc_cmd == M_RES) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESUME_IND, EN_NONE); + if(port_ptr->cic_state.sus_state == BICC_TERM_SUSPEND) + port_ptr->fsm_state.cpc_state = CPCO_ANSWERED; + } + else if(port_ptr->sprc_cmd == M_SUS) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_SUSPEND_IND, EN_NONE); + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + tempTimer->user_t10 = TIMER_PTR->user_t10; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_REL_COMP; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RESET; + tempTimer->user_t10 = TIMER_PTR->user_t10; + + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd= 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd= 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + case CPCO_WAIT_RLC: + if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t5 = BICC_TIMER_STOP; + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + writePrim_union[pid].rel_rsp.cause.pres = 0; + // bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + bicc_send_rlc(pid); + } + else if(tempTimer->t1-- == BICC_TIMER_EXPIRED) + { + bicc_send_rel(pid); + tempTimer->t1 = TIMER_PTR->t1; + } + else if(tempTimer->t5-- == BICC_TIMER_EXPIRED) + { + tempTimer->t1 = BICC_TIMER_STOP; + bicc_circuit_reset(pid, "t5 expired cpco wait rlc"); + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + //port_ptr->fsm_state.cpc_state = BICC_SETUP_RSP; + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CPCO); + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd= 0; + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd= 0; + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + case CPCO_WAIT_REL_COMP: + if(port_ptr->primitive_cmd == BICC_RELEASE_RSP) + { + port_ptr->primitive_cmd = 0; + tempTimer->user_t10 = 0; + + bicc_send_rlc(pid); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + //port_ptr->fsm_state.cpc_state = BICC_RESET_RSP; + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CPCO); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + bicc_cpc_clear(pid); + return; + } + else if(tempTimer->user_t10-- == BICC_TIMER_EXPIRED) + { + tempTimer->user_t10 = BICC_TIMER_STOP; + bicc_circuit_reset(pid, "user t10 expired cpco wait release complete"); + //bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_send_rlc(pid); + bicc_cpc_clear(pid); + return; + } + + break; + case CPCO_WAIT_RESET: + if(port_ptr->primitive_cmd == BICC_RESET_RSP) + { + port_ptr->primitive_cmd = 0; + //port_ptr->fsm_state.cpc_state = BICC_RESET_RSP; + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CPCO); + bicc_cpc_clear(pid); + return; + } + else if(tempTimer->user_t10-- == BICC_TIMER_EXPIRED) + { + tempTimer->user_t10 = BICC_TIMER_STOP; + bicc_circuit_reset(pid, "user t10 expired cpco wait release complete"); + bicc_cpc_clear(pid); + return; + } + break; + case CPCO_WAIT_GROUP_RESET: + if(port_ptr->primitive_cmd == BICC_RESET_RSP) + { + port_ptr->primitive_cmd = 0; + bicc_cpc_clear(pid); + return; + } + break; + default: + break; + } +} + + +/********************************************************************/ +/* Maintenance Oriented Circuit Group Blocking/Unbolcking Sending */ +/********************************************************************/ +inline void bicc_mgbs_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccTimer_struct *tempTimer = &Bicc_Data.timer_data[pid]; + + u32 circuit_id; + const pal_circuit_struct *pcircuit = NULL; + + circuit_id = pid / BICC_CIRCUIT_CIC; + pcircuit = pal_circuit_ptr(circuit_id); + if(pcircuit == NULL) + return; + if(pcircuit->attrib.plat_id != local_platid ) + if(Bicc_Data.dmp_data.active == 1) + { + if(port_ptr->fsm_state.mgbs_state != MGBS_IDLE) + { + port_ptr->fsm_state.mgbs_state = MGBS_IDLE; + tempTimer->t18 = 0; + tempTimer->t19 = 0; + } + return ; + } + switch(port_ptr->fsm_state.mgbs_state) + { + case MGBS_IDLE: + if(port_ptr->primitive_cmd == BICC_BLOCK_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_localblocking_func(pid, &writePrim_union[pid].cgb_req.rangeStatus); + bicc_send_cgb(pid); + tempTimer->t18 = TIMER_PTR->t18; + tempTimer->t19 = TIMER_PTR->t19; + port_ptr->fsm_state.mgbs_state = MGBS_WAIT_CGBA; + } + else if(port_ptr->primitive_cmd == BICC_UNBLOCK_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_cgu(pid); + tempTimer->t20 = TIMER_PTR->t20; + tempTimer->t21 = TIMER_PTR->t21; + port_ptr->fsm_state.mgbs_state = MGBS_WAIT_CGUA; + } + if(port_ptr->sprc_cmd == M_CGBA) + { + port_ptr->sprc_cmd = 0; + //discard + } + else if(port_ptr->sprc_cmd == M_CGUA) + { + port_ptr->sprc_cmd = 0; + //discard + } + break; + case MGBS_WAIT_CGBA: + if(port_ptr->sprc_cmd == M_CGBA) + { + port_ptr->sprc_cmd = 0; + if(readPrim_union[pid].cgb_cnf.rangeStatus.range >= 32) + return; + tempTimer->t18 = BICC_TIMER_STOP; + tempTimer->t19 = BICC_TIMER_STOP; + port_ptr->fsm_state.mgbs_state = MGBS_IDLE; + bicc_event_handle(pid, &readPrim_union[pid], BICC_BLOCK_CNF, EN_GROUP); + } + + if(tempTimer->t18 -- == BICC_TIMER_EXPIRED) + { + bicc_send_cgb(pid); + tempTimer->t18 = TIMER_PTR->t18; + } + if(tempTimer->t19 -- == BICC_TIMER_EXPIRED) + { + bicc_send_cgb(pid); + tempTimer->t19 = TIMER_PTR->t19; //ignore first T19 expired + } + if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + tempTimer->t18 = BICC_TIMER_STOP; + tempTimer->t19 = BICC_TIMER_STOP; + port_ptr->fsm_state.mgbs_state = MGBS_IDLE; + + } + break; + case MGBS_WAIT_CGUA: + if(port_ptr->sprc_cmd == M_CGUA) + { + port_ptr->sprc_cmd = 0; + if(readPrim_union[pid].cgu_cnf.rangeStatus.range >= 32) + return; + tempTimer->t20 = BICC_TIMER_STOP; + tempTimer->t21 = BICC_TIMER_STOP; + bicc_localunblocking_func(pid, &readPrim_union[pid].cgu_cnf.rangeStatus); + bicc_event_handle(pid, &readPrim_union[pid], BICC_UNBLOCK_CNF, EN_GROUP); + port_ptr->fsm_state.mgbs_state = MGBS_IDLE; + } + + if(tempTimer->t20 -- == BICC_TIMER_EXPIRED) + { + bicc_send_cgu(pid); + tempTimer->t20 = TIMER_PTR->t20; + } + if(tempTimer->t21 -- == BICC_TIMER_EXPIRED) + { + bicc_send_cgb(pid); + tempTimer->t21 = TIMER_PTR->t21; //ignore first T21 expired + } + if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + tempTimer->t20 = BICC_TIMER_STOP; + tempTimer->t21 = BICC_TIMER_STOP; + port_ptr->fsm_state.mgbs_state = MGBS_IDLE; + } + break; + default: + break; + } +} + +/************************************************************************/ +/* Maintenance Oriented Circuit Group Blocking/Unbolcking Reception */ +/************************************************************************/ +inline void bicc_mgbr_proc(u32 pid) +{ + + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + //BiccTimer_struct *tempTimer = &Bicc_Data.timer_data[pid]; + switch(port_ptr->fsm_state.mgbr_state) + { + case MGBR_IDLE: + if(port_ptr->sprc_cmd == M_CGB) + { + port_ptr->sprc_cmd = 0; + if(readPrim_union[pid].cgb_ind.rangeStatus.range >= 32) + return; + bicc_cpcoblocking_func(pid, &readPrim_union[pid].cgb_ind.rangeStatus); + port_ptr->fsm_state.mgbr_state = MGBR_WAIT_BLOCKING_RESP; + bicc_event_handle(pid, &readPrim_union[pid], BICC_BLOCK_IND, EN_GROUP); + } + else if(port_ptr->sprc_cmd == M_CGU) + { + port_ptr->sprc_cmd = 0; + if(readPrim_union[pid].cgu_ind.rangeStatus.range >= 32) + return; + bicc_event_handle(pid, &readPrim_union[pid], BICC_UNBLOCK_IND, EN_GROUP); + port_ptr->fsm_state.mgbr_state = MGBR_WAIT_UNBLOCKING_RESP; + } + break; + case MGBR_WAIT_BLOCKING_RESP: + if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + port_ptr->fsm_state.mgbr_state = MGBR_IDLE; + } + else + { + bicc_remoteblocking_func(pid, &readPrim_union[pid].cgb_ind.rangeStatus); + memcpy(&writePrim_union[pid].cgb_rsp, &readPrim_union[pid].cgb_ind, sizeof(BiccCgb_Ind)); + bicc_send_cgba(pid); + port_ptr->fsm_state.mgbr_state = MGBR_IDLE; + } + break; + case MGBR_WAIT_UNBLOCKING_RESP: + if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + port_ptr->fsm_state.mgbr_state = MGBR_IDLE; + } + else + { + bicc_remoteunblocking_func(pid, &readPrim_union[pid].cgu_ind.rangeStatus); + memcpy(&writePrim_union[pid].cgu_rsp, &readPrim_union[pid].cgu_ind, sizeof(BiccCgu_Ind)); + bicc_send_cgua(pid); + port_ptr->fsm_state.mgbr_state = MGBR_IDLE; + } + break; + default: + break; + } +} + +/********************************************/ +/* Circuit Reset Sending */ +/********************************************/ +BOOL check_crs_waiting(u32 pid) +{ + if(Bicc_Data.port_data[pid].fsm_state.crs_state == CRS_WAIT_REL) + return 1; + else + return 0; +} +inline void bicc_crs_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccTimer_struct *tempTimer = &Bicc_Data.timer_data[pid]; + + u32 circuit_id; + const pal_circuit_struct *pcircuit = NULL; + + circuit_id = pid / BICC_CIRCUIT_CIC; + pcircuit = pal_circuit_ptr(circuit_id); + if(pcircuit == NULL) + return ; + if(pcircuit->attrib.plat_id != local_platid ) + if(Bicc_Data.dmp_data.active == 1) + { + if(port_ptr->fsm_state.crs_state != CRS_IDLE) + { + port_ptr->fsm_state.crs_state = CRS_IDLE; + + tempTimer->t16 = 0; + } + return ; + } + switch(port_ptr->fsm_state.crs_state) + { + case CRS_IDLE: + if(port_ptr->primitive_cmd == BICC_RESET_REQ) + { + port_ptr->primitive_cmd = 0; + port_ptr->cic_state.blo_state &= 0x0e; + port_ptr->cic_state.blo_state &= 0x0d; + bicc_send_rsc(pid); + tempTimer->t16 = TIMER_PTR->t16; + + port_ptr->fsm_state.crs_state = CRS_WAIT_REL; + } + break; + case CRS_WAIT_REL: + if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + tempTimer->t16 = BICC_TIMER_STOP; + port_ptr->fsm_state.crs_state = CRS_IDLE; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_CNF, EN_NONE); + + } + + if(tempTimer->t16 -- == BICC_TIMER_EXPIRED) + { + bicc_send_rsc(pid); + tempTimer->t16 = TIMER_PTR->t16; + } + break; + default: + break; + } +} + +/********************************************/ +/* Circuit Reset Reception */ +/********************************************/ +inline void bicc_crr_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + + + switch(port_ptr->fsm_state.crr_state) + { + case CRR_IDLE: + if(port_ptr->sprc_cmd == M_RSC) + { + port_ptr->sprc_cmd = 0; + + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + port_ptr->cic_state.call_state = BICC_INCOMING; + + port_ptr->internal_cmd = (BICC_CMD_RESET|BICC_SI_CRR); + + if(port_ptr->cic_state.blo_state & M_LOCAL_BLOCK) + port_ptr->cic_state.blo_state &= 0x0e; + port_ptr->cic_state.blo_state &= 0x0d; + port_ptr->fsm_state.crr_state = CRR_WAIT_RESPONSE; + port_ptr->internal_cmd = (BICC_CMD_RESET|BICC_SI_CRR); + + } + break; + case CRR_WAIT_RESPONSE: + //if((port_ptr->internal_cmd & 0x0F) == CMD_RESET_COMP) + // if(port_ptr->primitive_cmd == BICC_RESET_RSP) + { + port_ptr->internal_cmd = 0; + writePrim_union[pid].rel_rsp.cause.pres = 0; + bicc_send_rlc(pid); + port_ptr->fsm_state.crr_state = CRR_IDLE; + } + break; + default: + break; + } +} + +/************************************************/ +/* Circuit Group Reset Sending */ +/************************************************/ +inline void bicc_cgrs_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccTimer_struct *tempTimer = &Bicc_Data.timer_data[pid]; + u32 circuit_id; + const pal_circuit_struct *pcircuit = NULL; + + circuit_id = pid / BICC_CIRCUIT_CIC; + pcircuit = pal_circuit_ptr(circuit_id); + if(pcircuit == NULL) + return ; + if(pcircuit->attrib.plat_id != local_platid ) + if(Bicc_Data.dmp_data.active == 1) + { + if(port_ptr->fsm_state.cgrs_state != CGRS_IDLE) + { + port_ptr->fsm_state.cgrs_state = CGRS_IDLE; + + tempTimer->t22 = 0; + } + return ; + } + switch(port_ptr->fsm_state.cgrs_state) + { + case CGRS_IDLE: + if(port_ptr->primitive_cmd == BICC_GROUP_RESET_REQ) + { + port_ptr->primitive_cmd = 0; + if(port_ptr->fsm_state.mgbs_state != MGBS_IDLE) + port_ptr->internal_cmd = (BICC_CMD_RESET|BICC_SI_CGRS); + bicc_cgrs_func(pid, writePrim_union[pid].grs_req.rangeStatus.range); + bicc_send_grs(pid); + tempTimer->t22 = TIMER_PTR->t22; + port_ptr->fsm_state.cgrs_state = CGRS_WAIT_GRA; + } + break; + case CGRS_WAIT_GRA: + if(port_ptr->sprc_cmd == M_GRA) + { + port_ptr->sprc_cmd = 0; + tempTimer->t22 = BICC_TIMER_STOP; + port_ptr->fsm_state.cgrs_state = CGRS_IDLE; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_CNF, EN_GROUP); + bicc_cgrsack_func(pid, &readPrim_union[pid].grs_cnf.rangeStatus); + } + + if(tempTimer->t22 -- == BICC_TIMER_EXPIRED) + { + bicc_send_grs(pid); + tempTimer->t22 = TIMER_PTR->t22; + + } + break; + default: + break; + } +} + +/****************************************************/ +/* Circuit Group Reset Reception */ +/****************************************************/ +inline void bicc_cgrr_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + + switch(port_ptr->fsm_state.cgrr_state) + { + case CGRR_IDLE: + if(port_ptr->sprc_cmd == M_GRS) + { + port_ptr->sprc_cmd = 0; + if((readPrim_union[pid].grs_ind.rangeStatus.range >= 32)|| (readPrim_union[pid].grs_ind.rangeStatus.range == 0)) + return; + if(port_ptr->fsm_state.mgbr_state != MGBR_IDLE) + port_ptr->internal_cmd = (BICC_CMD_RESET|BICC_SI_CGRR); + bicc_cgrr_func(pid, readPrim_union[pid].grs_ind.rangeStatus.range, &msg_union[pid].gra.rangeStatus); + port_ptr->fsm_state.cgrr_state = CGRR_WAIT_GROUP_RESET_COMP; + } + break; + case CGRR_WAIT_GROUP_RESET_COMP: + memcpy(&writePrim_union[pid].grs_rsp.rangeStatus, &msg_union[pid].gra.rangeStatus, sizeof(RangeStatus_struct)); + bicc_send_gra(pid); + port_ptr->internal_cmd = 0; + port_ptr->fsm_state.cgrr_state = CGRR_IDLE; + break; + default: + break; + } +} + + + +BOOL bicc_check_blocking(u32 circuit_id, RangeStatus_struct *rs_ptr) +{ + int i; + BOOL ret = 0; + const pal_circuit_struct *pcircuit = NULL; + + pcircuit = pal_circuit_ptr(circuit_id); + if(pcircuit == NULL) + return ret; + memset(rs_ptr, 0, sizeof(RangeStatus_struct)); + rs_ptr->range = BICC_CIRCUIT_CIC- 1; + for(i = pcircuit->attrib.head_cic; i < (pcircuit->attrib.head_cic + pcircuit->attrib.cic_range); i++) + { + if((Bicc_Data.port_data[i].cic_state.blo_state == 0) && (pcircuit->enable== 1)) + { + rs_ptr->status[i>>3]|= 0x01 << (i&0x07); + ret = 1; + } + } + return ret; +} + +BOOL bicc_check_unblocking(u32 circuit_id, RangeStatus_struct *rs_ptr) +{ + int i; + BOOL ret = 0; + const pal_circuit_struct *pcircuit = NULL; + + pcircuit = pal_circuit_ptr(circuit_id); + if(pcircuit == NULL) + return ret; + memset(rs_ptr, 0, sizeof(RangeStatus_struct)); + rs_ptr->range = BICC_CIRCUIT_CIC - 1; + for(i = pcircuit->attrib.head_cic; i < (pcircuit->attrib.head_cic + pcircuit->attrib.cic_range); i++) + { + if((pcircuit->enable== 1) && (Bicc_Data.port_data[i].cic_state.blo_state == 1)) + { + rs_ptr->status[i>>3]|= 0x01 << (i&0x07); + ret = 1; + } + } + return ret; +} + +BOOL bicc_trunk_reachable(u32 cg_id) +{ + const pal_cg_struct *pcg; + pcg = pal_cg_ptr(cg_id); + if(pcg==NULL) + return 0; + if(check_outbound_route(pcg->attrib.network_id, (long)pcg->attrib.dpc, 0) >= 0) + return 1; + else + return 0; +} + diff --git a/omc/plat/bicc/src.old/bicc_ipbcp.c b/omc/plat/bicc/src.old/bicc_ipbcp.c new file mode 100644 index 0000000..a5de374 --- /dev/null +++ b/omc/plat/bicc/src.old/bicc_ipbcp.c @@ -0,0 +1,362 @@ +#include +#include +#include "./include/ipbcp.h" + +int sdp_decode_orig(SdpOrig_struct *dst_ptr, char *src_ptr) +{ + char *token; + unsigned char field_id = 0; + + while((token = strsep(&src_ptr, " ")) != NULL) + { + switch(++field_id) + { + case 1: + sprintf(dst_ptr->username, token); + strcat(dst_ptr->username, "\0"); + break; + case 2: + sprintf(dst_ptr->session_id, token); + strcat(dst_ptr->session_id, "\0"); + break; + case 3: + sprintf(dst_ptr->version, token); + strcat(dst_ptr->version, "\0"); + break; + case 4: + sprintf(dst_ptr->network_type, token); + strcat(dst_ptr->network_type, "\0"); + break; + case 5: + sprintf(dst_ptr->address_type, token); + strcat(dst_ptr->address_type, "\0"); + break; + case 6: + sprintf(dst_ptr->address, token); + strcat(dst_ptr->address, "\0"); + break; + default: + return 0; + } + } + if(field_id != 6) + return 0; + else + return 1; +} + +int sdp_decode_conn(SdpConn_struct *dst_ptr, char *src_ptr) +{ + char *token; + unsigned char field_id = 0; + + while((token = strsep(&src_ptr, " ")) != NULL) + { + switch(++field_id) + { + case 1: + sprintf(dst_ptr->network_type, token); + strcat(dst_ptr->network_type, "\0"); + break; + case 2: + sprintf(dst_ptr->address_type, token); + strcat(dst_ptr->address_type, "\0"); + break; + case 3: + sprintf(dst_ptr->address, token); + strcat(dst_ptr->address, "\0"); + break; + default: + return 0; + } + } + if(field_id != 3) + return 0; + else + return 1; +} + +int sdp_decode_time(SdpTime_struct *dst_ptr, char *src_ptr) +{ + char *token; + unsigned char field_id = 0; + + while((token = strsep(&src_ptr, " ")) != NULL) + { + switch(++field_id) + { + case 1: + sprintf(dst_ptr->start, token); + strcat(dst_ptr->start, "\0"); + break; + case 2: + sprintf(dst_ptr->stop, token); + strcat(dst_ptr->stop, "\0"); + break; + default: + return 0; + } + } + if(field_id != 2) + return 0; + else + return 1; +} + +int sdp_decode_attrib(SdpAttrib_struct *dst_ptr, char *src_ptr) +{ + char *token; + unsigned char field_id = 0; + + if(strstr(src_ptr, "ipbcp:") != src_ptr) + return 0; + src_ptr += strlen("ipbcp:"); + while((token = strsep(&src_ptr, " ")) != NULL) + { + switch(++field_id) + { + case 1: + sprintf(dst_ptr->version, token); + strcat(dst_ptr->version, "\0"); + break; + case 2: + sprintf(dst_ptr->type, token); + strcat(dst_ptr->type, "\0"); + break; + default: + return 0; + } + } + if(field_id != 2) + return 0; + else + return 1; +} + +int sdp_decode_mediaAnn(SdpMediaAnn_struct *dst_ptr, char *src_ptr) +{ + char *token; + unsigned char field_id = 0; + + while((token = strsep(&src_ptr, " ")) != NULL) + { + switch(++field_id) + { + case 1: + sprintf(dst_ptr->media, token); + strcat(dst_ptr->media, "\0"); + break; + case 2: + sprintf(dst_ptr->port, token); + strcat(dst_ptr->port, "\0"); + break; + case 3: + sprintf(dst_ptr->transport, token); + strcat(dst_ptr->transport, "\0"); + strcpy(dst_ptr->fmt_list, src_ptr); + strcat(dst_ptr->fmt_list, "\0"); + break; + case 4: + // sprintf(dst_ptr->fmt_list, token); + break; + default: + break; + } + } + if(field_id < 4) + return 0; + else + return 1; +} + +int sdp_decode_mediaAtt(SdpMediaAtt_struct *dst_ptr, char *src_ptr) +{ + char *token; + unsigned char field_id = 0; + + if(strstr(src_ptr, "rtpmap:") != src_ptr) + return 0; + src_ptr += strlen("rtpmap:"); + while((token = strsep(&src_ptr, " /")) != NULL) + { + switch(++field_id) + { + case 1: + sprintf(dst_ptr->payload, token); + strcat(dst_ptr->payload, "\0"); + break; + case 2: + sprintf(dst_ptr->encoding_name, token); + strcat(dst_ptr->encoding_name, "\0"); + break; + case 3: + sprintf(dst_ptr->clock_rate, token); + strcat(dst_ptr->clock_rate, "\0"); + break; + case 4: +// sprintf(dst_ptr->p_time, token); + field_id --;//to avoid 4 fields + break; + default: + return 0; + } + } + if(field_id != 3) + return 0; + else + return 1; +} + + +int sdp_decode_ptime(char* p_time, char *src_ptr) +{ + char *token; + if((token = strstr(src_ptr, "ptime:")) == NULL) + return 0; + token = strtok(token, ":"); + token = strtok(NULL, ":"); +// p_time = token; +// if(strlen(token)<8) + if(token) + { + sprintf(p_time, token); + strcat(p_time, "\0"); + } + return 1; + +} + +int ipbcp_decode(IPBCP_struct *ipbcp_ptr, const char *ptr) +{ + char *token; + unsigned char field_id = 0; + char temp_ipbcp[200]; + char *temp_ptr; + + strncpy(temp_ipbcp, ptr, 200); + temp_ptr = temp_ipbcp; + memset(ipbcp_ptr, 0, sizeof(IPBCP_struct)); + while((token = strsep(&temp_ptr, "\r\n")) != NULL) + { + if(strlen(token) == 0) + continue; + switch(++field_id) + { + case 1: + if((token[0] != 'v') || (token[1] != '=')) + return 0; + sprintf(ipbcp_ptr->proto_ver, token+2); + strcat(ipbcp_ptr->proto_ver, "\0"); + break; + case 2: + if((token[0] != 'o') || (token[1] != '=')) + return 0; + if(!sdp_decode_orig(&ipbcp_ptr->orig, token+2)) + return 0; + break; + case 3: + if((token[0] != 's') || (token[1] != '=')) + return 0; + sprintf(ipbcp_ptr->session_name, token+2); + + strcat(ipbcp_ptr->session_name, "\0"); + break; + case 4: + if((token[0] != 'c') || (token[1] != '=')) + return 0; + if(!sdp_decode_conn(&ipbcp_ptr->conn_data, token+2)) + return 0; + break; + case 5: + if((token[0] != 't') || (token[1] != '=')) + return 0; + if(!sdp_decode_time(&ipbcp_ptr->time, token+2)) + return 0; + break; + case 6: + if((token[0] != 'a') || (token[1] != '=')) + return 0; + if(!sdp_decode_attrib(&ipbcp_ptr->attrib, token+2)) + return 0; + break; + case 7: + if((token[0] != 'm') || (token[1] != '=')) + return 0; + if(!sdp_decode_mediaAnn(&ipbcp_ptr->m_ann, token+2)) + return 0; + break; + case 8: + if((token[0] != 'a') || (token[1] != '=')) + return 0; + if(sdp_decode_mediaAtt(&ipbcp_ptr->m_att, token+2)) + // return 0; + ; + else if(!sdp_decode_ptime(ipbcp_ptr->ptime, token+2)) + return 0; + + break; + case 9: + if((token[0] != 'a') || (token[1] != '=')) + return 0; + if(!sdp_decode_ptime(ipbcp_ptr->ptime, token+2)) + return 0; + default: + break; + } + } + return 1; +} + +int ipbcp_encode(char *ptr, const IPBCP_struct *ipbcp_ptr) +{ + char tmp_buf[128]; + + sprintf(ptr, "v=%s\r\n", ipbcp_ptr->proto_ver); + + sprintf(tmp_buf, "o=%s %s %s %s %s %s\r\n", + ipbcp_ptr->orig.username, + ipbcp_ptr->orig.session_id, + ipbcp_ptr->orig.version, + ipbcp_ptr->orig.network_type, + ipbcp_ptr->orig.address_type, + ipbcp_ptr->orig.address); + strcat(ptr, tmp_buf); + + sprintf(tmp_buf, "s=%s\r\n", ipbcp_ptr->session_name); + strcat(ptr, tmp_buf); + + sprintf(tmp_buf, "c=%s %s %s\r\n", + ipbcp_ptr->conn_data.network_type, + ipbcp_ptr->conn_data.address_type, + ipbcp_ptr->conn_data.address); + strcat(ptr, tmp_buf); + + sprintf(tmp_buf, "t=%s %s\r\n", ipbcp_ptr->time.start, ipbcp_ptr->time.stop); + strcat(ptr, tmp_buf); + + sprintf(tmp_buf, "a=ipbcp:%s %s\r\n", ipbcp_ptr->attrib.version, ipbcp_ptr->attrib.type); + strcat(ptr, tmp_buf); + + sprintf(tmp_buf, "m=%s %s %s %s\r\n", + ipbcp_ptr->m_ann.media, + ipbcp_ptr->m_ann.port, + ipbcp_ptr->m_ann.transport, + ipbcp_ptr->m_ann.fmt_list); + strcat(ptr, tmp_buf); + + if(strlen(ipbcp_ptr->m_att.payload) != 0) + { + sprintf(tmp_buf, "a=rtpmap:%s %s/%s\r\n", + ipbcp_ptr->m_att.payload, + ipbcp_ptr->m_att.encoding_name, + ipbcp_ptr->m_att.clock_rate); + strcat(ptr, tmp_buf); + } + //ipbcp_ptr->ptime[7]='\0'; + if((ipbcp_ptr->ptime[0] != '\0') && (strlen(ipbcp_ptr->ptime)<8)) + { + sprintf(tmp_buf, "a=ptime:%s\r\n", ipbcp_ptr->ptime); + strcat(ptr, tmp_buf); + } + return strlen(ptr); +} diff --git a/omc/plat/bicc/src.old/bicc_msg.c b/omc/plat/bicc/src.old/bicc_msg.c new file mode 100644 index 0000000..9ba7769 --- /dev/null +++ b/omc/plat/bicc/src.old/bicc_msg.c @@ -0,0 +1,1285 @@ +#include "./include/inc.h" +#include "./include/var_ext.h" + +BiccMsg_union msg_union[BICC_MAX_PORT]; +//static up_message_2 up_msg; +extern void apm_decode(ApmUser_struct *ptr, const u8 *flw_ptr, u8 length); +extern u32 apm_encode(u8 *flw_ptr, const ApmUser_struct *ptr); +extern void bicc_prm2msg(BiccMsg_union *msg_ptr, BiccWritePrim_union *prm_ptr, u8 msg_type); + +void bicc_decode_app(AppTrans_struct *ptr, const u8 *flw_ptr, u8 length) +{ + int i = 0; + + ptr->pres = 1; + ptr->aci[0] = flw_ptr[i]; + if((flw_ptr[i++] >> 7) == 0) + ptr->aci[1] = flw_ptr[i++]; + ptr->sni = (flw_ptr[i] >> 1) & 0x01; + ptr->rci = flw_ptr[i++] & 0x01; + ptr->si = (flw_ptr[i] >> 6) & 0x01; + ptr->segment = flw_ptr[i] & 0x3f; + if((flw_ptr[i++] >> 7) == 0) + ptr->slr = flw_ptr[i++] & 0x7f; + if(length > i) + apm_decode(&ptr->apm_info, flw_ptr+i, length-i); +} + +u32 bicc_encode_app(u8 *flw_ptr, const AppTrans_struct *ptr) +{ + int i = 0; + + flw_ptr[i++] = ptr->aci[0] | 0x80; +// if((ptr->aci[0] >> 7) == 0) +// flw_ptr[i++] = ptr->aci[1]; + flw_ptr[i++] = (ptr->sni << 1) + ptr->rci; + flw_ptr[i++] = ((ptr->si << 6) + ptr->segment) | 0x80; + return i + apm_encode(flw_ptr+i, &ptr->apm_info); +} + +void bicc_decode_backcall(BackCallInd_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val[0] = flw_ptr[0]; + ptr->val[1] = flw_ptr[1]; +} + +u32 bicc_encode_backcall(u8 *flw_ptr, const BackCallInd_struct *ptr) +{ + flw_ptr[0] = ptr->val[0]; + flw_ptr[1] = ptr->val[1]; + return 2; +} + +void bicc_decode_calledptynum(CalledPtyNum_struct *ptr, const u8 *flw_ptr, u8 length) +{ + u32 i, j; + u8 num_len; + const u8 *num_ptr; + + if(length <= 2) + return; + ptr->pres = 1; + ptr->nai = flw_ptr[0] & 0x7f; + ptr->inn = flw_ptr[1] >> 7; + ptr->npi = (flw_ptr[1] >> 4) & 0x07; + num_len = length - 2; + num_ptr = flw_ptr + 2; + for(i = 0, j = 0; i < num_len; i++) + { + ptr->digit[j++] = num_ptr[i] & 0x0f; + ptr->digit[j++] = num_ptr[i] >> 4; + } + if((flw_ptr[0] >> 7) && (j > 0)) + j--; + ptr->numOfDigit = j; +} + +u32 bicc_encode_calledptynum(u8 *flw_ptr, const CalledPtyNum_struct *ptr) +{ + u32 i, j; + u8 num_len; + u8 *num_ptr; + + num_len = ptr->numOfDigit/2 + (ptr->numOfDigit & 0x01); + num_ptr = flw_ptr + 2; + flw_ptr[0] = (ptr->numOfDigit << 7) + ptr->nai; + flw_ptr[1] = ((ptr->inn << 7) + (ptr->npi << 4)) & 0xf0; + for(i = 0, j = 0; i < num_len; i++) + { + num_ptr[i] = ptr->digit[j++] & 0x0f; + num_ptr[i] += ptr->digit[j++] << 4; + } + if(ptr->numOfDigit & 0x01) + num_ptr[i] &= 0x0f; + return num_len + 2; +} + +void bicc_decode_callingptynum(CallingPtyNum_struct *ptr, const u8 *flw_ptr, u8 length) +{ + u32 i, j; + u8 num_len; + const u8 *num_ptr; + + if(length <= 2) + return; + ptr->pres = 1; + ptr->nai = flw_ptr[0] & 0x7f; + ptr->ni = flw_ptr[1] >> 7; + ptr->npi = (flw_ptr[1] >> 4) & 0x07; + ptr->apri = (flw_ptr[1] >> 2) & 0x03; + ptr->si = flw_ptr[1] & 0x03; + num_len = length - 2; + num_ptr = flw_ptr + 2; + for(i = 0, j = 0; i < num_len; i++) + { + ptr->digit[j++] = num_ptr[i] & 0x0f; + ptr->digit[j++] = num_ptr[i] >> 4; + } + if((flw_ptr[0] >> 7) && (j > 0)) + j--; + ptr->numOfDigit = j; +} + +u32 bicc_encode_callingptynum(u8 *flw_ptr, const CallingPtyNum_struct *ptr) +{ + u32 i, j; + u8 num_len; + u8 *num_ptr; + + num_len = ptr->numOfDigit/2 + (ptr->numOfDigit & 0x01); + num_ptr = flw_ptr + 2; + flw_ptr[0] = (ptr->numOfDigit << 7) + ptr->nai; + flw_ptr[1] = (ptr->ni << 7) + (ptr->npi << 4) + (ptr->apri << 2) + ptr->si; + for(i = 0, j = 0; i < num_len; i++) + { + num_ptr[i] = ptr->digit[j++] & 0x0f; + num_ptr[i] += ptr->digit[j++] << 4; + } + if(ptr->numOfDigit & 0x01) + num_ptr[i] &= 0x0f; + return num_len + 2; +} + +void bicc_decode_callingptycat(CallingPtyCat_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val = *flw_ptr; +} + +u32 bicc_encode_callingptycat(u8 *flw_ptr, const CallingPtyCat_struct *ptr) +{ + flw_ptr[0] = ptr->val; + return 1; +} + + +u32 bicc_encode_cause(u8 *flw_ptr, const CauseInd_struct *ptr) +{ + flw_ptr[0] = ((ptr->codingStd << 5) + ptr->location) & 0x7f; + flw_ptr[1] = 0x80 | ptr->causeVal; + return 2; +} + +void bicc_decode_cause(CauseInd_struct *ptr, const u8 *flw_ptr, u8 length) +{ + ptr->pres = 1; + ptr->codingStd = (flw_ptr[0] >> 5) & 0x03; + ptr->location = flw_ptr[0] & 0x0f; + ptr->causeVal = flw_ptr[1] & 0x7f; +} + + +void bicc_decode_cicgrpspv(CicGrpSpv_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val = *flw_ptr; +} + +u32 bicc_encode_cicgrpspv(u8 *flw_ptr, const CicGrpSpv_struct *ptr) +{ + flw_ptr[0] = ptr->val; + return 1; +} + +void bicc_decode_collectcallreq(CollectCallReq_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val = *flw_ptr; +} + +u32 bicc_encode_collectcallreq(u8 *flw_ptr, const CollectCallReq_struct *ptr) +{ + flw_ptr[0] = ptr->val; + return 1; +} + +void bicc_decode_conftreat(ConfTreatInd_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val = *flw_ptr; +} + +u32 bicc_encode_conftreat(u8 *flw_ptr, const ConfTreatInd_struct *ptr) +{ + flw_ptr[0] = ptr->val; + return 1; +} + +void bicc_decode_connnum(ConnNum_struct *ptr, const u8 *flw_ptr, u8 length) +{ + u32 i, j; + u8 num_len; + const u8 *num_ptr; + + if(length <= 2) + return; + ptr->pres = 1; + ptr->nai = flw_ptr[0] & 0x7f; + ptr->npi = (flw_ptr[1] >> 4) & 0x07; + ptr->apri = (flw_ptr[1] >> 2) & 0x03; + ptr->si = flw_ptr[1] & 0x03; + num_len = length - 2; + num_ptr = flw_ptr + 2; + for(i = 0, j = 0; i < num_len; i++) + { + ptr->digit[j++] = num_ptr[i] & 0x0f; + ptr->digit[j++] = num_ptr[i] >> 4; + } + if((flw_ptr[0] >> 7) && (j > 0)) + j--; + ptr->numOfDigit = j; +} + +u32 bicc_encode_connnum(u8 *flw_ptr, const ConnNum_struct *ptr) +{ + u32 i, j; + u8 num_len; + u8 *num_ptr; + + num_len = ptr->numOfDigit/2 + (ptr->numOfDigit & 0x01); + num_ptr = flw_ptr + 2; + flw_ptr[0] = (ptr->numOfDigit << 7) + ptr->nai; + flw_ptr[1] = ((ptr->npi << 4) + (ptr->apri << 2) + ptr->si) & 0x7f; + for(i = 0, j = 0; i < num_len; i++) + { + num_ptr[i] = ptr->digit[j++] & 0x0f; + num_ptr[i] += ptr->digit[j++] << 4; + } + if(ptr->numOfDigit & 0x01) + num_ptr[i] &= 0x0f; + return num_len + 2; +} + +void bicc_decode_genericnumber(GenericNumber_struct *ptr, const u8 *flw_ptr, u8 length) +{ + u32 i, j; + u8 num_len; + const u8 *num_ptr; + + if(length <= 3) + return; + ptr->pres = 1; + ptr->nqi = flw_ptr[0]; + ptr->nai = flw_ptr[1] & 0x7f; + ptr->ni = flw_ptr[2] >> 7; + ptr->npi = (flw_ptr[2] >> 4) & 0x07; + ptr->apri = (flw_ptr[2] >> 2) & 0x03; + ptr->si = flw_ptr[2] & 0x03; + num_len = length - 3; + num_ptr = flw_ptr + 3; + for(i = 0, j = 0; i < num_len; i++) + { + ptr->digit[j++] = num_ptr[i] & 0x0f; + ptr->digit[j++] = num_ptr[i] >> 4; + } + if((flw_ptr[1] >> 7) && (j > 0)) + j--; + ptr->numOfDigit = j; +} + +void bicc_decode_genericDigits(GenericDigits_struct *ptr, const u8 *flw_ptr, u8 length) +{ + u8 num_len; + int i, j; + const u8 *num_ptr; + if(length < 3) + return; + ptr->pres = 1; + + ptr->typeOfDigits = flw_ptr[0] & 0x1f; + ptr->encodeScheme = flw_ptr[0] & 0xE0; + num_len = length - 2; + num_ptr = flw_ptr + 2; + for(i = 0, j = 0; i < num_len; i++) + { + ptr->digits[j++] = num_ptr[i] & 0x0f; + ptr->digits[j++] = num_ptr[i] >> 4; + } + if((flw_ptr[0] >> 5) && (j > 0)) + j--; + ptr->numOfDigit = j; + +} + + + + +void bicc_decode_correlationid(CorrelationId_struct *ptr, const u8 *flw_ptr, u8 length) +{ + bicc_decode_genericDigits(ptr, flw_ptr, length); +} + + +u32 bicc_encode_genericnumber(u8 *flw_ptr, const GenericNumber_struct *ptr) +{ + u32 i, j; + u8 num_len; + u8 *num_ptr; + + num_len = ptr->numOfDigit/2 + (ptr->numOfDigit & 0x01); + num_ptr = flw_ptr + 3; + flw_ptr[0] = ptr->nqi; + flw_ptr[1] = (ptr->numOfDigit << 7) + ptr->nai; + flw_ptr[2] = (ptr->ni << 7) + (ptr->npi << 4) + (ptr->apri << 2) + ptr->si; + for(i = 0, j = 0; i < num_len; i++) + { + num_ptr[i] = ptr->digit[j++] & 0x0f; + num_ptr[i] += ptr->digit[j++] << 4; + } + if(ptr->numOfDigit & 0x01) + num_ptr[i] &= 0x0f; + return num_len + 3; +} + +u32 bicc_encode_genericDigits(u8 *flw_ptr, const GenericDigits_struct *ptr) +{ + u32 i, j; + u8 num_len; + u8 *num_ptr; + num_ptr = flw_ptr + 1; + flw_ptr[0] = (ptr->encodeScheme << 5) + ptr->typeOfDigits; + flw_ptr[1] = ptr->numOfDigit & 0xff; + num_len = ptr->numOfDigit/2 + (ptr->numOfDigit & 0x01); + for(i = 0, j = 0; i < num_len; i++) + { + num_ptr[i] = ptr->digits[j++] & 0x0f; + num_ptr[i] += ptr->digits[j++] << 4; + } + if(ptr->numOfDigit & 0x01) + num_ptr[i] &= 0x0f; + return num_len + 2; + +} + + +u32 bicc_encode_correlationid(u8 *flw_ptr, const CorrelationId_struct *ptr) +{ + return bicc_encode_genericDigits(flw_ptr, ptr); + +} + +void bicc_decode_eventinfo(EventInfo_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val = *flw_ptr; +} + +u32 bicc_encode_eventinfo(u8 *flw_ptr, const EventInfo_struct *ptr) +{ + flw_ptr[0] = ptr->val; + return 1; +} + +void bicc_decode_fwdcall(FwdCallInd_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val[0] = flw_ptr[0]; + ptr->val[1] = flw_ptr[1]; +} + +u32 bicc_encode_fwdcall(u8 *flw_ptr, const FwdCallInd_struct *ptr) +{ + flw_ptr[0] = ptr->val[0]; + flw_ptr[1] = ptr->val[1]; + return 2; +} + + +void bicc_decode_natconn(NatConnInd_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val = *flw_ptr; +} + +u32 bicc_encode_natconn(u8 *flw_ptr, const NatConnInd_struct *ptr) +{ + flw_ptr[0] = ptr->val; + return 1; +} + +void bicc_decode_origcallednum(OrigCalledNum_struct *ptr, const u8 *flw_ptr, u8 length) +{ + u32 i, j; + u8 num_len; + const u8 *num_ptr; + + if(length <= 2) + return; + ptr->pres = 1; + ptr->nai = flw_ptr[0] & 0x7f; + ptr->npi = (flw_ptr[1] >> 4) & 0x07; + ptr->apri = (flw_ptr[1] >> 2) & 0x03; + num_len = length - 2; + num_ptr = flw_ptr + 2; + for(i = 0, j = 0; i < num_len; i++) + { + ptr->digit[j++] = num_ptr[i] & 0x0f; + ptr->digit[j++] = num_ptr[i] >> 4; + } + if((flw_ptr[0] >> 7) && (j > 0)) + j--; + ptr->numOfDigit = j; +} + +u32 bicc_encode_origcallednum(u8 *flw_ptr, const OrigCalledNum_struct *ptr) +{ + u32 i, j; + u8 num_len; + u8 *num_ptr; + + num_len = ptr->numOfDigit/2 + (ptr->numOfDigit & 0x01); + num_ptr = flw_ptr + 2; + flw_ptr[0] = (ptr->numOfDigit << 7) + ptr->nai; + flw_ptr[1] = ((ptr->npi << 4) + (ptr->apri << 2)) & 0x7c; + for(i = 0, j = 0; i < num_len; i++) + { + num_ptr[i] = ptr->digit[j++] & 0x0f; + num_ptr[i] += ptr->digit[j++] << 4; + } + if(ptr->numOfDigit & 0x01) + num_ptr[i] &= 0x0f; + return num_len + 2; +} + +void bicc_decode_rangestatus(RangeStatus_struct *ptr, const u8 *flw_ptr, u8 length, u8 need_status) +{ + u8 status_len; + + ptr->pres = 1; + ptr->range = flw_ptr[0]; + if(need_status == 1) + { + status_len = (((flw_ptr[0]+1)&0x07) == 0)? ((flw_ptr[0]+1)>>3) : (((flw_ptr[0]+1)>>3) + 1); + memcpy(ptr->status, flw_ptr+1, status_len); + } +} + +u32 bicc_encode_rangestatus(u8 *flw_ptr, const RangeStatus_struct *ptr, u8 need_status) +{ + u8 status_len; + + flw_ptr[0] = ptr->range; + if(need_status == 1) + { + status_len = (((ptr->range+1)&0x07) == 0)? ((ptr->range+1)>>3) : (((ptr->range+1)>>3) + 1); + memcpy(flw_ptr+1, ptr->status, status_len); + } + else + status_len = 0; + return status_len + 1; +} + +void bicc_decode_redirgnum(RedirgNum_struct *ptr, const u8 *flw_ptr, u8 length) +{ + u32 i, j; + u8 num_len; + const u8 *num_ptr; + + if(length <= 2) + return; + ptr->pres = 1; + ptr->nai = flw_ptr[0] & 0x7f; + ptr->npi = (flw_ptr[1] >> 4) & 0x07; + ptr->apri = (flw_ptr[1] >> 2) & 0x03; + num_len = length - 2; + num_ptr = flw_ptr + 2; + for(i = 0, j = 0; i < num_len; i++) + { + ptr->digit[j++] = num_ptr[i] & 0x0f; + ptr->digit[j++] = num_ptr[i] >> 4; + } + if((flw_ptr[0] >> 7) && (j > 0)) + j--; + ptr->numOfDigit = j; +} + +void bicc_decode_redirinfo(RedirInfo_struct *ptr, u8 *flw_ptr, u8 length) +{ + if(length <= 2) + return; + ptr->redInd = flw_ptr[0] & 0x07; + ptr->origRedirReason = (flw_ptr[0] >> 4) & 0x0f; + ptr->redirCounter = flw_ptr[1] & 0x07; + ptr->redirReason = (flw_ptr[1] >> 4) & 0x0f; +} + +u32 bicc_encode_redirgnum(u8 *flw_ptr, const RedirgNum_struct *ptr) +{ + u32 i, j; + u8 num_len; + u8 *num_ptr; + + num_len = ptr->numOfDigit/2 + (ptr->numOfDigit & 0x01); + num_ptr = flw_ptr + 2; + flw_ptr[0] = (ptr->numOfDigit << 7) + ptr->nai; + flw_ptr[1] = ((ptr->npi << 4) + (ptr->apri << 2)) & 0x7c; + for(i = 0, j = 0; i < num_len; i++) + { + num_ptr[i] = ptr->digit[j++] & 0x0f; + num_ptr[i] += ptr->digit[j++] << 4; + } + if(ptr->numOfDigit & 0x01) + num_ptr[i] &= 0x0f; + return num_len + 2; +} + +u32 bicc_encode_redirinfo(u8 *flw_ptr, const RedirInfo_struct *ptr) +{ + flw_ptr[0] = (ptr->origRedirReason << 4) + ptr->redInd; + flw_ptr[1] = (ptr->redirReason << 4) + ptr->redirCounter; + return 2; +} + +void bicc_decode_scfid(ScfId_struct *ptr, const u8 *flw_ptr, u8 length) +{ + bicc_decode_genericDigits(ptr, flw_ptr, length); +} + +u32 bicc_encode_scfid(u8 *flw_ptr, const ScfId_struct *ptr) +{ + return bicc_encode_genericDigits(flw_ptr, ptr); +} + +void bicc_decode_subseqnum(SubseqNum_struct *ptr, const u8 *flw_ptr, u8 length) +{ + u32 i, j; + u8 num_len; + const u8 *num_ptr; + + if(length <= 1) + return; + ptr->pres = 1; + num_len = length - 1; + num_ptr = flw_ptr + 1; + for(i = 0, j = 0; i < num_len; i++) + { + ptr->digit[j++] = num_ptr[i] & 0x0f; + ptr->digit[j++] = num_ptr[i] >> 4; + } + if((flw_ptr[0] >> 7) && (j > 0)) + j--; + ptr->numOfDigit = j; +} + +u32 bicc_encode_subseqnum(u8 *flw_ptr, const SubseqNum_struct *ptr) +{ + u32 i, j; + u8 num_len; + u8 *num_ptr; + + num_len = ptr->numOfDigit/2 + (ptr->numOfDigit & 0x01); + num_ptr = flw_ptr + 1; + flw_ptr[0] = (ptr->numOfDigit & 0x01) << 7; + for(i = 0, j = 0; i < num_len; i++) + { + num_ptr[i] = ptr->digit[j++] & 0x0f; + num_ptr[i] += ptr->digit[j++] << 4; + } + if(ptr->numOfDigit & 0x01) + num_ptr[i] &= 0x0f; + return num_len + 2; +} + +void bicc_decode_susres(SusResInd_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val = *flw_ptr; +} + +u32 bicc_encode_susres(u8 *flw_ptr, const SusResInd_struct *ptr) +{ + flw_ptr[0] = ptr->val; + return 1; +} + +void bicc_decode_transmedreq(TransMedReq_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val = *flw_ptr; +} + +u32 bicc_encode_transmedreq(u8 *flw_ptr, const TransMedReq_struct *ptr) +{ + flw_ptr[0] = ptr->val; + return 1; +} + +void bicc_decode_utuind(UserToUserInd_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val = *flw_ptr; +} + +u32 bicc_encode_utuind(u8 *flw_ptr, const UserToUserInd_struct *ptr) +{ + flw_ptr[0] = ptr->val; + return 1; +} + +void bicc_decode_utuinfo(UserToUserInfo_struct *ptr, const u8 *flw_ptr, u8 length) +{ + if((length == 0) || (length > 129)) + return; + ptr->pres = 1; + ptr->len = length; + memcpy(ptr->val, flw_ptr, length); +} + +u32 bicc_encode_utuinfo(u8 *flw_ptr, const UserToUserInfo_struct *ptr) +{ + memcpy(flw_ptr, ptr->val, ptr->len); + return ptr->len; +} + +void bicc_decode_calldiverinfo(CallDiverInfo_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->notifSubsOption = flw_ptr[0]&0x07; + ptr->redirReason = (flw_ptr[0]>>3)&0x0f; +} + +u32 bicc_encode_calldiverinfo(u8 *flw_ptr, const CallDiverInfo_struct *ptr) +{ + flw_ptr[0] = ((ptr->redirReason)<<3) + (ptr->notifSubsOption); + return 1; +} + +void bicc_decode_optBackCallInd(OptBackCallInd_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->inbandInfoInd = flw_ptr[0]&0x01; + ptr->callDiverOccurInd = flw_ptr[0]&0x02; + ptr->simpSegmInd = flw_ptr[0]&0x04; + ptr->mlppUserInd = flw_ptr[0]&0x08; +} + +u32 bicc_encode_optBackCallInd(u8 *flw_ptr, const OptBackCallInd_struct *ptr) +{ + flw_ptr[0] = (((ptr->mlppUserInd)<<3)+((ptr->simpSegmInd)<<2)+((ptr->callDiverOccurInd<<1))+(ptr->inbandInfoInd))&0x0f; + return 1; +} + +void bicc_send_acm(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccAcm_struct *acm_ptr = &msg_union[pid].acm; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_ACM); + *(flw_ptr++) = M_ACM; + flw_ptr += bicc_encode_backcall(flw_ptr, &acm_ptr->backCall); + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 0; + if(acm_ptr->app.pres == 1) + { + flw_ptr[0] = P_APPTRANS; + flw_ptr[1] = bicc_encode_app(flw_ptr+2, &acm_ptr->app); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(acm_ptr->cause.pres == 1) + { + flw_ptr[0] = P_CAUSEIND; + flw_ptr[1] = bicc_encode_cause(flw_ptr+2, &acm_ptr->cause); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(acm_ptr->confTreat.pres == 1) + { + flw_ptr[0] = P_CONFTREATIND; + flw_ptr[1] = bicc_encode_conftreat(flw_ptr+2, &acm_ptr->confTreat); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(acm_ptr->optBackCall.pres == 1) + { + flw_ptr[0] = P_OPTBACKCALLIND; + flw_ptr[1] = bicc_encode_optBackCallInd(flw_ptr+2, &acm_ptr->optBackCall); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(acm_ptr->utuInd.pres == 1) + { + flw_ptr[0] = P_UTUIND; + flw_ptr[1] = bicc_encode_utuind(flw_ptr+2, &acm_ptr->utuInd); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(acm_ptr->utuInfo.pres == 1) + { + flw_ptr[0] = P_UTUINFO; + flw_ptr[1] = bicc_encode_utuinfo(flw_ptr+2, &acm_ptr->utuInfo); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_anm(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccAnm_struct *anm_ptr = &msg_union[pid].anm; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_ANM); + *(flw_ptr++) = M_ANM; + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 0; + if(anm_ptr->app.pres == 1) + { + flw_ptr[0] = P_APPTRANS; + flw_ptr[1] = bicc_encode_app(flw_ptr+2, &anm_ptr->app); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(anm_ptr->backCall.pres == 1) + { + flw_ptr[0] = P_BACKCALLIND; + flw_ptr[1] = bicc_encode_backcall(flw_ptr+2, &anm_ptr->backCall); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(anm_ptr->confTreat.pres == 1) + { + flw_ptr[0] = P_CONFTREATIND; + flw_ptr[1] = bicc_encode_conftreat(flw_ptr+2, &anm_ptr->confTreat); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(anm_ptr->connNum.pres == 1) + { + flw_ptr[0] = P_CONNNUM; + flw_ptr[1] = bicc_encode_connnum(flw_ptr+2, &anm_ptr->connNum); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(anm_ptr->utuInd.pres == 1) + { + flw_ptr[0] = P_UTUIND; + flw_ptr[1] = bicc_encode_utuind(flw_ptr+2, &anm_ptr->utuInd); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(anm_ptr->utuInfo.pres == 1) + { + flw_ptr[0] = P_UTUINFO; + flw_ptr[1] = bicc_encode_utuinfo(flw_ptr+2, &anm_ptr->utuInfo); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_apm(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccApm_struct *apm_ptr = &msg_union[pid].apm; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_APM); + *(flw_ptr++) = M_APM; + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 0; + if(apm_ptr->app.pres == 1) + { + flw_ptr[0] = P_APPTRANS; + flw_ptr[1] = bicc_encode_app(flw_ptr+2, &apm_ptr->app); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_cpg(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccCpg_struct *cpg_ptr = &msg_union[pid].cpg; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_CPG); + *(flw_ptr++) = M_CPG; + flw_ptr += bicc_encode_eventinfo(flw_ptr, &cpg_ptr->eventInfo); + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 0; + if(cpg_ptr->app.pres == 1) + { + flw_ptr[0] = P_APPTRANS; + flw_ptr[1] = bicc_encode_app(flw_ptr+2, &cpg_ptr->app); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(cpg_ptr->backCall.pres == 1) + { + flw_ptr[0] = P_BACKCALLIND; + flw_ptr[1] = bicc_encode_backcall(flw_ptr+2, &cpg_ptr->backCall); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(cpg_ptr->calldiver.pres == 1) + { + flw_ptr[0] = P_CALLDIVERINFO; + flw_ptr[1] = bicc_encode_calldiverinfo(flw_ptr+2, &cpg_ptr->calldiver); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(cpg_ptr->cause.pres == 1) + { + flw_ptr[0] = P_CAUSEIND; + flw_ptr[1] = bicc_encode_cause(flw_ptr+2, &cpg_ptr->cause); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(cpg_ptr->confTreat.pres == 1) + { + flw_ptr[0] = P_CONFTREATIND; + flw_ptr[1] = bicc_encode_conftreat(flw_ptr+2, &cpg_ptr->confTreat); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(cpg_ptr->connNum.pres == 1) + { + flw_ptr[0] = P_CONNNUM; + flw_ptr[1] = bicc_encode_connnum(flw_ptr+2, &cpg_ptr->connNum); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(cpg_ptr->utuInd.pres == 1) + { + flw_ptr[0] = P_UTUIND; + flw_ptr[1] = bicc_encode_utuind(flw_ptr+2, &cpg_ptr->utuInd); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(cpg_ptr->utuInfo.pres == 1) + { + flw_ptr[0] = P_UTUINFO; + flw_ptr[1] = bicc_encode_utuinfo(flw_ptr+2, &cpg_ptr->utuInfo); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_cgb(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccCgb_struct *cgb_ptr = &msg_union[pid].cgb; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_CGB); + *(flw_ptr++) = M_CGB; + flw_ptr += bicc_encode_cicgrpspv(flw_ptr, &cgb_ptr->cicGrpSpv); + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 1; + flw_ptr[0] = bicc_encode_rangestatus(flw_ptr+1, &cgb_ptr->rangeStatus, 1); + flw_ptr += flw_ptr[0] + 1; + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_cgba(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccCgba_struct *cgba_ptr = &msg_union[pid].cgba; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_CGBA); + *(flw_ptr++) = M_CGBA; + flw_ptr += bicc_encode_cicgrpspv(flw_ptr, &cgba_ptr->cicGrpSpv); + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 1; + flw_ptr[0] = bicc_encode_rangestatus(flw_ptr+1, &cgba_ptr->rangeStatus, 1); + flw_ptr += flw_ptr[0] + 1; + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_cgu(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccCgu_struct *cgu_ptr = &msg_union[pid].cgu; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_CGU); + *(flw_ptr++) = M_CGU; + flw_ptr += bicc_encode_cicgrpspv(flw_ptr, &cgu_ptr->cicGrpSpv); + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 1; + flw_ptr[0] = bicc_encode_rangestatus(flw_ptr+1, &cgu_ptr->rangeStatus, 1); + flw_ptr += flw_ptr[0] + 1; + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_cgua(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccCgua_struct *cgua_ptr = &msg_union[pid].cgua; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_CGUA); + *(flw_ptr++) = M_CGUA; + flw_ptr += bicc_encode_cicgrpspv(flw_ptr, &cgua_ptr->cicGrpSpv); + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 1; + flw_ptr[0] = bicc_encode_rangestatus(flw_ptr+1, &cgua_ptr->rangeStatus, 1); + flw_ptr += flw_ptr[0] + 1; + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_grs(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccGrs_struct *grs_ptr = &msg_union[pid].grs; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_GRS); + *(flw_ptr++) = M_GRS; + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 1; + flw_ptr[0] = bicc_encode_rangestatus(flw_ptr+1, &grs_ptr->rangeStatus, 0); + flw_ptr += flw_ptr[0] + 1; + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_gra(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccGra_struct *gra_ptr = &msg_union[pid].gra; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_GRA); + *(flw_ptr++) = M_GRA; + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 1; + flw_ptr[0] = bicc_encode_rangestatus(flw_ptr+1, &gra_ptr->rangeStatus, 1); + flw_ptr += flw_ptr[0] + 1; + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_con(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccCon_struct *con_ptr = &msg_union[pid].con; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_CON); + *(flw_ptr++) = M_CON; + flw_ptr += bicc_encode_backcall(flw_ptr, &con_ptr->backCall); + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 0; + if(con_ptr->app.pres == 1) + { + flw_ptr[0] = P_APPTRANS; + flw_ptr[1] = bicc_encode_app(flw_ptr+2, &con_ptr->app); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(con_ptr->confTreat.pres == 1) + { + flw_ptr[0] = P_CONFTREATIND; + flw_ptr[1] = bicc_encode_conftreat(flw_ptr+2, &con_ptr->confTreat); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(con_ptr->connNum.pres == 1) + { + flw_ptr[0] = P_CONNNUM; + flw_ptr[1] = bicc_encode_connnum(flw_ptr+2, &con_ptr->connNum); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(con_ptr->utuInd.pres == 1) + { + flw_ptr[0] = P_UTUIND; + flw_ptr[1] = bicc_encode_utuind(flw_ptr+2, &con_ptr->utuInd); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(con_ptr->utuInfo.pres == 1) + { + flw_ptr[0] = P_UTUINFO; + flw_ptr[1] = bicc_encode_utuinfo(flw_ptr+2, &con_ptr->utuInfo); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_iam(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccIam_struct *iam_ptr = &msg_union[pid].iam; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + u8 opt_pointer; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_IAM); + *(flw_ptr++) = M_IAM; + flw_ptr += bicc_encode_natconn(flw_ptr, &iam_ptr->natConn); + flw_ptr += bicc_encode_fwdcall(flw_ptr, &iam_ptr->fwdCall); + flw_ptr += bicc_encode_callingptycat(flw_ptr, &iam_ptr->callingPtyCat); + flw_ptr += bicc_encode_transmedreq(flw_ptr, &iam_ptr->transMedReq); + pointer_ptr = flw_ptr; + flw_ptr += 2; + *(pointer_ptr++) = 2; + *pointer_ptr = 0; + flw_ptr[0] = bicc_encode_calledptynum(flw_ptr+1, &iam_ptr->calledPtyNum); + opt_pointer = flw_ptr[0] + 2; + flw_ptr += flw_ptr[0] + 1; + if(iam_ptr->app.pres == 1) + { + flw_ptr[0] = P_APPTRANS; + flw_ptr[1] = bicc_encode_app(flw_ptr+2, &iam_ptr->app); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(iam_ptr->callingPtyNum.pres == 1) + { + flw_ptr[0] = P_CALLINGPTYNUM; + flw_ptr[1] = bicc_encode_callingptynum(flw_ptr+2, &iam_ptr->callingPtyNum); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(iam_ptr->collectCallReq.pres == 1) + { + flw_ptr[0] = P_COLLECTCALLREQ; + flw_ptr[1] = bicc_encode_collectcallreq(flw_ptr+2, &iam_ptr->collectCallReq); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(iam_ptr->confTreat.pres == 1) + { + flw_ptr[0] = P_CONFTREATIND; + flw_ptr[1] = bicc_encode_conftreat(flw_ptr+2, &iam_ptr->confTreat); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(iam_ptr->correlationId.pres == 1) + { + flw_ptr[0] = P_CORRELATIONID; + flw_ptr[1] = bicc_encode_correlationid(flw_ptr+2, &iam_ptr->correlationId); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(iam_ptr->origCalledNum.pres == 1) + { + flw_ptr[0] = P_ORIGCALLEDNUM; + flw_ptr[1] = bicc_encode_origcallednum(flw_ptr+2, &iam_ptr->origCalledNum); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(iam_ptr->redirgNum.pres == 1) + { + flw_ptr[0] = P_REDIRGNUM; + flw_ptr[1] = bicc_encode_redirgnum(flw_ptr+2, &iam_ptr->redirgNum); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(iam_ptr->redirInfo.pres == 1) + { + flw_ptr[0] = P_REDIRINFO; + flw_ptr[1] = bicc_encode_redirinfo(flw_ptr+2, &iam_ptr->redirInfo); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(iam_ptr->scfId.pres == 1) + { + flw_ptr[0] = P_SCFID; + flw_ptr[1] = bicc_encode_scfid(flw_ptr+2, &iam_ptr->scfId); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(iam_ptr->utuInd.pres == 1) + { + flw_ptr[0] = P_UTUIND; + flw_ptr[1] = bicc_encode_utuind(flw_ptr+2, &iam_ptr->utuInd); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(iam_ptr->utuInfo.pres == 1) + { + flw_ptr[0] = P_UTUINFO; + flw_ptr[1] = bicc_encode_utuinfo(flw_ptr+2, &iam_ptr->utuInfo); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + + +void bicc_send_rel(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccRel_struct *rel_ptr = &msg_union[pid].rel; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + u8 opt_pointer; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_REL); + *(flw_ptr++) = M_REL; + pointer_ptr = flw_ptr; + flw_ptr += 2; + *(pointer_ptr++) = 2; + *pointer_ptr = 0; + flw_ptr[0] = bicc_encode_cause(flw_ptr+1, &rel_ptr->cause); + opt_pointer = flw_ptr[0] + 2; + flw_ptr += flw_ptr[0] + 1; + if(rel_ptr->utuInd.pres == 1) + { + flw_ptr[0] = P_UTUIND; + flw_ptr[1] = bicc_encode_utuind(flw_ptr+2, &rel_ptr->utuInd); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(rel_ptr->utuInfo.pres == 1) + { + flw_ptr[0] = P_UTUINFO; + flw_ptr[1] = bicc_encode_utuinfo(flw_ptr+2, &rel_ptr->utuInfo); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_rlc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccRlc_struct *rlc_ptr = &msg_union[pid].rlc; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_RLC); + *(flw_ptr++) = M_RLC; + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 0; + if(rlc_ptr->cause.pres == 1) + { + flw_ptr[0] = P_CAUSEIND; + flw_ptr[1] = bicc_encode_cause(flw_ptr+2, &rlc_ptr->cause); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + + +void bicc_send_rsc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + + *(flw_ptr++) = M_RSC; + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_res(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccRes_struct *res_ptr = &msg_union[pid].res; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_RES); + *(flw_ptr++) = M_RES; + flw_ptr += bicc_encode_susres(flw_ptr, &res_ptr->susRes); + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 0; + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_sus(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccSus_struct *sus_ptr = &msg_union[pid].sus; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_SUS); + *(flw_ptr++) = M_SUS; + flw_ptr += bicc_encode_susres(flw_ptr, &sus_ptr->susRes); + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 0; + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_sam(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccSam_struct *sam_ptr = &msg_union[pid].sam; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_SAM); + *(flw_ptr++) = M_SAM; + pointer_ptr = flw_ptr; + flw_ptr += 2; + *(pointer_ptr++) = 2; + *pointer_ptr = 0; + flw_ptr[0] = bicc_encode_subseqnum(flw_ptr+1, &sam_ptr->subseqNum); + flw_ptr += flw_ptr[0] + 1; + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} diff --git a/omc/plat/bicc/src.old/bicc_prm.c b/omc/plat/bicc/src.old/bicc_prm.c new file mode 100644 index 0000000..1e1cb89 --- /dev/null +++ b/omc/plat/bicc/src.old/bicc_prm.c @@ -0,0 +1,244 @@ +#include "./include/inc.h" +#include "./include/var_ext.h" +#include "./include/q1902_3e.h" +/**********************************************/ +/******* BICC Message&Primitive Mapping *******/ +/**********************************************/ +void app_msg2prm(AppTransM_struct *dst_ptr, AppTrans_struct *src_ptr) +{ + dst_ptr->pres = src_ptr->pres; + if(src_ptr->pres == 1) + { + memcpy(&dst_ptr->apm_info, &src_ptr->apm_info, sizeof(ApmUser_struct)); + dst_ptr->apm_info.sni = src_ptr->sni; + dst_ptr->apm_info.rci = src_ptr->rci; + } +} + +void app_prm2msg(AppTrans_struct *dst_ptr, AppTransM_struct *src_ptr) +{ + dst_ptr->pres = src_ptr->pres; + if(src_ptr->pres == 1) + { + dst_ptr->aci[0] = 0x00; + dst_ptr->aci[1] = 0x00; + dst_ptr->sni = src_ptr->apm_info.sni; + dst_ptr->rci = src_ptr->apm_info.rci; + dst_ptr->si = 0; //subsequent segment to first segment + dst_ptr->segment = 0; //final segment + dst_ptr->slr = 0; + memcpy(&dst_ptr->apm_info, &src_ptr->apm_info, sizeof(ApmUser_struct)); + } +} + +void bicc_msg2prm(BiccReadPrim_union *prm_ptr, BiccMsg_union *msg_ptr, u8 msg_type) +{ + memset(prm_ptr, 0, sizeof(BiccReadPrim_union)); + switch(msg_type) + { + case M_ACM: + memcpy(&prm_ptr->alert_ind.backCall, &msg_ptr->acm.backCall, sizeof(BackCallInd_struct)); + app_msg2prm(&prm_ptr->alert_ind.app, &msg_ptr->acm.app); + memcpy(&prm_ptr->alert_ind.cause, &msg_ptr->acm.cause, sizeof(CauseInd_struct)); + memcpy(&prm_ptr->alert_ind.confTreat, &msg_ptr->acm.confTreat, sizeof(ConfTreatInd_struct)); + memcpy(&prm_ptr->alert_ind.optBackCall, &msg_ptr->acm.optBackCall, sizeof(OptBackCallInd_struct)); + memcpy(&prm_ptr->alert_ind.utuInd, &msg_ptr->acm.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&prm_ptr->alert_ind.utuInfo, &msg_ptr->acm.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_ANM: + app_msg2prm(&prm_ptr->setup_cnf.app, &msg_ptr->anm.app); + memcpy(&prm_ptr->setup_cnf.backCall, &msg_ptr->anm.backCall, sizeof(BackCallInd_struct)); + memcpy(&prm_ptr->setup_cnf.confTreat, &msg_ptr->anm.confTreat, sizeof(ConfTreatInd_struct)); + memcpy(&prm_ptr->setup_cnf.connNum, &msg_ptr->anm.connNum, sizeof(ConnNum_struct)); + memcpy(&prm_ptr->setup_cnf.utuInd, &msg_ptr->anm.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&prm_ptr->setup_cnf.utuInfo, &msg_ptr->anm.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_APM: + app_msg2prm(&prm_ptr->apm_ind.app, &msg_ptr->apm.app); + break; + case M_CPG: + memcpy(&prm_ptr->cpg_ind.eventInfo, &msg_ptr->cpg.eventInfo, sizeof(EventInfo_struct)); + app_msg2prm(&prm_ptr->cpg_ind.app, &msg_ptr->cpg.app); + memcpy(&prm_ptr->cpg_ind.backCall, &msg_ptr->cpg.backCall, sizeof(BackCallInd_struct)); + memcpy(&prm_ptr->cpg_ind.calldiver,&msg_ptr->cpg.calldiver, sizeof(BiccCpg_struct)); + memcpy(&prm_ptr->cpg_ind.cause, &msg_ptr->cpg.cause, sizeof(CauseInd_struct)); + memcpy(&prm_ptr->cpg_ind.confTreat, &msg_ptr->cpg.confTreat, sizeof(ConfTreatInd_struct)); + memcpy(&prm_ptr->cpg_ind.connNum, &msg_ptr->cpg.connNum, sizeof(ConnNum_struct)); + memcpy(&prm_ptr->cpg_ind.utuInd, &msg_ptr->cpg.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&prm_ptr->cpg_ind.utuInfo, &msg_ptr->cpg.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_CGB: + memcpy(&prm_ptr->cgb_ind.cicGrpSpv, &msg_ptr->cgb.cicGrpSpv, sizeof(CicGrpSpv_struct)); + memcpy(&prm_ptr->cgb_ind.rangeStatus, &msg_ptr->cgb.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_CGBA: + memcpy(&prm_ptr->cgb_cnf.cicGrpSpv, &msg_ptr->cgb.cicGrpSpv, sizeof(CicGrpSpv_struct)); + memcpy(&prm_ptr->cgb_cnf.rangeStatus, &msg_ptr->cgb.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_CGU: + memcpy(&prm_ptr->cgu_ind.cicGrpSpv, &msg_ptr->cgu.cicGrpSpv, sizeof(CicGrpSpv_struct)); + memcpy(&prm_ptr->cgu_ind.rangeStatus, &msg_ptr->cgu.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_CGUA: + memcpy(&prm_ptr->cgu_cnf.cicGrpSpv, &msg_ptr->cgu.cicGrpSpv, sizeof(CicGrpSpv_struct)); + memcpy(&prm_ptr->cgu_cnf.rangeStatus, &msg_ptr->cgu.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_GRS: + memcpy(&prm_ptr->grs_ind.rangeStatus, &msg_ptr->grs.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_GRA: + memcpy(&prm_ptr->grs_cnf.rangeStatus, &msg_ptr->grs.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_CON: + app_msg2prm(&prm_ptr->setup_cnf.app, &msg_ptr->con.app); + memcpy(&prm_ptr->setup_cnf.backCall, &msg_ptr->con.backCall, sizeof(BackCallInd_struct)); + memcpy(&prm_ptr->setup_cnf.confTreat, &msg_ptr->con.confTreat, sizeof(ConfTreatInd_struct)); + memcpy(&prm_ptr->setup_cnf.connNum, &msg_ptr->con.connNum, sizeof(ConnNum_struct)); + memcpy(&prm_ptr->setup_cnf.utuInd, &msg_ptr->con.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&prm_ptr->setup_cnf.utuInfo, &msg_ptr->con.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_IAM: + memcpy(&prm_ptr->setup_ind.natConn, &msg_ptr->iam.natConn, sizeof(NatConnInd_struct)); + memcpy(&prm_ptr->setup_ind.fwdCall, &msg_ptr->iam.fwdCall, sizeof(FwdCallInd_struct)); + memcpy(&prm_ptr->setup_ind.callingPtyCat, &msg_ptr->iam.callingPtyCat, sizeof(CallingPtyCat_struct)); + memcpy(&prm_ptr->setup_ind.transMedReq, &msg_ptr->iam.transMedReq, sizeof(TransMedReq_struct)); + memcpy(&prm_ptr->setup_ind.calledPtyNum, &msg_ptr->iam.calledPtyNum, sizeof(CalledPtyNum_struct)); + app_msg2prm(&prm_ptr->setup_ind.app, &msg_ptr->apm.app); + memcpy(&prm_ptr->setup_ind.callingPtyNum, &msg_ptr->iam.callingPtyNum, sizeof(CallingPtyNum_struct)); + memcpy(&prm_ptr->setup_ind.collectCallReq, &msg_ptr->iam.collectCallReq, sizeof(CollectCallReq_struct)); + memcpy(&prm_ptr->setup_ind.confTreat, &msg_ptr->iam.confTreat, sizeof(ConfTreatInd_struct)); + memcpy(&prm_ptr->setup_ind.correlationId, &msg_ptr->iam.correlationId, sizeof(CorrelationId_struct)); + memcpy(&prm_ptr->setup_ind.origCalledNum, &msg_ptr->iam.origCalledNum, sizeof(OrigCalledNum_struct)); + memcpy(&prm_ptr->setup_ind.redirgNum, &msg_ptr->iam.redirgNum, sizeof(RedirgNum_struct)); + memcpy(&prm_ptr->setup_ind.redirInfo, &msg_ptr->iam.redirInfo, sizeof(RedirInfo_struct)); + memcpy(&prm_ptr->setup_ind.scfId, &msg_ptr->iam.scfId, sizeof(ScfId_struct)); + memcpy(&prm_ptr->setup_ind.utuInd, &msg_ptr->iam.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&prm_ptr->setup_ind.utuInfo, &msg_ptr->iam.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_REL: + memcpy(&prm_ptr->rel_ind.cause, &msg_ptr->rel.cause, sizeof(CauseInd_struct)); + memcpy(&prm_ptr->rel_ind.utuInd, &msg_ptr->rel.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&prm_ptr->rel_ind.utuInfo, &msg_ptr->rel.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_RLC: + memcpy(&prm_ptr->rel_cnf.cause, &msg_ptr->rlc.cause, sizeof(CauseInd_struct)); + break; + case M_RES: + memcpy(&prm_ptr->res_ind.susRes, &msg_ptr->res.susRes, sizeof(SusResInd_struct)); + break; + case M_SUS: + memcpy(&prm_ptr->sus_ind.susRes, &msg_ptr->sus.susRes, sizeof(SusResInd_struct)); + break; + case M_SAM: + memcpy(&prm_ptr->info_ind.subseqNum, &msg_ptr->sam.subseqNum, sizeof(SubseqNum_struct)); + break; + default: + break; + } +} + +void bicc_prm2msg(BiccMsg_union *msg_ptr, BiccWritePrim_union *prm_ptr, u8 msg_type) +{ + memset(msg_ptr, 0, sizeof(BiccMsg_union)); + switch(msg_type) + { + case M_ACM: + memcpy(&msg_ptr->acm.backCall, &prm_ptr->alert_req.backCall, sizeof(BackCallInd_struct)); + app_prm2msg(&msg_ptr->acm.app, &prm_ptr->alert_req.app); + memcpy(&msg_ptr->acm.cause, &prm_ptr->alert_req.cause, sizeof(CauseInd_struct)); + memcpy(&msg_ptr->acm.confTreat, &prm_ptr->alert_req.confTreat, sizeof(ConfTreatInd_struct)); + memcpy(&msg_ptr->acm.optBackCall, &prm_ptr->alert_req.optBackCall, sizeof(OptBackCallInd_struct)); + memcpy(&msg_ptr->acm.utuInd, &prm_ptr->alert_req.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&msg_ptr->acm.utuInfo, &prm_ptr->alert_req.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_ANM: + app_prm2msg(&msg_ptr->anm.app, &prm_ptr->setup_rsp.app); + memcpy(&msg_ptr->anm.backCall, &prm_ptr->setup_rsp.backCall, sizeof(BackCallInd_struct)); + memcpy(&msg_ptr->anm.confTreat, &prm_ptr->setup_rsp.confTreat, sizeof(ConfTreatInd_struct)); + memcpy(&msg_ptr->anm.connNum, &prm_ptr->setup_rsp.connNum, sizeof(ConnNum_struct)); + memcpy(&msg_ptr->anm.utuInd, &prm_ptr->setup_rsp.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&msg_ptr->anm.utuInfo, &prm_ptr->setup_rsp.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_APM: + app_prm2msg(&msg_ptr->apm.app, &prm_ptr->apm_req.app); + break; + case M_CPG: + memcpy(&msg_ptr->cpg.eventInfo, &prm_ptr->cpg_req.eventInfo, sizeof(EventInfo_struct)); + app_prm2msg(&msg_ptr->cpg.app, &prm_ptr->cpg_req.app); + memcpy(&msg_ptr->cpg.backCall, &prm_ptr->cpg_req.backCall, sizeof(BackCallInd_struct)); + memcpy(&msg_ptr->cpg.calldiver, &prm_ptr->cpg_req.calldiver, sizeof(BiccCpg_struct)); + memcpy(&msg_ptr->cpg.cause, &prm_ptr->cpg_req.cause, sizeof(CauseInd_struct)); + memcpy(&msg_ptr->cpg.confTreat, &prm_ptr->cpg_req.confTreat, sizeof(ConfTreatInd_struct)); + memcpy(&msg_ptr->cpg.connNum, &prm_ptr->cpg_req.connNum, sizeof(ConnNum_struct)); + memcpy(&msg_ptr->cpg.utuInd, &prm_ptr->cpg_req.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&msg_ptr->cpg.utuInfo, &prm_ptr->cpg_req.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_CGB: + memcpy(&msg_ptr->cgb.cicGrpSpv, &prm_ptr->cgb_req.cicGrpSpv, sizeof(CicGrpSpv_struct)); + memcpy(&msg_ptr->cgb.rangeStatus, &prm_ptr->cgb_req.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_CGBA: + memcpy(&msg_ptr->cgb.cicGrpSpv, &prm_ptr->cgb_rsp.cicGrpSpv, sizeof(CicGrpSpv_struct)); + memcpy(&msg_ptr->cgb.rangeStatus, &prm_ptr->cgb_rsp.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_CGU: + memcpy(&msg_ptr->cgu.cicGrpSpv, &prm_ptr->cgu_req.cicGrpSpv, sizeof(CicGrpSpv_struct)); + memcpy(&msg_ptr->cgu.rangeStatus, &prm_ptr->cgu_req.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_CGUA: + memcpy(&msg_ptr->cgu.cicGrpSpv, &prm_ptr->cgu_rsp.cicGrpSpv, sizeof(CicGrpSpv_struct)); + memcpy(&msg_ptr->cgu.rangeStatus, &prm_ptr->cgu_rsp.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_GRS: + memcpy(&msg_ptr->grs.rangeStatus, &prm_ptr->grs_req.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_GRA: + memcpy(&msg_ptr->grs.rangeStatus, &prm_ptr->grs_rsp.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_CON: + app_prm2msg(&msg_ptr->con.app, &prm_ptr->setup_rsp.app); + memcpy(&msg_ptr->con.backCall, &prm_ptr->setup_rsp.backCall, sizeof(BackCallInd_struct)); + memcpy(&msg_ptr->con.confTreat, &prm_ptr->setup_rsp.confTreat, sizeof(ConfTreatInd_struct)); + memcpy(&msg_ptr->con.connNum, &prm_ptr->setup_rsp.connNum, sizeof(ConnNum_struct)); + memcpy(&msg_ptr->con.utuInd, &prm_ptr->setup_rsp.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&msg_ptr->con.utuInfo, &prm_ptr->setup_rsp.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_IAM: + memcpy(&msg_ptr->iam.natConn, &prm_ptr->setup_req.natConn, sizeof(NatConnInd_struct)); + memcpy(&msg_ptr->iam.fwdCall, &prm_ptr->setup_req.fwdCall, sizeof(FwdCallInd_struct)); + memcpy(&msg_ptr->iam.callingPtyCat, &prm_ptr->setup_req.callingPtyCat, sizeof(CallingPtyCat_struct)); + memcpy(&msg_ptr->iam.transMedReq, &prm_ptr->setup_req.transMedReq, sizeof(TransMedReq_struct)); + memcpy(&msg_ptr->iam.calledPtyNum, &prm_ptr->setup_req.calledPtyNum, sizeof(CalledPtyNum_struct)); + app_prm2msg(&msg_ptr->iam.app, &prm_ptr->setup_req.app); + memcpy(&msg_ptr->iam.callingPtyNum, &prm_ptr->setup_req.callingPtyNum, sizeof(CallingPtyNum_struct)); + memcpy(&msg_ptr->iam.collectCallReq, &prm_ptr->setup_req.collectCallReq, sizeof(CollectCallReq_struct)); + memcpy(&msg_ptr->iam.confTreat, &prm_ptr->setup_req.confTreat, sizeof(ConfTreatInd_struct)); + memcpy(&msg_ptr->iam.correlationId, &prm_ptr->setup_req.correlationId, sizeof(CorrelationId_struct)); + memcpy(&msg_ptr->iam.origCalledNum, &prm_ptr->setup_req.origCalledNum, sizeof(OrigCalledNum_struct)); + memcpy(&msg_ptr->iam.redirgNum, &prm_ptr->setup_req.redirgNum, sizeof(RedirgNum_struct)); + memcpy(&msg_ptr->iam.redirInfo, &prm_ptr->setup_req.redirInfo, sizeof(RedirInfo_struct)); + memcpy(&msg_ptr->iam.scfId, &prm_ptr->setup_req.scfId, sizeof(ScfId_struct)); + memcpy(&msg_ptr->iam.utuInd, &prm_ptr->setup_req.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&msg_ptr->iam.utuInfo, &prm_ptr->setup_req.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_REL: + memcpy(&msg_ptr->rel.cause, &prm_ptr->rel_req.cause, sizeof(CauseInd_struct)); + memcpy(&msg_ptr->rel.utuInd, &prm_ptr->rel_req.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&msg_ptr->rel.utuInfo, &prm_ptr->rel_req.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_RLC: + memcpy(&msg_ptr->rlc.cause, &prm_ptr->rel_rsp.cause, sizeof(CauseInd_struct)); + break; + case M_RES: + memcpy(&msg_ptr->res.susRes, &prm_ptr->res_req.susRes, sizeof(SusResInd_struct)); + break; + case M_SUS: + memcpy(&msg_ptr->sus.susRes, &prm_ptr->sus_req.susRes, sizeof(SusResInd_struct)); + break; + case M_SAM: + memcpy(&msg_ptr->sam.subseqNum, &prm_ptr->info_req.subseqNum, sizeof(SubseqNum_struct)); + break; + default: + break; + } +} diff --git a/omc/plat/bicc/src.old/biccif.c b/omc/plat/bicc/src.old/biccif.c new file mode 100644 index 0000000..aaef225 --- /dev/null +++ b/omc/plat/bicc/src.old/biccif.c @@ -0,0 +1,1080 @@ +#include "./include/inc.h" +#include "./include/var_ext.h" +#include "../../public/src/include/license_id.h" + +BiccReadPrim_union readPrim_union[BICC_MAX_PORT]; +BiccWritePrim_union writePrim_union[BICC_MAX_PORT]; +u8 Bicc_Version[4] = BICC_VERSION; +u8 local_platid=0; +extern BiccData_struct Bicc_Data; +BiccTimer_struct Timer_Data; +up_message_2 r_mtp_msg; //message receive from mtp3 +extern BiccMsg_union msg_union[BICC_MAX_PORT]; + +//void bicc_cpio_proc(u32 pid); +int check_outbound_route(BYTE nw, long dpc, BYTE sls); +extern BOOL bicc_event_handle(u32 pid, const BiccReadPrim_union *prm_ptr, u8 primitive, u8 eventType); +extern void bicc_cpci_proc(u32 pid); +extern void bicc_cpco_proc(u32 pid); +extern void bicc_mgbs_proc(u32 pid); +extern void bicc_mgbr_proc(u32 pid); +extern void bicc_crs_proc(u32 pid); +extern BOOL check_crs_waiting(u32 pid); +extern void bicc_crr_proc(u32 pid); +extern void bicc_cgrs_proc(u32 pid); +extern void bicc_cgrr_proc(u32 pid); +extern void bicc_circuit_reset(u32 pid, const char *s); +extern void bicc_decode_backcall(BackCallInd_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_app(AppTrans_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_calledptynum(CalledPtyNum_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_callingptynum(CallingPtyNum_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_callingptycat(CallingPtyCat_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_cause(CauseInd_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_cicgrpspv(CicGrpSpv_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_collectcallreq(CollectCallReq_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_conftreat(ConfTreatInd_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_connnum(ConnNum_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_genericnumber(GenericNumber_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_genericDigits(GenericDigits_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_correlationid(CorrelationId_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_fwdcall(FwdCallInd_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_natconn(NatConnInd_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_origcallednum(OrigCalledNum_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_utuind(UserToUserInd_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_utuinfo(UserToUserInfo_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_eventinfo(EventInfo_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_rangestatus(RangeStatus_struct *ptr, const u8 *flw_ptr, u8 length, u8 need_status); +extern void bicc_decode_transmedreq(TransMedReq_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_redirgnum(RedirgNum_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_redirinfo(RedirInfo_struct *ptr, u8 *flw_ptr, u8 length); +extern void bicc_decode_scfid(ScfId_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_susres(SusResInd_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_subseqnum(SubseqNum_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_calldiverinfo(CallDiverInfo_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_optBackCallInd(OptBackCallInd_struct *ptr, const u8 *flw_ptr); +extern void bicc_msg2prm(BiccReadPrim_union *prm_ptr, BiccMsg_union *msg_ptr, u8 msg_type); +extern void bicc_log_err(const char *fmt, ...); +extern void bicc_send_apm(u32 pid); + +int BICC_active_dmp(u8 plat_id, u32 alter_id) +{ + if(plat_id >= 2) + return 0; + Bicc_Data.dmp_data.active = 1; + Bicc_Data.dmp_data.processor_id = local_platid; + Bicc_Data.dmp_data.remote_ip = alter_id; + return BICC_CM_OK; +} + +int BICC_deactive_dmp() +{ + Bicc_Data.dmp_data.active = 0; + Bicc_Data.dmp_data.remote_ip = 0; + Bicc_Data.dmp_data.processor_id = local_platid; + return BICC_CM_OK; +} + +void bicc_transmit_func(u32 remote_ip, up_message_2 *upmsg_ptr) //transmit message to remote ip +{ + upmsg_ptr->dest_ip = remote_ip; + //bicc_to_mtp3(upmsg_ptr); + bicc_redirect(upmsg_ptr); +} + +int getPidByCic(u32 *pid, u32 cg_id, u32 cic) +{ + const pal_circuit_struct *pcircuit = NULL; + if((pcircuit = pal_locate_circuit(cg_id, cic)) != NULL) + { + *pid = (pcircuit->id)*BICC_CIRCUIT_CIC + (cic - pcircuit->attrib.head_cic); + return 1; + } + bicc_log_err("can not get port by cic %d, cg %d [%s]\n", cic,cg_id,__FUNCTION__); + return 0; +} + +static int find_port_by_cic(u8 ni, u32 dpc, u32 opc, u32 cic_val, u32* pid) +{ + const pal_circuit_struct *pcircuit = NULL; + if((pcircuit = pal_ss7_find_circuit(ni, opc, dpc, cic_val)) != NULL) + { + *pid = pcircuit->id*BICC_CIRCUIT_CIC + (cic_val - pcircuit->attrib.head_cic); + return 1; + } + bicc_log_err("can not find port by cic %d dpc %d opc %d ni %d [%s]\n",cic_val,opc,dpc,ni,__FUNCTION__); + return 0; +} + + + +int BICC_mdsc_proc() //get the message form Lower Layer +{ + u32 sap_id, cg_id, circuit_id; + u32 cic_val; + u32 pid; + u8 *flw_ptr; //message flow pointer + u8 msg_type; + BICC_Port_struct *port_ptr; + BiccMsg_union *msg_ptr; + BiccDmp_struct *dmp_ptr = &Bicc_Data.dmp_data; + const pal_circuit_struct *pcircuit = NULL; + const pal_cg_struct *pcg = NULL; + if(bicc_GetMsg(&r_mtp_msg) == 0) + return 0; + + + cic_val = (r_mtp_msg.cic[3]<<24) + (r_mtp_msg.cic[2]<<16) + (r_mtp_msg.cic[1]<<8) + r_mtp_msg.cic[0]; + + if(!find_port_by_cic(r_mtp_msg.sio>>6, r_mtp_msg.dpc, r_mtp_msg.opc, cic_val, &pid)) + return 0; + circuit_id = pid / BICC_CIRCUIT_CIC; + pcircuit = pal_circuit_ptr(circuit_id); + if((dmp_ptr->active == 1) && (pcircuit != NULL) && (pcircuit->attrib.plat_id != dmp_ptr->processor_id)) + { + bicc_transmit_func(dmp_ptr->remote_ip, &r_mtp_msg); + monitor_bicc_msg(r_mtp_msg.msgList, r_mtp_msg.len, 2, cic_val,pid); + return 1 ; + } + cg_id = pcircuit->cg_id; + pcg = pal_cg_ptr(cg_id); + if(pcg == NULL && pcg->enable == 0) + return 0; + sap_id = pcg->sap_id; + port_ptr = &Bicc_Data.port_data[pid]; + flw_ptr = r_mtp_msg.msgList; + msg_type = *(flw_ptr++); + msg_ptr = &msg_union[pid]; + memset(msg_ptr, 0, sizeof(BiccMsg_union)); + + monitor_bicc_msg(r_mtp_msg.msgList, r_mtp_msg.len, 0, cic_val, pid); + switch(msg_type) + { + case M_ACM: + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + { + bicc_circuit_reset(pid, "recv acm at idle"); + break; + } + port_ptr->sprc_cmd = M_ACM; + bicc_decode_backcall(&msg_ptr->acm.backCall, flw_ptr); + flw_ptr += 2; + if(*flw_ptr == 0) + break; + flw_ptr += *flw_ptr; + while(flw_ptr+flw_ptr[1]+2-r_mtp_msg.msgList <= r_mtp_msg.len) + { + if(*flw_ptr == 0) //end of option parameter + break; + switch(*flw_ptr) + { + case P_APPTRANS: + bicc_decode_app(&msg_ptr->acm.app, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CAUSEIND: + bicc_decode_cause(&msg_ptr->acm.cause, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CONFTREATIND: + bicc_decode_conftreat(&msg_ptr->acm.confTreat, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_OPTBACKCALLIND: + bicc_decode_optBackCallInd(&msg_ptr->acm.optBackCall,flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUIND: + bicc_decode_utuind(&msg_ptr->acm.utuInd, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUINFO: + bicc_decode_utuinfo(&msg_ptr->acm.utuInfo, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + flw_ptr += flw_ptr[1] + 2; + break; + } + } + bicc_cpco_proc(pid); + break; + case M_ANM: + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + { + bicc_circuit_reset(pid, "recv anm at idle"); + break; + } + port_ptr->sprc_cmd = M_ANM; + if(*flw_ptr == 0) + break; + flw_ptr += *flw_ptr; + while(flw_ptr+flw_ptr[1]+2-r_mtp_msg.msgList <= r_mtp_msg.len) + { + if(*flw_ptr == 0) //end of option parameter + break; + switch(*flw_ptr) + { + case P_APPTRANS: + bicc_decode_app(&msg_ptr->anm.app, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_BACKCALLIND: + bicc_decode_backcall(&msg_ptr->anm.backCall, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CONFTREATIND: + bicc_decode_conftreat(&msg_ptr->anm.confTreat, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CONNNUM: + bicc_decode_connnum(&msg_ptr->anm.connNum, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUIND: + bicc_decode_utuind(&msg_ptr->anm.utuInd, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUINFO: + bicc_decode_utuinfo(&msg_ptr->anm.utuInfo, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + flw_ptr += flw_ptr[1] + 2; + break; + } + } + break; + case M_APM: // APM is not sent to CPC, event handle function is called directly + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + { + bicc_circuit_reset(pid, "recv apm at idle"); + return 0; + } + if(*flw_ptr == 0) + break; + flw_ptr += *flw_ptr; + while(flw_ptr+flw_ptr[1]+2-r_mtp_msg.msgList <= r_mtp_msg.len) + { + if(*flw_ptr == 0) //end of option parameter + break; + switch(*flw_ptr) + { + case P_APPTRANS: + bicc_decode_app(&msg_ptr->apm.app, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + flw_ptr += flw_ptr[1] + 2; + break; + } + } + break; + case M_CPG: + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + { + bicc_circuit_reset(pid, "recv cpg at idle"); + break; + } + port_ptr->sprc_cmd = M_CPG; + bicc_decode_eventinfo(&msg_ptr->cpg.eventInfo, flw_ptr); + flw_ptr += 1; + if(*flw_ptr == 0) + break; + flw_ptr += *flw_ptr; + while(flw_ptr+flw_ptr[1]+2-r_mtp_msg.msgList <= r_mtp_msg.len) + { + if(*flw_ptr == 0) //end of option parameter + break; + switch(*flw_ptr) + { + case P_APPTRANS: + bicc_decode_app(&msg_ptr->cpg.app, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_BACKCALLIND: + bicc_decode_backcall(&msg_ptr->cpg.backCall, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CAUSEIND: + bicc_decode_cause(&msg_ptr->cpg.cause, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CONFTREATIND: + bicc_decode_conftreat(&msg_ptr->cpg.confTreat, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CONNNUM: + bicc_decode_connnum(&msg_ptr->cpg.connNum, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUIND: + bicc_decode_utuind(&msg_ptr->cpg.utuInd, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUINFO: + bicc_decode_utuinfo(&msg_ptr->cpg.utuInfo, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CALLDIVERINFO: + bicc_decode_calldiverinfo(&msg_ptr->cpg.calldiver, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + default: + flw_ptr += flw_ptr[1] + 2; + break; + } + } + break; + case M_CGB: + port_ptr->sprc_cmd = M_CGB; + bicc_decode_cicgrpspv(&msg_ptr->cgb.cicGrpSpv, flw_ptr); + flw_ptr += 1; + bicc_decode_rangestatus(&msg_ptr->cgb.rangeStatus, flw_ptr+*flw_ptr+1, *(flw_ptr + *flw_ptr), 1); + break; + case M_CGBA: + port_ptr->sprc_cmd = M_CGBA; + bicc_decode_cicgrpspv(&msg_ptr->cgba.cicGrpSpv, flw_ptr); + flw_ptr += 1; + bicc_decode_rangestatus(&msg_ptr->cgba.rangeStatus, flw_ptr+*flw_ptr+1, *(flw_ptr + *flw_ptr), 1); + break; + case M_CGU: + port_ptr->sprc_cmd = M_CGU; + bicc_decode_cicgrpspv(&msg_ptr->cgu.cicGrpSpv, flw_ptr); + flw_ptr += 1; + bicc_decode_rangestatus(&msg_ptr->cgu.rangeStatus, flw_ptr+*flw_ptr+1, *(flw_ptr + *flw_ptr), 1); + break; + case M_CGUA: + port_ptr->sprc_cmd = M_CGUA; + bicc_decode_cicgrpspv(&msg_ptr->cgua.cicGrpSpv, flw_ptr); + flw_ptr += 1; + bicc_decode_rangestatus(&msg_ptr->cgua.rangeStatus, flw_ptr+*flw_ptr+1, *(flw_ptr + *flw_ptr), 1); + break; + case M_GRS: + port_ptr->sprc_cmd = M_GRS; + bicc_decode_rangestatus(&msg_ptr->grs.rangeStatus, flw_ptr+*flw_ptr+1, *(flw_ptr + *flw_ptr), 0); + break; + case M_GRA: + port_ptr->sprc_cmd = M_GRA; + bicc_decode_rangestatus(&msg_ptr->gra.rangeStatus, flw_ptr+*flw_ptr+1, *(flw_ptr + *flw_ptr), 1); + break; + case M_CON: + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + { + bicc_circuit_reset(pid, "recv con at idle"); + break; + } + port_ptr->sprc_cmd = M_CON; + bicc_decode_backcall(&msg_ptr->con.backCall, flw_ptr); + flw_ptr += 2; + if(*flw_ptr == 0) + break; + flw_ptr += *flw_ptr; + while(flw_ptr+flw_ptr[1]+2-r_mtp_msg.msgList <= r_mtp_msg.len) + { + if(*flw_ptr == 0) //end of option parameter + break; + switch(*flw_ptr) + { + case P_APPTRANS: + bicc_decode_app(&msg_ptr->con.app, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CONFTREATIND: + bicc_decode_conftreat(&msg_ptr->con.confTreat, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CONNNUM: + bicc_decode_connnum(&msg_ptr->con.connNum, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUIND: + bicc_decode_utuind(&msg_ptr->con.utuInd, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUINFO: + bicc_decode_utuinfo(&msg_ptr->con.utuInfo, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + flw_ptr += flw_ptr[1] + 2; + break; + } + } + break; + case M_IAM: +#ifdef BICC_REATTEMPT + if(port_ptr->cic_state.call_state == BICC_INCOMING) + return 0; +#else + if(port_ptr->cic_state.call_state != BICC_CIC_IDLE) + return 0; +#endif + if(port_ptr->cic_state.call_state == BICC_TYPE_OUTGOING) + { + bicc_circuit_reset(pid, "recv iam at outgoing cic"); + break; + } +#ifdef BICC_REATTEMPT + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + { + port_ptr->cic_state.call_state = BICC_INCOMING; // mark the cic + } +#else + port_ptr->cic_state.call_state = BICC_INCOMING; // mark the cic +#endif + port_ptr->sprc_cmd = M_IAM; + bicc_decode_natconn(&msg_ptr->iam.natConn, flw_ptr); + flw_ptr += 1; + bicc_decode_fwdcall(&msg_ptr->iam.fwdCall, flw_ptr); + flw_ptr += 2; + bicc_decode_callingptycat(&msg_ptr->iam.callingPtyCat, flw_ptr); + flw_ptr += 1; + bicc_decode_transmedreq(&msg_ptr->iam.transMedReq, flw_ptr); + flw_ptr += 1; + bicc_decode_calledptynum(&msg_ptr->iam.calledPtyNum, flw_ptr+*flw_ptr+1, *(flw_ptr + *flw_ptr)); + flw_ptr++; + if(*flw_ptr == 0) + break; + flw_ptr += *flw_ptr; + while(flw_ptr+flw_ptr[1]+2-r_mtp_msg.msgList <= r_mtp_msg.len) + { + if(*flw_ptr == 0) //end of option parameter + break; + switch(*flw_ptr) + { + case P_APPTRANS: + bicc_decode_app(&msg_ptr->iam.app, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CALLINGPTYNUM: + bicc_decode_callingptynum(&msg_ptr->iam.callingPtyNum, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_COLLECTCALLREQ: + bicc_decode_collectcallreq(&msg_ptr->iam.collectCallReq, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CONFTREATIND: + bicc_decode_conftreat(&msg_ptr->iam.confTreat, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CORRELATIONID: + bicc_decode_correlationid(&msg_ptr->iam.correlationId, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_ORIGCALLEDNUM: + bicc_decode_origcallednum(&msg_ptr->iam.origCalledNum, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_REDIRGNUM: + bicc_decode_redirgnum(&msg_ptr->iam.redirgNum, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_REDIRINFO: + bicc_decode_redirinfo(&msg_ptr->iam.redirInfo, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_SCFID: + bicc_decode_scfid(&msg_ptr->iam.scfId, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUIND: + bicc_decode_utuind(&msg_ptr->iam.utuInd, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUINFO: + bicc_decode_utuinfo(&msg_ptr->iam.utuInfo, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + flw_ptr += flw_ptr[1] + 2; + break; + } + } + break; + case M_REL: + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + port_ptr->cic_state.call_state = BICC_INCOMING; + port_ptr->sprc_cmd = M_REL; + bicc_decode_cause(&msg_ptr->rel.cause, flw_ptr+*flw_ptr+1, *(flw_ptr + *flw_ptr)); + flw_ptr++; + if(*flw_ptr == 0) + break; + flw_ptr += *flw_ptr; + while(flw_ptr+flw_ptr[1]+2-r_mtp_msg.msgList <= r_mtp_msg.len) + { + if(*flw_ptr == 0) //end of option parameter + break; + switch(*flw_ptr) + { + case P_UTUIND: + bicc_decode_utuind(&msg_ptr->iam.utuInd, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUINFO: + bicc_decode_utuinfo(&msg_ptr->iam.utuInfo, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + flw_ptr += flw_ptr[1] + 2; + break; + } + } + break; + case M_RLC: + // if(Bicc_Data.port_data[pid].used_flag == 0) + // return 0; + if(check_crs_waiting(pid)) + port_ptr->sprc_cmd = M_RLC; + else + { + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + // port_ptr->cic_state.call_state = BICC_INCOMING; + break; + port_ptr->sprc_cmd = M_RLC; + } + if(*flw_ptr == 0) + break; + flw_ptr += *flw_ptr; + while(flw_ptr+flw_ptr[1]+2-r_mtp_msg.msgList <= r_mtp_msg.len) + { + if(*flw_ptr == 0) //end of option parameter + break; + switch(*flw_ptr) + { + case P_CAUSEIND: + bicc_decode_cause(&msg_ptr->rlc.cause, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + flw_ptr += flw_ptr[1] + 2; + break; + } + } + break; + case M_RSC: + port_ptr->sprc_cmd = M_RSC; + break; + case M_RES: + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + { + bicc_circuit_reset(pid, "recv res at idle"); + break; + } + port_ptr->sprc_cmd = M_RES; + bicc_decode_susres(&msg_ptr->res.susRes, flw_ptr); + break; + case M_SUS: + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + { + bicc_circuit_reset(pid, "recv sus at idle"); + break; + } + port_ptr->sprc_cmd = M_SUS; + bicc_decode_susres(&msg_ptr->sus.susRes, flw_ptr); + break; + case M_SAM: + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + { + bicc_circuit_reset(pid, "recv sam at idle"); + break; + } + port_ptr->sprc_cmd = M_SAM; + if(*flw_ptr == 0) + break; + flw_ptr += *flw_ptr; + while(flw_ptr+flw_ptr[1]+2-r_mtp_msg.msgList <= r_mtp_msg.len) + { + if(*flw_ptr == 0) //end of option parameter + break; + switch(*flw_ptr) + { + case P_SUBSEQNUM: + bicc_decode_subseqnum(&msg_ptr->sam.subseqNum, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + flw_ptr += flw_ptr[1] + 2; + break; + } + } + break; + default: //unknow message type + break; + } + bicc_msg2prm(&readPrim_union[pid], &msg_union[pid], msg_type); + if(msg_type == M_GRS) + bicc_cgrr_proc(pid); + if(msg_type == M_GRA) + bicc_cgrs_proc(pid); + if(msg_type == M_APM) + bicc_event_handle(pid, &readPrim_union[pid], BICC_APM_IND, EN_NONE); + if(msg_type == M_IAM) + { + bicc_cpci_proc(pid); + Bicc_Data.port_data[pid].used_flag = 1; + } + return 1; + +} + +void BICC_msdc_proc(u32 pid, up_message_2 * upmsg_ptr) //send the message to Lower Layer +{ + u32 cg_id, circuit_id; + u32 cic_val; + const pal_circuit_struct *pcircuit = NULL; + const pal_cg_struct *pcg = NULL; + + circuit_id = pid / BICC_CIRCUIT_CIC; + pcircuit = pal_circuit_ptr(circuit_id); + if(pcircuit != NULL) + cg_id = pcircuit->cg_id; + pcg = pal_cg_ptr(cg_id); + if(pcg == NULL) + return; + if((cic_val = pcircuit->attrib.head_cic+ pid % BICC_CIRCUIT_CIC) > + (pcircuit->attrib.head_cic + pcircuit->attrib.cic_range)) + { + bicc_log_err("No cic corresponds to pid.\n"); + return; + } + + + upmsg_ptr->dest_ip = 0xffffffff; + upmsg_ptr->dpc = pcg->attrib.dpc; + upmsg_ptr->opc = pcg->attrib.opc; + upmsg_ptr->cic[0] = cic_val & 0xff; + upmsg_ptr->cic[1] = (cic_val >> 8) & 0xff; + upmsg_ptr->cic[2] = (cic_val >> 16) & 0xff; + upmsg_ptr->cic[3] = (cic_val >> 24) & 0xff; + upmsg_ptr->sio = (pcg->attrib.network_id<<6) + BICC_SI; + + monitor_bicc_msg(Bicc_Data.port_data[pid].s_mtp_msg.msgList, Bicc_Data.port_data[pid].s_mtp_msg.len, 1, cic_val, pid); + bicc_to_mtp3(upmsg_ptr); +} + +int BICC_con_req(Pst *pst, BiccSetup_Req * ptr) +{ + + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + { + port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_SETUP_REQ; + port_ptr->used_flag = 1; + port_ptr->trace_flag = pst->trace_flag; + //if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + //{ + port_ptr->cic_state.call_state = BICC_OUTGOING; + memcpy(&writePrim_union[pst->sp_proc_id].setup_req, ptr, sizeof(BiccSetup_Req)); + } + else + { + + bicc_log_err("cic not idle,cic=%d, port = %d\n",pst->cic,pst->sp_proc_id); + return 0; + + } + + return 1; + +} + +int BICC_con_rsp(Pst *pst, BiccSetup_Rsp * ptr) +{ + + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; +// port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_SETUP_RSP; + + memcpy(&writePrim_union[pst->sp_proc_id].setup_rsp, ptr, sizeof(BiccSetup_Rsp)); + return 1; +} + + + +int BICC_rel_req(Pst *pst, BiccRel_Req * ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; +// port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_RELEASE_REQ; + + memcpy(&writePrim_union[pst->sp_proc_id].rel_req, ptr, sizeof(BiccRel_Req)); + return 1; +} + +int BICC_rel_rsp(Pst *pst, BiccRel_Rsp * ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; +// port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_RELEASE_RSP; + + memcpy(&writePrim_union[pst->sp_proc_id].rel_rsp, ptr, sizeof(BiccRel_Rsp)); + return 1; +} + +int BICC_alert_req(Pst *pst, BiccAlert_Req *ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; +// port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_ALERT_REQ; + memcpy(&writePrim_union[pst->sp_proc_id].alert_req, ptr, sizeof(BiccAlert_Req)); + bicc_cpci_proc(pst->sp_proc_id); + return 1; +} + +int BICC_info_req(Pst *pst, BiccInfo_Req *ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; +// port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_INFO_REQ; + memcpy(&writePrim_union[pst->sp_proc_id].info_req, ptr, sizeof(BiccInfo_Req)); + return 1; +} + +int BICC_prog_req(Pst *pst, BiccCpg_Req *ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; +// port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_PROG_REQ; + memcpy(&writePrim_union[pst->sp_proc_id].cpg_req, ptr, sizeof(BiccCpg_Req)); + return 1; +} + +int BICC_block_req(Pst *pst, BiccCgb_Req *ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; + port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_BLOCK_REQ; + memcpy(&writePrim_union[pst->sp_proc_id].cgb_req, ptr, sizeof(BiccCgb_Req)); + + return 1; + + +} + +int BICC_unblock_req(Pst *pst, BiccCgb_Req *ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; + port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_RESET_REQ; + memcpy(&writePrim_union[pst->sp_proc_id].cgb_req, ptr, sizeof(BiccCgb_Req)); + + return 1; + + + +} + +int BICC_resm_req(Pst *pst, BiccRes_Req * ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; +// port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_RESUME_REQ; + + memcpy(&writePrim_union[pst->sp_proc_id].res_req, ptr, sizeof(BiccRes_Req)); + return 1; +} + +int BICC_apm_req(Pst *pst, BiccApm_Req * ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; +// port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_APM_REQ; + + memcpy(&writePrim_union[pst->sp_proc_id].apm_req, ptr, sizeof(BiccApm_Req)); + bicc_send_apm(pst->sp_proc_id); + return 1; +} + +int BICC_sus_req(Pst *pst, BiccSus_Req *ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; +// port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_SUSPEND_REQ; + + memcpy(&writePrim_union[pst->sp_proc_id].sus_req, ptr, sizeof(BiccSus_Req)); + return 1; +} + + +int BICC_reset_req(Pst *pst, BiccGrs_Req *ptr) +{ + BICC_Port_struct *port_ptr; + //if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; + port_ptr->su_proc_id = pst->su_proc_id; + if(ptr!=NULL) + { + port_ptr->primitive_cmd = BICC_GROUP_RESET_REQ; + memcpy(&writePrim_union[pst->sp_proc_id].grs_req, ptr, sizeof(BiccGrs_Req)); + bicc_cgrs_proc(pst->sp_proc_id); + + } + else + port_ptr->primitive_cmd = BICC_RESET_REQ; + +// memcpy(&writePrim_union[pst->sp_proc_id].grs_req, ptr, sizeof(BiccGrs_Req)); + + return 1; + +} + + +int BICC_reset_rsp(Pst *pst, BiccGrs_Rsp *ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; +// port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_RESET_RSP; + memcpy(&writePrim_union[pst->sp_proc_id].grs_rsp, ptr, sizeof(BiccGrs_Rsp)); + + return 1; +} + +void BICC_EMPTY_APM(ApmUser_struct *ptr) +{ + ptr->action.pres = 0; + ptr->bnc_id.pres = 0; + ptr->bnc_chr.pres = 0; + ptr->bc_info.pres = 0; + ptr->bc_tunnel.pres = 0; + ptr->signal_type.pres = 0; + ptr->duration.pres = 0; +} + +/* This function clear optional parameter flag */ +void BICC_EMPTY_OPTPAR(void *ptr, u8 prim) +{ + if((prim & 0xf0) == 0x00) //request + { + switch(prim) + { + case BICC_SETUP_REQ: + ((BiccSetup_Req *)ptr)->app.pres = 0; + BICC_EMPTY_APM(&((BiccSetup_Req *)ptr)->app.apm_info); + ((BiccSetup_Req *)ptr)->callingPtyNum.pres = 0; + ((BiccSetup_Req *)ptr)->collectCallReq.pres = 0; + ((BiccSetup_Req *)ptr)->confTreat.pres = 0; + ((BiccSetup_Req *)ptr)->correlationId.pres = 0; + ((BiccSetup_Req *)ptr)->origCalledNum.pres = 0; + ((BiccSetup_Req *)ptr)->redirgNum.pres = 0; + ((BiccSetup_Req *)ptr)->scfId.pres = 0; + ((BiccSetup_Req *)ptr)->utuInd.pres = 0; + ((BiccSetup_Req *)ptr)->utuInfo.pres = 0; + break; + case BICC_ALERT_REQ: + ((BiccAlert_Req *)ptr)->app.pres = 0; + BICC_EMPTY_APM(&((BiccAlert_Req *)ptr)->app.apm_info); + ((BiccAlert_Req *)ptr)->cause.pres = 0; + ((BiccAlert_Req *)ptr)->confTreat.pres = 0; + ((BiccAlert_Req *)ptr)->utuInd.pres = 0; + ((BiccAlert_Req *)ptr)->utuInfo.pres = 0; + break; + case BICC_APM_REQ: + ((BiccApm_Req *)ptr)->app.pres = 0; + BICC_EMPTY_APM(&((BiccApm_Req *)ptr)->app.apm_info); + break; + case BICC_PROG_REQ: + ((BiccCpg_Req *)ptr)->app.pres = 0; + BICC_EMPTY_APM(&((BiccCpg_Req *)ptr)->app.apm_info); + ((BiccCpg_Req *)ptr)->backCall.pres = 0; + ((BiccCpg_Req *)ptr)->cause.pres = 0; + ((BiccCpg_Req *)ptr)->confTreat.pres = 0; + ((BiccCpg_Req *)ptr)->connNum.pres = 0; + ((BiccCpg_Req *)ptr)->utuInd.pres = 0; + ((BiccCpg_Req *)ptr)->utuInfo.pres = 0; + break; + case BICC_RELEASE_REQ: + ((BiccRel_Req *)ptr)->utuInd.pres = 0; + ((BiccRel_Req *)ptr)->utuInfo.pres = 0; + break; + default: + break; + } + } + else if((prim & 0xf0) == 0x80) //response + { + switch(prim) + { + case BICC_SETUP_RSP: + ((BiccSetup_Rsp *)ptr)->app.pres = 0; + BICC_EMPTY_APM(&((BiccSetup_Rsp *)ptr)->app.apm_info); + ((BiccSetup_Rsp *)ptr)->backCall.pres = 0; + ((BiccSetup_Rsp *)ptr)->confTreat.pres = 0; + ((BiccSetup_Rsp *)ptr)->connNum.pres = 0; + ((BiccSetup_Rsp *)ptr)->utuInd.pres = 0; + ((BiccSetup_Rsp *)ptr)->utuInfo.pres = 0; + break; + case BICC_RELEASE_RSP: + ((BiccRel_Rsp *)ptr)->cause.pres = 0; + break; + default: + break; + } + } +} + +void bicc_timer_init(int interval_ms) +{ + BiccTimer_struct *timer_ptr = &Timer_Data; + timer_ptr ->t1 = BICC_T1 * 1000 / interval_ms; + timer_ptr ->t5 = BICC_T5 * 1000 / interval_ms; + timer_ptr ->t7 = BICC_T7 * 1000 / interval_ms; + timer_ptr ->t8 = BICC_T8 * 1000 / interval_ms; + timer_ptr ->t9 = BICC_T9 * 1000 / interval_ms; + timer_ptr ->t12 = BICC_T12 * 1000 / interval_ms; + timer_ptr ->t13 = BICC_T13 * 1000 / interval_ms; + timer_ptr ->t14 = BICC_T14 * 1000 / interval_ms; + timer_ptr ->t15 = BICC_T15 * 1000 / interval_ms; + timer_ptr ->t16 = BICC_T16 * 1000 / interval_ms; + timer_ptr ->t17 = BICC_T17 * 1000 / interval_ms; + timer_ptr ->t18 = BICC_T18 * 1000 / interval_ms; + timer_ptr ->t19 = BICC_T19 * 1000 / interval_ms; + timer_ptr ->t20 = BICC_T20 * 1000 / interval_ms; + timer_ptr ->t21 = BICC_T21 * 1000 / interval_ms; + timer_ptr ->t22 = BICC_T22 * 1000 / interval_ms; + timer_ptr ->t23 = BICC_T23 * 1000 / interval_ms; + timer_ptr ->t28 = BICC_T28 * 1000 / interval_ms; + timer_ptr ->t33 = BICC_T33 * 1000 / interval_ms; + timer_ptr ->t34 = BICC_T34 * 1000 / interval_ms; + timer_ptr ->t35 = BICC_T35 * 1000 / interval_ms; + timer_ptr ->t40 = BICC_T40 * 1000 / interval_ms; + timer_ptr ->t41 = BICC_T41 * 1000 / interval_ms; + timer_ptr ->t42 = BICC_T42 * 1000 / interval_ms; + timer_ptr ->t43 = BICC_T43 * 1000 / interval_ms; + timer_ptr->user_t10 = BICC_USER_T10 * 1000 / interval_ms; + + +} + + +void BICC_init(int interval_ms,int local_id) +{ + u32 stack_size; + printf("Start BICC module init......\n"); + //memset(&BiccResource, 0, sizeof(BICC_Resource_pond)); + memset(&Bicc_Data, 0, sizeof(BiccData_struct)); + bicc_timer_init(interval_ms); + stack_size = sizeof(Bicc_Data); + bicc_debug_init(); + local_platid = local_id; + printf("BICC module init complete! Stack size: %ld bytes\n", stack_size); +} + + +void BICC_cpc_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + if(port_ptr->cic_state.call_state == BICC_INCOMING) + bicc_cpci_proc(pid); + else if(port_ptr->cic_state.call_state == BICC_OUTGOING) + bicc_cpco_proc(pid); + else + { +// if((port_ptr->fsm_state.cgrs_state == 0)&&(port_ptr->primitive_cmd == 0)) +// memset(&Bicc_Data.port_data[pid],0,sizeof(BICC_Port_struct)); + } +} + + +void BICC_csc_proc(u32 pid) +{ + bicc_mgbs_proc(pid); + bicc_mgbr_proc(pid); + bicc_crs_proc(pid); + bicc_crr_proc(pid); + bicc_cgrs_proc(pid); + bicc_cgrr_proc(pid); +// bicc_blr_proc(pid); +// bicc_bls_proc(pid); +} + +void BICC_timer() +{ + u32 i, j; + u32 offset, pid; + const pal_circuit_struct *pcircuit = NULL; + const pal_cg_struct *pcg = NULL; + for(i = 0; i < 64; i++) + { + if(BICC_mdsc_proc() == 0) + break; + } + for(i = 0; i < PAL_MAX_CIRCUIT; i++) + { + pcircuit = pal_circuit_ptr(i); + + if((pcircuit !=NULL) && (pcircuit->enable)) + { + if((pcg = pal_cg_ptr(pcircuit->cg_id)) && (pcg->attrib.protocol == PROTO_BICC)) + { + offset = BICC_CIRCUIT_CIC * i; + for(j = 0; j < BICC_CIRCUIT_CIC; j++) + { + pid = offset + j; + BICC_cpc_proc(pid); + BICC_csc_proc(pid); + } + } + } + } + bicc_debug_timer(); + +} + diff --git a/omc/plat/bicc/src.old/include/.copyarea.db b/omc/plat/bicc/src.old/include/.copyarea.db new file mode 100644 index 0000000..3837c9e --- /dev/null +++ b/omc/plat/bicc/src.old/include/.copyarea.db @@ -0,0 +1,12 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\bicc\src.old\include +2 +8 +c:bicc_debug.h|1|11d70a3e55c|2d0|bc45c482|e454820e6cf311dd91a5001c23e19543|0 +7:ipbcp.h|1|11d70a3e4ee|5ec|3918ea7e|e3c481de6cf311dd91a5001c23e19543|0 +a:q1902_3e.h|1|11d70a3e4c0|2d50|c4a74e73|e32481c66cf311dd91a5001c23e19543|0 +8:biccif.h|1|11d70a3e636|32e4|3f0cf7b4|e584826e6cf311dd91a5001c23e19543|0 +5:inc.h|1|11d70a3e5ba|e57|566ed92f|e4f4823e6cf311dd91a5001c23e19543|0 +9:q765_5e.h|1|11d70a3e59a|82e|ee80601c|e45482266cf311dd91a5001c23e19543|0 +9:var_ext.h|1|11d70a3e5f8|15c|91ea711b|e4f482566cf311dd91a5001c23e19543|0 +8:define.h|1|11d70a3e53d|1e9|94808f37|e3c481f66cf311dd91a5001c23e19543|0 diff --git a/omc/plat/bicc/src.old/include/bicc_debug.h b/omc/plat/bicc/src.old/include/bicc_debug.h new file mode 100644 index 0000000..01fcba9 --- /dev/null +++ b/omc/plat/bicc/src.old/include/bicc_debug.h @@ -0,0 +1,25 @@ +#include "define.h" +#include "../../../debug/src/include/debug.h" + +#define LOG_ERR_FLAG 0x01 +#define LOG_BICC_FLAG 0x02 +#define LOG_MSG_FLAG 0x04 +#define LOG_TIME_FLAG 0x08 +#define LOG_DMP_FLAG 0x10 +#define LOG_ALL_FLAG 0x1f +#define LOG_FILE_FLAG 0x20 +/*******************************/ +#define MAX_OPR_LEN 16 +#define MAX_OBJ_LEN 32 +#define MAX_VALUE_LEN 32 +#define BICC_PREOID_LEN 12 +#define BICC_DEBUG_OID 17 +#define BICC_DEBUG_PAGE 10 +#define BICC_ASCIN_LEN 128 +#define BICC_ASCOUT_LEN 4096 + + +int bicc_debug_init(); +void bicc_debug_timer(); +void monitor_bicc_msg(u8 *msg,u8 buf_len, BYTE flag, u32 cic, u32 portNo); +void bicc_asciout_proc(const char *fmt, ...); diff --git a/omc/plat/bicc/src.old/include/biccif.h b/omc/plat/bicc/src.old/include/biccif.h new file mode 100644 index 0000000..a755dec --- /dev/null +++ b/omc/plat/bicc/src.old/include/biccif.h @@ -0,0 +1,417 @@ +#ifndef _BICCIF_H_ +#define _BICCIF_H_ + +#include "q765_5e.h" +#include "q1902_3e.h" +#include "../../../mtp3/src/include/mtp3.h" +#include "../../../snmp/src/include/snmp.h" +//#include "../../../public/src/include/proto_pub.h" +#include "bicc_debug.h" +#include "../../../pal/pal.h" +/*********************************/ +/*** BICC Management Structure ***/ +/*********************************/ + +#define BICC_CM_OK 1 //command request success +#define BICC_CM_FAILED -1 //command request failed + +/************************************* +******BICC Resource Structure********* +*************************************/ +#define BICC_MAX_PORT 8192 +#define BICC_CG_CIRCUIT 32 +#define BICC_CIRCUIT_CIC 32 + + +/*** BICC Primitive Parameter Structure (different to q1902_3e) ***/ +typedef struct AppTransM_struct { //Application Transport Mechanism + u8 pres; + ApmUser_struct apm_info; +} AppTransM_struct; +/*********************************/ +/**** BICC Primitive Structure ***/ +/*********************************/ +typedef struct BiccSetup_Req { + NatConnInd_struct natConn;//F + FwdCallInd_struct fwdCall;//F + CallingPtyCat_struct callingPtyCat;//F + TransMedReq_struct transMedReq;//F + CalledPtyNum_struct calledPtyNum;//V + AppTransM_struct app; + CallingPtyNum_struct callingPtyNum; + CollectCallReq_struct collectCallReq; + ConfTreatInd_struct confTreat; + CorrelationId_struct correlationId; + OrigCalledNum_struct origCalledNum; + RedirgNum_struct redirgNum; + RedirInfo_struct redirInfo; + ScfId_struct scfId; + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; +} BiccSetup_Req, BiccSetup_Ind; + +typedef struct BiccSetup_Rsp { + AppTransM_struct app; + BackCallInd_struct backCall;//C: use it if no alert req is sent before + ConfTreatInd_struct confTreat; + ConnNum_struct connNum; + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; +} BiccSetup_Rsp, BiccSetup_Cnf; + +typedef struct BiccAlert_Req { + BackCallInd_struct backCall;//F + AppTransM_struct app; + CauseInd_struct cause; + ConfTreatInd_struct confTreat; + OptBackCallInd_struct optBackCall; + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; +} BiccAlert_Req, BiccAlert_Ind; + +typedef struct BiccInfo_Req { + SubseqNum_struct subseqNum;//V +} BiccInfo_Req, BiccInfo_Ind; + +typedef struct BiccApm_Req { + AppTransM_struct app; +} BiccApm_Req, BiccApm_Ind; + +typedef struct BiccCpg_Req { + EventInfo_struct eventInfo;//F + AppTransM_struct app; + BackCallInd_struct backCall; + CallDiverInfo_struct calldiver; + CauseInd_struct cause; + ConfTreatInd_struct confTreat; + ConnNum_struct connNum; + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; +} BiccCpg_Req, BiccCpg_Ind; + +typedef struct BiccRel_Req { + CauseInd_struct cause;//V + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; +} BiccRel_Req, BiccRel_Ind; + +typedef struct BiccRel_Rsp { + CauseInd_struct cause; +} BiccRel_Rsp, BiccRel_Cnf; + +typedef struct BiccRes_Req { + SusResInd_struct susRes;//F +} BiccRes_Req, BiccRes_Ind; + +typedef struct BiccSus_Req { + SusResInd_struct susRes;//F +} BiccSus_Req, BiccSus_Ind; + +typedef struct BiccCgb_Req { + CicGrpSpv_struct cicGrpSpv;//F + RangeStatus_struct rangeStatus;//V +} BiccCgb_Req, BiccCgb_Ind; + +typedef struct BiccCgb_Rsp { + CicGrpSpv_struct cicGrpSpv;//F + RangeStatus_struct rangeStatus;//V +} BiccCgb_Rsp, BiccCgb_Cnf; + +typedef struct BiccCgu_Req { + CicGrpSpv_struct cicGrpSpv;//F + RangeStatus_struct rangeStatus;//V +} BiccCgu_Req, BiccCgu_Ind; + +typedef struct BiccCgu_Rsp { + CicGrpSpv_struct cicGrpSpv;//F + RangeStatus_struct rangeStatus;//V +} BiccCgu_Rsp, BiccCgu_Cnf; + +typedef struct BiccGrs_Req { + RangeStatus_struct rangeStatus;//V +} BiccGrs_Req, BiccGrs_Ind; + +typedef struct BiccGrs_Rsp { + RangeStatus_struct rangeStatus;//V +} BiccGrs_Rsp, BiccGrs_Cnf; + + +typedef struct BiccSta_Req +{ + BiccMsg_struct biccMsg; +}BiccSta_Req; + +typedef struct BiccFac_Req +{ + FacInd_struct facInd; +}BiccFac_Req, BiccFac_Ind; + +typedef struct BiccFac_Rsp +{ + FacInd_struct facInd; +}BiccFac_Rsp, BiccFac_Cnf; + +typedef union BiccWritePrim_union { + BiccSetup_Req setup_req; + BiccSetup_Rsp setup_rsp; + BiccAlert_Req alert_req; + BiccInfo_Req info_req; + BiccApm_Req apm_req; + BiccCpg_Req cpg_req; + BiccRel_Req rel_req; + BiccRel_Rsp rel_rsp; + BiccRes_Req res_req; + BiccSus_Req sus_req; + BiccCgb_Req cgb_req;//only used in BICC module + BiccCgb_Rsp cgb_rsp;//only used in BICC module + BiccCgu_Req cgu_req;//only used in BICC module + BiccCgu_Rsp cgu_rsp;//only used in BICC module + BiccGrs_Req grs_req;//only used in BICC module + BiccGrs_Rsp grs_rsp;//only used in BICC module + BiccFac_Req fac_req; + BiccFac_Rsp fac_rsp; +} BiccWritePrim_union; + +typedef union BiccReadPrim_union { + BiccSetup_Ind setup_ind; + BiccSetup_Cnf setup_cnf; + BiccAlert_Ind alert_ind; + BiccInfo_Ind info_ind; + BiccApm_Ind apm_ind; + BiccCpg_Ind cpg_ind; + BiccRel_Ind rel_ind; + BiccRel_Cnf rel_cnf; + BiccRes_Ind res_ind; + BiccSus_Ind sus_ind; + BiccCgb_Ind cgb_ind;//only used in BICC module + BiccCgb_Cnf cgb_cnf;//only used in BICC module + BiccCgu_Ind cgu_ind;//only used in BICC module + BiccCgu_Cnf cgu_cnf;//only used in BICC module + BiccGrs_Ind grs_ind;//only used in BICC module + BiccGrs_Cnf grs_cnf;//only used in BICC module + BiccFac_Ind fac_ind; + BiccFac_Cnf fac_cnf; +} BiccReadPrim_union; + + +/********************************************/ +/****** BICC Internal Command *************/ +/********************************************/ +#define BICC_CMD_UNBLO 0x01 +#define BICC_CMD_BLO 0x02 +#define BICC_CMD_RESET 0x03 +#define BICC_CMD_RESET_COMP 0x04 + + +#define BICC_SI_CPCI 0x10 +#define BICC_SI_CPCO 0x20 +#define BICC_SI_BLS 0x30 +#define BICC_SI_BLR 0x40 +#define BICC_SI_MGBR 0x50 +#define BICC_SI_MGBS 0x60 +#define BICC_SI_CRS 0x70 +#define BICC_SI_CRR 0x80 +#define BICC_SI_CGRS 0x90 +#define BICC_SI_CGRR 0xA0 + +/********************************************/ +/****** BICC Event/Primitive Definition *****/ +/********************************************/ + +#define BICC_SETUP_REQ 0x01 //user-defined, first 4-digit:type of primitive second 4-digit:type of event +#define BICC_SETUP_IND 0x41 +#define BICC_SETUP_RSP 0x81 +#define BICC_SETUP_CNF 0xc1 +#define BICC_ALERT_REQ 0x02 +#define BICC_ALERT_IND 0x42 +#define BICC_INFO_REQ 0x03 +#define BICC_INFO_IND 0x43 +#define BICC_APM_REQ 0x04 +#define BICC_APM_IND 0x44 +#define BICC_PROG_REQ 0x05 +#define BICC_PROG_IND 0x45 +#define BICC_RELEASE_REQ 0x06 +#define BICC_RELEASE_IND 0x46 +#define BICC_RELEASE_RSP 0x86 +#define BICC_RELEASE_CNF 0xc6 +#define BICC_RESET_REQ 0x07 +#define BICC_RESET_IND 0x47 +#define BICC_RESET_CNF 0xc7 +#define BICC_RESET_RSP 0x87 +#define BICC_GROUP_RESET_REQ 0x17 + +#define BICC_BLOCK_REQ 0x08 +#define BICC_BLOCK_IND 0x48 +#define BICC_BLOCK_RSP 0x88 +#define BICC_BLOCK_CNF 0xc8 +#define BICC_UNBLOCK_REQ 0x09 +#define BICC_UNBLOCK_IND 0x49 +#define BICC_UNBLOCK_RSP 0x89 +#define BICC_UNBLOCK_CNF 0xc9 +#define BICC_SUSPEND_REQ 0x0a +#define BICC_SUSPEND_IND 0x4a +#define BICC_RESUME_REQ 0x0b +#define BICC_RESUME_IND 0x4b +#define BICC_REATTEMPT_IND 0x4c +#define BICC_FAILURE_IND 0x4f +#define BICC_FAC_REQ 0x0d +#define BICC_FAC_RSP 0x8d +#define BICC_FAC_IND 0x4d +#define BICC_FAC_CNF 0xcd +#define BICC_STA_IND 0x4e +#define BICC_STA_REQ 0x0e +#define BICC_MAINTENANCE_IND 0x44 // + +#define BICC_STOP_REQ 0xee +#define BICC_STOP_CNF 0xef + +typedef int f_bicc_setup_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_setup_anm_cnf(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_setup_con_cnf(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_release_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_release_cnf(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_alert_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_info_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_prog_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_suspend_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_resume_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_reset_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_reset_cnf(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_apm_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_reattempt_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_failure_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_block_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_block_cnf(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_unblock_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_unblock_cnf(Pst *pst, const BiccReadPrim_union *prm_ptr); + +typedef struct bicc_eventhandle_struct +{ + f_bicc_setup_ind *h_bicc_setup_ind; + f_bicc_setup_anm_cnf *h_bicc_setup_anm_cnf; + f_bicc_setup_con_cnf *h_bicc_setup_con_cnf; + f_bicc_release_ind *h_bicc_release_ind; + f_bicc_release_cnf *h_bicc_release_cnf; + f_bicc_alert_ind *h_bicc_alert_ind; + f_bicc_info_ind *h_bicc_info_ind; + f_bicc_prog_ind *h_bicc_prog_ind; + f_bicc_suspend_ind *h_bicc_suspend_ind; + f_bicc_resume_ind *h_bicc_resume_ind; + f_bicc_block_ind *h_bicc_block_ind; + f_bicc_block_cnf *h_bicc_block_cnf; + f_bicc_unblock_ind *h_bicc_unblock_ind; + f_bicc_unblock_cnf *h_bicc_unblock_cnf; + f_bicc_reset_ind *h_bicc_reset_ind; + f_bicc_reset_cnf *h_bicc_reset_cnf; + f_bicc_apm_ind *h_bicc_apm_ind; + f_bicc_reattempt_ind *h_bicc_reattempt_ind; + f_bicc_failure_ind *h_bicc_failure_ind; + +}BICC_EventHandle_struct; + +typedef struct _bicc_sap_attrib_ +{ + BICC_EventHandle_struct event_handle; +}bicc_sap_sttrib_; + +typedef enum _BICC_network_id +{ + SI_INTERNATIONAL = 0, + SI_INTERNATIONAL_SPARE = 1, + SI_NATIONAL = 2, + SI_NATIONAL_SPARE = 3, + +}SI_Netwrok_ID; + +typedef struct bicc_cic_state +{ + u8 call_state; + u8 sus_state; //suspend state, remote hold? local hold? + u8 blo_state; //block state, remote block? local hold? +}BICC_CIC_state; + +typedef struct bicc_fsm_state +{ + u8 cpc_state; + u8 mgbs_state; + u8 mgbr_state; + u8 crs_state; + u8 crr_state; + u8 cgrs_state; + u8 cgrr_state; +}BICC_Fsm_state; + +typedef struct bicc_port_struct +{ + u8 used_flag; + u8 trace_flag; + u32 w_time; + u32 su_proc_id; + u8 sprc_cmd; + u8 primitive_cmd; + u8 internal_cmd; + BICC_Fsm_state fsm_state; + BICC_CIC_state cic_state; + up_message_2 s_mtp_msg; //message send to mtp3 +}BICC_Port_struct; + +extern up_message_2 r_mtp_msg; //message receive from mtp3 + +typedef struct BiccDmp_struct { + // If DMP is active, circuit 0-127 is according to proccessor 0, circuit 128-255 is accroding to proccessor 1 // + u8 active; + u8 processor_id; + u32 remote_ip; +} BiccDmp_struct; + + +/********************** +***upper layer interface*** +*********************** +*/ + +extern int BICC_con_req(Pst *pst, BiccSetup_Req *ptr); //iam //Connection establishment request +extern int BICC_con_rsp(Pst *pst, BiccSetup_Rsp *ptr); //anm,con //Connection establishment response +extern int BICC_rel_req(Pst *pst, BiccRel_Req *ptr); //Release request +extern int BICC_rel_rsp(Pst *pst, BiccRel_Rsp *ptr); //Release response +extern int BICC_alert_req(Pst *pst, BiccAlert_Req *ptr); //alert +extern int BICC_info_req(Pst *pst, BiccInfo_Req *ptr); //sam +extern int BICC_prog_req(Pst *pst, BiccCpg_Req *ptr); //progress +extern int BICC_apm_req(Pst *pst, BiccApm_Req *ptr); +extern int BICC_sus_req(Pst *pst, BiccSus_Req *ptr); //Call suspend request +extern int BICC_resm_req(Pst *pst, BiccRes_Req *ptr); //Call resume request +extern int BICC_block_req(Pst *pst, BiccCgb_Req *ptr); //block req +extern int BICC_block_rsp(Pst *pst, BiccCgb_Req *ptr); +extern int BICC_unblock_req(Pst *pst, BiccCgb_Req *ptr); //unblock req +extern int BICC_unblock_rsp(Pst *pst, BiccCgb_Req *ptr); +extern int BICC_reset_req(Pst *pst, BiccGrs_Req *ptr); +extern int BICC_reset_rsp(Pst *pst, BiccGrs_Rsp *ptr); //reset response + +extern void BICC_EMPTY_OPTPAR(void *ptr, u8 prim); + +extern BOOL bicc_trunk_reachable(u32 cg_id); +/***************************** +*** layer management interface*** +****************************** +*/ + +int BICC_active_dmp(u8 plat_id, u32 alter_id ); +int BICC_deactive_dmp(); + +/*********************** +*** lower layer interface*** +************************ +*/ +void BICC_msdc_proc(u32 pid, up_message_2 *upmsg_ptr); +int BICC_mdsc_proc(); + +/****************************** +*** system service interface*** +******************************* +*/ + +void BICC_init(int interval_ms, int local_id); +void BICC_timer(); + +#endif + diff --git a/omc/plat/bicc/src.old/include/define.h b/omc/plat/bicc/src.old/include/define.h new file mode 100644 index 0000000..63fc073 --- /dev/null +++ b/omc/plat/bicc/src.old/include/define.h @@ -0,0 +1,34 @@ +#ifndef _DEFINE_H_ +#define _DEFINE_H_ + +//typedef int BOOL; +#ifndef _T_U8 +#define _T_U8 +typedef unsigned char u8; +#endif + +#ifndef _T_U16 +#define _T_U16 +typedef unsigned short u16; +#endif + +#ifndef _T_U32 +#define _T_U32 +typedef unsigned int u32; +#endif + +#define BICC_TOLERANT +#define BICC_REATTEMPT +#define BICC_DEBUG + +//Event +#define EN_NONE 0x00 +#define EN_ANM 0x01 +#define EN_CON 0x02 +#define EN_GROUP 0x03 + +#define M_LOCAL_BLOCK 0x01 +#define M_REMOTE_BLOCK 0x02 + +#endif + diff --git a/omc/plat/bicc/src.old/include/inc.h b/omc/plat/bicc/src.old/include/inc.h new file mode 100644 index 0000000..20d1c9c --- /dev/null +++ b/omc/plat/bicc/src.old/include/inc.h @@ -0,0 +1,162 @@ +#ifndef _INC_H +#define _INC_H + +#include +#include +#include "../../../mtp3/src/include/mtp3.h" +#include "../../../snmp/src/include/snmp.h" +#include "biccif.h" + +#define BICC_VERSION {9, 0, 10, 0} +#define BICC_SCREEN_SIZE 32 + +#define BICC_TIMER_STOP 0 +#define BICC_TIMER_EXPIRED 1 +#define BICC_T1 15 +#define BICC_T5 300 +#define BICC_T7 30 +#define BICC_T8 10 +#define BICC_T9 120 +#define BICC_T12 15 +#define BICC_T13 300 +#define BICC_T14 15 +#define BICC_T15 300 +#define BICC_T16 15 +#define BICC_T17 300 +#define BICC_T18 15 +#define BICC_T19 300 +#define BICC_T20 15 +#define BICC_T21 300 +#define BICC_T22 15 +#define BICC_T23 300 +//#define BICC_T24 1 +//#define BICC_T25 1 +//#define BICC_T26 60 +//#define BICC_T27 240 +#define BICC_T28 10 +#define BICC_T33 12 +#define BICC_T34 2 +#define BICC_T35 15 +//#define BICC_T36 10 +//#define BICC_T37 2 +#define BICC_T40 10 +#define BICC_T41 10 +#define BICC_T42 5 +#define BICC_T43 5 +#define BICC_USER_T10 10//user defined timer,10s + + +#define BICC_CIC_IDLE 0 +#define BICC_INCOMING 1 +#define BICC_OUTGOING 2 +#define BICC_RESET 3 + + +#define BICC_TYPE_INCOMING 0 +#define BICC_TYPE_OUTGOING 1 +#define BICC_TYPE_BIDIRECT 2 + +#define BICC_ORIG_SUSPEND 0 //originating side suspend +#define BICC_TERM_SUSPEND 1 //terminating side suspend + + +typedef struct BiccTimer_struct +{ + int t1; + int t5; + int t7; + int t8; + int t9; + int t12; + int t13; + int t14; + int t15; + int t16; + int t17; + int t18; + int t19; + int t20; + int t21; + int t22; + int t23; + int t28; + int t33; + int t34; + int t35; + int t40; + int t41; + int t42; + int t43; + int user_t10; + +}BiccTimer_struct; + +typedef struct BiccMng_struct { + u8 state; + u32 lnk_id; + RangeStatus_struct rangeStatus; +} BiccMng_struct; + + +typedef struct BiccDebug_struct { + u32 flag; + u8 sap_enable[BICC_SCREEN_SIZE]; + u8 sap_cg_num[BICC_SCREEN_SIZE]; + + //u8 cg_enable[BICC_SCREEN_SIZE]; + //u8 network_id[BICC_SCREEN_SIZE]; + + // page 1 // + u8 cic_enable[BICC_SCREEN_SIZE]; + u8 cic_type[BICC_SCREEN_SIZE]; + u8 l_block[BICC_SCREEN_SIZE]; + u8 r_block[BICC_SCREEN_SIZE]; + // page 2 // + u8 cic_status[BICC_SCREEN_SIZE]; + u8 cpc_state[BICC_SCREEN_SIZE]; + u8 mgbs_state[BICC_SCREEN_SIZE]; + u8 mgbr_state[BICC_SCREEN_SIZE]; + u8 crs_state[BICC_SCREEN_SIZE]; + u8 crr_state[BICC_SCREEN_SIZE]; + u8 cgrs_state[BICC_SCREEN_SIZE]; + u8 cgrr_state[BICC_SCREEN_SIZE]; + // page 3 // + u8 sprc_command[BICC_SCREEN_SIZE]; + u8 mgbs_command[BICC_SCREEN_SIZE]; + u8 mgbr_command[BICC_SCREEN_SIZE]; + u8 crs_command[BICC_SCREEN_SIZE]; + u8 crr_command[BICC_SCREEN_SIZE]; + u8 cgrs_command[BICC_SCREEN_SIZE]; + u8 cgrr_command[BICC_SCREEN_SIZE]; + u8 prim_command[BICC_SCREEN_SIZE]; + // page 4 // + u8 mng_state; + u8 mng_lnk_id; +} BiccDebug_struct; + +typedef struct BiccData_struct +{ + BiccDebug_struct debug_data; + BiccMng_struct mng_data; + BiccDmp_struct dmp_data; + BiccTimer_struct timer_data[BICC_MAX_PORT]; + //BICC_Fsm_state fsm_data[BICC_MAX_PORT]; + BICC_Port_struct port_data[BICC_MAX_PORT]; + +}BiccData_struct; + +typedef struct stat_struct { +// u32 en_cic; + u32 lblo_cic; + u32 rblo_cic; +// u32 in_cic; +// u32 out_cic; +// u32 bi_cic; + u32 idle_call; + u32 in_call; + u32 out_call; + u32 lsus_cic; + u32 rsus_cic; +}stat_struct; +#endif + diff --git a/omc/plat/bicc/src.old/include/ipbcp.h b/omc/plat/bicc/src.old/include/ipbcp.h new file mode 100644 index 0000000..813b057 --- /dev/null +++ b/omc/plat/bicc/src.old/include/ipbcp.h @@ -0,0 +1,60 @@ +// Q.1970E; RFC 2327 // +#ifndef _IPBCP_H_ +#define _IPBCP_H_ + +typedef struct SdpOrig_struct { + char username[16]; + char session_id[16]; + char version[8]; + char network_type[8]; + char address_type[8]; + char address[16]; +} SdpOrig_struct; + +typedef struct SdpConn_struct { + char network_type[8]; + char address_type[8]; + char address[16]; +} SdpConn_struct; + +typedef struct SdpTime_struct { + char start[16]; //0 + char stop[16]; //0 +} SdpTime_struct; + +typedef struct SdpAttrib_struct { + char version[8]; //1 + char type[16]; //"Request"/"Accepted"/"Confused"/"Rejected" +} SdpAttrib_struct; + +typedef struct SdpMediaAnn_struct { + char media[16]; + char port[8]; + char transport[16]; + char fmt_list[128]; +} SdpMediaAnn_struct; + +// specify RTP dynamic payload types // +typedef struct SdpMediaAtt_struct { + char payload[8]; + char encoding_name[16]; + char clock_rate[8]; +// char p_time[8]; +} SdpMediaAtt_struct; + +typedef struct IPBCP_struct { + char proto_ver[8]; //Protocol version (M) + SdpOrig_struct orig; //Orign (M) + char session_name[16]; //Session name (M) + SdpConn_struct conn_data; //Connection data + SdpTime_struct time; //Time + SdpAttrib_struct attrib; //Session attribute + SdpMediaAnn_struct m_ann; //Media announcement (M) + SdpMediaAtt_struct m_att; //Media attributes + char ptime[8]; +} IPBCP_struct; + +extern int ipbcp_decode(IPBCP_struct *ipbcp_ptr, const char *ptr); +extern int ipbcp_encode(char *ptr, const IPBCP_struct *ipbcp_ptr); + +#endif diff --git a/omc/plat/bicc/src.old/include/q1902_3e.h b/omc/plat/bicc/src.old/include/q1902_3e.h new file mode 100644 index 0000000..16dc75a --- /dev/null +++ b/omc/plat/bicc/src.old/include/q1902_3e.h @@ -0,0 +1,456 @@ +#ifndef _q1902_3E_H_ +#define _q1902_3E_H_ +#include "define.h" +#include "q765_5e.h" +/******************************************/ +/******** BICC SIO (Q.1901E C.7.3) ********/ +/******************************************/ +#define BICC_SI 13 + +/******************************************/ +/* Message Type Codes (Q.1902-3E, page 5) */ +/******************************************/ +#define M_ACM 0x06//Address complete +#define M_ANM 0x09//Answer +#define M_APM 0x41//Application transport +#define M_BLO 0x13//Blocking +#define M_BLA 0x15//Blocking acknowledgement +#define M_CPG 0x2c//Call progress +#define M_CGB 0x18//Circuit/CIC group blocking +#define M_CGBA 0x1a//Circuit/CIC group blocking acknowledgement +#define M_CQM 0x2a//Circuit/CIC group query (national use) +#define M_CQR 0x2b//Circuit/CIC group query response (national use) +#define M_GRS 0x17//Circuit/CIC group reset +#define M_GRA 0x29//Circuit/CIC group reset acknowledgement +#define M_CGU 0x19//Circuit/CIC group unblocking +#define M_CGUA 0x1b//Circuit/CIC group unblocking acknowledgement +#define M_CRG 0x31//Charge information (national use) +#define M_CFN 0x2f//Confusion +#define M_CON 0x07//Connect +#define M_COT 0x05//Continuity +#define M_FAC 0x33//Facility +#define M_FAA 0x20//Facility accepted +#define M_FRJ 0x21//Facility reject +#define M_FAR 0x1f//Facility request +#define M_FOT 0x08//Forward transfer +#define M_IDR 0x36//Identification request +#define M_IRS 0x37//Identification response +#define M_INF 0x04//Information (national use) +#define M_INR 0x03//Information request (national use) +#define M_IAM 0x01//Initial address +#define M_LOP 0x40//Loop prevention +#define M_NRM 0x32//Network resource management +#define M_PRI 0x42//Pre-release information +#define M_REL 0x0c//Release +#define M_RLC 0x10//Release complete +#define M_RSC 0x12//Reset circuit/CIC +#define M_RES 0x0e//Resume +#define M_SGM 0x38//Segmentation +#define M_SAM 0x02//Subsequent address +#define M_SDM 0x43//Subsequent Directory Number (national use) +#define M_SUS 0x0d//Suspend +#define M_UBL 0x14//Unblocking +#define M_UBA 0x16//Unblocking acknowledgement +#define M_UCIC 0x2e//Unequipped CIC (national use) +#define M_USR 0x2d//User-to-user information + + +/*********************************************/ +/* Parameter Name Codes (Q.1902-3E, page 10) */ +/*********************************************/ +#define P_APPTRANS 0x78//Application transport +#define P_BACKCALLIND 0x11//Backward call indicators +#define P_CALLEDPTYNUM 0x04//Called party number +#define P_CALLINGPTYNUM 0x0a//Calling party number +#define P_CALLINGPTYCAT 0x09//Calling party's category +#define P_CAUSEIND 0x02//Cause indicators +#define P_CICGRPSPV 0x15//Circuit/CIC group supervision message type +#define P_COLLECTCALLREQ 0x79//Collect call request +#define P_CONFTREATIND 0x72//Conference treatment indicators +#define P_CONNNUM 0x21//Connected number +#define P_CORRELATIONID 0x65//Correlation id +#define P_EVENINFO 0x24//Event information +#define P_FACIND 0x18//Facility indicator +#define P_FWDCALLIND 0x07//Forward call indicators +#define P_NATCONNIND 0x06//Nature of connection indicators +#define P_ORIGCALLEDNUM 0x28//Original called number +#define P_RANGESTATUS 0x16//Range and status +#define P_REDIRGNUM 0x0b//Redirecting number +#define P_REDIRINFO 0x13//Redirection information +#define P_SCFID 0x66//SCF id +#define P_SUBSEQNUM 0x05//Subsequent number +#define P_SUSRESIND 0x22//Suspend/Resume indicators +#define P_TRANSMEDREQ 0x02//Transmission medium requirement +#define P_UTUIND 0x2a//User-to-user indicators +#define P_UTUINFO 0x20//User-to-user information +#define P_CALLDIVERINFO 0x36//Call diversion information +#define P_OPTBACKCALLIND 0x29//Optional backward call indicators + +/**********************************************/ +/* Parameter Structure (Q.1902-3E, section 6) */ +/**********************************************/ +#define MAX_BICC_DIGIT 32 +#define BICC_STATUS_LEN 32 +#define BICC_APP_LEN 200 +#define MAX_DIAGNOSTIC_LEN 32 + +typedef struct AppTrans_struct { + u8 pres; + u8 aci[2]; //Application context identifier + u8 :6; + u8 sni:1; //Send notification indicator + u8 rci:1; //Release call indicator + u16 :1; + u16 si:1; //Sequence indicator + u16 segment:6; //APM segmentation indicator + u16 :1; + u16 slr:7; //Segmentation local reference + // APM-user information (For APM'98-user application only) // + ApmUser_struct apm_info; +} AppTrans_struct; + +typedef struct BackCallInd_struct { + u8 pres; + u8 val[2]; +} BackCallInd_struct; + +typedef struct CalledPtyNum_struct { + u8 pres; + u8 nai; + u8 inn; + u8 npi; + u8 numOfDigit; + u8 digit[MAX_BICC_DIGIT]; +} CalledPtyNum_struct; + +typedef struct CallingPtyNum_struct { + u8 pres; + u8 nai; + u8 ni; + u8 npi; + u8 apri; + u8 si; + u8 numOfDigit; + u8 digit[MAX_BICC_DIGIT]; +} CallingPtyNum_struct; + +typedef struct CallingPtyCat_struct { + u8 pres; + u8 val; +} CallingPtyCat_struct; + +/* defined in Q.850E */ +typedef struct CauseInd_struct { + u8 pres; + u8 codingStd; + u8 location; + u8 causeVal; + //diagnostic +} CauseInd_struct; + +typedef struct CicGrpSpv_struct { + u8 pres; + u8 val; +} CicGrpSpv_struct; + +typedef struct CollectCallReq_struct { + u8 pres; + u8 val; +} CollectCallReq_struct; + +typedef struct ConfTreatInd_struct { + u8 pres; + u8 val; +} ConfTreatInd_struct; + +typedef struct ConnNum_struct { + u8 pres; + u8 nai; + u8 npi; + u8 apri; + u8 si; + u8 numOfDigit; + u8 digit[MAX_BICC_DIGIT]; +} ConnNum_struct; + +typedef struct EventInfo_struct { + u8 pres; + u8 val; +} EventInfo_struct; + +typedef struct FacInd_struct { + u8 pres; + u8 val; +} FacInd_struct; + +typedef struct FwdCallInd_struct { + u8 pres; + u8 val[2]; +} FwdCallInd_struct; + +typedef struct GenericNumber_struct { + u8 pres; + u8 nqi; //Number qualifier indicator + u8 nai; + u8 ni; + u8 npi; + u8 apri; + u8 si; + u8 numOfDigit; + u8 digit[MAX_BICC_DIGIT]; +} GenericNumber_struct; + + +typedef struct GenericDigits_struct /* Generic Digits */ +{ + u8 pres; + u8 typeOfDigits; + u8 encodeScheme; + u8 numOfDigit; + u8* digits; +} GenericDigits_struct; + + +typedef GenericDigits_struct CorrelationId_struct; //R10 + +//typedef struct CorrelationId_struct { //R9 +// u8 pres; +// u8 digit[4]; //4 bytes +//}CorrelationId_struct; +typedef struct NatConnInd_struct { + u8 pres; + u8 val; +} NatConnInd_struct; + +typedef struct OrigCalledNum_struct { + u8 pres; + u8 nai; + u8 npi; + u8 apri; + u8 numOfDigit; + u8 digit[MAX_BICC_DIGIT]; +} OrigCalledNum_struct; + +typedef struct RangeStatus_struct { + u8 pres; + u8 range; + u8 status[BICC_STATUS_LEN]; +} RangeStatus_struct; + +typedef struct RedirgNum_struct { + u8 pres; + u8 nai; + u8 npi; + u8 apri; + u8 numOfDigit; + u8 digit[MAX_BICC_DIGIT]; +} RedirgNum_struct; + +typedef struct RedirInfo_struct{ + u8 pres; + u8 redInd; + u8 origRedirReason; + u8 redirCounter; + u8 redirReason; +}RedirInfo_struct; + +typedef GenericDigits_struct ScfId_struct; +/*typedef struct ScfId_struct { + u8 pres; + u8 nai; + u8 inn; + u8 npi; + u8 numOfDigit; + u8 digit[MAX_BICC_DIGIT]; +}ScfId_struct; +*/ +typedef struct SubseqNum_struct { + u8 pres; + u8 numOfDigit; + u8 digit[MAX_BICC_DIGIT]; +} SubseqNum_struct; + +typedef struct SusResInd_struct { + u8 pres; + u8 val; +} SusResInd_struct; + +typedef struct TransMedReq_struct { + u8 pres; + u8 val; +} TransMedReq_struct; + +typedef struct UserToUserInd_struct { + u8 pres; + u8 val; +} UserToUserInd_struct; + +typedef struct UserToUserInfo_struct { + u8 pres; + u8 len; + u8 val[129]; +} UserToUserInfo_struct; + +typedef struct CallDiverInfo_struct +{ + u8 pres; + u8 notifSubsOption; + u8 redirReason; +}CallDiverInfo_struct; + +typedef struct OptBackCallInd_struct +{ + u8 pres; + u8 inbandInfoInd; + u8 callDiverOccurInd; + u8 simpSegmInd; + u8 mlppUserInd; +}OptBackCallInd_struct; +/********************************************/ +/* Message structure (Q.1902-3E, section 7) */ +/********************************************/ +typedef struct BiccAcm_struct { + BackCallInd_struct backCall;//F + AppTrans_struct app; + CauseInd_struct cause; + ConfTreatInd_struct confTreat; + OptBackCallInd_struct optBackCall; + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; +} BiccAcm_struct; + +typedef struct BiccAnm_struct { + AppTrans_struct app; + BackCallInd_struct backCall; + ConfTreatInd_struct confTreat; + ConnNum_struct connNum; + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; +} BiccAnm_struct; + +typedef struct BiccApm_struct { + AppTrans_struct app; +} BiccApm_struct; + +typedef struct BiccCpg_struct { + EventInfo_struct eventInfo;//F + AppTrans_struct app; + BackCallInd_struct backCall; + CallDiverInfo_struct calldiver; + CauseInd_struct cause; + ConfTreatInd_struct confTreat; + ConnNum_struct connNum; + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; +} BiccCpg_struct; + +typedef struct BiccCgb_struct { + CicGrpSpv_struct cicGrpSpv;//F + RangeStatus_struct rangeStatus;//V +} BiccCgb_struct; + +typedef struct BiccCgba_struct { + CicGrpSpv_struct cicGrpSpv;//F + RangeStatus_struct rangeStatus;//V +} BiccCgba_struct; + +typedef struct BiccCgu_struct { + CicGrpSpv_struct cicGrpSpv;//F + RangeStatus_struct rangeStatus;//V +} BiccCgu_struct; + +typedef struct BiccCgua_struct { + CicGrpSpv_struct cicGrpSpv;//F + RangeStatus_struct rangeStatus;//V +} BiccCgua_struct; + +typedef struct BiccGrs_struct { + RangeStatus_struct rangeStatus;//V +} BiccGrs_struct; + +typedef struct BiccGra_struct { + RangeStatus_struct rangeStatus;//V +} BiccGra_struct; + +typedef struct BiccCon_struct { + BackCallInd_struct backCall;//F + AppTrans_struct app; + ConfTreatInd_struct confTreat; + ConnNum_struct connNum; + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; +} BiccCon_struct; + +typedef struct BiccIam_struct { + NatConnInd_struct natConn;//F + FwdCallInd_struct fwdCall;//F + CallingPtyCat_struct callingPtyCat;//F + TransMedReq_struct transMedReq;//F + CalledPtyNum_struct calledPtyNum;//V + AppTrans_struct app; + CallingPtyNum_struct callingPtyNum; + CollectCallReq_struct collectCallReq; + ConfTreatInd_struct confTreat; + CorrelationId_struct correlationId; + OrigCalledNum_struct origCalledNum; + RedirgNum_struct redirgNum; + RedirInfo_struct redirInfo; + ScfId_struct scfId; + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; + +} BiccIam_struct; + +typedef struct BiccRel_struct { + CauseInd_struct cause;//V + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; +} BiccRel_struct; + +typedef struct BiccRlc_struct { + CauseInd_struct cause; +} BiccRlc_struct; + +typedef struct BiccRes_struct { + SusResInd_struct susRes;//F + //Optional +} BiccRes_struct; + +typedef struct BiccSus_struct { + SusResInd_struct susRes;//F + //Optional +} BiccSus_struct; + +typedef struct BiccSam_struct { + SubseqNum_struct subseqNum;//V + //Optional +} BiccSam_struct; + +typedef struct BiccMsg_struct +{ + +}BiccMsg_struct; + + +typedef union BiccMsg_union { + BiccAcm_struct acm; + BiccAnm_struct anm; + BiccApm_struct apm; + BiccCpg_struct cpg; + BiccCgb_struct cgb; + BiccCgba_struct cgba; + BiccCgu_struct cgu; + BiccCgua_struct cgua; + BiccGrs_struct grs; + BiccGra_struct gra; + BiccCon_struct con; + BiccIam_struct iam; + BiccRel_struct rel; + BiccRlc_struct rlc; + BiccRes_struct res; + BiccSus_struct sus; + BiccSam_struct sam; +} BiccMsg_union; + +#endif + diff --git a/omc/plat/bicc/src.old/include/q765_5e.h b/omc/plat/bicc/src.old/include/q765_5e.h new file mode 100644 index 0000000..b404cf0 --- /dev/null +++ b/omc/plat/bicc/src.old/include/q765_5e.h @@ -0,0 +1,100 @@ +#ifndef _q765_5E_H_ +#define _q765_5E_H_ +#include "define.h" + +#define AP_ACTION 0x01 +#define AP_BNCID 0x02 +#define AP_IWFADDR 0x03 +#define AP_CODECLIST 0x04 +#define AP_SINGLECODEC 0x05 +#define AP_BATCR 0x06 +#define AP_BNCCHR 0x07 +#define AP_BCINFO 0x08 +#define AP_BCTUNNEL 0x09 +#define AP_BCUI 0x0a +#define AP_SIGNAL 0x0b +#define AP_BRC 0x0c +#define AP_BRI 0x0d +#define AP_SIGNALTYPE 0x0e +#define AP_DURATION 0x0f + +/************************************************/ +/***** Encapsulated application information *****/ +/************************************************/ +typedef struct ActionInd_struct { + u8 pres; + u8 comp_info; + u8 val; +} ActionInd_struct; + +typedef struct BncId_struct { + u8 pres; + u8 comp_info; + u8 len; + u8 val[4]; +} BncId_struct; + +typedef struct IwfAddr_struct { + u8 pres; + //... +} IwfAddr_struct; + +typedef struct BncChr_struct { + u8 pres; + u8 comp_info; + u8 val; +} BncChr_struct; + +typedef struct BCTP_struct { + // BTCP (Q.1990) // + u8 :1; + u8 bvei:1; //BCTP Version Error Indicator + u8 :1; + u8 btcp_version:5; //BCTP Version Indicator + u8 :1; + u8 tpei:1; //Tunnelled Protocol Error Indicator + u8 tunnel_protocol:6; //Tunnelled Protocol Indicator + // IPBCP (Q.1970) // + u8 ipbcp_len; + u8 ipbcp_content[200]; +} BCTP_struct; + +typedef struct BcInfo_struct { + u8 pres; + u8 comp_info; + BCTP_struct bctp; +} BcInfo_struct; + +typedef struct BcTunnel_struct { + u8 pres; + u8 comp_info; + u8 val; +} BcTunnel_struct; + +typedef struct SignalType_struct { + u8 pres; + u8 comp_info; + u8 val; +} SignalType_struct; + +typedef struct Duration_struct { + u8 pres; + u8 comp_info; + u16 val; +} Duration_struct; + +typedef struct ApmUser_struct { + u8 :6; + u8 sni:1; //Send notification indicator + u8 rci:1; //Release call indicator + ActionInd_struct action; + BncId_struct bnc_id; + BncChr_struct bnc_chr; + BcInfo_struct bc_info; + BcTunnel_struct bc_tunnel; + SignalType_struct signal_type; + Duration_struct duration; +} ApmUser_struct; + +#endif + diff --git a/omc/plat/bicc/src.old/include/var_ext.h b/omc/plat/bicc/src.old/include/var_ext.h new file mode 100644 index 0000000..480534d --- /dev/null +++ b/omc/plat/bicc/src.old/include/var_ext.h @@ -0,0 +1,14 @@ +#ifndef _VAR_EXT_H_ +#define _VAR_EXT_H_ + +#include "define.h" +#include "biccif.h" +#include "inc.h" + + +extern u8 Bicc_Version[4]; +extern BiccData_struct Bicc_Data; +extern BiccTimer_struct Timer_Data; +extern BiccReadPrim_union readPrim_union[BICC_MAX_PORT]; +extern BiccWritePrim_union writePrim_union[BICC_MAX_PORT]; +#endif diff --git a/omc/plat/bicc/src/.copyarea.db b/omc/plat/bicc/src/.copyarea.db new file mode 100644 index 0000000..fc7fc04 --- /dev/null +++ b/omc/plat/bicc/src/.copyarea.db @@ -0,0 +1,12 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\bicc\src +2 +8 +a:bicc_prm.c|1|11d70a3e7ec|33ed|1c8d9a4|5cd64a3a9a8611dd8b36001c23e19543|0 +a:bicc_fsm.c|1|11d70a3e740|f45c|d7758e91|5e064a9a9a8611dd8b36001c23e19543|0 +a:bicc_msg.c|1|11d70a3e7ad|8563|a0fc75de|5d764a6a9a8611dd8b36001c23e19543|0 +a:bicc_apm.c|1|11d70a3e6d3|1363|b56b34ff|5cd64a529a8611dd8b36001c23e19543|0 +7:include|2|0|0|0|b19bc6669b5711dd8e28001c23e19543|0 +c:bicc_debug.c|1|11d70a3e702|54e6|55931a29|5d764a829a8611dd8b36001c23e19543|0 +8:biccif.c|1|11d70a3e81b|800d|713cda1f|5ea64ae29a8611dd8b36001c23e19543|0 +c:bicc_ipbcp.c|1|11d70a3e76f|1e3d|81f3ff1f|5ea64aca9a8611dd8b36001c23e19543|0 diff --git a/omc/plat/bicc/src/bicc_apm.c b/omc/plat/bicc/src/bicc_apm.c new file mode 100644 index 0000000..90039f9 --- /dev/null +++ b/omc/plat/bicc/src/bicc_apm.c @@ -0,0 +1,206 @@ +#include +#include +#include "./include/q765_5e.h" + +void apm_decode_action(ActionInd_struct *ptr, const u8 *flw_ptr, u8 length) +{ + ptr->pres = 1; + ptr->comp_info = flw_ptr[0]; + ptr->val = flw_ptr[1]; +} + +u32 apm_encode_action(u8 *flw_ptr, const ActionInd_struct *ptr) +{ + flw_ptr[0] = ptr->comp_info; + flw_ptr[1] = ptr->val; + return 2; +} + +void apm_decode_bncid(BncId_struct *ptr, const u8 *flw_ptr, u8 length) +{ + ptr->pres = 1; + ptr->comp_info = flw_ptr[0]; + ptr->len = length - 1; + memcpy(ptr->val, flw_ptr+1, ptr->len); +} + +u32 apm_encode_bncid(u8 *flw_ptr, const BncId_struct *ptr) +{ + flw_ptr[0] = ptr->comp_info; + memcpy(flw_ptr+1, ptr->val, ptr->len); + return ptr->len + 1; +} + +void apm_decode_bncchr(BncChr_struct *ptr, const u8 *flw_ptr, u8 length) +{ + ptr->pres = 1; + ptr->comp_info = flw_ptr[0]; + ptr->val = flw_ptr[1]; +} + +u32 apm_encode_bncchr(u8 *flw_ptr, const BncChr_struct *ptr) +{ + flw_ptr[0] = ptr->comp_info; + flw_ptr[1] = ptr->val; + return 2; +} + +void apm_decode_bcinfo(BcInfo_struct *ptr, const u8 *flw_ptr, u8 length) +{ + ptr->pres = 1; + ptr->comp_info = flw_ptr[0]; + ptr->bctp.bvei = (flw_ptr[1] >> 6) & 0x01; + ptr->bctp.btcp_version = flw_ptr[1] & 0x1f; + ptr->bctp.tpei = (flw_ptr[2] >> 6) & 0x01; + ptr->bctp.tunnel_protocol = flw_ptr[2] & 0x3f; + ptr->bctp.ipbcp_len = length - 3; + memcpy(ptr->bctp.ipbcp_content, flw_ptr+3, ptr->bctp.ipbcp_len); +} + +u32 apm_encode_bcinfo(u8 *flw_ptr, const BcInfo_struct *ptr) +{ + flw_ptr[0] = ptr->comp_info; + flw_ptr[1] = (ptr->bctp.bvei << 6) + (1 << 5) + ptr->bctp.btcp_version; + flw_ptr[2] = (ptr->bctp.tpei << 6) + ptr->bctp.tunnel_protocol; + memcpy(flw_ptr+3, ptr->bctp.ipbcp_content, ptr->bctp.ipbcp_len); + return ptr->bctp.ipbcp_len + 3; +} + +void apm_decode_bctunnel(BcTunnel_struct *ptr, const u8 *flw_ptr, u8 length) +{ + ptr->pres = 1; + ptr->comp_info = flw_ptr[0]; + ptr->val = flw_ptr[1]; +} + +u32 apm_encode_bctunnel(u8 *flw_ptr, const BcTunnel_struct *ptr) +{ + flw_ptr[0] = ptr->comp_info; + flw_ptr[1] = ptr->val; + return 2; +} + +void apm_decode_signaltype(SignalType_struct *ptr, const u8 *flw_ptr, u8 length) +{ + ptr->pres = 1; + ptr->comp_info = flw_ptr[0]; + ptr->val = flw_ptr[1]; +} + +u32 apm_encode_signaltype(u8 *flw_ptr, const SignalType_struct *ptr) +{ + flw_ptr[0] = ptr->comp_info; + flw_ptr[1] = ptr->val; + return 2; +} + +void apm_decode_duration(Duration_struct *ptr, const u8 *flw_ptr, u8 length) +{ + ptr->pres = 1; + ptr->comp_info = flw_ptr[0]; + ptr->val = (flw_ptr[1] << 8) + flw_ptr[2]; +} + +u32 apm_encode_duration(u8 *flw_ptr, const Duration_struct *ptr) +{ + flw_ptr[0] = ptr->comp_info; + flw_ptr[1] = ptr->val >> 8; + flw_ptr[2] = ptr->val & 0xff; + return 3; +} + +void apm_decode(ApmUser_struct *ptr, const u8 *flw_ptr, u8 length) +{ + const u8 *old_ptr = flw_ptr; + + while(flw_ptr+flw_ptr[1]+2-old_ptr <= length) + { + if(*flw_ptr == 0) + break; + switch(*flw_ptr) + { + case AP_ACTION: + apm_decode_action(&ptr->action, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case AP_BNCID: + apm_decode_bncid(&ptr->bnc_id, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case AP_BNCCHR: + apm_decode_bncchr(&ptr->bnc_chr, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case AP_BCINFO: + apm_decode_bcinfo(&ptr->bc_info, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case AP_BCTUNNEL: + apm_decode_bctunnel(&ptr->bc_tunnel, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case AP_SIGNALTYPE: + apm_decode_signaltype(&ptr->signal_type, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case AP_DURATION: + apm_decode_duration(&ptr->duration, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + flw_ptr += flw_ptr[1] + 2; + break; + } + } +} + +u32 apm_encode(u8 *flw_ptr, const ApmUser_struct *ptr) +{ + u8 *old_ptr = flw_ptr; + + if(ptr->action.pres == 1) + { + flw_ptr[0] = AP_ACTION; + flw_ptr[1] = apm_encode_action(flw_ptr+2, &ptr->action); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->bnc_id.pres == 1) + { + flw_ptr[0] = AP_BNCID; + flw_ptr[1] = apm_encode_bncid(flw_ptr+2, &ptr->bnc_id); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->bnc_chr.pres == 1) + { + flw_ptr[0] = AP_BNCCHR; + flw_ptr[1] = apm_encode_bncchr(flw_ptr+2, &ptr->bnc_chr); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->bc_info.pres == 1) + { + flw_ptr[0] = AP_BCINFO; + flw_ptr[1] = apm_encode_bcinfo(flw_ptr+2, &ptr->bc_info); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->bc_tunnel.pres == 1) + { + flw_ptr[0] = AP_BCTUNNEL; + flw_ptr[1] = apm_encode_bctunnel(flw_ptr+2, &ptr->bc_tunnel); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->signal_type.pres == 1) + { + flw_ptr[0] = AP_SIGNALTYPE; + flw_ptr[1] = apm_encode_signaltype(flw_ptr+2, &ptr->signal_type); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->duration.pres == 1) + { + flw_ptr[0] = AP_DURATION; + flw_ptr[1] = apm_encode_duration(flw_ptr+2, &ptr->duration); + flw_ptr += flw_ptr[1] + 2; + } + return flw_ptr - old_ptr; +} + + diff --git a/omc/plat/bicc/src/bicc_debug.c b/omc/plat/bicc/src/bicc_debug.c new file mode 100644 index 0000000..9182253 --- /dev/null +++ b/omc/plat/bicc/src/bicc_debug.c @@ -0,0 +1,882 @@ +#include "./include/var_ext.h" + +//static u32 bicc_object_id[BICC_PREOID_LEN] = {1,3,6,1,4,1,1373,1,3,2,2,6}; +//static u16 bicc_sub_page[BICC_DEBUG_PAGE] = {0}; +//static u8 bicc_ascii_in[BICC_ASCIN_LEN] = {0}; +//static u8 bicc_ascii_out[BICC_ASCOUT_LEN] = {0}; + +#define BICC_DEBUG_ID 17 +#define BICC_VER_DEBUG "R91V0_01" + +#define MONITOR_NONE 0x0000 +#define MONITOR_ERROR 0x0010 +#define MONITOR_ALL 0xffff + +#define TRACE_FLAG_ON 1 +#define TRACE_FLAG_OFF 0 + +u8 AsciInBuf[4096]; +u8 AsciOutBuf[4096]; +u8 AsciTempBuf[4096]; +WORD MonitorFg; +u8 info[1024]; + +static u8 log_help[] = { + "BICC debug Help:\n\r\ + \n\r\ + 1.help\n\r\ + 2.log all/none\n\r\ + 3.log error on/off\n\r\ + 4.list cg[-cgNo] \n\r\ + 5.list circuit[-circuitNo]\n\r\ + 6.list port[-portNo]\n\r\ + 7.list dmp\n\r\ + 8.trace on-portNo\n\r\ + 9.trace off[-portNo]\n\r\n\r\ +" +}; + +static WORD disp_page[10]; +static u8 *disp_ptr = (u8 *) disp_page; + +static DWORD debug_status_id[20] = +{ + 1,3,6,1,4,1,1373,1,1,2,3,1,2,BICC_DEBUG_ID + 2,1 +}; + +static BYTE debug_status = 1; + +static DWORD debug_name_id[20] = +{ + 1,3,6,1,4,1,1373,1,1,2,3,1,2,BICC_DEBUG_ID + 2,2 +}; + +static DWORD debug_ascin_id[20] = +{ + 1,3,6,1,4,1,1373,1,1,2,3,1,2,BICC_DEBUG_ID + 2,3 +}; + +static DWORD debug_ascout_id[20] = +{ + 1,3,6,1,4,1,1373,1,1,2,3,1,2,BICC_DEBUG_ID + 2,4 +}; + +static DWORD debug_page_title[20] = +{ + 1,3,6,1,4,1,1373,1,1,2,3,1,2,BICC_DEBUG_ID + 2,1,1 +}; + +static DWORD debug_page_line[20] = +{ + 1,3,6,1,4,1,1373,1,1,2,3,1,2,BICC_DEBUG_ID + 2,1,2,1 +}; + +const static u8 BASE_ID_LEN = 15; +const static u8 PAGE_POINT = 14; +const static u8 LINE_POINT = 15; + +static u8 title1_p[] = +{ +" BICC Page 01 SAP Info\n\r\ + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\ +Subpage\n\r\ +Enable\n\r\ +CG num\n\r" +}; + +static u8 title2_p[] = +{ +" BICC Page 02 CG Info\n\r\ + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\ +Subpage\n\r\ +Enable\n\r\ +SAP id\n\r\ +NI\n\r\ +DPC\n\r" +}; + +static u8 title3_p[] = +{ +" BICC Page 03 CIrcuit Info\n\r\ + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\ +Subpage\n\r\ +CG id\n\r\ +CIC range\n\r\ +HEAD CIC\n\r" +}; + +static u8 title4_p[] = +{ +" BICC Page 04 Port Info\n\r\ + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\ +Subpage\n\r\ +Enable\n\r\ +FSM State\n\r\ +CIC State\n\r" +}; + +static u8 debug_disp_line(u8 page, u8 line) +{ + u8 disp_length; + disp_length = 0; + disp_ptr = (u8 *) disp_page; + switch (page) + { +/* + case 1: // Page 1: sap Info + switch(line) + { + case 0: + disp_ptr = (BYTE *) &disp_page[page]; + disp_length = 2; + break; + case 1: + disp_ptr = (BYTE *) &Bicc_Data.debug_data.sap_enable; + disp_length = 16; + break; + case 2: + disp_ptr = (BYTE *) &Bicc_Data.debug_data.sap_cg_num; + disp_length = 16; + break; + default: + break; + } + break; + case 2: // Page 2: cg Info + //disp_page[page] = (disp_page[page]+1)%BICC_MAX_CG; + switch(line) + { + case 0: + disp_ptr = (BYTE *) &disp_page[page]; //Subpage + disp_length = 2; + break; + case 1: //enable + disp_ptr = (BYTE *) &(BiccResource.cg_pond[disp_page[page]].used_flag); + disp_length = 16; + break; + case 2: //sap_id + disp_ptr = (BYTE *) &(BiccResource.cg_pond[disp_page[page]].sap_id); + disp_length = 16; + break; + case 3: //network_id + disp_ptr = (BYTE *) &(BiccResource.cg_pond[disp_page[page]].attrib.network_id); + disp_length = 16; + break; + case 4: //dpc + disp_ptr = (BYTE *) &(BiccResource.cg_pond[disp_page[page]].attrib.dpc); + disp_length = 16; + break; + default: + break; + } + break; + + case 3: // Page 3: circuit Info + //disp_page[page] = (disp_page[page]+1)%BICC_MAX_CIRCUIT; + switch(line) + { + case 0: + disp_ptr = (BYTE *) &disp_page[page]; //Subpage + disp_length = 16; + break; + case 1: //cg_id + disp_ptr = (BYTE *) &(BiccResource.circuit_pond[disp_page[page]].cg_id); + disp_length = 16; + break; + case 2: //cic_range + disp_ptr = (BYTE *) &(BiccResource.circuit_pond[disp_page[page]].attrib.cic_range); + disp_length = 16; + break; + case 3: //head_cic + disp_ptr = (BYTE *) &(BiccResource.circuit_pond[disp_page[page]].attrib.head_cic); + disp_length = 16; + break; + default: + break; + } + break; + + case 4: // Page 4: port Info + //disp_page[page] = (disp_page[page]+32)%BICC_MAX_PORT; + switch(line) + { + case 0: + disp_ptr = (BYTE *) &disp_page[page]; //Subpage + disp_length = 16; + break; + case 1: //enable + disp_ptr = (BYTE *) &(BiccResource.port_pond[disp_page[page]].used_flag); + disp_length = 16; + break; + case 2: //fsm_state + disp_ptr = (BYTE *) &(BiccResource.port_pond[disp_page[page]].fsm_state); + disp_length = 16; + break; + case 3: //cic_state + disp_ptr = (BYTE *) &(BiccResource.port_pond[disp_page[page]].cic_state); + disp_length = 16; + break; + default: + break; + } + break; +*/ + default: + disp_length = 0; + break; + } + + return disp_length; +} + +static void debug_disp_page(u8 page) +{ + u8 disp_line; + u8 disp_length; + + debug_page_line[PAGE_POINT] = page + 5; + + for (disp_line = 0; disp_line < 22; disp_line++) + { + disp_length = debug_disp_line(page, disp_line); + debug_page_line[LINE_POINT] = disp_line + 2; + debug_page_line[LINE_POINT + 1] = 2; // Data Pointer + debug_set_response(BASE_ID_LEN + 2, debug_page_line, disp_ptr, disp_length); + } +} + +int bicc_debug_init(void) +{ + BYTE page; + BYTE data[10]; + BYTE *ptr; + + strcpy(AsciInBuf, "\0"); + strcpy(AsciOutBuf, "\0"); + MonitorFg = MONITOR_NONE; + bzero(disp_page, 20); + + ptr = data; + + debug_set_response(BASE_ID_LEN, debug_status_id, &debug_status, 1); + debug_set_response(BASE_ID_LEN, debug_name_id, BICC_VER_DEBUG, 10); + debug_set_response(BASE_ID_LEN, debug_ascin_id, AsciInBuf, 4096); + debug_set_response(BASE_ID_LEN, debug_ascout_id, AsciOutBuf, 4096); + + for (page = 1; page < 5; page++) + { + switch (page) + { + case 1: //page 1 + ptr = title1_p; + break; + case 2: //page 2 + ptr = title2_p; + break; + case 3: //page 3 + ptr = title3_p; + break; + case 4: //page 4 + ptr = title4_p; + break; + default: + break; + } + + debug_page_title[PAGE_POINT] = 5 + page; + debug_set_response(BASE_ID_LEN + 1, debug_page_title, ptr, strlen(ptr)); + debug_disp_page(page); + } + + return 1; +} + +void bicc_asciout_proc(const char *fmt, ...) +{ + va_list ap; + char buf[1024]; + + va_start(ap, fmt); + vsprintf(buf, fmt, ap); + if((strlen(AsciOutBuf) + strlen(buf)) < 4096) + strcat(AsciOutBuf, buf); + else + strcpy(AsciOutBuf, buf); + va_end(ap); +} + + +void bicc_debug_refresh(void) +{ +// int i; + #if 0 + for(i=0;i<16;i++) + { + Bicc_Data.debug_data.sap_enable[i] = BiccResource.sap_pond[i].used_flag; + Bicc_Data.debug_data.sap_cg_num[i] = BiccResource.sap_pond[i].cg_num; + } + #endif +} + + +#if 0 +void list_sap(WORD sapNo) +{ + //u8 sapinfo[1024]; + if(sapNo >= BICC_MAX_SAP) + return; + + sprintf(info,"\ +Enable:%d\n\r\ +cg num:%d\n\r", + BiccResource.sap_pond[sapNo].used_flag,BiccResource.sap_pond[sapNo].cg_num); + bicc_asciout_proc(info); +} + +void list_all_sap() +{ + int i; + sprintf(info, "Index CG(s)\n\r"); + bicc_asciout_proc(info); + for(i=0; i= PAL_MAX_CG) + return; + pcg = pal_cg_ptr(cgNo); + if(pcg == NULL) + return; + sprintf(info, "\ +Enable:%d\n\r\ +sap id:%d\n\r\ +circuit num:%d\n\r\ +variant_type:%d\n\r\ +priority:%d\n\r\ +network id:%d\n\r\ +opc:%ld\n\r\ +dpc:%ld\n\r\ +tg_id:%ld\n\r", + pcg->enable,pcg->sap_id,pcg->circuit_num,pcg->attrib.variant,pcg->attrib.priority,pcg->attrib.network_id,pcg->attrib.opc,pcg->attrib.dpc,pcg->attrib.tg_id); + bicc_asciout_proc(info); +} + +void list_all_cg() +{ + int i = 0; + const pal_cg_struct *pcg; + sprintf(info, "Index SAP Circuit(s) NetInd DPC OPC TG\n\r"); + bicc_asciout_proc(info); + for(i=0; ienable==0) + continue; + + if(pcg->attrib.protocol != PROTO_BICC) + continue; + sprintf(info, " %d %d %d %d %ld %ld %ld\n\r", i, pcg->sap_id, pcg->circuit_num, pcg->attrib.network_id, pcg->attrib.dpc, pcg->attrib.opc, pcg->attrib.tg_id); + bicc_asciout_proc(info); + } +} + + +void list_circuit(WORD circuitNo) +{ + const pal_circuit_struct *pcircuit; + if(circuitNo >= PAL_MAX_CIRCUIT) + return; + pcircuit = pal_circuit_ptr(circuitNo); + if(pcircuit == NULL) + return ; + + sprintf(info,"\ +Enable:%d\n\r\ +cg id:%d\n\r\ +head cic:%ld\n\r\ +cic range:%d\n\r\ +plat id:%d\n\r", + pcircuit->enable,pcircuit->cg_id,pcircuit->attrib.head_cic,pcircuit->attrib.cic_range,pcircuit->attrib.plat_id); + bicc_asciout_proc(info); +} + + +void list_all_circuit() +{ + int i = 0, j = 0; + const pal_circuit_struct *pcircuit; + const pal_cg_struct *pcg; +// for(i = 0; i < BICC_MAX_SAP; i ++) + //{ + sprintf(info, "Index CG PLAT CIC(s)\n\r"); + bicc_asciout_proc(info); + for(i=0; ienable == 0) + continue; + if(pcg->attrib.protocol != PROTO_BICC) + continue; + for(j = 0; jenable == 0 || pcircuit->cg_id != pcg->id) + continue; + sprintf(info, " %d %d %d %d (%ld~~%ld)\n\r", i, pcircuit->cg_id, pcircuit->attrib.plat_id, pcircuit->attrib.cic_range, pcircuit->attrib.head_cic, pcircuit->attrib.head_cic+pcircuit->attrib.cic_range); + bicc_asciout_proc(info); + + } + + } +} + +void list_port(WORD portNo) +{ + if(portNo>=BICC_MAX_PORT) + return; + sprintf(info,"\ +upper port:%ld\n\r\ +sprc_cmd:%x\n\r\ +primitive_cmd:%x\n\r\ +internal_cmd:%x\n\r\ +cic state{\n\r\ + call state:%d\n\r\ + suspend state:%d\n\r\ + block state:%d\n\r\ + }\n\r\ +fsm state{\n\r\ + cpc_state:%d\n\r\ + mgbs_state:%d\n\r\ + mgbr_state:%d\n\r\ + crs_state:%d\n\r\ + crr_state:%d\n\r\ + cgrs_state:%d\n\r\ + cgrr_state:%d\n\r\ + }\n\r", + Bicc_Data.port_data[portNo].su_proc_id,Bicc_Data.port_data[portNo].sprc_cmd, + Bicc_Data.port_data[portNo].primitive_cmd,Bicc_Data.port_data[portNo].internal_cmd, + Bicc_Data.port_data[portNo].cic_state.call_state,Bicc_Data.port_data[portNo].cic_state.sus_state, + Bicc_Data.port_data[portNo].cic_state.blo_state,Bicc_Data.port_data[portNo].fsm_state.cpc_state, + Bicc_Data.port_data[portNo].fsm_state.mgbs_state,Bicc_Data.port_data[portNo].fsm_state.mgbr_state, + Bicc_Data.port_data[portNo].fsm_state.crs_state,Bicc_Data.port_data[portNo].fsm_state.crr_state, + Bicc_Data.port_data[portNo].fsm_state.cgrs_state,Bicc_Data.port_data[portNo].fsm_state.cgrr_state); + bicc_asciout_proc(info); +} + +void list_busy_port() +{ + int i,j=0; + sprintf(info, "Index PortNo CallState\n\r"); + bicc_asciout_proc(info); + for(i=0;i 0) + { + in_page = AsciInBuf[0] - 1; + ascii_in_ptr = AsciInBuf + 1; + + if (in_page > 4) + err_fg = 1; + else if (strcmp(ascii_in_ptr,"log error on") == 0) + { + MonitorFg = MonitorFg | MONITOR_ERROR; + } + else if (strcmp(ascii_in_ptr,"log error off") == 0) + { + MonitorFg = MonitorFg & (~MONITOR_ERROR); + } + else if (strcmp(ascii_in_ptr,"log all") == 0) + { + MonitorFg = MONITOR_ALL; + + } + else if (strcmp(ascii_in_ptr,"log none") == 0) + { + MonitorFg = MONITOR_NONE; + + } + else if (strcmp(ascii_in_ptr,"help") == 0) + { + bicc_asciout_proc(log_help); + } + else if (isdigit(ascii_in_ptr[0])) + { + num = strtoul(ascii_in_ptr, NULL, 10); + disp_page[in_page] = num; + debug_disp_page(in_page); + } + else if ((str_start = strstr(ascii_in_ptr, ">")) != NULL) + { + num = strtoul(str_start + 1, NULL, 10); + disp_page[in_page] += num; + debug_disp_page(in_page); + } + else if ((str_start = strstr(ascii_in_ptr, "<"))!= NULL) + { + num = strtoul(str_start + 1, NULL, 10); + disp_page[in_page] -= num; + debug_disp_page(in_page); + } + #if 0 + else if ((strstr (ascii_in_ptr, "list sap")) != NULL) + { + if((tmpStr = strstr (ascii_in_ptr, "-")) != NULL) + { + sapNo = strtoul (tmpStr + 1, NULL, 10); + list_sap(sapNo); + } + else + { + list_all_sap(); + } + } +#endif + else if ((strstr (ascii_in_ptr,"list cg")) != NULL) + { + if((tmpStr = strstr (ascii_in_ptr, "-")) != NULL) + // if((tmpStr = strsep(&&ascii_in_ptr, " \t")) != NULL) + { + cgNo = strtoul (tmpStr+1, NULL, 10); + // strsep(, " \t"); + list_cg(cgNo); + } + else + { + list_all_cg(); + } + } + else if ((strstr (ascii_in_ptr, "list circuit")) != NULL) + { + if((tmpStr = strstr (ascii_in_ptr, "-")) != NULL) + { + circuitNo = strtoul (tmpStr + 1, NULL, 10); + list_circuit(circuitNo); + } + else + { + list_all_circuit(); + } + } + else if ((strstr (ascii_in_ptr, "list port")) != NULL) + { + if((tmpStr = strstr (ascii_in_ptr, "-")) != NULL) + { + portNo = strtoul (tmpStr + 1, NULL, 10); + list_port(portNo); + } + else + { + list_busy_port(); + } + + } + else if((strstr (ascii_in_ptr, "list dmp")) != NULL) + { + list_dmp(); + } + else if((strstr(ascii_in_ptr, "trace on")) != NULL) + { + if((tmpStr = strstr(ascii_in_ptr, "-")) != NULL) + { + portNo = strtoul(tmpStr + 1, NULL, 10); + //trace_port(portNo); + Bicc_Data.port_data[portNo].trace_flag = 1; + } + else + {} + } + else if ((strstr (ascii_in_ptr, "trace off")) != NULL) + { + if((tmpStr = strstr (ascii_in_ptr, "-")) != NULL) + { + portNo = strtoul (tmpStr + 1, NULL, 10); + Bicc_Data.port_data[portNo].trace_flag = 0; + } + else + { + int i; + for(i=0; i= 4096) + sprintf(AsciTempBuf, "log msg is too long!\n\r"); + else + sprintf(AsciTempBuf, "%s\n\r", msg); + bicc_asciout_proc(AsciTempBuf); + return 0; + } + + return -1; +} + +void display_bicc_msgtype(u8 msgtype, u32 cic) +{ + switch(msgtype) + { + case M_ACM: + bicc_asciout_proc("ACM:Address complete"); + break; + case M_ANM: + bicc_asciout_proc("ANM:Answer"); + break; + case M_BLO: + bicc_asciout_proc("BLO:Blocking"); + break; + case M_BLA: + bicc_asciout_proc("BLA:Blocking acknowledgement"); + break; + case M_CPG: + bicc_asciout_proc("CPG:Call progress"); + break; + case M_CGB: + bicc_asciout_proc("CGB:Circuit/CIC group blocking"); + break; + case M_CGBA: + bicc_asciout_proc("CGBA:Circuit/CIC group blocking acknowledgement"); + break; + case M_CQM: + bicc_asciout_proc("CQM:Circuit/CIC group query (national use)"); + break; + case M_CQR: + bicc_asciout_proc("CQR:Circuit/CIC group query response (national use)"); + break; + case M_GRS: + bicc_asciout_proc("GRS:Circuit/CIC group reset"); + break; + case M_GRA: + bicc_asciout_proc("GRA:Circuit/CIC group reset acknowledgement"); + break; + case M_CGU: + bicc_asciout_proc("CGU:Circuit/CIC group unblocking"); + break; + case M_CGUA: + bicc_asciout_proc("CGUA:Circuit/CIC group unblocking acknowledgement"); + break; + case M_CRG: + bicc_asciout_proc("CRG:Charge information (national use)"); + break; + case M_CFN: + bicc_asciout_proc("CFN:Confusion"); + break; + case M_CON: + bicc_asciout_proc("CON:Connect"); + break; + case M_COT: + bicc_asciout_proc("COT:Continuity"); + break; + case M_FAC: + bicc_asciout_proc("FAC:Facility "); + break; + case M_FAA: + bicc_asciout_proc("FAA:Facility accepted"); + break; + case M_FRJ: + bicc_asciout_proc("FRJ:Facility reject"); + break; + case M_FAR: + bicc_asciout_proc("FAR:Facility request"); + break; + case M_FOT: + bicc_asciout_proc("FOT:Forward transfer"); + break; + case M_IDR: + bicc_asciout_proc("IDR:Identification request"); + break; + case M_IRS: + bicc_asciout_proc("IRS:Identification response"); + break; + case M_INF: + bicc_asciout_proc("INF:Information (national use)"); + break; + case M_INR: + bicc_asciout_proc("INR:Information request (national use)"); + break; + case M_IAM: + bicc_asciout_proc("IAM:Initial address"); + break; + case M_NRM: + bicc_asciout_proc("NRM:Network resource management"); + break; + case M_REL: + bicc_asciout_proc("REL:Release"); + break; + case M_RLC: + bicc_asciout_proc("RLC:Release complete"); + break; + case M_RSC: + bicc_asciout_proc("RSC:Reset circuit/CIC"); + break; + case M_RES: + bicc_asciout_proc("RES:Resume"); + break; + case M_SGM: + bicc_asciout_proc("SGM:Segmentation"); + break; + case M_SAM: + bicc_asciout_proc("SAM:Subsequent address"); + break; + case M_SUS: + bicc_asciout_proc("SUS:Suspend"); + break; + case M_UBL: + bicc_asciout_proc("UBL:Unblocking"); + break; + case M_UBA: + bicc_asciout_proc("UBA:Unblocking acknowledgement"); + break; + case M_UCIC: + bicc_asciout_proc("UCIC:Unequipped CIC (national use)"); + break; + case M_APM: + bicc_asciout_proc("APM:Application Transport"); + break; + case M_USR: + bicc_asciout_proc("USR:User-to-user information"); + break; + default: + bicc_asciout_proc("Unknown message"); + + } + + bicc_asciout_proc("(message type=0x%x cic=%d)\r\n",msgtype,cic); +} + + +void monitor_bicc_msg(BYTE *msg,BYTE buf_len, BYTE flag, u32 cic, u32 portNo) +{ + BYTE i,temp_buf[1024]; + if(MonitorFg == MONITOR_ALL) + { + if(flag == 0) + bicc_asciout_proc("\33[33mReceive:\33[0m"); + else if(flag == 1) + bicc_asciout_proc("\33[32mSend:\33[0m"); + else if(flag == 2) + bicc_asciout_proc("\33[34mRedirect:\33[0m"); + display_bicc_msgtype(msg[0], cic); + + if(flag != 2) + { + for (i = 0; i < buf_len; i ++) + { + sprintf(&temp_buf[3*i]," %02x", msg[i]); + } + sprintf(&temp_buf[3*i],"\n\r"); + bicc_asciout_proc(temp_buf); + } + } + if(MonitorFg == MONITOR_NONE) + {} + if(Bicc_Data.port_data[portNo].trace_flag == 1) + { + if(flag == 0) + bicc_asciout_proc("\33[33mReceive:\33[0m"); + else if(flag == 1) + bicc_asciout_proc("\33[32mSend:\33[0m"); + else if(flag == 2) + bicc_asciout_proc("\33[34mRedirect:\33[0m"); + display_bicc_msgtype(msg[0], cic); + + if(flag != 2) + { + for (i = 0; i < buf_len; i ++) + { + sprintf(&temp_buf[3*i]," %02x", msg[i]); + } + sprintf(&temp_buf[3*i],"\n\r"); + bicc_asciout_proc(temp_buf); + } + } +} + diff --git a/omc/plat/bicc/src/bicc_fsm.c b/omc/plat/bicc/src/bicc_fsm.c new file mode 100644 index 0000000..944719e --- /dev/null +++ b/omc/plat/bicc/src/bicc_fsm.c @@ -0,0 +1,2093 @@ +#include "./include/inc.h" +#include "./include/var_ext.h" +#include "./include/biccif.h" +/**************CPCI*************************/ +#define CPCI_IDLE 0 +#define CPCI_WAIT_CONTINUITY 1 +#define CPCI_WAIT_ACM 2 +#define CPCI_WAIT_ANM 3 +#define CPCI_ANSWERED 4 +#define CPCI_SUSPENDED 5 +#define CPCI_WAIT_RLC 6 +#define CPCI_WAIT_REL_COMP 7 +#define CPCI_WAIT_RESET 8 +#define CPCI_WAIT_GROUP_RESET 9 + +/*************CPCO*************************/ +#define CPCO_IDLE 0 +#define CPCO_WAIT_CONTINUITY 1 +#define CPCO_WAIT_ACM 2 +#define CPCO_WAIT_ANM 3 +#define CPCO_ANSWERED 4 +#define CPCO_SUSPENDED 5 +#define CPCO_WAIT_RLC 6 +#define CPCO_WAIT_REL_COMP 7 +#define CPCO_WAIT_RESET 8 +#define CPCO_WAIT_GROUP_RESET 9 + +/********************************************/ +#define MGBS_IDLE 0 +#define MGBS_WAIT_CGBA 1 +#define MGBS_WAIT_CGUA 2 +/********************************************/ +#define MGBR_IDLE 0 +#define MGBR_WAIT_BLOCKING_RESP 1 +#define MGBR_WAIT_UNBLOCKING_RESP 2 +/********************************************/ +#define CRS_IDLE 0 +#define CRS_WAIT_REL 1 +/*******************************************/ +#define CRR_IDLE 0 +#define CRR_WAIT_RESPONSE 1 +#define CRR_RESET 2 +#define CRR_RESET_COMP 3 +/*******************************************/ +#define CGRS_IDLE 0 +#define CGRS_WAIT_GRA 1 +/*******************************************/ +#define CGRR_IDLE 0 +#define CGRR_WAIT_GROUP_RESET_COMP 1 +/********************************************/ +#define BLR_IDLE 0 +#define BLR_WAIT_BLOCKING_RESP 1 +#define BLR_REMOTE_LOCKED 2 +#define BLR_WAIT_UNBLOCKING_RESP 3 +/********************************************/ +#define BLS_IDLE 0 +#define BLS_WAIT_BLA 1 +#define BLS_LOCAL_LOCKED 2 +#define BLS_WAIT_UBA 3 +/*******************************************/ + + + +BiccData_struct Bicc_Data; +const BiccTimer_struct *TIMER_PTR = &Timer_Data; + + +extern BiccReadPrim_union readPrim_union[BICC_MAX_PORT]; +extern BiccWritePrim_union writePrim_union[BICC_MAX_PORT]; +//extern BICC_Resource_pond BiccResource; +extern BiccMsg_union msg_union[BICC_MAX_PORT]; +extern u8 local_platid; + +extern void bicc_send_apm(u32 pid); +extern void bicc_log_err(const char *fmt, ...); +extern void bicc_send_res(u32 pid); +extern void bicc_send_sus(u32 pid); +extern void bicc_send_sam(u32 pid); +extern void bicc_send_rsc(u32 pid); +extern void bicc_send_rlc(u32 pid); +extern void bicc_send_rel(u32 pid); +extern void bicc_send_iam(u32 pid); +extern void bicc_send_con(u32 pid); +extern void bicc_send_gra(u32 pid); +extern void bicc_send_grs(u32 pid); +extern void bicc_send_cgua(u32 pid); +extern void bicc_send_cgu(u32 pid); +extern void bicc_send_cgba(u32 pid); +extern void bicc_send_cgb(u32 pid); +extern void bicc_send_cpg(u32 pid); +extern void bicc_send_anm(u32 pid); +extern void bicc_send_acm(u32 pid); +extern BOOL check_crs_waiting(u32 pid); +extern int check_outbound_route(BYTE nw, long dpc, BYTE sls); + + +void bicc_cpc_clear(u32 pid) +{ + memset(&Bicc_Data.port_data[pid], 0, sizeof(BICC_Port_struct)); +} + + +BOOL bicc_cgrs_func(u32 start_pid, u8 range) +{ + int i; + u32 pid; + + if(start_pid+range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= range; i++) + { + pid = start_pid + i; + Bicc_Data.port_data[pid].cic_state.call_state = BICC_RESET; + + } + return 1; +} + +BOOL bicc_cgrsack_func(u32 start_pid, const RangeStatus_struct *rs_ptr) +{ + int i; + u32 pid; + + if(start_pid+rs_ptr->range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= rs_ptr->range; i++) + { + pid = start_pid + i; + Bicc_Data.port_data[pid].cic_state.call_state = BICC_CIC_IDLE; + memset(&Bicc_Data.port_data[pid], 0, sizeof(BICC_Port_struct)); + + if((rs_ptr->status[i>>3]>>(i&0x07)) & 0x01) + Bicc_Data.port_data[pid].cic_state.blo_state |= M_REMOTE_BLOCK; + else + Bicc_Data.port_data[pid].cic_state.blo_state &= 0x0d; + } + //BiccResource.circuit_pond[start_pid/BICC_CIRCUIT_CIC].active_flag = 1; + return 1; +} + +BOOL bicc_cgrr_func(u32 start_pid, u8 range, RangeStatus_struct *rs_ptr) +{ + int i; + u32 pid; + + rs_ptr->range = range; + memset(rs_ptr->status, 0, 4); + if(start_pid+range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= range; i++) + { + pid = start_pid + i; + Bicc_Data.port_data[pid].cic_state.blo_state &= 0x0d; + if(Bicc_Data.port_data[pid].cic_state.blo_state & M_LOCAL_BLOCK) + { + if(Bicc_Data.port_data[pid].fsm_state.mgbs_state != MGBS_WAIT_CGUA) + rs_ptr->status[i>>3]|= 0x01 << (i&0x07); + } + } + return 1; +} + + +void bicc_set_cause(CauseInd_struct *cause_ptr, u8 val) +{ + cause_ptr->pres = 1; + cause_ptr->codingStd = 0; //CCITT standardized coding + cause_ptr->location = 5; //private network serving the remote user + cause_ptr->causeVal = val; +} + +void bicc_circuit_reset(u32 pid, const char *s) +{ + #ifdef BICC_DEBUG + bicc_log_err("BICC circuit reset!, %s\n", s); + #endif + + if(check_crs_waiting(pid)) + return; + Bicc_Data.port_data[pid].primitive_cmd = BICC_RESET_REQ; +} + + +BOOL bicc_localblocking_func(u32 start_pid, const RangeStatus_struct *rs_ptr) +{ + int i; + u32 pid; + + if(start_pid+rs_ptr->range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= rs_ptr->range; i++) + { + pid = start_pid + i; + if((rs_ptr->status[i>>3]>>(i&0x07)) & 0x01) + Bicc_Data.port_data[pid].cic_state.blo_state &= M_LOCAL_BLOCK; + } + return 1; +} + +BOOL bicc_remoteblocking_func(u32 start_pid, const RangeStatus_struct *rs_ptr) +{ + int i; + u32 pid; + + if(start_pid+rs_ptr->range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= rs_ptr->range; i++) + { + pid = start_pid + i; + if((rs_ptr->status[i>>3]>>(i&0x07)) & 0x01) + Bicc_Data.port_data[pid].cic_state.blo_state &= M_REMOTE_BLOCK; + } + return 1; +} + +BOOL bicc_cpcoblocking_func(u32 start_pid, const RangeStatus_struct *rs_ptr) +{ + int i; + u32 pid; + + if(start_pid+rs_ptr->range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= rs_ptr->range; i++) + { + pid = start_pid + i; + if((rs_ptr->status[i>>3]>>(i&0x07)) & 0x01) + { + if(Bicc_Data.port_data[pid].cic_state.call_state == BICC_OUTGOING) + Bicc_Data.port_data[pid].internal_cmd = (BICC_CMD_BLO|BICC_SI_MGBR); + } + } + return 1; +} + +BOOL bicc_localunblocking_func(u32 start_pid, const RangeStatus_struct *rs_ptr) +{ + int i; + u32 pid; + + if(start_pid+rs_ptr->range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= rs_ptr->range; i++) + { + pid = start_pid + i; + if((rs_ptr->status[i>>3]>>(i&0x07)) & 0x01) + Bicc_Data.port_data[pid].cic_state.blo_state &= 0x0e; + } + return 1; +} + +BOOL bicc_remoteunblocking_func(u32 start_pid, const RangeStatus_struct *rs_ptr) +{ + int i; + u32 pid; + + if(start_pid+rs_ptr->range >= BICC_MAX_PORT) + return 0; + for(i = 0; i <= rs_ptr->range; i++) + { + pid = start_pid + i; + if((rs_ptr->status[i>>3]>>(i&0x07)) & 0x01) + Bicc_Data.port_data[pid].cic_state.blo_state &= 0x0d; + } + return 1; +} + + +BOOL bicc_event_handle(u32 pid, BiccReadPrim_union *prm_ptr, u8 primitive, u8 eventType) +{ + BICC_EventHandle_struct *eh_ptr = NULL; + Pst pst; + u32 cic; + int circuit_id, offset, ret = -1; + const pal_circuit_struct *pcircuit = NULL; + const pal_cg_struct *pcg = NULL; + + circuit_id = pid / BICC_CIRCUIT_CIC; + offset = pid % BICC_CIRCUIT_CIC; + pcircuit = pal_circuit_ptr(circuit_id); + if(pcircuit == NULL) + return BICC_CM_FAILED; + cic = pcircuit->attrib.head_cic + offset; + + pst.cg_id = pcircuit->cg_id; + pcg = pal_cg_ptr(pst.cg_id); + if(pcg == NULL) + return BICC_CM_FAILED; + if(pcg->attrib.protocol != PROTO_BICC) + return BICC_CM_FAILED; + pst.tg_id = pcg->attrib.tg_id; + pst.sp_proc_id = pid; + pst.su_proc_id = Bicc_Data.port_data[pid].su_proc_id; + pst.cic = cic; + pst.trace_flag = 0; + + eh_ptr = (BICC_EventHandle_struct *)pal_get_handler(pst.cg_id); + if(eh_ptr == NULL) + return BICC_CM_FAILED; + + switch(primitive) + { + case BICC_SETUP_IND: + if(eh_ptr->h_bicc_setup_ind != NULL) + { + ret = eh_ptr->h_bicc_setup_ind(&pst, prm_ptr); + if(pst.trace_flag == 1) + { + //BiccResource.port_pond[pid].trace_flag = 1; + Bicc_Data.port_data[pid].trace_flag = 1; + monitor_bicc_msg(r_mtp_msg.msgList, r_mtp_msg.len, 0, cic, pid); + } + } + else + bicc_log_err("Setup indicate handle is not registered.\n"); + if(ret != -1) + Bicc_Data.port_data[pid].su_proc_id = pst.su_proc_id; + break; + + case BICC_SETUP_CNF: + if(eventType == EN_CON) + { + if(eh_ptr->h_bicc_setup_con_cnf != NULL) + { + if(!eh_ptr->h_bicc_setup_con_cnf(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("Setup confirm handle is not registered.\n"); + break; + + } + else + { + if(eh_ptr->h_bicc_setup_anm_cnf != NULL) + eh_ptr->h_bicc_setup_anm_cnf(&pst, prm_ptr); + else + bicc_log_err("Setup confirm handle is not registered.\n"); + } + + break; + + case BICC_ALERT_IND: + if(eh_ptr->h_bicc_alert_ind != NULL) + { + if(!eh_ptr->h_bicc_alert_ind(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("Alert indication handle is not registered.\n"); + break; + + case BICC_RELEASE_IND: + if(eh_ptr->h_bicc_release_ind != NULL) + { + if(!eh_ptr->h_bicc_release_ind(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("Release indication is not registered.\n"); + break; + + case BICC_APM_IND: + if(eh_ptr->h_bicc_apm_ind != NULL) + { + if(!eh_ptr->h_bicc_apm_ind(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("APM indication is not registered.\n"); + break; + + case BICC_RELEASE_CNF: + if(eh_ptr->h_bicc_release_cnf != NULL) + { + if(!eh_ptr->h_bicc_release_cnf(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("Release confirm is not registered.\n"); + break; + + case BICC_INFO_IND: + if(eh_ptr->h_bicc_info_ind != NULL) + { + if(!eh_ptr->h_bicc_info_ind(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("info indication is not registered.\n"); + break; + + case BICC_SUSPEND_IND: + if(eh_ptr->h_bicc_suspend_ind != NULL) + { + if(!eh_ptr->h_bicc_suspend_ind(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("Suspend indication is not registered.\n"); + break; + + case BICC_RESUME_IND: + if(eh_ptr->h_bicc_resume_ind != NULL) + { + if(!eh_ptr->h_bicc_resume_ind(&pst, prm_ptr)) + return 0; + } + else + bicc_log_err("Resume indication is not registered.\n"); + break; + + case BICC_PROG_IND: + if(eh_ptr->h_bicc_prog_ind != NULL) + eh_ptr->h_bicc_prog_ind(&pst, prm_ptr); + else + bicc_log_err("Call progress indication handle is not registered.\n"); + break; + case BICC_RESET_IND: + if(eh_ptr->h_bicc_reset_ind != NULL) + eh_ptr->h_bicc_reset_ind(&pst, prm_ptr); + + else + bicc_log_err("Reset indicate handle is not registered.\n"); + break; + case BICC_RESET_CNF: + if(eh_ptr->h_bicc_reset_cnf != NULL) + { + if(eventType == EN_GROUP) + eh_ptr->h_bicc_reset_cnf(&pst, prm_ptr); + else + eh_ptr->h_bicc_reset_cnf(&pst, NULL); + } + else + bicc_log_err("Reset cnf handle is not registered.\n"); + break; + case BICC_FAILURE_IND: + if(eh_ptr->h_bicc_failure_ind != NULL) + eh_ptr->h_bicc_failure_ind(&pst, prm_ptr); + else + bicc_log_err("Failure indicate handle is not registered.\n"); + break; + case BICC_REATTEMPT_IND: + if(eh_ptr->h_bicc_reattempt_ind != NULL) + eh_ptr->h_bicc_reattempt_ind(&pst, prm_ptr); + else + bicc_log_err("Reattempt indicate handle is not registered.\n"); + break; + case BICC_BLOCK_IND: + if(eh_ptr->h_bicc_block_ind != NULL) + { + if(eventType == EN_GROUP) + eh_ptr->h_bicc_block_ind(&pst, prm_ptr); + else + eh_ptr->h_bicc_block_ind(&pst, NULL); + } + else + bicc_log_err("Block indicate handle is not registered.\n"); + break; + + case BICC_BLOCK_CNF: + if(eh_ptr->h_bicc_block_cnf != NULL) + { + if(eventType == EN_GROUP) + eh_ptr->h_bicc_block_cnf(&pst, prm_ptr); + else + eh_ptr->h_bicc_block_cnf(&pst, NULL); + } + else + bicc_log_err("Block confirm handle is not registered.\n"); + break; + case BICC_UNBLOCK_IND: + if(eh_ptr->h_bicc_unblock_ind != NULL) + { + if(eventType == EN_GROUP) + eh_ptr->h_bicc_unblock_ind(&pst, prm_ptr); + else + eh_ptr->h_bicc_unblock_ind(&pst, NULL); + } + else + bicc_log_err("Unblock indicate handle is not registered.\n"); + break; + case BICC_UNBLOCK_CNF: + if(eh_ptr->h_bicc_unblock_cnf != NULL) + { + if(eventType == EN_GROUP) + eh_ptr->h_bicc_unblock_cnf(&pst, prm_ptr); + else + eh_ptr->h_bicc_unblock_cnf(&pst, NULL); + } + else + bicc_log_err("Unblock confirm handle is not registered.\n"); + break; + default: + break; + } + return 1; +} + + +void bicc_dualseizure_func(u32 pid) +{ + int cg_id; + const pal_circuit_struct *pcircuit = NULL; + const pal_cg_struct *pcg = NULL; + BiccTimer_struct *tempTimer = &Bicc_Data.timer_data[pid]; + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + pcircuit = pal_circuit_ptr(pid / BICC_CIRCUIT_CIC); + if(pcircuit == NULL) + return; + cg_id = pcircuit->cg_id; + pcg = pal_cg_ptr(cg_id); + if(pcg == NULL) + return; + if(pcg->attrib.priority == 0) + return; + tempTimer->t7 = BICC_TIMER_STOP; + bicc_event_handle(pid, NULL, BICC_REATTEMPT_IND, EN_NONE); + bicc_cpc_clear(pid); + Bicc_Data.port_data[pid].cic_state.call_state = BICC_INCOMING; + port_ptr->sprc_cmd = M_IAM; +} + + +void bicc_cpci_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccTimer_struct *tempTimer = &Bicc_Data.timer_data[pid]; + + switch(port_ptr->fsm_state.cpc_state) + { + case CPCI_IDLE: + if(port_ptr->sprc_cmd == M_IAM) + { + port_ptr->sprc_cmd = 0; + if(readPrim_union[pid].setup_ind.callingPtyCat.val != 0x0d) //test call? + { + if(port_ptr->cic_state.blo_state & M_REMOTE_BLOCK) + port_ptr->cic_state.blo_state &= 0x01; //set remote unblocked + if(port_ptr->cic_state.blo_state & M_LOCAL_BLOCK) + { + bicc_cpc_clear(pid); + return; + } + + } + if(bicc_event_handle(pid, &readPrim_union[pid], BICC_SETUP_IND, EN_NONE)) + { + port_ptr->fsm_state.cpc_state = CPCI_WAIT_ACM; + + } + else + { + bicc_circuit_reset(pid, "setup ind rejected"); + bicc_cpc_clear(pid); + return; + } + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + writePrim_union[pid].rel_rsp.cause.pres = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + bicc_send_rlc(pid); + bicc_cpc_clear(pid); + return ; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_cpc_clear(pid); + return ; + } + else if(port_ptr->sprc_cmd !=0 ) + { + port_ptr->sprc_cmd = 0; + port_ptr->internal_cmd = (BICC_CMD_RESET|BICC_SI_CPCI); + bicc_circuit_reset(pid, "unexpected message"); + bicc_cpc_clear(pid); + return ; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CRR); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CGRR); + bicc_cpc_clear(pid); + return ; + } + + break; + case CPCI_WAIT_CONTINUITY: + break; + case CPCI_WAIT_ACM: + if(port_ptr->primitive_cmd == BICC_ALERT_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_acm(pid); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_ANM; + } + else if(port_ptr->primitive_cmd == BICC_SETUP_RSP) + { + port_ptr->primitive_cmd = 0; + bicc_send_con(pid); + port_ptr->fsm_state.cpc_state = CPCI_ANSWERED; + tempTimer->t9 = TIMER_PTR->t9; + } + else if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_rel(pid); + + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_REL_COMP; + } + else if(port_ptr ->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } +/* else if(port_ptr->sprc_cmd == M_SAM) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_INFO_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_ACM; + } +*/ + else if(port_ptr->sprc_cmd != 0) + { + port_ptr->sprc_cmd = 0; + port_ptr->internal_cmd = (BICC_CMD_RESET|BICC_SI_CPCI); + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_circuit_reset(pid, "unexpected message cpci wait acm"); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_BLO|BICC_SI_MGBS)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd= 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + + case CPCI_WAIT_ANM: + if(port_ptr->primitive_cmd == BICC_SETUP_RSP) + { + port_ptr->primitive_cmd = 0; + bicc_send_anm(pid); + port_ptr->fsm_state.cpc_state = CPCI_ANSWERED; + } + else if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } + else if(port_ptr->primitive_cmd == BICC_PROG_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_cpg(pid); + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_REL_COMP; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } +#ifdef BICC_TOLERANT + // To avoid both side backoff // + else if(port_ptr->sprc_cmd != 0) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_circuit_reset(pid, "unexpected message cpci wait anm"); + bicc_cpc_clear(pid); + return; + } +#endif + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + // break; + else if(tempTimer->t9-- == BICC_TIMER_EXPIRED) + { + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x13); + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } + break; + + case CPCI_ANSWERED: + if(port_ptr->primitive_cmd == BICC_SUSPEND_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_sus(pid); + port_ptr->cic_state.sus_state = BICC_TERM_SUSPEND; + port_ptr->fsm_state.cpc_state = CPCI_SUSPENDED; + } + else if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } + else if(port_ptr->sprc_cmd == M_SUS) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_SUSPEND_IND, EN_NONE); + port_ptr->cic_state.sus_state = BICC_ORIG_SUSPEND; + port_ptr->fsm_state.cpc_state = CPCI_SUSPENDED; + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_REL_COMP; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + case CPCI_SUSPENDED: + if(port_ptr->primitive_cmd == BICC_RESUME_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_res(pid); + if(port_ptr->cic_state.sus_state == BICC_TERM_SUSPEND) + port_ptr->fsm_state.cpc_state = CPCI_ANSWERED; + } + else if(port_ptr->primitive_cmd == BICC_SUSPEND_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_sus(pid); + } + else if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state= CPCI_WAIT_RLC; + } + else if(port_ptr->sprc_cmd == M_RES) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESUME_IND, EN_NONE); + if(port_ptr->cic_state.sus_state == BICC_ORIG_SUSPEND) + port_ptr->fsm_state.cpc_state = CPCI_ANSWERED; + } + else if(port_ptr->sprc_cmd == M_SUS) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_SUSPEND_IND, EN_NONE); + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_REL_COMP; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RLC; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCI_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + + case CPCI_WAIT_RLC: + if(port_ptr->sprc_cmd== M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + writePrim_union[pid].rel_rsp.cause.pres = 0; + bicc_send_rlc(pid); + + } + else if(tempTimer->t1-- == BICC_TIMER_EXPIRED) + { + bicc_send_rel(pid); + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + + } + else if(tempTimer->t5-- == BICC_TIMER_EXPIRED) + { + tempTimer->t1 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_circuit_reset(pid, "t5 expired cpci wait rlc"); + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_cpc_clear(pid); + return; + } + //if(cpc_ptr->crr_cmd == BICC_RESET_IND) + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + //port_ptr->fsm_state.cpc_state = BICC_RESET_RSP; + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CPCI); + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid,&readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + case CPCI_WAIT_REL_COMP: + if(port_ptr->primitive_cmd == BICC_RELEASE_RSP) + { + port_ptr->primitive_cmd = 0; + bicc_send_rlc(pid); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + //port_ptr->fsm_state.cpc_state = BICC_RESET_RSP; + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CPCI); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + bicc_cpc_clear(pid); + return; + } +#ifdef BICC_TOLERANT + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + } + +#endif + break; + case CPCI_WAIT_RESET: + if(port_ptr->primitive_cmd == BICC_RESET_RSP) + { + port_ptr->primitive_cmd = 0; + //port_ptr->fsm_state.cpc_state = BICC_RESET_RSP; + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CPCI); + bicc_cpc_clear(pid); + return; + } + break; + case CPCI_WAIT_GROUP_RESET: + if(port_ptr->primitive_cmd == BICC_RESET_RSP) + { + port_ptr->primitive_cmd = 0; + bicc_cpc_clear(pid); + return; + } + break; + default: + break; + } +} + + +inline void bicc_cpco_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccTimer_struct *tempTimer = &Bicc_Data.timer_data[pid]; + + switch(port_ptr->fsm_state.cpc_state) + { + case CPCO_IDLE: + if(port_ptr->primitive_cmd== BICC_SETUP_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_iam(pid); + tempTimer->t7 = TIMER_PTR->t7; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_ACM; + } + else + bicc_cpc_clear(pid); + break; + case CPCO_WAIT_CONTINUITY: + break; + case CPCO_WAIT_ACM: + if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->primitive_cmd == BICC_INFO_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_sam(pid); + tempTimer->t7 = TIMER_PTR->t7; + port_ptr->w_time = 0; + } + else if(port_ptr->sprc_cmd == M_ACM) + { + port_ptr->sprc_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + tempTimer->t9 = TIMER_PTR->t9; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_ALERT_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_ANM; + } + else if(port_ptr->sprc_cmd == M_CON) + { + port_ptr->sprc_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_SETUP_CNF, EN_CON); + port_ptr->fsm_state.cpc_state = CPCO_ANSWERED; + } +/* else if(port_ptr->sprc_cmd == M_ANM) + { + port_ptr->sprc_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_SETUP_CNF, EN_ANM); + port_ptr->fsm_state.cpc_state = CPCO_ANSWERED; + } +*/ + else if(port_ptr->sprc_cmd == M_CPG) + { + port_ptr->sprc_cmd = 0; //discard... + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + tempTimer->user_t10 = TIMER_PTR->user_t10; + + // fsm_ptr->timer_data.t7 = BICC_TIMER_STOP; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_REL_COMP; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + tempTimer->t7 = BICC_TIMER_STOP; + + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } +#ifdef BICC_REATTEMPT + else if(port_ptr->sprc_cmd == M_IAM) + { + port_ptr->sprc_cmd = 0; + bicc_dualseizure_func(pid); + } +#endif + else if(port_ptr->sprc_cmd != 0) + { + port_ptr->sprc_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_circuit_reset(pid, "unexpected message cpco wait acm"); + bicc_cpc_clear(pid); + return; + } + else if(tempTimer->t7-- == BICC_TIMER_EXPIRED) + { + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x12); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->internal_cmd == (BICC_CMD_BLO|BICC_SI_MGBR)) + { + port_ptr->internal_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd= 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RESET; + tempTimer->user_t10 = TIMER_PTR->user_t10; + + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd= 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + tempTimer->t7 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + case CPCO_WAIT_ANM: + if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->sprc_cmd == M_ANM) + { + port_ptr->sprc_cmd = 0; + tempTimer->t9 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_SETUP_CNF, EN_ANM); + port_ptr->fsm_state.cpc_state = CPCO_ANSWERED; + } + else if(port_ptr->sprc_cmd == M_CPG) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_PROG_IND, EN_NONE); + } +#ifdef BICC_TOLERANT + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + tempTimer->t9 = BICC_TIMER_STOP; + port_ptr->w_time = 0; + tempTimer->user_t10 = TIMER_PTR->user_t10; + + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_REL_COMP; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + tempTimer->t9 = BICC_TIMER_STOP; + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->w_time = 0; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } +#endif +#ifdef BICC_TOLERANT + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + tempTimer->t9 = BICC_TIMER_STOP; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RESET; + tempTimer->user_t10 = TIMER_PTR->user_t10; + + } +#endif + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + tempTimer->t9 = BICC_TIMER_STOP; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + tempTimer->t9 = BICC_TIMER_STOP; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(tempTimer->t9-- == BICC_TIMER_EXPIRED) + { + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + break; + case CPCO_ANSWERED: + if(port_ptr->primitive_cmd == BICC_SUSPEND_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_sus(pid); + port_ptr->cic_state.sus_state = BICC_ORIG_SUSPEND; + port_ptr->fsm_state.cpc_state = CPCO_SUSPENDED; + } + else if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->sprc_cmd == M_SUS) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid,&readPrim_union[pid], BICC_SUSPEND_IND, EN_NONE); + port_ptr->cic_state.sus_state = BICC_TERM_SUSPEND; + port_ptr->fsm_state.cpc_state = CPCO_SUSPENDED; + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + tempTimer->user_t10 = TIMER_PTR->user_t10; + + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_REL_COMP; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RESET; + tempTimer->user_t10 = TIMER_PTR->user_t10; + + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + case CPCO_SUSPENDED: + if(port_ptr->primitive_cmd== BICC_RESUME_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_res(pid); + if(port_ptr->cic_state.sus_state == BICC_ORIG_SUSPEND) + port_ptr->fsm_state.cpc_state = CPCO_ANSWERED; + } + else if(port_ptr->primitive_cmd == BICC_SUSPEND_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_sus(pid); + } + else if(port_ptr->primitive_cmd == BICC_RELEASE_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->sprc_cmd == M_RES) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESUME_IND, EN_NONE); + if(port_ptr->cic_state.sus_state == BICC_TERM_SUSPEND) + port_ptr->fsm_state.cpc_state = CPCO_ANSWERED; + } + else if(port_ptr->sprc_cmd == M_SUS) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_SUSPEND_IND, EN_NONE); + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + tempTimer->user_t10 = TIMER_PTR->user_t10; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_REL_COMP; + } + else if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_FAILURE_IND, EN_NONE); + bicc_set_cause(&writePrim_union[pid].rel_req.cause, 0x10); //Normal call clearing + bicc_send_rel(pid); + tempTimer->t5 = TIMER_PTR->t5; + tempTimer->t1 = TIMER_PTR->t1; + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RLC; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_RESET; + tempTimer->user_t10 = TIMER_PTR->user_t10; + + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + port_ptr->fsm_state.cpc_state = CPCO_WAIT_GROUP_RESET; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd= 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd= 0; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + case CPCO_WAIT_RLC: + if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t5 = BICC_TIMER_STOP; + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->sprc_cmd == M_REL) + { + port_ptr->sprc_cmd = 0; + writePrim_union[pid].rel_rsp.cause.pres = 0; + // bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_IND, EN_NONE); + bicc_send_rlc(pid); + } + else if(tempTimer->t1-- == BICC_TIMER_EXPIRED) + { + bicc_send_rel(pid); + tempTimer->t1 = TIMER_PTR->t1; + } + else if(tempTimer->t5-- == BICC_TIMER_EXPIRED) + { + tempTimer->t1 = BICC_TIMER_STOP; + bicc_circuit_reset(pid, "t5 expired cpco wait rlc"); + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + //port_ptr->fsm_state.cpc_state = BICC_SETUP_RSP; + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CPCO); + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd= 0; + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd= 0; + tempTimer->t5 = BICC_TIMER_STOP; + tempTimer->t1 = BICC_TIMER_STOP; + //The Ind must sent to CC because this Req is not by CC but BICC locally + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_IND, EN_NONE); + bicc_cpc_clear(pid); + return; + } + break; + case CPCO_WAIT_REL_COMP: + if(port_ptr->primitive_cmd == BICC_RELEASE_RSP) + { + port_ptr->primitive_cmd = 0; + tempTimer->user_t10 = 0; + + bicc_send_rlc(pid); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRR)) + { + port_ptr->internal_cmd = 0; + //port_ptr->fsm_state.cpc_state = BICC_RESET_RSP; + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CPCO); + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CRS)) + { + port_ptr->internal_cmd = 0; + bicc_cpc_clear(pid); + return; + } + else if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + bicc_cpc_clear(pid); + return; + } + else if(tempTimer->user_t10-- == BICC_TIMER_EXPIRED) + { + tempTimer->user_t10 = BICC_TIMER_STOP; + bicc_circuit_reset(pid, "user t10 expired cpco wait release complete"); + //bicc_event_handle(pid, &readPrim_union[pid], BICC_RELEASE_CNF, EN_NONE); + bicc_send_rlc(pid); + bicc_cpc_clear(pid); + return; + } + + break; + case CPCO_WAIT_RESET: + if(port_ptr->primitive_cmd == BICC_RESET_RSP) + { + port_ptr->primitive_cmd = 0; + //port_ptr->fsm_state.cpc_state = BICC_RESET_RSP; + port_ptr->internal_cmd = (BICC_CMD_RESET_COMP|BICC_SI_CPCO); + bicc_cpc_clear(pid); + return; + } + else if(tempTimer->user_t10-- == BICC_TIMER_EXPIRED) + { + tempTimer->user_t10 = BICC_TIMER_STOP; + bicc_circuit_reset(pid, "user t10 expired cpco wait release complete"); + bicc_cpc_clear(pid); + return; + } + break; + case CPCO_WAIT_GROUP_RESET: + if(port_ptr->primitive_cmd == BICC_RESET_RSP) + { + port_ptr->primitive_cmd = 0; + bicc_cpc_clear(pid); + return; + } + break; + default: + break; + } +} + + +/********************************************************************/ +/* Maintenance Oriented Circuit Group Blocking/Unbolcking Sending */ +/********************************************************************/ +inline void bicc_mgbs_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccTimer_struct *tempTimer = &Bicc_Data.timer_data[pid]; + + u32 circuit_id; + const pal_circuit_struct *pcircuit = NULL; + + circuit_id = pid / BICC_CIRCUIT_CIC; + pcircuit = pal_circuit_ptr(circuit_id); + if(pcircuit == NULL) + return; + if(pcircuit->attrib.plat_id != local_platid ) + if(Bicc_Data.dmp_data.active == 1) + { + if(port_ptr->fsm_state.mgbs_state != MGBS_IDLE) + { + port_ptr->fsm_state.mgbs_state = MGBS_IDLE; + tempTimer->t18 = 0; + tempTimer->t19 = 0; + } + return ; + } + switch(port_ptr->fsm_state.mgbs_state) + { + case MGBS_IDLE: + if(port_ptr->primitive_cmd == BICC_BLOCK_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_localblocking_func(pid, &writePrim_union[pid].cgb_req.rangeStatus); + bicc_send_cgb(pid); + tempTimer->t18 = TIMER_PTR->t18; + tempTimer->t19 = TIMER_PTR->t19; + port_ptr->fsm_state.mgbs_state = MGBS_WAIT_CGBA; + } + else if(port_ptr->primitive_cmd == BICC_UNBLOCK_REQ) + { + port_ptr->primitive_cmd = 0; + bicc_send_cgu(pid); + tempTimer->t20 = TIMER_PTR->t20; + tempTimer->t21 = TIMER_PTR->t21; + port_ptr->fsm_state.mgbs_state = MGBS_WAIT_CGUA; + } + if(port_ptr->sprc_cmd == M_CGBA) + { + port_ptr->sprc_cmd = 0; + //discard + } + else if(port_ptr->sprc_cmd == M_CGUA) + { + port_ptr->sprc_cmd = 0; + //discard + } + break; + case MGBS_WAIT_CGBA: + if(port_ptr->sprc_cmd == M_CGBA) + { + port_ptr->sprc_cmd = 0; + if(readPrim_union[pid].cgb_cnf.rangeStatus.range >= 32) + return; + tempTimer->t18 = BICC_TIMER_STOP; + tempTimer->t19 = BICC_TIMER_STOP; + port_ptr->fsm_state.mgbs_state = MGBS_IDLE; + bicc_event_handle(pid, &readPrim_union[pid], BICC_BLOCK_CNF, EN_GROUP); + } + + if(tempTimer->t18 -- == BICC_TIMER_EXPIRED) + { + bicc_send_cgb(pid); + tempTimer->t18 = TIMER_PTR->t18; + } + if(tempTimer->t19 -- == BICC_TIMER_EXPIRED) + { + bicc_send_cgb(pid); + tempTimer->t19 = TIMER_PTR->t19; //ignore first T19 expired + } + if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + tempTimer->t18 = BICC_TIMER_STOP; + tempTimer->t19 = BICC_TIMER_STOP; + port_ptr->fsm_state.mgbs_state = MGBS_IDLE; + + } + break; + case MGBS_WAIT_CGUA: + if(port_ptr->sprc_cmd == M_CGUA) + { + port_ptr->sprc_cmd = 0; + if(readPrim_union[pid].cgu_cnf.rangeStatus.range >= 32) + return; + tempTimer->t20 = BICC_TIMER_STOP; + tempTimer->t21 = BICC_TIMER_STOP; + bicc_localunblocking_func(pid, &readPrim_union[pid].cgu_cnf.rangeStatus); + bicc_event_handle(pid, &readPrim_union[pid], BICC_UNBLOCK_CNF, EN_GROUP); + port_ptr->fsm_state.mgbs_state = MGBS_IDLE; + } + + if(tempTimer->t20 -- == BICC_TIMER_EXPIRED) + { + bicc_send_cgu(pid); + tempTimer->t20 = TIMER_PTR->t20; + } + if(tempTimer->t21 -- == BICC_TIMER_EXPIRED) + { + bicc_send_cgb(pid); + tempTimer->t21 = TIMER_PTR->t21; //ignore first T21 expired + } + if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRS)) + { + port_ptr->internal_cmd = 0; + tempTimer->t20 = BICC_TIMER_STOP; + tempTimer->t21 = BICC_TIMER_STOP; + port_ptr->fsm_state.mgbs_state = MGBS_IDLE; + } + break; + default: + break; + } +} + +/************************************************************************/ +/* Maintenance Oriented Circuit Group Blocking/Unbolcking Reception */ +/************************************************************************/ +inline void bicc_mgbr_proc(u32 pid) +{ + + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + //BiccTimer_struct *tempTimer = &Bicc_Data.timer_data[pid]; + switch(port_ptr->fsm_state.mgbr_state) + { + case MGBR_IDLE: + if(port_ptr->sprc_cmd == M_CGB) + { + port_ptr->sprc_cmd = 0; + if(readPrim_union[pid].cgb_ind.rangeStatus.range >= 32) + return; + bicc_cpcoblocking_func(pid, &readPrim_union[pid].cgb_ind.rangeStatus); + port_ptr->fsm_state.mgbr_state = MGBR_WAIT_BLOCKING_RESP; + bicc_event_handle(pid, &readPrim_union[pid], BICC_BLOCK_IND, EN_GROUP); + } + else if(port_ptr->sprc_cmd == M_CGU) + { + port_ptr->sprc_cmd = 0; + if(readPrim_union[pid].cgu_ind.rangeStatus.range >= 32) + return; + bicc_event_handle(pid, &readPrim_union[pid], BICC_UNBLOCK_IND, EN_GROUP); + port_ptr->fsm_state.mgbr_state = MGBR_WAIT_UNBLOCKING_RESP; + } + break; + case MGBR_WAIT_BLOCKING_RESP: + if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + port_ptr->fsm_state.mgbr_state = MGBR_IDLE; + } + else + { + bicc_remoteblocking_func(pid, &readPrim_union[pid].cgb_ind.rangeStatus); + memcpy(&writePrim_union[pid].cgb_rsp, &readPrim_union[pid].cgb_ind, sizeof(BiccCgb_Ind)); + bicc_send_cgba(pid); + port_ptr->fsm_state.mgbr_state = MGBR_IDLE; + } + break; + case MGBR_WAIT_UNBLOCKING_RESP: + if(port_ptr->internal_cmd == (BICC_CMD_RESET|BICC_SI_CGRR)) + { + port_ptr->internal_cmd = 0; + port_ptr->fsm_state.mgbr_state = MGBR_IDLE; + } + else + { + bicc_remoteunblocking_func(pid, &readPrim_union[pid].cgu_ind.rangeStatus); + memcpy(&writePrim_union[pid].cgu_rsp, &readPrim_union[pid].cgu_ind, sizeof(BiccCgu_Ind)); + bicc_send_cgua(pid); + port_ptr->fsm_state.mgbr_state = MGBR_IDLE; + } + break; + default: + break; + } +} + +/********************************************/ +/* Circuit Reset Sending */ +/********************************************/ +BOOL check_crs_waiting(u32 pid) +{ + if(Bicc_Data.port_data[pid].fsm_state.crs_state == CRS_WAIT_REL) + return 1; + else + return 0; +} +inline void bicc_crs_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccTimer_struct *tempTimer = &Bicc_Data.timer_data[pid]; + + u32 circuit_id; + const pal_circuit_struct *pcircuit = NULL; + + circuit_id = pid / BICC_CIRCUIT_CIC; + pcircuit = pal_circuit_ptr(circuit_id); + if(pcircuit == NULL) + return ; + if(pcircuit->attrib.plat_id != local_platid ) + if(Bicc_Data.dmp_data.active == 1) + { + if(port_ptr->fsm_state.crs_state != CRS_IDLE) + { + port_ptr->fsm_state.crs_state = CRS_IDLE; + + tempTimer->t16 = 0; + } + return ; + } + switch(port_ptr->fsm_state.crs_state) + { + case CRS_IDLE: + if(port_ptr->primitive_cmd == BICC_RESET_REQ) + { + port_ptr->primitive_cmd = 0; + port_ptr->cic_state.blo_state &= 0x0e; + port_ptr->cic_state.blo_state &= 0x0d; + bicc_send_rsc(pid); + tempTimer->t16 = TIMER_PTR->t16; + + port_ptr->fsm_state.crs_state = CRS_WAIT_REL; + } + break; + case CRS_WAIT_REL: + if(port_ptr->sprc_cmd == M_RLC) + { + port_ptr->sprc_cmd = 0; + tempTimer->t16 = BICC_TIMER_STOP; + port_ptr->fsm_state.crs_state = CRS_IDLE; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_CNF, EN_NONE); + + } + + if(tempTimer->t16 -- == BICC_TIMER_EXPIRED) + { + bicc_send_rsc(pid); + tempTimer->t16 = TIMER_PTR->t16; + } + break; + default: + break; + } +} + +/********************************************/ +/* Circuit Reset Reception */ +/********************************************/ +inline void bicc_crr_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + + + switch(port_ptr->fsm_state.crr_state) + { + case CRR_IDLE: + if(port_ptr->sprc_cmd == M_RSC) + { + port_ptr->sprc_cmd = 0; + + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + port_ptr->cic_state.call_state = BICC_INCOMING; + + port_ptr->internal_cmd = (BICC_CMD_RESET|BICC_SI_CRR); + + if(port_ptr->cic_state.blo_state & M_LOCAL_BLOCK) + port_ptr->cic_state.blo_state &= 0x0e; + port_ptr->cic_state.blo_state &= 0x0d; + port_ptr->fsm_state.crr_state = CRR_WAIT_RESPONSE; + port_ptr->internal_cmd = (BICC_CMD_RESET|BICC_SI_CRR); + + } + break; + case CRR_WAIT_RESPONSE: + //if((port_ptr->internal_cmd & 0x0F) == CMD_RESET_COMP) + // if(port_ptr->primitive_cmd == BICC_RESET_RSP) + { + port_ptr->internal_cmd = 0; + writePrim_union[pid].rel_rsp.cause.pres = 0; + bicc_send_rlc(pid); + port_ptr->fsm_state.crr_state = CRR_IDLE; + } + break; + default: + break; + } +} + +/************************************************/ +/* Circuit Group Reset Sending */ +/************************************************/ +inline void bicc_cgrs_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccTimer_struct *tempTimer = &Bicc_Data.timer_data[pid]; + u32 circuit_id; + const pal_circuit_struct *pcircuit = NULL; + + circuit_id = pid / BICC_CIRCUIT_CIC; + pcircuit = pal_circuit_ptr(circuit_id); + if(pcircuit == NULL) + return ; + if(pcircuit->attrib.plat_id != local_platid ) + if(Bicc_Data.dmp_data.active == 1) + { + if(port_ptr->fsm_state.cgrs_state != CGRS_IDLE) + { + port_ptr->fsm_state.cgrs_state = CGRS_IDLE; + + tempTimer->t22 = 0; + } + return ; + } + switch(port_ptr->fsm_state.cgrs_state) + { + case CGRS_IDLE: + if(port_ptr->primitive_cmd == BICC_GROUP_RESET_REQ) + { + port_ptr->primitive_cmd = 0; + if(port_ptr->fsm_state.mgbs_state != MGBS_IDLE) + port_ptr->internal_cmd = (BICC_CMD_RESET|BICC_SI_CGRS); + bicc_cgrs_func(pid, writePrim_union[pid].grs_req.rangeStatus.range); + bicc_send_grs(pid); + tempTimer->t22 = TIMER_PTR->t22; + port_ptr->fsm_state.cgrs_state = CGRS_WAIT_GRA; + } + break; + case CGRS_WAIT_GRA: + if(port_ptr->sprc_cmd == M_GRA) + { + port_ptr->sprc_cmd = 0; + tempTimer->t22 = BICC_TIMER_STOP; + port_ptr->fsm_state.cgrs_state = CGRS_IDLE; + bicc_event_handle(pid, &readPrim_union[pid], BICC_RESET_CNF, EN_GROUP); + bicc_cgrsack_func(pid, &readPrim_union[pid].grs_cnf.rangeStatus); + } + + if(tempTimer->t22 -- == BICC_TIMER_EXPIRED) + { + bicc_send_grs(pid); + tempTimer->t22 = TIMER_PTR->t22; + + } + break; + default: + break; + } +} + +/****************************************************/ +/* Circuit Group Reset Reception */ +/****************************************************/ +inline void bicc_cgrr_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + + switch(port_ptr->fsm_state.cgrr_state) + { + case CGRR_IDLE: + if(port_ptr->sprc_cmd == M_GRS) + { + port_ptr->sprc_cmd = 0; + if((readPrim_union[pid].grs_ind.rangeStatus.range >= 32)|| (readPrim_union[pid].grs_ind.rangeStatus.range == 0)) + return; + if(port_ptr->fsm_state.mgbr_state != MGBR_IDLE) + port_ptr->internal_cmd = (BICC_CMD_RESET|BICC_SI_CGRR); + bicc_cgrr_func(pid, readPrim_union[pid].grs_ind.rangeStatus.range, &msg_union[pid].gra.rangeStatus); + port_ptr->fsm_state.cgrr_state = CGRR_WAIT_GROUP_RESET_COMP; + } + break; + case CGRR_WAIT_GROUP_RESET_COMP: + memcpy(&writePrim_union[pid].grs_rsp.rangeStatus, &msg_union[pid].gra.rangeStatus, sizeof(RangeStatus_struct)); + bicc_send_gra(pid); + port_ptr->internal_cmd = 0; + port_ptr->fsm_state.cgrr_state = CGRR_IDLE; + break; + default: + break; + } +} + + + +BOOL bicc_check_blocking(u32 circuit_id, RangeStatus_struct *rs_ptr) +{ + int i; + BOOL ret = 0; + const pal_circuit_struct *pcircuit = NULL; + + pcircuit = pal_circuit_ptr(circuit_id); + if(pcircuit == NULL) + return ret; + memset(rs_ptr, 0, sizeof(RangeStatus_struct)); + rs_ptr->range = BICC_CIRCUIT_CIC- 1; + for(i = pcircuit->attrib.head_cic; i < (pcircuit->attrib.head_cic + pcircuit->attrib.cic_range); i++) + { + if((Bicc_Data.port_data[i].cic_state.blo_state == 0) && (pcircuit->enable== 1)) + { + rs_ptr->status[i>>3]|= 0x01 << (i&0x07); + ret = 1; + } + } + return ret; +} + +BOOL bicc_check_unblocking(u32 circuit_id, RangeStatus_struct *rs_ptr) +{ + int i; + BOOL ret = 0; + const pal_circuit_struct *pcircuit = NULL; + + pcircuit = pal_circuit_ptr(circuit_id); + if(pcircuit == NULL) + return ret; + memset(rs_ptr, 0, sizeof(RangeStatus_struct)); + rs_ptr->range = BICC_CIRCUIT_CIC - 1; + for(i = pcircuit->attrib.head_cic; i < (pcircuit->attrib.head_cic + pcircuit->attrib.cic_range); i++) + { + if((pcircuit->enable== 1) && (Bicc_Data.port_data[i].cic_state.blo_state == 1)) + { + rs_ptr->status[i>>3]|= 0x01 << (i&0x07); + ret = 1; + } + } + return ret; +} + +BOOL bicc_trunk_reachable(u32 cg_id) +{ + const pal_cg_struct *pcg; + pcg = pal_cg_ptr(cg_id); + if(pcg==NULL) + return 0; + if(check_outbound_route(pcg->attrib.network_id, (long)pcg->attrib.dpc, 0) >= 0) + return 1; + else + return 0; +} + diff --git a/omc/plat/bicc/src/bicc_ipbcp.c b/omc/plat/bicc/src/bicc_ipbcp.c new file mode 100644 index 0000000..a5de374 --- /dev/null +++ b/omc/plat/bicc/src/bicc_ipbcp.c @@ -0,0 +1,362 @@ +#include +#include +#include "./include/ipbcp.h" + +int sdp_decode_orig(SdpOrig_struct *dst_ptr, char *src_ptr) +{ + char *token; + unsigned char field_id = 0; + + while((token = strsep(&src_ptr, " ")) != NULL) + { + switch(++field_id) + { + case 1: + sprintf(dst_ptr->username, token); + strcat(dst_ptr->username, "\0"); + break; + case 2: + sprintf(dst_ptr->session_id, token); + strcat(dst_ptr->session_id, "\0"); + break; + case 3: + sprintf(dst_ptr->version, token); + strcat(dst_ptr->version, "\0"); + break; + case 4: + sprintf(dst_ptr->network_type, token); + strcat(dst_ptr->network_type, "\0"); + break; + case 5: + sprintf(dst_ptr->address_type, token); + strcat(dst_ptr->address_type, "\0"); + break; + case 6: + sprintf(dst_ptr->address, token); + strcat(dst_ptr->address, "\0"); + break; + default: + return 0; + } + } + if(field_id != 6) + return 0; + else + return 1; +} + +int sdp_decode_conn(SdpConn_struct *dst_ptr, char *src_ptr) +{ + char *token; + unsigned char field_id = 0; + + while((token = strsep(&src_ptr, " ")) != NULL) + { + switch(++field_id) + { + case 1: + sprintf(dst_ptr->network_type, token); + strcat(dst_ptr->network_type, "\0"); + break; + case 2: + sprintf(dst_ptr->address_type, token); + strcat(dst_ptr->address_type, "\0"); + break; + case 3: + sprintf(dst_ptr->address, token); + strcat(dst_ptr->address, "\0"); + break; + default: + return 0; + } + } + if(field_id != 3) + return 0; + else + return 1; +} + +int sdp_decode_time(SdpTime_struct *dst_ptr, char *src_ptr) +{ + char *token; + unsigned char field_id = 0; + + while((token = strsep(&src_ptr, " ")) != NULL) + { + switch(++field_id) + { + case 1: + sprintf(dst_ptr->start, token); + strcat(dst_ptr->start, "\0"); + break; + case 2: + sprintf(dst_ptr->stop, token); + strcat(dst_ptr->stop, "\0"); + break; + default: + return 0; + } + } + if(field_id != 2) + return 0; + else + return 1; +} + +int sdp_decode_attrib(SdpAttrib_struct *dst_ptr, char *src_ptr) +{ + char *token; + unsigned char field_id = 0; + + if(strstr(src_ptr, "ipbcp:") != src_ptr) + return 0; + src_ptr += strlen("ipbcp:"); + while((token = strsep(&src_ptr, " ")) != NULL) + { + switch(++field_id) + { + case 1: + sprintf(dst_ptr->version, token); + strcat(dst_ptr->version, "\0"); + break; + case 2: + sprintf(dst_ptr->type, token); + strcat(dst_ptr->type, "\0"); + break; + default: + return 0; + } + } + if(field_id != 2) + return 0; + else + return 1; +} + +int sdp_decode_mediaAnn(SdpMediaAnn_struct *dst_ptr, char *src_ptr) +{ + char *token; + unsigned char field_id = 0; + + while((token = strsep(&src_ptr, " ")) != NULL) + { + switch(++field_id) + { + case 1: + sprintf(dst_ptr->media, token); + strcat(dst_ptr->media, "\0"); + break; + case 2: + sprintf(dst_ptr->port, token); + strcat(dst_ptr->port, "\0"); + break; + case 3: + sprintf(dst_ptr->transport, token); + strcat(dst_ptr->transport, "\0"); + strcpy(dst_ptr->fmt_list, src_ptr); + strcat(dst_ptr->fmt_list, "\0"); + break; + case 4: + // sprintf(dst_ptr->fmt_list, token); + break; + default: + break; + } + } + if(field_id < 4) + return 0; + else + return 1; +} + +int sdp_decode_mediaAtt(SdpMediaAtt_struct *dst_ptr, char *src_ptr) +{ + char *token; + unsigned char field_id = 0; + + if(strstr(src_ptr, "rtpmap:") != src_ptr) + return 0; + src_ptr += strlen("rtpmap:"); + while((token = strsep(&src_ptr, " /")) != NULL) + { + switch(++field_id) + { + case 1: + sprintf(dst_ptr->payload, token); + strcat(dst_ptr->payload, "\0"); + break; + case 2: + sprintf(dst_ptr->encoding_name, token); + strcat(dst_ptr->encoding_name, "\0"); + break; + case 3: + sprintf(dst_ptr->clock_rate, token); + strcat(dst_ptr->clock_rate, "\0"); + break; + case 4: +// sprintf(dst_ptr->p_time, token); + field_id --;//to avoid 4 fields + break; + default: + return 0; + } + } + if(field_id != 3) + return 0; + else + return 1; +} + + +int sdp_decode_ptime(char* p_time, char *src_ptr) +{ + char *token; + if((token = strstr(src_ptr, "ptime:")) == NULL) + return 0; + token = strtok(token, ":"); + token = strtok(NULL, ":"); +// p_time = token; +// if(strlen(token)<8) + if(token) + { + sprintf(p_time, token); + strcat(p_time, "\0"); + } + return 1; + +} + +int ipbcp_decode(IPBCP_struct *ipbcp_ptr, const char *ptr) +{ + char *token; + unsigned char field_id = 0; + char temp_ipbcp[200]; + char *temp_ptr; + + strncpy(temp_ipbcp, ptr, 200); + temp_ptr = temp_ipbcp; + memset(ipbcp_ptr, 0, sizeof(IPBCP_struct)); + while((token = strsep(&temp_ptr, "\r\n")) != NULL) + { + if(strlen(token) == 0) + continue; + switch(++field_id) + { + case 1: + if((token[0] != 'v') || (token[1] != '=')) + return 0; + sprintf(ipbcp_ptr->proto_ver, token+2); + strcat(ipbcp_ptr->proto_ver, "\0"); + break; + case 2: + if((token[0] != 'o') || (token[1] != '=')) + return 0; + if(!sdp_decode_orig(&ipbcp_ptr->orig, token+2)) + return 0; + break; + case 3: + if((token[0] != 's') || (token[1] != '=')) + return 0; + sprintf(ipbcp_ptr->session_name, token+2); + + strcat(ipbcp_ptr->session_name, "\0"); + break; + case 4: + if((token[0] != 'c') || (token[1] != '=')) + return 0; + if(!sdp_decode_conn(&ipbcp_ptr->conn_data, token+2)) + return 0; + break; + case 5: + if((token[0] != 't') || (token[1] != '=')) + return 0; + if(!sdp_decode_time(&ipbcp_ptr->time, token+2)) + return 0; + break; + case 6: + if((token[0] != 'a') || (token[1] != '=')) + return 0; + if(!sdp_decode_attrib(&ipbcp_ptr->attrib, token+2)) + return 0; + break; + case 7: + if((token[0] != 'm') || (token[1] != '=')) + return 0; + if(!sdp_decode_mediaAnn(&ipbcp_ptr->m_ann, token+2)) + return 0; + break; + case 8: + if((token[0] != 'a') || (token[1] != '=')) + return 0; + if(sdp_decode_mediaAtt(&ipbcp_ptr->m_att, token+2)) + // return 0; + ; + else if(!sdp_decode_ptime(ipbcp_ptr->ptime, token+2)) + return 0; + + break; + case 9: + if((token[0] != 'a') || (token[1] != '=')) + return 0; + if(!sdp_decode_ptime(ipbcp_ptr->ptime, token+2)) + return 0; + default: + break; + } + } + return 1; +} + +int ipbcp_encode(char *ptr, const IPBCP_struct *ipbcp_ptr) +{ + char tmp_buf[128]; + + sprintf(ptr, "v=%s\r\n", ipbcp_ptr->proto_ver); + + sprintf(tmp_buf, "o=%s %s %s %s %s %s\r\n", + ipbcp_ptr->orig.username, + ipbcp_ptr->orig.session_id, + ipbcp_ptr->orig.version, + ipbcp_ptr->orig.network_type, + ipbcp_ptr->orig.address_type, + ipbcp_ptr->orig.address); + strcat(ptr, tmp_buf); + + sprintf(tmp_buf, "s=%s\r\n", ipbcp_ptr->session_name); + strcat(ptr, tmp_buf); + + sprintf(tmp_buf, "c=%s %s %s\r\n", + ipbcp_ptr->conn_data.network_type, + ipbcp_ptr->conn_data.address_type, + ipbcp_ptr->conn_data.address); + strcat(ptr, tmp_buf); + + sprintf(tmp_buf, "t=%s %s\r\n", ipbcp_ptr->time.start, ipbcp_ptr->time.stop); + strcat(ptr, tmp_buf); + + sprintf(tmp_buf, "a=ipbcp:%s %s\r\n", ipbcp_ptr->attrib.version, ipbcp_ptr->attrib.type); + strcat(ptr, tmp_buf); + + sprintf(tmp_buf, "m=%s %s %s %s\r\n", + ipbcp_ptr->m_ann.media, + ipbcp_ptr->m_ann.port, + ipbcp_ptr->m_ann.transport, + ipbcp_ptr->m_ann.fmt_list); + strcat(ptr, tmp_buf); + + if(strlen(ipbcp_ptr->m_att.payload) != 0) + { + sprintf(tmp_buf, "a=rtpmap:%s %s/%s\r\n", + ipbcp_ptr->m_att.payload, + ipbcp_ptr->m_att.encoding_name, + ipbcp_ptr->m_att.clock_rate); + strcat(ptr, tmp_buf); + } + //ipbcp_ptr->ptime[7]='\0'; + if((ipbcp_ptr->ptime[0] != '\0') && (strlen(ipbcp_ptr->ptime)<8)) + { + sprintf(tmp_buf, "a=ptime:%s\r\n", ipbcp_ptr->ptime); + strcat(ptr, tmp_buf); + } + return strlen(ptr); +} diff --git a/omc/plat/bicc/src/bicc_msg.c b/omc/plat/bicc/src/bicc_msg.c new file mode 100644 index 0000000..9ba7769 --- /dev/null +++ b/omc/plat/bicc/src/bicc_msg.c @@ -0,0 +1,1285 @@ +#include "./include/inc.h" +#include "./include/var_ext.h" + +BiccMsg_union msg_union[BICC_MAX_PORT]; +//static up_message_2 up_msg; +extern void apm_decode(ApmUser_struct *ptr, const u8 *flw_ptr, u8 length); +extern u32 apm_encode(u8 *flw_ptr, const ApmUser_struct *ptr); +extern void bicc_prm2msg(BiccMsg_union *msg_ptr, BiccWritePrim_union *prm_ptr, u8 msg_type); + +void bicc_decode_app(AppTrans_struct *ptr, const u8 *flw_ptr, u8 length) +{ + int i = 0; + + ptr->pres = 1; + ptr->aci[0] = flw_ptr[i]; + if((flw_ptr[i++] >> 7) == 0) + ptr->aci[1] = flw_ptr[i++]; + ptr->sni = (flw_ptr[i] >> 1) & 0x01; + ptr->rci = flw_ptr[i++] & 0x01; + ptr->si = (flw_ptr[i] >> 6) & 0x01; + ptr->segment = flw_ptr[i] & 0x3f; + if((flw_ptr[i++] >> 7) == 0) + ptr->slr = flw_ptr[i++] & 0x7f; + if(length > i) + apm_decode(&ptr->apm_info, flw_ptr+i, length-i); +} + +u32 bicc_encode_app(u8 *flw_ptr, const AppTrans_struct *ptr) +{ + int i = 0; + + flw_ptr[i++] = ptr->aci[0] | 0x80; +// if((ptr->aci[0] >> 7) == 0) +// flw_ptr[i++] = ptr->aci[1]; + flw_ptr[i++] = (ptr->sni << 1) + ptr->rci; + flw_ptr[i++] = ((ptr->si << 6) + ptr->segment) | 0x80; + return i + apm_encode(flw_ptr+i, &ptr->apm_info); +} + +void bicc_decode_backcall(BackCallInd_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val[0] = flw_ptr[0]; + ptr->val[1] = flw_ptr[1]; +} + +u32 bicc_encode_backcall(u8 *flw_ptr, const BackCallInd_struct *ptr) +{ + flw_ptr[0] = ptr->val[0]; + flw_ptr[1] = ptr->val[1]; + return 2; +} + +void bicc_decode_calledptynum(CalledPtyNum_struct *ptr, const u8 *flw_ptr, u8 length) +{ + u32 i, j; + u8 num_len; + const u8 *num_ptr; + + if(length <= 2) + return; + ptr->pres = 1; + ptr->nai = flw_ptr[0] & 0x7f; + ptr->inn = flw_ptr[1] >> 7; + ptr->npi = (flw_ptr[1] >> 4) & 0x07; + num_len = length - 2; + num_ptr = flw_ptr + 2; + for(i = 0, j = 0; i < num_len; i++) + { + ptr->digit[j++] = num_ptr[i] & 0x0f; + ptr->digit[j++] = num_ptr[i] >> 4; + } + if((flw_ptr[0] >> 7) && (j > 0)) + j--; + ptr->numOfDigit = j; +} + +u32 bicc_encode_calledptynum(u8 *flw_ptr, const CalledPtyNum_struct *ptr) +{ + u32 i, j; + u8 num_len; + u8 *num_ptr; + + num_len = ptr->numOfDigit/2 + (ptr->numOfDigit & 0x01); + num_ptr = flw_ptr + 2; + flw_ptr[0] = (ptr->numOfDigit << 7) + ptr->nai; + flw_ptr[1] = ((ptr->inn << 7) + (ptr->npi << 4)) & 0xf0; + for(i = 0, j = 0; i < num_len; i++) + { + num_ptr[i] = ptr->digit[j++] & 0x0f; + num_ptr[i] += ptr->digit[j++] << 4; + } + if(ptr->numOfDigit & 0x01) + num_ptr[i] &= 0x0f; + return num_len + 2; +} + +void bicc_decode_callingptynum(CallingPtyNum_struct *ptr, const u8 *flw_ptr, u8 length) +{ + u32 i, j; + u8 num_len; + const u8 *num_ptr; + + if(length <= 2) + return; + ptr->pres = 1; + ptr->nai = flw_ptr[0] & 0x7f; + ptr->ni = flw_ptr[1] >> 7; + ptr->npi = (flw_ptr[1] >> 4) & 0x07; + ptr->apri = (flw_ptr[1] >> 2) & 0x03; + ptr->si = flw_ptr[1] & 0x03; + num_len = length - 2; + num_ptr = flw_ptr + 2; + for(i = 0, j = 0; i < num_len; i++) + { + ptr->digit[j++] = num_ptr[i] & 0x0f; + ptr->digit[j++] = num_ptr[i] >> 4; + } + if((flw_ptr[0] >> 7) && (j > 0)) + j--; + ptr->numOfDigit = j; +} + +u32 bicc_encode_callingptynum(u8 *flw_ptr, const CallingPtyNum_struct *ptr) +{ + u32 i, j; + u8 num_len; + u8 *num_ptr; + + num_len = ptr->numOfDigit/2 + (ptr->numOfDigit & 0x01); + num_ptr = flw_ptr + 2; + flw_ptr[0] = (ptr->numOfDigit << 7) + ptr->nai; + flw_ptr[1] = (ptr->ni << 7) + (ptr->npi << 4) + (ptr->apri << 2) + ptr->si; + for(i = 0, j = 0; i < num_len; i++) + { + num_ptr[i] = ptr->digit[j++] & 0x0f; + num_ptr[i] += ptr->digit[j++] << 4; + } + if(ptr->numOfDigit & 0x01) + num_ptr[i] &= 0x0f; + return num_len + 2; +} + +void bicc_decode_callingptycat(CallingPtyCat_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val = *flw_ptr; +} + +u32 bicc_encode_callingptycat(u8 *flw_ptr, const CallingPtyCat_struct *ptr) +{ + flw_ptr[0] = ptr->val; + return 1; +} + + +u32 bicc_encode_cause(u8 *flw_ptr, const CauseInd_struct *ptr) +{ + flw_ptr[0] = ((ptr->codingStd << 5) + ptr->location) & 0x7f; + flw_ptr[1] = 0x80 | ptr->causeVal; + return 2; +} + +void bicc_decode_cause(CauseInd_struct *ptr, const u8 *flw_ptr, u8 length) +{ + ptr->pres = 1; + ptr->codingStd = (flw_ptr[0] >> 5) & 0x03; + ptr->location = flw_ptr[0] & 0x0f; + ptr->causeVal = flw_ptr[1] & 0x7f; +} + + +void bicc_decode_cicgrpspv(CicGrpSpv_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val = *flw_ptr; +} + +u32 bicc_encode_cicgrpspv(u8 *flw_ptr, const CicGrpSpv_struct *ptr) +{ + flw_ptr[0] = ptr->val; + return 1; +} + +void bicc_decode_collectcallreq(CollectCallReq_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val = *flw_ptr; +} + +u32 bicc_encode_collectcallreq(u8 *flw_ptr, const CollectCallReq_struct *ptr) +{ + flw_ptr[0] = ptr->val; + return 1; +} + +void bicc_decode_conftreat(ConfTreatInd_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val = *flw_ptr; +} + +u32 bicc_encode_conftreat(u8 *flw_ptr, const ConfTreatInd_struct *ptr) +{ + flw_ptr[0] = ptr->val; + return 1; +} + +void bicc_decode_connnum(ConnNum_struct *ptr, const u8 *flw_ptr, u8 length) +{ + u32 i, j; + u8 num_len; + const u8 *num_ptr; + + if(length <= 2) + return; + ptr->pres = 1; + ptr->nai = flw_ptr[0] & 0x7f; + ptr->npi = (flw_ptr[1] >> 4) & 0x07; + ptr->apri = (flw_ptr[1] >> 2) & 0x03; + ptr->si = flw_ptr[1] & 0x03; + num_len = length - 2; + num_ptr = flw_ptr + 2; + for(i = 0, j = 0; i < num_len; i++) + { + ptr->digit[j++] = num_ptr[i] & 0x0f; + ptr->digit[j++] = num_ptr[i] >> 4; + } + if((flw_ptr[0] >> 7) && (j > 0)) + j--; + ptr->numOfDigit = j; +} + +u32 bicc_encode_connnum(u8 *flw_ptr, const ConnNum_struct *ptr) +{ + u32 i, j; + u8 num_len; + u8 *num_ptr; + + num_len = ptr->numOfDigit/2 + (ptr->numOfDigit & 0x01); + num_ptr = flw_ptr + 2; + flw_ptr[0] = (ptr->numOfDigit << 7) + ptr->nai; + flw_ptr[1] = ((ptr->npi << 4) + (ptr->apri << 2) + ptr->si) & 0x7f; + for(i = 0, j = 0; i < num_len; i++) + { + num_ptr[i] = ptr->digit[j++] & 0x0f; + num_ptr[i] += ptr->digit[j++] << 4; + } + if(ptr->numOfDigit & 0x01) + num_ptr[i] &= 0x0f; + return num_len + 2; +} + +void bicc_decode_genericnumber(GenericNumber_struct *ptr, const u8 *flw_ptr, u8 length) +{ + u32 i, j; + u8 num_len; + const u8 *num_ptr; + + if(length <= 3) + return; + ptr->pres = 1; + ptr->nqi = flw_ptr[0]; + ptr->nai = flw_ptr[1] & 0x7f; + ptr->ni = flw_ptr[2] >> 7; + ptr->npi = (flw_ptr[2] >> 4) & 0x07; + ptr->apri = (flw_ptr[2] >> 2) & 0x03; + ptr->si = flw_ptr[2] & 0x03; + num_len = length - 3; + num_ptr = flw_ptr + 3; + for(i = 0, j = 0; i < num_len; i++) + { + ptr->digit[j++] = num_ptr[i] & 0x0f; + ptr->digit[j++] = num_ptr[i] >> 4; + } + if((flw_ptr[1] >> 7) && (j > 0)) + j--; + ptr->numOfDigit = j; +} + +void bicc_decode_genericDigits(GenericDigits_struct *ptr, const u8 *flw_ptr, u8 length) +{ + u8 num_len; + int i, j; + const u8 *num_ptr; + if(length < 3) + return; + ptr->pres = 1; + + ptr->typeOfDigits = flw_ptr[0] & 0x1f; + ptr->encodeScheme = flw_ptr[0] & 0xE0; + num_len = length - 2; + num_ptr = flw_ptr + 2; + for(i = 0, j = 0; i < num_len; i++) + { + ptr->digits[j++] = num_ptr[i] & 0x0f; + ptr->digits[j++] = num_ptr[i] >> 4; + } + if((flw_ptr[0] >> 5) && (j > 0)) + j--; + ptr->numOfDigit = j; + +} + + + + +void bicc_decode_correlationid(CorrelationId_struct *ptr, const u8 *flw_ptr, u8 length) +{ + bicc_decode_genericDigits(ptr, flw_ptr, length); +} + + +u32 bicc_encode_genericnumber(u8 *flw_ptr, const GenericNumber_struct *ptr) +{ + u32 i, j; + u8 num_len; + u8 *num_ptr; + + num_len = ptr->numOfDigit/2 + (ptr->numOfDigit & 0x01); + num_ptr = flw_ptr + 3; + flw_ptr[0] = ptr->nqi; + flw_ptr[1] = (ptr->numOfDigit << 7) + ptr->nai; + flw_ptr[2] = (ptr->ni << 7) + (ptr->npi << 4) + (ptr->apri << 2) + ptr->si; + for(i = 0, j = 0; i < num_len; i++) + { + num_ptr[i] = ptr->digit[j++] & 0x0f; + num_ptr[i] += ptr->digit[j++] << 4; + } + if(ptr->numOfDigit & 0x01) + num_ptr[i] &= 0x0f; + return num_len + 3; +} + +u32 bicc_encode_genericDigits(u8 *flw_ptr, const GenericDigits_struct *ptr) +{ + u32 i, j; + u8 num_len; + u8 *num_ptr; + num_ptr = flw_ptr + 1; + flw_ptr[0] = (ptr->encodeScheme << 5) + ptr->typeOfDigits; + flw_ptr[1] = ptr->numOfDigit & 0xff; + num_len = ptr->numOfDigit/2 + (ptr->numOfDigit & 0x01); + for(i = 0, j = 0; i < num_len; i++) + { + num_ptr[i] = ptr->digits[j++] & 0x0f; + num_ptr[i] += ptr->digits[j++] << 4; + } + if(ptr->numOfDigit & 0x01) + num_ptr[i] &= 0x0f; + return num_len + 2; + +} + + +u32 bicc_encode_correlationid(u8 *flw_ptr, const CorrelationId_struct *ptr) +{ + return bicc_encode_genericDigits(flw_ptr, ptr); + +} + +void bicc_decode_eventinfo(EventInfo_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val = *flw_ptr; +} + +u32 bicc_encode_eventinfo(u8 *flw_ptr, const EventInfo_struct *ptr) +{ + flw_ptr[0] = ptr->val; + return 1; +} + +void bicc_decode_fwdcall(FwdCallInd_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val[0] = flw_ptr[0]; + ptr->val[1] = flw_ptr[1]; +} + +u32 bicc_encode_fwdcall(u8 *flw_ptr, const FwdCallInd_struct *ptr) +{ + flw_ptr[0] = ptr->val[0]; + flw_ptr[1] = ptr->val[1]; + return 2; +} + + +void bicc_decode_natconn(NatConnInd_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val = *flw_ptr; +} + +u32 bicc_encode_natconn(u8 *flw_ptr, const NatConnInd_struct *ptr) +{ + flw_ptr[0] = ptr->val; + return 1; +} + +void bicc_decode_origcallednum(OrigCalledNum_struct *ptr, const u8 *flw_ptr, u8 length) +{ + u32 i, j; + u8 num_len; + const u8 *num_ptr; + + if(length <= 2) + return; + ptr->pres = 1; + ptr->nai = flw_ptr[0] & 0x7f; + ptr->npi = (flw_ptr[1] >> 4) & 0x07; + ptr->apri = (flw_ptr[1] >> 2) & 0x03; + num_len = length - 2; + num_ptr = flw_ptr + 2; + for(i = 0, j = 0; i < num_len; i++) + { + ptr->digit[j++] = num_ptr[i] & 0x0f; + ptr->digit[j++] = num_ptr[i] >> 4; + } + if((flw_ptr[0] >> 7) && (j > 0)) + j--; + ptr->numOfDigit = j; +} + +u32 bicc_encode_origcallednum(u8 *flw_ptr, const OrigCalledNum_struct *ptr) +{ + u32 i, j; + u8 num_len; + u8 *num_ptr; + + num_len = ptr->numOfDigit/2 + (ptr->numOfDigit & 0x01); + num_ptr = flw_ptr + 2; + flw_ptr[0] = (ptr->numOfDigit << 7) + ptr->nai; + flw_ptr[1] = ((ptr->npi << 4) + (ptr->apri << 2)) & 0x7c; + for(i = 0, j = 0; i < num_len; i++) + { + num_ptr[i] = ptr->digit[j++] & 0x0f; + num_ptr[i] += ptr->digit[j++] << 4; + } + if(ptr->numOfDigit & 0x01) + num_ptr[i] &= 0x0f; + return num_len + 2; +} + +void bicc_decode_rangestatus(RangeStatus_struct *ptr, const u8 *flw_ptr, u8 length, u8 need_status) +{ + u8 status_len; + + ptr->pres = 1; + ptr->range = flw_ptr[0]; + if(need_status == 1) + { + status_len = (((flw_ptr[0]+1)&0x07) == 0)? ((flw_ptr[0]+1)>>3) : (((flw_ptr[0]+1)>>3) + 1); + memcpy(ptr->status, flw_ptr+1, status_len); + } +} + +u32 bicc_encode_rangestatus(u8 *flw_ptr, const RangeStatus_struct *ptr, u8 need_status) +{ + u8 status_len; + + flw_ptr[0] = ptr->range; + if(need_status == 1) + { + status_len = (((ptr->range+1)&0x07) == 0)? ((ptr->range+1)>>3) : (((ptr->range+1)>>3) + 1); + memcpy(flw_ptr+1, ptr->status, status_len); + } + else + status_len = 0; + return status_len + 1; +} + +void bicc_decode_redirgnum(RedirgNum_struct *ptr, const u8 *flw_ptr, u8 length) +{ + u32 i, j; + u8 num_len; + const u8 *num_ptr; + + if(length <= 2) + return; + ptr->pres = 1; + ptr->nai = flw_ptr[0] & 0x7f; + ptr->npi = (flw_ptr[1] >> 4) & 0x07; + ptr->apri = (flw_ptr[1] >> 2) & 0x03; + num_len = length - 2; + num_ptr = flw_ptr + 2; + for(i = 0, j = 0; i < num_len; i++) + { + ptr->digit[j++] = num_ptr[i] & 0x0f; + ptr->digit[j++] = num_ptr[i] >> 4; + } + if((flw_ptr[0] >> 7) && (j > 0)) + j--; + ptr->numOfDigit = j; +} + +void bicc_decode_redirinfo(RedirInfo_struct *ptr, u8 *flw_ptr, u8 length) +{ + if(length <= 2) + return; + ptr->redInd = flw_ptr[0] & 0x07; + ptr->origRedirReason = (flw_ptr[0] >> 4) & 0x0f; + ptr->redirCounter = flw_ptr[1] & 0x07; + ptr->redirReason = (flw_ptr[1] >> 4) & 0x0f; +} + +u32 bicc_encode_redirgnum(u8 *flw_ptr, const RedirgNum_struct *ptr) +{ + u32 i, j; + u8 num_len; + u8 *num_ptr; + + num_len = ptr->numOfDigit/2 + (ptr->numOfDigit & 0x01); + num_ptr = flw_ptr + 2; + flw_ptr[0] = (ptr->numOfDigit << 7) + ptr->nai; + flw_ptr[1] = ((ptr->npi << 4) + (ptr->apri << 2)) & 0x7c; + for(i = 0, j = 0; i < num_len; i++) + { + num_ptr[i] = ptr->digit[j++] & 0x0f; + num_ptr[i] += ptr->digit[j++] << 4; + } + if(ptr->numOfDigit & 0x01) + num_ptr[i] &= 0x0f; + return num_len + 2; +} + +u32 bicc_encode_redirinfo(u8 *flw_ptr, const RedirInfo_struct *ptr) +{ + flw_ptr[0] = (ptr->origRedirReason << 4) + ptr->redInd; + flw_ptr[1] = (ptr->redirReason << 4) + ptr->redirCounter; + return 2; +} + +void bicc_decode_scfid(ScfId_struct *ptr, const u8 *flw_ptr, u8 length) +{ + bicc_decode_genericDigits(ptr, flw_ptr, length); +} + +u32 bicc_encode_scfid(u8 *flw_ptr, const ScfId_struct *ptr) +{ + return bicc_encode_genericDigits(flw_ptr, ptr); +} + +void bicc_decode_subseqnum(SubseqNum_struct *ptr, const u8 *flw_ptr, u8 length) +{ + u32 i, j; + u8 num_len; + const u8 *num_ptr; + + if(length <= 1) + return; + ptr->pres = 1; + num_len = length - 1; + num_ptr = flw_ptr + 1; + for(i = 0, j = 0; i < num_len; i++) + { + ptr->digit[j++] = num_ptr[i] & 0x0f; + ptr->digit[j++] = num_ptr[i] >> 4; + } + if((flw_ptr[0] >> 7) && (j > 0)) + j--; + ptr->numOfDigit = j; +} + +u32 bicc_encode_subseqnum(u8 *flw_ptr, const SubseqNum_struct *ptr) +{ + u32 i, j; + u8 num_len; + u8 *num_ptr; + + num_len = ptr->numOfDigit/2 + (ptr->numOfDigit & 0x01); + num_ptr = flw_ptr + 1; + flw_ptr[0] = (ptr->numOfDigit & 0x01) << 7; + for(i = 0, j = 0; i < num_len; i++) + { + num_ptr[i] = ptr->digit[j++] & 0x0f; + num_ptr[i] += ptr->digit[j++] << 4; + } + if(ptr->numOfDigit & 0x01) + num_ptr[i] &= 0x0f; + return num_len + 2; +} + +void bicc_decode_susres(SusResInd_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val = *flw_ptr; +} + +u32 bicc_encode_susres(u8 *flw_ptr, const SusResInd_struct *ptr) +{ + flw_ptr[0] = ptr->val; + return 1; +} + +void bicc_decode_transmedreq(TransMedReq_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val = *flw_ptr; +} + +u32 bicc_encode_transmedreq(u8 *flw_ptr, const TransMedReq_struct *ptr) +{ + flw_ptr[0] = ptr->val; + return 1; +} + +void bicc_decode_utuind(UserToUserInd_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->val = *flw_ptr; +} + +u32 bicc_encode_utuind(u8 *flw_ptr, const UserToUserInd_struct *ptr) +{ + flw_ptr[0] = ptr->val; + return 1; +} + +void bicc_decode_utuinfo(UserToUserInfo_struct *ptr, const u8 *flw_ptr, u8 length) +{ + if((length == 0) || (length > 129)) + return; + ptr->pres = 1; + ptr->len = length; + memcpy(ptr->val, flw_ptr, length); +} + +u32 bicc_encode_utuinfo(u8 *flw_ptr, const UserToUserInfo_struct *ptr) +{ + memcpy(flw_ptr, ptr->val, ptr->len); + return ptr->len; +} + +void bicc_decode_calldiverinfo(CallDiverInfo_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->notifSubsOption = flw_ptr[0]&0x07; + ptr->redirReason = (flw_ptr[0]>>3)&0x0f; +} + +u32 bicc_encode_calldiverinfo(u8 *flw_ptr, const CallDiverInfo_struct *ptr) +{ + flw_ptr[0] = ((ptr->redirReason)<<3) + (ptr->notifSubsOption); + return 1; +} + +void bicc_decode_optBackCallInd(OptBackCallInd_struct *ptr, const u8 *flw_ptr) +{ + ptr->pres = 1; + ptr->inbandInfoInd = flw_ptr[0]&0x01; + ptr->callDiverOccurInd = flw_ptr[0]&0x02; + ptr->simpSegmInd = flw_ptr[0]&0x04; + ptr->mlppUserInd = flw_ptr[0]&0x08; +} + +u32 bicc_encode_optBackCallInd(u8 *flw_ptr, const OptBackCallInd_struct *ptr) +{ + flw_ptr[0] = (((ptr->mlppUserInd)<<3)+((ptr->simpSegmInd)<<2)+((ptr->callDiverOccurInd<<1))+(ptr->inbandInfoInd))&0x0f; + return 1; +} + +void bicc_send_acm(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccAcm_struct *acm_ptr = &msg_union[pid].acm; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_ACM); + *(flw_ptr++) = M_ACM; + flw_ptr += bicc_encode_backcall(flw_ptr, &acm_ptr->backCall); + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 0; + if(acm_ptr->app.pres == 1) + { + flw_ptr[0] = P_APPTRANS; + flw_ptr[1] = bicc_encode_app(flw_ptr+2, &acm_ptr->app); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(acm_ptr->cause.pres == 1) + { + flw_ptr[0] = P_CAUSEIND; + flw_ptr[1] = bicc_encode_cause(flw_ptr+2, &acm_ptr->cause); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(acm_ptr->confTreat.pres == 1) + { + flw_ptr[0] = P_CONFTREATIND; + flw_ptr[1] = bicc_encode_conftreat(flw_ptr+2, &acm_ptr->confTreat); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(acm_ptr->optBackCall.pres == 1) + { + flw_ptr[0] = P_OPTBACKCALLIND; + flw_ptr[1] = bicc_encode_optBackCallInd(flw_ptr+2, &acm_ptr->optBackCall); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(acm_ptr->utuInd.pres == 1) + { + flw_ptr[0] = P_UTUIND; + flw_ptr[1] = bicc_encode_utuind(flw_ptr+2, &acm_ptr->utuInd); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(acm_ptr->utuInfo.pres == 1) + { + flw_ptr[0] = P_UTUINFO; + flw_ptr[1] = bicc_encode_utuinfo(flw_ptr+2, &acm_ptr->utuInfo); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_anm(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccAnm_struct *anm_ptr = &msg_union[pid].anm; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_ANM); + *(flw_ptr++) = M_ANM; + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 0; + if(anm_ptr->app.pres == 1) + { + flw_ptr[0] = P_APPTRANS; + flw_ptr[1] = bicc_encode_app(flw_ptr+2, &anm_ptr->app); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(anm_ptr->backCall.pres == 1) + { + flw_ptr[0] = P_BACKCALLIND; + flw_ptr[1] = bicc_encode_backcall(flw_ptr+2, &anm_ptr->backCall); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(anm_ptr->confTreat.pres == 1) + { + flw_ptr[0] = P_CONFTREATIND; + flw_ptr[1] = bicc_encode_conftreat(flw_ptr+2, &anm_ptr->confTreat); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(anm_ptr->connNum.pres == 1) + { + flw_ptr[0] = P_CONNNUM; + flw_ptr[1] = bicc_encode_connnum(flw_ptr+2, &anm_ptr->connNum); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(anm_ptr->utuInd.pres == 1) + { + flw_ptr[0] = P_UTUIND; + flw_ptr[1] = bicc_encode_utuind(flw_ptr+2, &anm_ptr->utuInd); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(anm_ptr->utuInfo.pres == 1) + { + flw_ptr[0] = P_UTUINFO; + flw_ptr[1] = bicc_encode_utuinfo(flw_ptr+2, &anm_ptr->utuInfo); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_apm(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccApm_struct *apm_ptr = &msg_union[pid].apm; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_APM); + *(flw_ptr++) = M_APM; + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 0; + if(apm_ptr->app.pres == 1) + { + flw_ptr[0] = P_APPTRANS; + flw_ptr[1] = bicc_encode_app(flw_ptr+2, &apm_ptr->app); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_cpg(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccCpg_struct *cpg_ptr = &msg_union[pid].cpg; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_CPG); + *(flw_ptr++) = M_CPG; + flw_ptr += bicc_encode_eventinfo(flw_ptr, &cpg_ptr->eventInfo); + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 0; + if(cpg_ptr->app.pres == 1) + { + flw_ptr[0] = P_APPTRANS; + flw_ptr[1] = bicc_encode_app(flw_ptr+2, &cpg_ptr->app); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(cpg_ptr->backCall.pres == 1) + { + flw_ptr[0] = P_BACKCALLIND; + flw_ptr[1] = bicc_encode_backcall(flw_ptr+2, &cpg_ptr->backCall); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(cpg_ptr->calldiver.pres == 1) + { + flw_ptr[0] = P_CALLDIVERINFO; + flw_ptr[1] = bicc_encode_calldiverinfo(flw_ptr+2, &cpg_ptr->calldiver); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(cpg_ptr->cause.pres == 1) + { + flw_ptr[0] = P_CAUSEIND; + flw_ptr[1] = bicc_encode_cause(flw_ptr+2, &cpg_ptr->cause); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(cpg_ptr->confTreat.pres == 1) + { + flw_ptr[0] = P_CONFTREATIND; + flw_ptr[1] = bicc_encode_conftreat(flw_ptr+2, &cpg_ptr->confTreat); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(cpg_ptr->connNum.pres == 1) + { + flw_ptr[0] = P_CONNNUM; + flw_ptr[1] = bicc_encode_connnum(flw_ptr+2, &cpg_ptr->connNum); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(cpg_ptr->utuInd.pres == 1) + { + flw_ptr[0] = P_UTUIND; + flw_ptr[1] = bicc_encode_utuind(flw_ptr+2, &cpg_ptr->utuInd); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(cpg_ptr->utuInfo.pres == 1) + { + flw_ptr[0] = P_UTUINFO; + flw_ptr[1] = bicc_encode_utuinfo(flw_ptr+2, &cpg_ptr->utuInfo); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_cgb(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccCgb_struct *cgb_ptr = &msg_union[pid].cgb; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_CGB); + *(flw_ptr++) = M_CGB; + flw_ptr += bicc_encode_cicgrpspv(flw_ptr, &cgb_ptr->cicGrpSpv); + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 1; + flw_ptr[0] = bicc_encode_rangestatus(flw_ptr+1, &cgb_ptr->rangeStatus, 1); + flw_ptr += flw_ptr[0] + 1; + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_cgba(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccCgba_struct *cgba_ptr = &msg_union[pid].cgba; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_CGBA); + *(flw_ptr++) = M_CGBA; + flw_ptr += bicc_encode_cicgrpspv(flw_ptr, &cgba_ptr->cicGrpSpv); + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 1; + flw_ptr[0] = bicc_encode_rangestatus(flw_ptr+1, &cgba_ptr->rangeStatus, 1); + flw_ptr += flw_ptr[0] + 1; + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_cgu(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccCgu_struct *cgu_ptr = &msg_union[pid].cgu; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_CGU); + *(flw_ptr++) = M_CGU; + flw_ptr += bicc_encode_cicgrpspv(flw_ptr, &cgu_ptr->cicGrpSpv); + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 1; + flw_ptr[0] = bicc_encode_rangestatus(flw_ptr+1, &cgu_ptr->rangeStatus, 1); + flw_ptr += flw_ptr[0] + 1; + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_cgua(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccCgua_struct *cgua_ptr = &msg_union[pid].cgua; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_CGUA); + *(flw_ptr++) = M_CGUA; + flw_ptr += bicc_encode_cicgrpspv(flw_ptr, &cgua_ptr->cicGrpSpv); + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 1; + flw_ptr[0] = bicc_encode_rangestatus(flw_ptr+1, &cgua_ptr->rangeStatus, 1); + flw_ptr += flw_ptr[0] + 1; + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_grs(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccGrs_struct *grs_ptr = &msg_union[pid].grs; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_GRS); + *(flw_ptr++) = M_GRS; + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 1; + flw_ptr[0] = bicc_encode_rangestatus(flw_ptr+1, &grs_ptr->rangeStatus, 0); + flw_ptr += flw_ptr[0] + 1; + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_gra(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccGra_struct *gra_ptr = &msg_union[pid].gra; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_GRA); + *(flw_ptr++) = M_GRA; + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 1; + flw_ptr[0] = bicc_encode_rangestatus(flw_ptr+1, &gra_ptr->rangeStatus, 1); + flw_ptr += flw_ptr[0] + 1; + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_con(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccCon_struct *con_ptr = &msg_union[pid].con; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_CON); + *(flw_ptr++) = M_CON; + flw_ptr += bicc_encode_backcall(flw_ptr, &con_ptr->backCall); + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 0; + if(con_ptr->app.pres == 1) + { + flw_ptr[0] = P_APPTRANS; + flw_ptr[1] = bicc_encode_app(flw_ptr+2, &con_ptr->app); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(con_ptr->confTreat.pres == 1) + { + flw_ptr[0] = P_CONFTREATIND; + flw_ptr[1] = bicc_encode_conftreat(flw_ptr+2, &con_ptr->confTreat); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(con_ptr->connNum.pres == 1) + { + flw_ptr[0] = P_CONNNUM; + flw_ptr[1] = bicc_encode_connnum(flw_ptr+2, &con_ptr->connNum); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(con_ptr->utuInd.pres == 1) + { + flw_ptr[0] = P_UTUIND; + flw_ptr[1] = bicc_encode_utuind(flw_ptr+2, &con_ptr->utuInd); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(con_ptr->utuInfo.pres == 1) + { + flw_ptr[0] = P_UTUINFO; + flw_ptr[1] = bicc_encode_utuinfo(flw_ptr+2, &con_ptr->utuInfo); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_iam(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccIam_struct *iam_ptr = &msg_union[pid].iam; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + u8 opt_pointer; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_IAM); + *(flw_ptr++) = M_IAM; + flw_ptr += bicc_encode_natconn(flw_ptr, &iam_ptr->natConn); + flw_ptr += bicc_encode_fwdcall(flw_ptr, &iam_ptr->fwdCall); + flw_ptr += bicc_encode_callingptycat(flw_ptr, &iam_ptr->callingPtyCat); + flw_ptr += bicc_encode_transmedreq(flw_ptr, &iam_ptr->transMedReq); + pointer_ptr = flw_ptr; + flw_ptr += 2; + *(pointer_ptr++) = 2; + *pointer_ptr = 0; + flw_ptr[0] = bicc_encode_calledptynum(flw_ptr+1, &iam_ptr->calledPtyNum); + opt_pointer = flw_ptr[0] + 2; + flw_ptr += flw_ptr[0] + 1; + if(iam_ptr->app.pres == 1) + { + flw_ptr[0] = P_APPTRANS; + flw_ptr[1] = bicc_encode_app(flw_ptr+2, &iam_ptr->app); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(iam_ptr->callingPtyNum.pres == 1) + { + flw_ptr[0] = P_CALLINGPTYNUM; + flw_ptr[1] = bicc_encode_callingptynum(flw_ptr+2, &iam_ptr->callingPtyNum); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(iam_ptr->collectCallReq.pres == 1) + { + flw_ptr[0] = P_COLLECTCALLREQ; + flw_ptr[1] = bicc_encode_collectcallreq(flw_ptr+2, &iam_ptr->collectCallReq); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(iam_ptr->confTreat.pres == 1) + { + flw_ptr[0] = P_CONFTREATIND; + flw_ptr[1] = bicc_encode_conftreat(flw_ptr+2, &iam_ptr->confTreat); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(iam_ptr->correlationId.pres == 1) + { + flw_ptr[0] = P_CORRELATIONID; + flw_ptr[1] = bicc_encode_correlationid(flw_ptr+2, &iam_ptr->correlationId); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(iam_ptr->origCalledNum.pres == 1) + { + flw_ptr[0] = P_ORIGCALLEDNUM; + flw_ptr[1] = bicc_encode_origcallednum(flw_ptr+2, &iam_ptr->origCalledNum); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(iam_ptr->redirgNum.pres == 1) + { + flw_ptr[0] = P_REDIRGNUM; + flw_ptr[1] = bicc_encode_redirgnum(flw_ptr+2, &iam_ptr->redirgNum); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(iam_ptr->redirInfo.pres == 1) + { + flw_ptr[0] = P_REDIRINFO; + flw_ptr[1] = bicc_encode_redirinfo(flw_ptr+2, &iam_ptr->redirInfo); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(iam_ptr->scfId.pres == 1) + { + flw_ptr[0] = P_SCFID; + flw_ptr[1] = bicc_encode_scfid(flw_ptr+2, &iam_ptr->scfId); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(iam_ptr->utuInd.pres == 1) + { + flw_ptr[0] = P_UTUIND; + flw_ptr[1] = bicc_encode_utuind(flw_ptr+2, &iam_ptr->utuInd); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(iam_ptr->utuInfo.pres == 1) + { + flw_ptr[0] = P_UTUINFO; + flw_ptr[1] = bicc_encode_utuinfo(flw_ptr+2, &iam_ptr->utuInfo); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + + +void bicc_send_rel(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccRel_struct *rel_ptr = &msg_union[pid].rel; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + u8 opt_pointer; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_REL); + *(flw_ptr++) = M_REL; + pointer_ptr = flw_ptr; + flw_ptr += 2; + *(pointer_ptr++) = 2; + *pointer_ptr = 0; + flw_ptr[0] = bicc_encode_cause(flw_ptr+1, &rel_ptr->cause); + opt_pointer = flw_ptr[0] + 2; + flw_ptr += flw_ptr[0] + 1; + if(rel_ptr->utuInd.pres == 1) + { + flw_ptr[0] = P_UTUIND; + flw_ptr[1] = bicc_encode_utuind(flw_ptr+2, &rel_ptr->utuInd); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(rel_ptr->utuInfo.pres == 1) + { + flw_ptr[0] = P_UTUINFO; + flw_ptr[1] = bicc_encode_utuinfo(flw_ptr+2, &rel_ptr->utuInfo); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = opt_pointer; + } + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_rlc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccRlc_struct *rlc_ptr = &msg_union[pid].rlc; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_RLC); + *(flw_ptr++) = M_RLC; + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 0; + if(rlc_ptr->cause.pres == 1) + { + flw_ptr[0] = P_CAUSEIND; + flw_ptr[1] = bicc_encode_cause(flw_ptr+2, &rlc_ptr->cause); + flw_ptr += flw_ptr[1] + 2; + *pointer_ptr = 1; + } + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + + +void bicc_send_rsc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + + *(flw_ptr++) = M_RSC; + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_res(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccRes_struct *res_ptr = &msg_union[pid].res; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_RES); + *(flw_ptr++) = M_RES; + flw_ptr += bicc_encode_susres(flw_ptr, &res_ptr->susRes); + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 0; + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_sus(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccSus_struct *sus_ptr = &msg_union[pid].sus; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_SUS); + *(flw_ptr++) = M_SUS; + flw_ptr += bicc_encode_susres(flw_ptr, &sus_ptr->susRes); + pointer_ptr = flw_ptr; + flw_ptr++; + *pointer_ptr = 0; + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} + +void bicc_send_sam(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + BiccSam_struct *sam_ptr = &msg_union[pid].sam; + u8 *flw_ptr = port_ptr->s_mtp_msg.msgList; //message flow pointer + u8 *pointer_ptr; + + bicc_prm2msg(&msg_union[pid], &writePrim_union[pid], M_SAM); + *(flw_ptr++) = M_SAM; + pointer_ptr = flw_ptr; + flw_ptr += 2; + *(pointer_ptr++) = 2; + *pointer_ptr = 0; + flw_ptr[0] = bicc_encode_subseqnum(flw_ptr+1, &sam_ptr->subseqNum); + flw_ptr += flw_ptr[0] + 1; + if(*pointer_ptr != 0) + *(flw_ptr++) = 0; //End of optional parameters + port_ptr->s_mtp_msg.len = flw_ptr - port_ptr->s_mtp_msg.msgList; + BICC_msdc_proc(pid, &(port_ptr->s_mtp_msg)); +} diff --git a/omc/plat/bicc/src/bicc_prm.c b/omc/plat/bicc/src/bicc_prm.c new file mode 100644 index 0000000..1e1cb89 --- /dev/null +++ b/omc/plat/bicc/src/bicc_prm.c @@ -0,0 +1,244 @@ +#include "./include/inc.h" +#include "./include/var_ext.h" +#include "./include/q1902_3e.h" +/**********************************************/ +/******* BICC Message&Primitive Mapping *******/ +/**********************************************/ +void app_msg2prm(AppTransM_struct *dst_ptr, AppTrans_struct *src_ptr) +{ + dst_ptr->pres = src_ptr->pres; + if(src_ptr->pres == 1) + { + memcpy(&dst_ptr->apm_info, &src_ptr->apm_info, sizeof(ApmUser_struct)); + dst_ptr->apm_info.sni = src_ptr->sni; + dst_ptr->apm_info.rci = src_ptr->rci; + } +} + +void app_prm2msg(AppTrans_struct *dst_ptr, AppTransM_struct *src_ptr) +{ + dst_ptr->pres = src_ptr->pres; + if(src_ptr->pres == 1) + { + dst_ptr->aci[0] = 0x00; + dst_ptr->aci[1] = 0x00; + dst_ptr->sni = src_ptr->apm_info.sni; + dst_ptr->rci = src_ptr->apm_info.rci; + dst_ptr->si = 0; //subsequent segment to first segment + dst_ptr->segment = 0; //final segment + dst_ptr->slr = 0; + memcpy(&dst_ptr->apm_info, &src_ptr->apm_info, sizeof(ApmUser_struct)); + } +} + +void bicc_msg2prm(BiccReadPrim_union *prm_ptr, BiccMsg_union *msg_ptr, u8 msg_type) +{ + memset(prm_ptr, 0, sizeof(BiccReadPrim_union)); + switch(msg_type) + { + case M_ACM: + memcpy(&prm_ptr->alert_ind.backCall, &msg_ptr->acm.backCall, sizeof(BackCallInd_struct)); + app_msg2prm(&prm_ptr->alert_ind.app, &msg_ptr->acm.app); + memcpy(&prm_ptr->alert_ind.cause, &msg_ptr->acm.cause, sizeof(CauseInd_struct)); + memcpy(&prm_ptr->alert_ind.confTreat, &msg_ptr->acm.confTreat, sizeof(ConfTreatInd_struct)); + memcpy(&prm_ptr->alert_ind.optBackCall, &msg_ptr->acm.optBackCall, sizeof(OptBackCallInd_struct)); + memcpy(&prm_ptr->alert_ind.utuInd, &msg_ptr->acm.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&prm_ptr->alert_ind.utuInfo, &msg_ptr->acm.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_ANM: + app_msg2prm(&prm_ptr->setup_cnf.app, &msg_ptr->anm.app); + memcpy(&prm_ptr->setup_cnf.backCall, &msg_ptr->anm.backCall, sizeof(BackCallInd_struct)); + memcpy(&prm_ptr->setup_cnf.confTreat, &msg_ptr->anm.confTreat, sizeof(ConfTreatInd_struct)); + memcpy(&prm_ptr->setup_cnf.connNum, &msg_ptr->anm.connNum, sizeof(ConnNum_struct)); + memcpy(&prm_ptr->setup_cnf.utuInd, &msg_ptr->anm.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&prm_ptr->setup_cnf.utuInfo, &msg_ptr->anm.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_APM: + app_msg2prm(&prm_ptr->apm_ind.app, &msg_ptr->apm.app); + break; + case M_CPG: + memcpy(&prm_ptr->cpg_ind.eventInfo, &msg_ptr->cpg.eventInfo, sizeof(EventInfo_struct)); + app_msg2prm(&prm_ptr->cpg_ind.app, &msg_ptr->cpg.app); + memcpy(&prm_ptr->cpg_ind.backCall, &msg_ptr->cpg.backCall, sizeof(BackCallInd_struct)); + memcpy(&prm_ptr->cpg_ind.calldiver,&msg_ptr->cpg.calldiver, sizeof(BiccCpg_struct)); + memcpy(&prm_ptr->cpg_ind.cause, &msg_ptr->cpg.cause, sizeof(CauseInd_struct)); + memcpy(&prm_ptr->cpg_ind.confTreat, &msg_ptr->cpg.confTreat, sizeof(ConfTreatInd_struct)); + memcpy(&prm_ptr->cpg_ind.connNum, &msg_ptr->cpg.connNum, sizeof(ConnNum_struct)); + memcpy(&prm_ptr->cpg_ind.utuInd, &msg_ptr->cpg.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&prm_ptr->cpg_ind.utuInfo, &msg_ptr->cpg.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_CGB: + memcpy(&prm_ptr->cgb_ind.cicGrpSpv, &msg_ptr->cgb.cicGrpSpv, sizeof(CicGrpSpv_struct)); + memcpy(&prm_ptr->cgb_ind.rangeStatus, &msg_ptr->cgb.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_CGBA: + memcpy(&prm_ptr->cgb_cnf.cicGrpSpv, &msg_ptr->cgb.cicGrpSpv, sizeof(CicGrpSpv_struct)); + memcpy(&prm_ptr->cgb_cnf.rangeStatus, &msg_ptr->cgb.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_CGU: + memcpy(&prm_ptr->cgu_ind.cicGrpSpv, &msg_ptr->cgu.cicGrpSpv, sizeof(CicGrpSpv_struct)); + memcpy(&prm_ptr->cgu_ind.rangeStatus, &msg_ptr->cgu.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_CGUA: + memcpy(&prm_ptr->cgu_cnf.cicGrpSpv, &msg_ptr->cgu.cicGrpSpv, sizeof(CicGrpSpv_struct)); + memcpy(&prm_ptr->cgu_cnf.rangeStatus, &msg_ptr->cgu.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_GRS: + memcpy(&prm_ptr->grs_ind.rangeStatus, &msg_ptr->grs.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_GRA: + memcpy(&prm_ptr->grs_cnf.rangeStatus, &msg_ptr->grs.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_CON: + app_msg2prm(&prm_ptr->setup_cnf.app, &msg_ptr->con.app); + memcpy(&prm_ptr->setup_cnf.backCall, &msg_ptr->con.backCall, sizeof(BackCallInd_struct)); + memcpy(&prm_ptr->setup_cnf.confTreat, &msg_ptr->con.confTreat, sizeof(ConfTreatInd_struct)); + memcpy(&prm_ptr->setup_cnf.connNum, &msg_ptr->con.connNum, sizeof(ConnNum_struct)); + memcpy(&prm_ptr->setup_cnf.utuInd, &msg_ptr->con.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&prm_ptr->setup_cnf.utuInfo, &msg_ptr->con.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_IAM: + memcpy(&prm_ptr->setup_ind.natConn, &msg_ptr->iam.natConn, sizeof(NatConnInd_struct)); + memcpy(&prm_ptr->setup_ind.fwdCall, &msg_ptr->iam.fwdCall, sizeof(FwdCallInd_struct)); + memcpy(&prm_ptr->setup_ind.callingPtyCat, &msg_ptr->iam.callingPtyCat, sizeof(CallingPtyCat_struct)); + memcpy(&prm_ptr->setup_ind.transMedReq, &msg_ptr->iam.transMedReq, sizeof(TransMedReq_struct)); + memcpy(&prm_ptr->setup_ind.calledPtyNum, &msg_ptr->iam.calledPtyNum, sizeof(CalledPtyNum_struct)); + app_msg2prm(&prm_ptr->setup_ind.app, &msg_ptr->apm.app); + memcpy(&prm_ptr->setup_ind.callingPtyNum, &msg_ptr->iam.callingPtyNum, sizeof(CallingPtyNum_struct)); + memcpy(&prm_ptr->setup_ind.collectCallReq, &msg_ptr->iam.collectCallReq, sizeof(CollectCallReq_struct)); + memcpy(&prm_ptr->setup_ind.confTreat, &msg_ptr->iam.confTreat, sizeof(ConfTreatInd_struct)); + memcpy(&prm_ptr->setup_ind.correlationId, &msg_ptr->iam.correlationId, sizeof(CorrelationId_struct)); + memcpy(&prm_ptr->setup_ind.origCalledNum, &msg_ptr->iam.origCalledNum, sizeof(OrigCalledNum_struct)); + memcpy(&prm_ptr->setup_ind.redirgNum, &msg_ptr->iam.redirgNum, sizeof(RedirgNum_struct)); + memcpy(&prm_ptr->setup_ind.redirInfo, &msg_ptr->iam.redirInfo, sizeof(RedirInfo_struct)); + memcpy(&prm_ptr->setup_ind.scfId, &msg_ptr->iam.scfId, sizeof(ScfId_struct)); + memcpy(&prm_ptr->setup_ind.utuInd, &msg_ptr->iam.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&prm_ptr->setup_ind.utuInfo, &msg_ptr->iam.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_REL: + memcpy(&prm_ptr->rel_ind.cause, &msg_ptr->rel.cause, sizeof(CauseInd_struct)); + memcpy(&prm_ptr->rel_ind.utuInd, &msg_ptr->rel.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&prm_ptr->rel_ind.utuInfo, &msg_ptr->rel.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_RLC: + memcpy(&prm_ptr->rel_cnf.cause, &msg_ptr->rlc.cause, sizeof(CauseInd_struct)); + break; + case M_RES: + memcpy(&prm_ptr->res_ind.susRes, &msg_ptr->res.susRes, sizeof(SusResInd_struct)); + break; + case M_SUS: + memcpy(&prm_ptr->sus_ind.susRes, &msg_ptr->sus.susRes, sizeof(SusResInd_struct)); + break; + case M_SAM: + memcpy(&prm_ptr->info_ind.subseqNum, &msg_ptr->sam.subseqNum, sizeof(SubseqNum_struct)); + break; + default: + break; + } +} + +void bicc_prm2msg(BiccMsg_union *msg_ptr, BiccWritePrim_union *prm_ptr, u8 msg_type) +{ + memset(msg_ptr, 0, sizeof(BiccMsg_union)); + switch(msg_type) + { + case M_ACM: + memcpy(&msg_ptr->acm.backCall, &prm_ptr->alert_req.backCall, sizeof(BackCallInd_struct)); + app_prm2msg(&msg_ptr->acm.app, &prm_ptr->alert_req.app); + memcpy(&msg_ptr->acm.cause, &prm_ptr->alert_req.cause, sizeof(CauseInd_struct)); + memcpy(&msg_ptr->acm.confTreat, &prm_ptr->alert_req.confTreat, sizeof(ConfTreatInd_struct)); + memcpy(&msg_ptr->acm.optBackCall, &prm_ptr->alert_req.optBackCall, sizeof(OptBackCallInd_struct)); + memcpy(&msg_ptr->acm.utuInd, &prm_ptr->alert_req.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&msg_ptr->acm.utuInfo, &prm_ptr->alert_req.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_ANM: + app_prm2msg(&msg_ptr->anm.app, &prm_ptr->setup_rsp.app); + memcpy(&msg_ptr->anm.backCall, &prm_ptr->setup_rsp.backCall, sizeof(BackCallInd_struct)); + memcpy(&msg_ptr->anm.confTreat, &prm_ptr->setup_rsp.confTreat, sizeof(ConfTreatInd_struct)); + memcpy(&msg_ptr->anm.connNum, &prm_ptr->setup_rsp.connNum, sizeof(ConnNum_struct)); + memcpy(&msg_ptr->anm.utuInd, &prm_ptr->setup_rsp.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&msg_ptr->anm.utuInfo, &prm_ptr->setup_rsp.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_APM: + app_prm2msg(&msg_ptr->apm.app, &prm_ptr->apm_req.app); + break; + case M_CPG: + memcpy(&msg_ptr->cpg.eventInfo, &prm_ptr->cpg_req.eventInfo, sizeof(EventInfo_struct)); + app_prm2msg(&msg_ptr->cpg.app, &prm_ptr->cpg_req.app); + memcpy(&msg_ptr->cpg.backCall, &prm_ptr->cpg_req.backCall, sizeof(BackCallInd_struct)); + memcpy(&msg_ptr->cpg.calldiver, &prm_ptr->cpg_req.calldiver, sizeof(BiccCpg_struct)); + memcpy(&msg_ptr->cpg.cause, &prm_ptr->cpg_req.cause, sizeof(CauseInd_struct)); + memcpy(&msg_ptr->cpg.confTreat, &prm_ptr->cpg_req.confTreat, sizeof(ConfTreatInd_struct)); + memcpy(&msg_ptr->cpg.connNum, &prm_ptr->cpg_req.connNum, sizeof(ConnNum_struct)); + memcpy(&msg_ptr->cpg.utuInd, &prm_ptr->cpg_req.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&msg_ptr->cpg.utuInfo, &prm_ptr->cpg_req.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_CGB: + memcpy(&msg_ptr->cgb.cicGrpSpv, &prm_ptr->cgb_req.cicGrpSpv, sizeof(CicGrpSpv_struct)); + memcpy(&msg_ptr->cgb.rangeStatus, &prm_ptr->cgb_req.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_CGBA: + memcpy(&msg_ptr->cgb.cicGrpSpv, &prm_ptr->cgb_rsp.cicGrpSpv, sizeof(CicGrpSpv_struct)); + memcpy(&msg_ptr->cgb.rangeStatus, &prm_ptr->cgb_rsp.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_CGU: + memcpy(&msg_ptr->cgu.cicGrpSpv, &prm_ptr->cgu_req.cicGrpSpv, sizeof(CicGrpSpv_struct)); + memcpy(&msg_ptr->cgu.rangeStatus, &prm_ptr->cgu_req.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_CGUA: + memcpy(&msg_ptr->cgu.cicGrpSpv, &prm_ptr->cgu_rsp.cicGrpSpv, sizeof(CicGrpSpv_struct)); + memcpy(&msg_ptr->cgu.rangeStatus, &prm_ptr->cgu_rsp.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_GRS: + memcpy(&msg_ptr->grs.rangeStatus, &prm_ptr->grs_req.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_GRA: + memcpy(&msg_ptr->grs.rangeStatus, &prm_ptr->grs_rsp.rangeStatus, sizeof(RangeStatus_struct)); + break; + case M_CON: + app_prm2msg(&msg_ptr->con.app, &prm_ptr->setup_rsp.app); + memcpy(&msg_ptr->con.backCall, &prm_ptr->setup_rsp.backCall, sizeof(BackCallInd_struct)); + memcpy(&msg_ptr->con.confTreat, &prm_ptr->setup_rsp.confTreat, sizeof(ConfTreatInd_struct)); + memcpy(&msg_ptr->con.connNum, &prm_ptr->setup_rsp.connNum, sizeof(ConnNum_struct)); + memcpy(&msg_ptr->con.utuInd, &prm_ptr->setup_rsp.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&msg_ptr->con.utuInfo, &prm_ptr->setup_rsp.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_IAM: + memcpy(&msg_ptr->iam.natConn, &prm_ptr->setup_req.natConn, sizeof(NatConnInd_struct)); + memcpy(&msg_ptr->iam.fwdCall, &prm_ptr->setup_req.fwdCall, sizeof(FwdCallInd_struct)); + memcpy(&msg_ptr->iam.callingPtyCat, &prm_ptr->setup_req.callingPtyCat, sizeof(CallingPtyCat_struct)); + memcpy(&msg_ptr->iam.transMedReq, &prm_ptr->setup_req.transMedReq, sizeof(TransMedReq_struct)); + memcpy(&msg_ptr->iam.calledPtyNum, &prm_ptr->setup_req.calledPtyNum, sizeof(CalledPtyNum_struct)); + app_prm2msg(&msg_ptr->iam.app, &prm_ptr->setup_req.app); + memcpy(&msg_ptr->iam.callingPtyNum, &prm_ptr->setup_req.callingPtyNum, sizeof(CallingPtyNum_struct)); + memcpy(&msg_ptr->iam.collectCallReq, &prm_ptr->setup_req.collectCallReq, sizeof(CollectCallReq_struct)); + memcpy(&msg_ptr->iam.confTreat, &prm_ptr->setup_req.confTreat, sizeof(ConfTreatInd_struct)); + memcpy(&msg_ptr->iam.correlationId, &prm_ptr->setup_req.correlationId, sizeof(CorrelationId_struct)); + memcpy(&msg_ptr->iam.origCalledNum, &prm_ptr->setup_req.origCalledNum, sizeof(OrigCalledNum_struct)); + memcpy(&msg_ptr->iam.redirgNum, &prm_ptr->setup_req.redirgNum, sizeof(RedirgNum_struct)); + memcpy(&msg_ptr->iam.redirInfo, &prm_ptr->setup_req.redirInfo, sizeof(RedirInfo_struct)); + memcpy(&msg_ptr->iam.scfId, &prm_ptr->setup_req.scfId, sizeof(ScfId_struct)); + memcpy(&msg_ptr->iam.utuInd, &prm_ptr->setup_req.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&msg_ptr->iam.utuInfo, &prm_ptr->setup_req.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_REL: + memcpy(&msg_ptr->rel.cause, &prm_ptr->rel_req.cause, sizeof(CauseInd_struct)); + memcpy(&msg_ptr->rel.utuInd, &prm_ptr->rel_req.utuInd, sizeof(UserToUserInd_struct)); + memcpy(&msg_ptr->rel.utuInfo, &prm_ptr->rel_req.utuInfo, sizeof(UserToUserInfo_struct)); + break; + case M_RLC: + memcpy(&msg_ptr->rlc.cause, &prm_ptr->rel_rsp.cause, sizeof(CauseInd_struct)); + break; + case M_RES: + memcpy(&msg_ptr->res.susRes, &prm_ptr->res_req.susRes, sizeof(SusResInd_struct)); + break; + case M_SUS: + memcpy(&msg_ptr->sus.susRes, &prm_ptr->sus_req.susRes, sizeof(SusResInd_struct)); + break; + case M_SAM: + memcpy(&msg_ptr->sam.subseqNum, &prm_ptr->info_req.subseqNum, sizeof(SubseqNum_struct)); + break; + default: + break; + } +} diff --git a/omc/plat/bicc/src/biccif.c b/omc/plat/bicc/src/biccif.c new file mode 100644 index 0000000..aaef225 --- /dev/null +++ b/omc/plat/bicc/src/biccif.c @@ -0,0 +1,1080 @@ +#include "./include/inc.h" +#include "./include/var_ext.h" +#include "../../public/src/include/license_id.h" + +BiccReadPrim_union readPrim_union[BICC_MAX_PORT]; +BiccWritePrim_union writePrim_union[BICC_MAX_PORT]; +u8 Bicc_Version[4] = BICC_VERSION; +u8 local_platid=0; +extern BiccData_struct Bicc_Data; +BiccTimer_struct Timer_Data; +up_message_2 r_mtp_msg; //message receive from mtp3 +extern BiccMsg_union msg_union[BICC_MAX_PORT]; + +//void bicc_cpio_proc(u32 pid); +int check_outbound_route(BYTE nw, long dpc, BYTE sls); +extern BOOL bicc_event_handle(u32 pid, const BiccReadPrim_union *prm_ptr, u8 primitive, u8 eventType); +extern void bicc_cpci_proc(u32 pid); +extern void bicc_cpco_proc(u32 pid); +extern void bicc_mgbs_proc(u32 pid); +extern void bicc_mgbr_proc(u32 pid); +extern void bicc_crs_proc(u32 pid); +extern BOOL check_crs_waiting(u32 pid); +extern void bicc_crr_proc(u32 pid); +extern void bicc_cgrs_proc(u32 pid); +extern void bicc_cgrr_proc(u32 pid); +extern void bicc_circuit_reset(u32 pid, const char *s); +extern void bicc_decode_backcall(BackCallInd_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_app(AppTrans_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_calledptynum(CalledPtyNum_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_callingptynum(CallingPtyNum_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_callingptycat(CallingPtyCat_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_cause(CauseInd_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_cicgrpspv(CicGrpSpv_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_collectcallreq(CollectCallReq_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_conftreat(ConfTreatInd_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_connnum(ConnNum_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_genericnumber(GenericNumber_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_genericDigits(GenericDigits_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_correlationid(CorrelationId_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_fwdcall(FwdCallInd_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_natconn(NatConnInd_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_origcallednum(OrigCalledNum_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_utuind(UserToUserInd_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_utuinfo(UserToUserInfo_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_eventinfo(EventInfo_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_rangestatus(RangeStatus_struct *ptr, const u8 *flw_ptr, u8 length, u8 need_status); +extern void bicc_decode_transmedreq(TransMedReq_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_redirgnum(RedirgNum_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_redirinfo(RedirInfo_struct *ptr, u8 *flw_ptr, u8 length); +extern void bicc_decode_scfid(ScfId_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_susres(SusResInd_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_subseqnum(SubseqNum_struct *ptr, const u8 *flw_ptr, u8 length); +extern void bicc_decode_calldiverinfo(CallDiverInfo_struct *ptr, const u8 *flw_ptr); +extern void bicc_decode_optBackCallInd(OptBackCallInd_struct *ptr, const u8 *flw_ptr); +extern void bicc_msg2prm(BiccReadPrim_union *prm_ptr, BiccMsg_union *msg_ptr, u8 msg_type); +extern void bicc_log_err(const char *fmt, ...); +extern void bicc_send_apm(u32 pid); + +int BICC_active_dmp(u8 plat_id, u32 alter_id) +{ + if(plat_id >= 2) + return 0; + Bicc_Data.dmp_data.active = 1; + Bicc_Data.dmp_data.processor_id = local_platid; + Bicc_Data.dmp_data.remote_ip = alter_id; + return BICC_CM_OK; +} + +int BICC_deactive_dmp() +{ + Bicc_Data.dmp_data.active = 0; + Bicc_Data.dmp_data.remote_ip = 0; + Bicc_Data.dmp_data.processor_id = local_platid; + return BICC_CM_OK; +} + +void bicc_transmit_func(u32 remote_ip, up_message_2 *upmsg_ptr) //transmit message to remote ip +{ + upmsg_ptr->dest_ip = remote_ip; + //bicc_to_mtp3(upmsg_ptr); + bicc_redirect(upmsg_ptr); +} + +int getPidByCic(u32 *pid, u32 cg_id, u32 cic) +{ + const pal_circuit_struct *pcircuit = NULL; + if((pcircuit = pal_locate_circuit(cg_id, cic)) != NULL) + { + *pid = (pcircuit->id)*BICC_CIRCUIT_CIC + (cic - pcircuit->attrib.head_cic); + return 1; + } + bicc_log_err("can not get port by cic %d, cg %d [%s]\n", cic,cg_id,__FUNCTION__); + return 0; +} + +static int find_port_by_cic(u8 ni, u32 dpc, u32 opc, u32 cic_val, u32* pid) +{ + const pal_circuit_struct *pcircuit = NULL; + if((pcircuit = pal_ss7_find_circuit(ni, opc, dpc, cic_val)) != NULL) + { + *pid = pcircuit->id*BICC_CIRCUIT_CIC + (cic_val - pcircuit->attrib.head_cic); + return 1; + } + bicc_log_err("can not find port by cic %d dpc %d opc %d ni %d [%s]\n",cic_val,opc,dpc,ni,__FUNCTION__); + return 0; +} + + + +int BICC_mdsc_proc() //get the message form Lower Layer +{ + u32 sap_id, cg_id, circuit_id; + u32 cic_val; + u32 pid; + u8 *flw_ptr; //message flow pointer + u8 msg_type; + BICC_Port_struct *port_ptr; + BiccMsg_union *msg_ptr; + BiccDmp_struct *dmp_ptr = &Bicc_Data.dmp_data; + const pal_circuit_struct *pcircuit = NULL; + const pal_cg_struct *pcg = NULL; + if(bicc_GetMsg(&r_mtp_msg) == 0) + return 0; + + + cic_val = (r_mtp_msg.cic[3]<<24) + (r_mtp_msg.cic[2]<<16) + (r_mtp_msg.cic[1]<<8) + r_mtp_msg.cic[0]; + + if(!find_port_by_cic(r_mtp_msg.sio>>6, r_mtp_msg.dpc, r_mtp_msg.opc, cic_val, &pid)) + return 0; + circuit_id = pid / BICC_CIRCUIT_CIC; + pcircuit = pal_circuit_ptr(circuit_id); + if((dmp_ptr->active == 1) && (pcircuit != NULL) && (pcircuit->attrib.plat_id != dmp_ptr->processor_id)) + { + bicc_transmit_func(dmp_ptr->remote_ip, &r_mtp_msg); + monitor_bicc_msg(r_mtp_msg.msgList, r_mtp_msg.len, 2, cic_val,pid); + return 1 ; + } + cg_id = pcircuit->cg_id; + pcg = pal_cg_ptr(cg_id); + if(pcg == NULL && pcg->enable == 0) + return 0; + sap_id = pcg->sap_id; + port_ptr = &Bicc_Data.port_data[pid]; + flw_ptr = r_mtp_msg.msgList; + msg_type = *(flw_ptr++); + msg_ptr = &msg_union[pid]; + memset(msg_ptr, 0, sizeof(BiccMsg_union)); + + monitor_bicc_msg(r_mtp_msg.msgList, r_mtp_msg.len, 0, cic_val, pid); + switch(msg_type) + { + case M_ACM: + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + { + bicc_circuit_reset(pid, "recv acm at idle"); + break; + } + port_ptr->sprc_cmd = M_ACM; + bicc_decode_backcall(&msg_ptr->acm.backCall, flw_ptr); + flw_ptr += 2; + if(*flw_ptr == 0) + break; + flw_ptr += *flw_ptr; + while(flw_ptr+flw_ptr[1]+2-r_mtp_msg.msgList <= r_mtp_msg.len) + { + if(*flw_ptr == 0) //end of option parameter + break; + switch(*flw_ptr) + { + case P_APPTRANS: + bicc_decode_app(&msg_ptr->acm.app, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CAUSEIND: + bicc_decode_cause(&msg_ptr->acm.cause, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CONFTREATIND: + bicc_decode_conftreat(&msg_ptr->acm.confTreat, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_OPTBACKCALLIND: + bicc_decode_optBackCallInd(&msg_ptr->acm.optBackCall,flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUIND: + bicc_decode_utuind(&msg_ptr->acm.utuInd, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUINFO: + bicc_decode_utuinfo(&msg_ptr->acm.utuInfo, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + flw_ptr += flw_ptr[1] + 2; + break; + } + } + bicc_cpco_proc(pid); + break; + case M_ANM: + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + { + bicc_circuit_reset(pid, "recv anm at idle"); + break; + } + port_ptr->sprc_cmd = M_ANM; + if(*flw_ptr == 0) + break; + flw_ptr += *flw_ptr; + while(flw_ptr+flw_ptr[1]+2-r_mtp_msg.msgList <= r_mtp_msg.len) + { + if(*flw_ptr == 0) //end of option parameter + break; + switch(*flw_ptr) + { + case P_APPTRANS: + bicc_decode_app(&msg_ptr->anm.app, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_BACKCALLIND: + bicc_decode_backcall(&msg_ptr->anm.backCall, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CONFTREATIND: + bicc_decode_conftreat(&msg_ptr->anm.confTreat, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CONNNUM: + bicc_decode_connnum(&msg_ptr->anm.connNum, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUIND: + bicc_decode_utuind(&msg_ptr->anm.utuInd, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUINFO: + bicc_decode_utuinfo(&msg_ptr->anm.utuInfo, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + flw_ptr += flw_ptr[1] + 2; + break; + } + } + break; + case M_APM: // APM is not sent to CPC, event handle function is called directly + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + { + bicc_circuit_reset(pid, "recv apm at idle"); + return 0; + } + if(*flw_ptr == 0) + break; + flw_ptr += *flw_ptr; + while(flw_ptr+flw_ptr[1]+2-r_mtp_msg.msgList <= r_mtp_msg.len) + { + if(*flw_ptr == 0) //end of option parameter + break; + switch(*flw_ptr) + { + case P_APPTRANS: + bicc_decode_app(&msg_ptr->apm.app, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + flw_ptr += flw_ptr[1] + 2; + break; + } + } + break; + case M_CPG: + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + { + bicc_circuit_reset(pid, "recv cpg at idle"); + break; + } + port_ptr->sprc_cmd = M_CPG; + bicc_decode_eventinfo(&msg_ptr->cpg.eventInfo, flw_ptr); + flw_ptr += 1; + if(*flw_ptr == 0) + break; + flw_ptr += *flw_ptr; + while(flw_ptr+flw_ptr[1]+2-r_mtp_msg.msgList <= r_mtp_msg.len) + { + if(*flw_ptr == 0) //end of option parameter + break; + switch(*flw_ptr) + { + case P_APPTRANS: + bicc_decode_app(&msg_ptr->cpg.app, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_BACKCALLIND: + bicc_decode_backcall(&msg_ptr->cpg.backCall, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CAUSEIND: + bicc_decode_cause(&msg_ptr->cpg.cause, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CONFTREATIND: + bicc_decode_conftreat(&msg_ptr->cpg.confTreat, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CONNNUM: + bicc_decode_connnum(&msg_ptr->cpg.connNum, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUIND: + bicc_decode_utuind(&msg_ptr->cpg.utuInd, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUINFO: + bicc_decode_utuinfo(&msg_ptr->cpg.utuInfo, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CALLDIVERINFO: + bicc_decode_calldiverinfo(&msg_ptr->cpg.calldiver, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + default: + flw_ptr += flw_ptr[1] + 2; + break; + } + } + break; + case M_CGB: + port_ptr->sprc_cmd = M_CGB; + bicc_decode_cicgrpspv(&msg_ptr->cgb.cicGrpSpv, flw_ptr); + flw_ptr += 1; + bicc_decode_rangestatus(&msg_ptr->cgb.rangeStatus, flw_ptr+*flw_ptr+1, *(flw_ptr + *flw_ptr), 1); + break; + case M_CGBA: + port_ptr->sprc_cmd = M_CGBA; + bicc_decode_cicgrpspv(&msg_ptr->cgba.cicGrpSpv, flw_ptr); + flw_ptr += 1; + bicc_decode_rangestatus(&msg_ptr->cgba.rangeStatus, flw_ptr+*flw_ptr+1, *(flw_ptr + *flw_ptr), 1); + break; + case M_CGU: + port_ptr->sprc_cmd = M_CGU; + bicc_decode_cicgrpspv(&msg_ptr->cgu.cicGrpSpv, flw_ptr); + flw_ptr += 1; + bicc_decode_rangestatus(&msg_ptr->cgu.rangeStatus, flw_ptr+*flw_ptr+1, *(flw_ptr + *flw_ptr), 1); + break; + case M_CGUA: + port_ptr->sprc_cmd = M_CGUA; + bicc_decode_cicgrpspv(&msg_ptr->cgua.cicGrpSpv, flw_ptr); + flw_ptr += 1; + bicc_decode_rangestatus(&msg_ptr->cgua.rangeStatus, flw_ptr+*flw_ptr+1, *(flw_ptr + *flw_ptr), 1); + break; + case M_GRS: + port_ptr->sprc_cmd = M_GRS; + bicc_decode_rangestatus(&msg_ptr->grs.rangeStatus, flw_ptr+*flw_ptr+1, *(flw_ptr + *flw_ptr), 0); + break; + case M_GRA: + port_ptr->sprc_cmd = M_GRA; + bicc_decode_rangestatus(&msg_ptr->gra.rangeStatus, flw_ptr+*flw_ptr+1, *(flw_ptr + *flw_ptr), 1); + break; + case M_CON: + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + { + bicc_circuit_reset(pid, "recv con at idle"); + break; + } + port_ptr->sprc_cmd = M_CON; + bicc_decode_backcall(&msg_ptr->con.backCall, flw_ptr); + flw_ptr += 2; + if(*flw_ptr == 0) + break; + flw_ptr += *flw_ptr; + while(flw_ptr+flw_ptr[1]+2-r_mtp_msg.msgList <= r_mtp_msg.len) + { + if(*flw_ptr == 0) //end of option parameter + break; + switch(*flw_ptr) + { + case P_APPTRANS: + bicc_decode_app(&msg_ptr->con.app, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CONFTREATIND: + bicc_decode_conftreat(&msg_ptr->con.confTreat, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CONNNUM: + bicc_decode_connnum(&msg_ptr->con.connNum, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUIND: + bicc_decode_utuind(&msg_ptr->con.utuInd, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUINFO: + bicc_decode_utuinfo(&msg_ptr->con.utuInfo, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + flw_ptr += flw_ptr[1] + 2; + break; + } + } + break; + case M_IAM: +#ifdef BICC_REATTEMPT + if(port_ptr->cic_state.call_state == BICC_INCOMING) + return 0; +#else + if(port_ptr->cic_state.call_state != BICC_CIC_IDLE) + return 0; +#endif + if(port_ptr->cic_state.call_state == BICC_TYPE_OUTGOING) + { + bicc_circuit_reset(pid, "recv iam at outgoing cic"); + break; + } +#ifdef BICC_REATTEMPT + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + { + port_ptr->cic_state.call_state = BICC_INCOMING; // mark the cic + } +#else + port_ptr->cic_state.call_state = BICC_INCOMING; // mark the cic +#endif + port_ptr->sprc_cmd = M_IAM; + bicc_decode_natconn(&msg_ptr->iam.natConn, flw_ptr); + flw_ptr += 1; + bicc_decode_fwdcall(&msg_ptr->iam.fwdCall, flw_ptr); + flw_ptr += 2; + bicc_decode_callingptycat(&msg_ptr->iam.callingPtyCat, flw_ptr); + flw_ptr += 1; + bicc_decode_transmedreq(&msg_ptr->iam.transMedReq, flw_ptr); + flw_ptr += 1; + bicc_decode_calledptynum(&msg_ptr->iam.calledPtyNum, flw_ptr+*flw_ptr+1, *(flw_ptr + *flw_ptr)); + flw_ptr++; + if(*flw_ptr == 0) + break; + flw_ptr += *flw_ptr; + while(flw_ptr+flw_ptr[1]+2-r_mtp_msg.msgList <= r_mtp_msg.len) + { + if(*flw_ptr == 0) //end of option parameter + break; + switch(*flw_ptr) + { + case P_APPTRANS: + bicc_decode_app(&msg_ptr->iam.app, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CALLINGPTYNUM: + bicc_decode_callingptynum(&msg_ptr->iam.callingPtyNum, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_COLLECTCALLREQ: + bicc_decode_collectcallreq(&msg_ptr->iam.collectCallReq, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CONFTREATIND: + bicc_decode_conftreat(&msg_ptr->iam.confTreat, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_CORRELATIONID: + bicc_decode_correlationid(&msg_ptr->iam.correlationId, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_ORIGCALLEDNUM: + bicc_decode_origcallednum(&msg_ptr->iam.origCalledNum, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_REDIRGNUM: + bicc_decode_redirgnum(&msg_ptr->iam.redirgNum, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_REDIRINFO: + bicc_decode_redirinfo(&msg_ptr->iam.redirInfo, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_SCFID: + bicc_decode_scfid(&msg_ptr->iam.scfId, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUIND: + bicc_decode_utuind(&msg_ptr->iam.utuInd, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUINFO: + bicc_decode_utuinfo(&msg_ptr->iam.utuInfo, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + flw_ptr += flw_ptr[1] + 2; + break; + } + } + break; + case M_REL: + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + port_ptr->cic_state.call_state = BICC_INCOMING; + port_ptr->sprc_cmd = M_REL; + bicc_decode_cause(&msg_ptr->rel.cause, flw_ptr+*flw_ptr+1, *(flw_ptr + *flw_ptr)); + flw_ptr++; + if(*flw_ptr == 0) + break; + flw_ptr += *flw_ptr; + while(flw_ptr+flw_ptr[1]+2-r_mtp_msg.msgList <= r_mtp_msg.len) + { + if(*flw_ptr == 0) //end of option parameter + break; + switch(*flw_ptr) + { + case P_UTUIND: + bicc_decode_utuind(&msg_ptr->iam.utuInd, flw_ptr+2); + flw_ptr += flw_ptr[1] + 2; + break; + case P_UTUINFO: + bicc_decode_utuinfo(&msg_ptr->iam.utuInfo, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + flw_ptr += flw_ptr[1] + 2; + break; + } + } + break; + case M_RLC: + // if(Bicc_Data.port_data[pid].used_flag == 0) + // return 0; + if(check_crs_waiting(pid)) + port_ptr->sprc_cmd = M_RLC; + else + { + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + // port_ptr->cic_state.call_state = BICC_INCOMING; + break; + port_ptr->sprc_cmd = M_RLC; + } + if(*flw_ptr == 0) + break; + flw_ptr += *flw_ptr; + while(flw_ptr+flw_ptr[1]+2-r_mtp_msg.msgList <= r_mtp_msg.len) + { + if(*flw_ptr == 0) //end of option parameter + break; + switch(*flw_ptr) + { + case P_CAUSEIND: + bicc_decode_cause(&msg_ptr->rlc.cause, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + flw_ptr += flw_ptr[1] + 2; + break; + } + } + break; + case M_RSC: + port_ptr->sprc_cmd = M_RSC; + break; + case M_RES: + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + { + bicc_circuit_reset(pid, "recv res at idle"); + break; + } + port_ptr->sprc_cmd = M_RES; + bicc_decode_susres(&msg_ptr->res.susRes, flw_ptr); + break; + case M_SUS: + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + { + bicc_circuit_reset(pid, "recv sus at idle"); + break; + } + port_ptr->sprc_cmd = M_SUS; + bicc_decode_susres(&msg_ptr->sus.susRes, flw_ptr); + break; + case M_SAM: + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + { + bicc_circuit_reset(pid, "recv sam at idle"); + break; + } + port_ptr->sprc_cmd = M_SAM; + if(*flw_ptr == 0) + break; + flw_ptr += *flw_ptr; + while(flw_ptr+flw_ptr[1]+2-r_mtp_msg.msgList <= r_mtp_msg.len) + { + if(*flw_ptr == 0) //end of option parameter + break; + switch(*flw_ptr) + { + case P_SUBSEQNUM: + bicc_decode_subseqnum(&msg_ptr->sam.subseqNum, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + flw_ptr += flw_ptr[1] + 2; + break; + } + } + break; + default: //unknow message type + break; + } + bicc_msg2prm(&readPrim_union[pid], &msg_union[pid], msg_type); + if(msg_type == M_GRS) + bicc_cgrr_proc(pid); + if(msg_type == M_GRA) + bicc_cgrs_proc(pid); + if(msg_type == M_APM) + bicc_event_handle(pid, &readPrim_union[pid], BICC_APM_IND, EN_NONE); + if(msg_type == M_IAM) + { + bicc_cpci_proc(pid); + Bicc_Data.port_data[pid].used_flag = 1; + } + return 1; + +} + +void BICC_msdc_proc(u32 pid, up_message_2 * upmsg_ptr) //send the message to Lower Layer +{ + u32 cg_id, circuit_id; + u32 cic_val; + const pal_circuit_struct *pcircuit = NULL; + const pal_cg_struct *pcg = NULL; + + circuit_id = pid / BICC_CIRCUIT_CIC; + pcircuit = pal_circuit_ptr(circuit_id); + if(pcircuit != NULL) + cg_id = pcircuit->cg_id; + pcg = pal_cg_ptr(cg_id); + if(pcg == NULL) + return; + if((cic_val = pcircuit->attrib.head_cic+ pid % BICC_CIRCUIT_CIC) > + (pcircuit->attrib.head_cic + pcircuit->attrib.cic_range)) + { + bicc_log_err("No cic corresponds to pid.\n"); + return; + } + + + upmsg_ptr->dest_ip = 0xffffffff; + upmsg_ptr->dpc = pcg->attrib.dpc; + upmsg_ptr->opc = pcg->attrib.opc; + upmsg_ptr->cic[0] = cic_val & 0xff; + upmsg_ptr->cic[1] = (cic_val >> 8) & 0xff; + upmsg_ptr->cic[2] = (cic_val >> 16) & 0xff; + upmsg_ptr->cic[3] = (cic_val >> 24) & 0xff; + upmsg_ptr->sio = (pcg->attrib.network_id<<6) + BICC_SI; + + monitor_bicc_msg(Bicc_Data.port_data[pid].s_mtp_msg.msgList, Bicc_Data.port_data[pid].s_mtp_msg.len, 1, cic_val, pid); + bicc_to_mtp3(upmsg_ptr); +} + +int BICC_con_req(Pst *pst, BiccSetup_Req * ptr) +{ + + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; + if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + { + port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_SETUP_REQ; + port_ptr->used_flag = 1; + port_ptr->trace_flag = pst->trace_flag; + //if(port_ptr->cic_state.call_state == BICC_CIC_IDLE) + //{ + port_ptr->cic_state.call_state = BICC_OUTGOING; + memcpy(&writePrim_union[pst->sp_proc_id].setup_req, ptr, sizeof(BiccSetup_Req)); + } + else + { + + bicc_log_err("cic not idle,cic=%d, port = %d\n",pst->cic,pst->sp_proc_id); + return 0; + + } + + return 1; + +} + +int BICC_con_rsp(Pst *pst, BiccSetup_Rsp * ptr) +{ + + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; +// port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_SETUP_RSP; + + memcpy(&writePrim_union[pst->sp_proc_id].setup_rsp, ptr, sizeof(BiccSetup_Rsp)); + return 1; +} + + + +int BICC_rel_req(Pst *pst, BiccRel_Req * ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; +// port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_RELEASE_REQ; + + memcpy(&writePrim_union[pst->sp_proc_id].rel_req, ptr, sizeof(BiccRel_Req)); + return 1; +} + +int BICC_rel_rsp(Pst *pst, BiccRel_Rsp * ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; +// port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_RELEASE_RSP; + + memcpy(&writePrim_union[pst->sp_proc_id].rel_rsp, ptr, sizeof(BiccRel_Rsp)); + return 1; +} + +int BICC_alert_req(Pst *pst, BiccAlert_Req *ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; +// port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_ALERT_REQ; + memcpy(&writePrim_union[pst->sp_proc_id].alert_req, ptr, sizeof(BiccAlert_Req)); + bicc_cpci_proc(pst->sp_proc_id); + return 1; +} + +int BICC_info_req(Pst *pst, BiccInfo_Req *ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; +// port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_INFO_REQ; + memcpy(&writePrim_union[pst->sp_proc_id].info_req, ptr, sizeof(BiccInfo_Req)); + return 1; +} + +int BICC_prog_req(Pst *pst, BiccCpg_Req *ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; +// port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_PROG_REQ; + memcpy(&writePrim_union[pst->sp_proc_id].cpg_req, ptr, sizeof(BiccCpg_Req)); + return 1; +} + +int BICC_block_req(Pst *pst, BiccCgb_Req *ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; + port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_BLOCK_REQ; + memcpy(&writePrim_union[pst->sp_proc_id].cgb_req, ptr, sizeof(BiccCgb_Req)); + + return 1; + + +} + +int BICC_unblock_req(Pst *pst, BiccCgb_Req *ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; + port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_RESET_REQ; + memcpy(&writePrim_union[pst->sp_proc_id].cgb_req, ptr, sizeof(BiccCgb_Req)); + + return 1; + + + +} + +int BICC_resm_req(Pst *pst, BiccRes_Req * ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; +// port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_RESUME_REQ; + + memcpy(&writePrim_union[pst->sp_proc_id].res_req, ptr, sizeof(BiccRes_Req)); + return 1; +} + +int BICC_apm_req(Pst *pst, BiccApm_Req * ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; +// port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_APM_REQ; + + memcpy(&writePrim_union[pst->sp_proc_id].apm_req, ptr, sizeof(BiccApm_Req)); + bicc_send_apm(pst->sp_proc_id); + return 1; +} + +int BICC_sus_req(Pst *pst, BiccSus_Req *ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; +// port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_SUSPEND_REQ; + + memcpy(&writePrim_union[pst->sp_proc_id].sus_req, ptr, sizeof(BiccSus_Req)); + return 1; +} + + +int BICC_reset_req(Pst *pst, BiccGrs_Req *ptr) +{ + BICC_Port_struct *port_ptr; + //if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; + port_ptr->su_proc_id = pst->su_proc_id; + if(ptr!=NULL) + { + port_ptr->primitive_cmd = BICC_GROUP_RESET_REQ; + memcpy(&writePrim_union[pst->sp_proc_id].grs_req, ptr, sizeof(BiccGrs_Req)); + bicc_cgrs_proc(pst->sp_proc_id); + + } + else + port_ptr->primitive_cmd = BICC_RESET_REQ; + +// memcpy(&writePrim_union[pst->sp_proc_id].grs_req, ptr, sizeof(BiccGrs_Req)); + + return 1; + +} + + +int BICC_reset_rsp(Pst *pst, BiccGrs_Rsp *ptr) +{ + BICC_Port_struct *port_ptr; + if(pst->sp_proc_id == 0) + if(!getPidByCic(&pst->sp_proc_id, pst->cg_id, pst->cic)) + return 0; + port_ptr = &Bicc_Data.port_data[pst->sp_proc_id]; +// port_ptr->su_proc_id = pst->su_proc_id; + port_ptr->primitive_cmd = BICC_RESET_RSP; + memcpy(&writePrim_union[pst->sp_proc_id].grs_rsp, ptr, sizeof(BiccGrs_Rsp)); + + return 1; +} + +void BICC_EMPTY_APM(ApmUser_struct *ptr) +{ + ptr->action.pres = 0; + ptr->bnc_id.pres = 0; + ptr->bnc_chr.pres = 0; + ptr->bc_info.pres = 0; + ptr->bc_tunnel.pres = 0; + ptr->signal_type.pres = 0; + ptr->duration.pres = 0; +} + +/* This function clear optional parameter flag */ +void BICC_EMPTY_OPTPAR(void *ptr, u8 prim) +{ + if((prim & 0xf0) == 0x00) //request + { + switch(prim) + { + case BICC_SETUP_REQ: + ((BiccSetup_Req *)ptr)->app.pres = 0; + BICC_EMPTY_APM(&((BiccSetup_Req *)ptr)->app.apm_info); + ((BiccSetup_Req *)ptr)->callingPtyNum.pres = 0; + ((BiccSetup_Req *)ptr)->collectCallReq.pres = 0; + ((BiccSetup_Req *)ptr)->confTreat.pres = 0; + ((BiccSetup_Req *)ptr)->correlationId.pres = 0; + ((BiccSetup_Req *)ptr)->origCalledNum.pres = 0; + ((BiccSetup_Req *)ptr)->redirgNum.pres = 0; + ((BiccSetup_Req *)ptr)->scfId.pres = 0; + ((BiccSetup_Req *)ptr)->utuInd.pres = 0; + ((BiccSetup_Req *)ptr)->utuInfo.pres = 0; + break; + case BICC_ALERT_REQ: + ((BiccAlert_Req *)ptr)->app.pres = 0; + BICC_EMPTY_APM(&((BiccAlert_Req *)ptr)->app.apm_info); + ((BiccAlert_Req *)ptr)->cause.pres = 0; + ((BiccAlert_Req *)ptr)->confTreat.pres = 0; + ((BiccAlert_Req *)ptr)->utuInd.pres = 0; + ((BiccAlert_Req *)ptr)->utuInfo.pres = 0; + break; + case BICC_APM_REQ: + ((BiccApm_Req *)ptr)->app.pres = 0; + BICC_EMPTY_APM(&((BiccApm_Req *)ptr)->app.apm_info); + break; + case BICC_PROG_REQ: + ((BiccCpg_Req *)ptr)->app.pres = 0; + BICC_EMPTY_APM(&((BiccCpg_Req *)ptr)->app.apm_info); + ((BiccCpg_Req *)ptr)->backCall.pres = 0; + ((BiccCpg_Req *)ptr)->cause.pres = 0; + ((BiccCpg_Req *)ptr)->confTreat.pres = 0; + ((BiccCpg_Req *)ptr)->connNum.pres = 0; + ((BiccCpg_Req *)ptr)->utuInd.pres = 0; + ((BiccCpg_Req *)ptr)->utuInfo.pres = 0; + break; + case BICC_RELEASE_REQ: + ((BiccRel_Req *)ptr)->utuInd.pres = 0; + ((BiccRel_Req *)ptr)->utuInfo.pres = 0; + break; + default: + break; + } + } + else if((prim & 0xf0) == 0x80) //response + { + switch(prim) + { + case BICC_SETUP_RSP: + ((BiccSetup_Rsp *)ptr)->app.pres = 0; + BICC_EMPTY_APM(&((BiccSetup_Rsp *)ptr)->app.apm_info); + ((BiccSetup_Rsp *)ptr)->backCall.pres = 0; + ((BiccSetup_Rsp *)ptr)->confTreat.pres = 0; + ((BiccSetup_Rsp *)ptr)->connNum.pres = 0; + ((BiccSetup_Rsp *)ptr)->utuInd.pres = 0; + ((BiccSetup_Rsp *)ptr)->utuInfo.pres = 0; + break; + case BICC_RELEASE_RSP: + ((BiccRel_Rsp *)ptr)->cause.pres = 0; + break; + default: + break; + } + } +} + +void bicc_timer_init(int interval_ms) +{ + BiccTimer_struct *timer_ptr = &Timer_Data; + timer_ptr ->t1 = BICC_T1 * 1000 / interval_ms; + timer_ptr ->t5 = BICC_T5 * 1000 / interval_ms; + timer_ptr ->t7 = BICC_T7 * 1000 / interval_ms; + timer_ptr ->t8 = BICC_T8 * 1000 / interval_ms; + timer_ptr ->t9 = BICC_T9 * 1000 / interval_ms; + timer_ptr ->t12 = BICC_T12 * 1000 / interval_ms; + timer_ptr ->t13 = BICC_T13 * 1000 / interval_ms; + timer_ptr ->t14 = BICC_T14 * 1000 / interval_ms; + timer_ptr ->t15 = BICC_T15 * 1000 / interval_ms; + timer_ptr ->t16 = BICC_T16 * 1000 / interval_ms; + timer_ptr ->t17 = BICC_T17 * 1000 / interval_ms; + timer_ptr ->t18 = BICC_T18 * 1000 / interval_ms; + timer_ptr ->t19 = BICC_T19 * 1000 / interval_ms; + timer_ptr ->t20 = BICC_T20 * 1000 / interval_ms; + timer_ptr ->t21 = BICC_T21 * 1000 / interval_ms; + timer_ptr ->t22 = BICC_T22 * 1000 / interval_ms; + timer_ptr ->t23 = BICC_T23 * 1000 / interval_ms; + timer_ptr ->t28 = BICC_T28 * 1000 / interval_ms; + timer_ptr ->t33 = BICC_T33 * 1000 / interval_ms; + timer_ptr ->t34 = BICC_T34 * 1000 / interval_ms; + timer_ptr ->t35 = BICC_T35 * 1000 / interval_ms; + timer_ptr ->t40 = BICC_T40 * 1000 / interval_ms; + timer_ptr ->t41 = BICC_T41 * 1000 / interval_ms; + timer_ptr ->t42 = BICC_T42 * 1000 / interval_ms; + timer_ptr ->t43 = BICC_T43 * 1000 / interval_ms; + timer_ptr->user_t10 = BICC_USER_T10 * 1000 / interval_ms; + + +} + + +void BICC_init(int interval_ms,int local_id) +{ + u32 stack_size; + printf("Start BICC module init......\n"); + //memset(&BiccResource, 0, sizeof(BICC_Resource_pond)); + memset(&Bicc_Data, 0, sizeof(BiccData_struct)); + bicc_timer_init(interval_ms); + stack_size = sizeof(Bicc_Data); + bicc_debug_init(); + local_platid = local_id; + printf("BICC module init complete! Stack size: %ld bytes\n", stack_size); +} + + +void BICC_cpc_proc(u32 pid) +{ + BICC_Port_struct *port_ptr = &Bicc_Data.port_data[pid]; + if(port_ptr->cic_state.call_state == BICC_INCOMING) + bicc_cpci_proc(pid); + else if(port_ptr->cic_state.call_state == BICC_OUTGOING) + bicc_cpco_proc(pid); + else + { +// if((port_ptr->fsm_state.cgrs_state == 0)&&(port_ptr->primitive_cmd == 0)) +// memset(&Bicc_Data.port_data[pid],0,sizeof(BICC_Port_struct)); + } +} + + +void BICC_csc_proc(u32 pid) +{ + bicc_mgbs_proc(pid); + bicc_mgbr_proc(pid); + bicc_crs_proc(pid); + bicc_crr_proc(pid); + bicc_cgrs_proc(pid); + bicc_cgrr_proc(pid); +// bicc_blr_proc(pid); +// bicc_bls_proc(pid); +} + +void BICC_timer() +{ + u32 i, j; + u32 offset, pid; + const pal_circuit_struct *pcircuit = NULL; + const pal_cg_struct *pcg = NULL; + for(i = 0; i < 64; i++) + { + if(BICC_mdsc_proc() == 0) + break; + } + for(i = 0; i < PAL_MAX_CIRCUIT; i++) + { + pcircuit = pal_circuit_ptr(i); + + if((pcircuit !=NULL) && (pcircuit->enable)) + { + if((pcg = pal_cg_ptr(pcircuit->cg_id)) && (pcg->attrib.protocol == PROTO_BICC)) + { + offset = BICC_CIRCUIT_CIC * i; + for(j = 0; j < BICC_CIRCUIT_CIC; j++) + { + pid = offset + j; + BICC_cpc_proc(pid); + BICC_csc_proc(pid); + } + } + } + } + bicc_debug_timer(); + +} + diff --git a/omc/plat/bicc/src/include/.copyarea.db b/omc/plat/bicc/src/include/.copyarea.db new file mode 100644 index 0000000..be529d5 --- /dev/null +++ b/omc/plat/bicc/src/include/.copyarea.db @@ -0,0 +1,12 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\bicc\src\include +2 +8 +7:ipbcp.h|1|11d70a3e9ef|5ec|3918ea7e|c54bc7539b5711dd8e28001c23e19543|0 +c:bicc_debug.h|1|11d70a3e8e6|2d0|bc45c482|c24bc6e39b5711dd8e28001c23e19543|0 +a:q1902_3e.h|1|11d70a3ea1e|2d50|c4a74e73|c67bc76f9b5711dd8e28001c23e19543|0 +5:inc.h|1|11d70a3e9c0|e57|566ed92f|c4abc7379b5711dd8e28001c23e19543|0 +8:biccif.h|1|11d70a3e972|32e4|3f0cf7b4|c37bc6ff9b5711dd8e28001c23e19543|0 +9:q765_5e.h|1|11d70a3ea4d|82e|ee80601c|c70bc78b9b5711dd8e28001c23e19543|0 +9:var_ext.h|1|11d70a3ea7c|15c|91ea711b|c7abc7a79b5711dd8e28001c23e19543|0 +8:define.h|1|11d70a3e991|1e9|94808f37|c41bc71b9b5711dd8e28001c23e19543|0 diff --git a/omc/plat/bicc/src/include/bicc_debug.h b/omc/plat/bicc/src/include/bicc_debug.h new file mode 100644 index 0000000..01fcba9 --- /dev/null +++ b/omc/plat/bicc/src/include/bicc_debug.h @@ -0,0 +1,25 @@ +#include "define.h" +#include "../../../debug/src/include/debug.h" + +#define LOG_ERR_FLAG 0x01 +#define LOG_BICC_FLAG 0x02 +#define LOG_MSG_FLAG 0x04 +#define LOG_TIME_FLAG 0x08 +#define LOG_DMP_FLAG 0x10 +#define LOG_ALL_FLAG 0x1f +#define LOG_FILE_FLAG 0x20 +/*******************************/ +#define MAX_OPR_LEN 16 +#define MAX_OBJ_LEN 32 +#define MAX_VALUE_LEN 32 +#define BICC_PREOID_LEN 12 +#define BICC_DEBUG_OID 17 +#define BICC_DEBUG_PAGE 10 +#define BICC_ASCIN_LEN 128 +#define BICC_ASCOUT_LEN 4096 + + +int bicc_debug_init(); +void bicc_debug_timer(); +void monitor_bicc_msg(u8 *msg,u8 buf_len, BYTE flag, u32 cic, u32 portNo); +void bicc_asciout_proc(const char *fmt, ...); diff --git a/omc/plat/bicc/src/include/biccif.h b/omc/plat/bicc/src/include/biccif.h new file mode 100644 index 0000000..a755dec --- /dev/null +++ b/omc/plat/bicc/src/include/biccif.h @@ -0,0 +1,417 @@ +#ifndef _BICCIF_H_ +#define _BICCIF_H_ + +#include "q765_5e.h" +#include "q1902_3e.h" +#include "../../../mtp3/src/include/mtp3.h" +#include "../../../snmp/src/include/snmp.h" +//#include "../../../public/src/include/proto_pub.h" +#include "bicc_debug.h" +#include "../../../pal/pal.h" +/*********************************/ +/*** BICC Management Structure ***/ +/*********************************/ + +#define BICC_CM_OK 1 //command request success +#define BICC_CM_FAILED -1 //command request failed + +/************************************* +******BICC Resource Structure********* +*************************************/ +#define BICC_MAX_PORT 8192 +#define BICC_CG_CIRCUIT 32 +#define BICC_CIRCUIT_CIC 32 + + +/*** BICC Primitive Parameter Structure (different to q1902_3e) ***/ +typedef struct AppTransM_struct { //Application Transport Mechanism + u8 pres; + ApmUser_struct apm_info; +} AppTransM_struct; +/*********************************/ +/**** BICC Primitive Structure ***/ +/*********************************/ +typedef struct BiccSetup_Req { + NatConnInd_struct natConn;//F + FwdCallInd_struct fwdCall;//F + CallingPtyCat_struct callingPtyCat;//F + TransMedReq_struct transMedReq;//F + CalledPtyNum_struct calledPtyNum;//V + AppTransM_struct app; + CallingPtyNum_struct callingPtyNum; + CollectCallReq_struct collectCallReq; + ConfTreatInd_struct confTreat; + CorrelationId_struct correlationId; + OrigCalledNum_struct origCalledNum; + RedirgNum_struct redirgNum; + RedirInfo_struct redirInfo; + ScfId_struct scfId; + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; +} BiccSetup_Req, BiccSetup_Ind; + +typedef struct BiccSetup_Rsp { + AppTransM_struct app; + BackCallInd_struct backCall;//C: use it if no alert req is sent before + ConfTreatInd_struct confTreat; + ConnNum_struct connNum; + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; +} BiccSetup_Rsp, BiccSetup_Cnf; + +typedef struct BiccAlert_Req { + BackCallInd_struct backCall;//F + AppTransM_struct app; + CauseInd_struct cause; + ConfTreatInd_struct confTreat; + OptBackCallInd_struct optBackCall; + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; +} BiccAlert_Req, BiccAlert_Ind; + +typedef struct BiccInfo_Req { + SubseqNum_struct subseqNum;//V +} BiccInfo_Req, BiccInfo_Ind; + +typedef struct BiccApm_Req { + AppTransM_struct app; +} BiccApm_Req, BiccApm_Ind; + +typedef struct BiccCpg_Req { + EventInfo_struct eventInfo;//F + AppTransM_struct app; + BackCallInd_struct backCall; + CallDiverInfo_struct calldiver; + CauseInd_struct cause; + ConfTreatInd_struct confTreat; + ConnNum_struct connNum; + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; +} BiccCpg_Req, BiccCpg_Ind; + +typedef struct BiccRel_Req { + CauseInd_struct cause;//V + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; +} BiccRel_Req, BiccRel_Ind; + +typedef struct BiccRel_Rsp { + CauseInd_struct cause; +} BiccRel_Rsp, BiccRel_Cnf; + +typedef struct BiccRes_Req { + SusResInd_struct susRes;//F +} BiccRes_Req, BiccRes_Ind; + +typedef struct BiccSus_Req { + SusResInd_struct susRes;//F +} BiccSus_Req, BiccSus_Ind; + +typedef struct BiccCgb_Req { + CicGrpSpv_struct cicGrpSpv;//F + RangeStatus_struct rangeStatus;//V +} BiccCgb_Req, BiccCgb_Ind; + +typedef struct BiccCgb_Rsp { + CicGrpSpv_struct cicGrpSpv;//F + RangeStatus_struct rangeStatus;//V +} BiccCgb_Rsp, BiccCgb_Cnf; + +typedef struct BiccCgu_Req { + CicGrpSpv_struct cicGrpSpv;//F + RangeStatus_struct rangeStatus;//V +} BiccCgu_Req, BiccCgu_Ind; + +typedef struct BiccCgu_Rsp { + CicGrpSpv_struct cicGrpSpv;//F + RangeStatus_struct rangeStatus;//V +} BiccCgu_Rsp, BiccCgu_Cnf; + +typedef struct BiccGrs_Req { + RangeStatus_struct rangeStatus;//V +} BiccGrs_Req, BiccGrs_Ind; + +typedef struct BiccGrs_Rsp { + RangeStatus_struct rangeStatus;//V +} BiccGrs_Rsp, BiccGrs_Cnf; + + +typedef struct BiccSta_Req +{ + BiccMsg_struct biccMsg; +}BiccSta_Req; + +typedef struct BiccFac_Req +{ + FacInd_struct facInd; +}BiccFac_Req, BiccFac_Ind; + +typedef struct BiccFac_Rsp +{ + FacInd_struct facInd; +}BiccFac_Rsp, BiccFac_Cnf; + +typedef union BiccWritePrim_union { + BiccSetup_Req setup_req; + BiccSetup_Rsp setup_rsp; + BiccAlert_Req alert_req; + BiccInfo_Req info_req; + BiccApm_Req apm_req; + BiccCpg_Req cpg_req; + BiccRel_Req rel_req; + BiccRel_Rsp rel_rsp; + BiccRes_Req res_req; + BiccSus_Req sus_req; + BiccCgb_Req cgb_req;//only used in BICC module + BiccCgb_Rsp cgb_rsp;//only used in BICC module + BiccCgu_Req cgu_req;//only used in BICC module + BiccCgu_Rsp cgu_rsp;//only used in BICC module + BiccGrs_Req grs_req;//only used in BICC module + BiccGrs_Rsp grs_rsp;//only used in BICC module + BiccFac_Req fac_req; + BiccFac_Rsp fac_rsp; +} BiccWritePrim_union; + +typedef union BiccReadPrim_union { + BiccSetup_Ind setup_ind; + BiccSetup_Cnf setup_cnf; + BiccAlert_Ind alert_ind; + BiccInfo_Ind info_ind; + BiccApm_Ind apm_ind; + BiccCpg_Ind cpg_ind; + BiccRel_Ind rel_ind; + BiccRel_Cnf rel_cnf; + BiccRes_Ind res_ind; + BiccSus_Ind sus_ind; + BiccCgb_Ind cgb_ind;//only used in BICC module + BiccCgb_Cnf cgb_cnf;//only used in BICC module + BiccCgu_Ind cgu_ind;//only used in BICC module + BiccCgu_Cnf cgu_cnf;//only used in BICC module + BiccGrs_Ind grs_ind;//only used in BICC module + BiccGrs_Cnf grs_cnf;//only used in BICC module + BiccFac_Ind fac_ind; + BiccFac_Cnf fac_cnf; +} BiccReadPrim_union; + + +/********************************************/ +/****** BICC Internal Command *************/ +/********************************************/ +#define BICC_CMD_UNBLO 0x01 +#define BICC_CMD_BLO 0x02 +#define BICC_CMD_RESET 0x03 +#define BICC_CMD_RESET_COMP 0x04 + + +#define BICC_SI_CPCI 0x10 +#define BICC_SI_CPCO 0x20 +#define BICC_SI_BLS 0x30 +#define BICC_SI_BLR 0x40 +#define BICC_SI_MGBR 0x50 +#define BICC_SI_MGBS 0x60 +#define BICC_SI_CRS 0x70 +#define BICC_SI_CRR 0x80 +#define BICC_SI_CGRS 0x90 +#define BICC_SI_CGRR 0xA0 + +/********************************************/ +/****** BICC Event/Primitive Definition *****/ +/********************************************/ + +#define BICC_SETUP_REQ 0x01 //user-defined, first 4-digit:type of primitive second 4-digit:type of event +#define BICC_SETUP_IND 0x41 +#define BICC_SETUP_RSP 0x81 +#define BICC_SETUP_CNF 0xc1 +#define BICC_ALERT_REQ 0x02 +#define BICC_ALERT_IND 0x42 +#define BICC_INFO_REQ 0x03 +#define BICC_INFO_IND 0x43 +#define BICC_APM_REQ 0x04 +#define BICC_APM_IND 0x44 +#define BICC_PROG_REQ 0x05 +#define BICC_PROG_IND 0x45 +#define BICC_RELEASE_REQ 0x06 +#define BICC_RELEASE_IND 0x46 +#define BICC_RELEASE_RSP 0x86 +#define BICC_RELEASE_CNF 0xc6 +#define BICC_RESET_REQ 0x07 +#define BICC_RESET_IND 0x47 +#define BICC_RESET_CNF 0xc7 +#define BICC_RESET_RSP 0x87 +#define BICC_GROUP_RESET_REQ 0x17 + +#define BICC_BLOCK_REQ 0x08 +#define BICC_BLOCK_IND 0x48 +#define BICC_BLOCK_RSP 0x88 +#define BICC_BLOCK_CNF 0xc8 +#define BICC_UNBLOCK_REQ 0x09 +#define BICC_UNBLOCK_IND 0x49 +#define BICC_UNBLOCK_RSP 0x89 +#define BICC_UNBLOCK_CNF 0xc9 +#define BICC_SUSPEND_REQ 0x0a +#define BICC_SUSPEND_IND 0x4a +#define BICC_RESUME_REQ 0x0b +#define BICC_RESUME_IND 0x4b +#define BICC_REATTEMPT_IND 0x4c +#define BICC_FAILURE_IND 0x4f +#define BICC_FAC_REQ 0x0d +#define BICC_FAC_RSP 0x8d +#define BICC_FAC_IND 0x4d +#define BICC_FAC_CNF 0xcd +#define BICC_STA_IND 0x4e +#define BICC_STA_REQ 0x0e +#define BICC_MAINTENANCE_IND 0x44 // + +#define BICC_STOP_REQ 0xee +#define BICC_STOP_CNF 0xef + +typedef int f_bicc_setup_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_setup_anm_cnf(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_setup_con_cnf(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_release_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_release_cnf(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_alert_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_info_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_prog_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_suspend_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_resume_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_reset_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_reset_cnf(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_apm_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_reattempt_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_failure_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_block_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_block_cnf(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_unblock_ind(Pst *pst, const BiccReadPrim_union *prm_ptr); +typedef int f_bicc_unblock_cnf(Pst *pst, const BiccReadPrim_union *prm_ptr); + +typedef struct bicc_eventhandle_struct +{ + f_bicc_setup_ind *h_bicc_setup_ind; + f_bicc_setup_anm_cnf *h_bicc_setup_anm_cnf; + f_bicc_setup_con_cnf *h_bicc_setup_con_cnf; + f_bicc_release_ind *h_bicc_release_ind; + f_bicc_release_cnf *h_bicc_release_cnf; + f_bicc_alert_ind *h_bicc_alert_ind; + f_bicc_info_ind *h_bicc_info_ind; + f_bicc_prog_ind *h_bicc_prog_ind; + f_bicc_suspend_ind *h_bicc_suspend_ind; + f_bicc_resume_ind *h_bicc_resume_ind; + f_bicc_block_ind *h_bicc_block_ind; + f_bicc_block_cnf *h_bicc_block_cnf; + f_bicc_unblock_ind *h_bicc_unblock_ind; + f_bicc_unblock_cnf *h_bicc_unblock_cnf; + f_bicc_reset_ind *h_bicc_reset_ind; + f_bicc_reset_cnf *h_bicc_reset_cnf; + f_bicc_apm_ind *h_bicc_apm_ind; + f_bicc_reattempt_ind *h_bicc_reattempt_ind; + f_bicc_failure_ind *h_bicc_failure_ind; + +}BICC_EventHandle_struct; + +typedef struct _bicc_sap_attrib_ +{ + BICC_EventHandle_struct event_handle; +}bicc_sap_sttrib_; + +typedef enum _BICC_network_id +{ + SI_INTERNATIONAL = 0, + SI_INTERNATIONAL_SPARE = 1, + SI_NATIONAL = 2, + SI_NATIONAL_SPARE = 3, + +}SI_Netwrok_ID; + +typedef struct bicc_cic_state +{ + u8 call_state; + u8 sus_state; //suspend state, remote hold? local hold? + u8 blo_state; //block state, remote block? local hold? +}BICC_CIC_state; + +typedef struct bicc_fsm_state +{ + u8 cpc_state; + u8 mgbs_state; + u8 mgbr_state; + u8 crs_state; + u8 crr_state; + u8 cgrs_state; + u8 cgrr_state; +}BICC_Fsm_state; + +typedef struct bicc_port_struct +{ + u8 used_flag; + u8 trace_flag; + u32 w_time; + u32 su_proc_id; + u8 sprc_cmd; + u8 primitive_cmd; + u8 internal_cmd; + BICC_Fsm_state fsm_state; + BICC_CIC_state cic_state; + up_message_2 s_mtp_msg; //message send to mtp3 +}BICC_Port_struct; + +extern up_message_2 r_mtp_msg; //message receive from mtp3 + +typedef struct BiccDmp_struct { + // If DMP is active, circuit 0-127 is according to proccessor 0, circuit 128-255 is accroding to proccessor 1 // + u8 active; + u8 processor_id; + u32 remote_ip; +} BiccDmp_struct; + + +/********************** +***upper layer interface*** +*********************** +*/ + +extern int BICC_con_req(Pst *pst, BiccSetup_Req *ptr); //iam //Connection establishment request +extern int BICC_con_rsp(Pst *pst, BiccSetup_Rsp *ptr); //anm,con //Connection establishment response +extern int BICC_rel_req(Pst *pst, BiccRel_Req *ptr); //Release request +extern int BICC_rel_rsp(Pst *pst, BiccRel_Rsp *ptr); //Release response +extern int BICC_alert_req(Pst *pst, BiccAlert_Req *ptr); //alert +extern int BICC_info_req(Pst *pst, BiccInfo_Req *ptr); //sam +extern int BICC_prog_req(Pst *pst, BiccCpg_Req *ptr); //progress +extern int BICC_apm_req(Pst *pst, BiccApm_Req *ptr); +extern int BICC_sus_req(Pst *pst, BiccSus_Req *ptr); //Call suspend request +extern int BICC_resm_req(Pst *pst, BiccRes_Req *ptr); //Call resume request +extern int BICC_block_req(Pst *pst, BiccCgb_Req *ptr); //block req +extern int BICC_block_rsp(Pst *pst, BiccCgb_Req *ptr); +extern int BICC_unblock_req(Pst *pst, BiccCgb_Req *ptr); //unblock req +extern int BICC_unblock_rsp(Pst *pst, BiccCgb_Req *ptr); +extern int BICC_reset_req(Pst *pst, BiccGrs_Req *ptr); +extern int BICC_reset_rsp(Pst *pst, BiccGrs_Rsp *ptr); //reset response + +extern void BICC_EMPTY_OPTPAR(void *ptr, u8 prim); + +extern BOOL bicc_trunk_reachable(u32 cg_id); +/***************************** +*** layer management interface*** +****************************** +*/ + +int BICC_active_dmp(u8 plat_id, u32 alter_id ); +int BICC_deactive_dmp(); + +/*********************** +*** lower layer interface*** +************************ +*/ +void BICC_msdc_proc(u32 pid, up_message_2 *upmsg_ptr); +int BICC_mdsc_proc(); + +/****************************** +*** system service interface*** +******************************* +*/ + +void BICC_init(int interval_ms, int local_id); +void BICC_timer(); + +#endif + diff --git a/omc/plat/bicc/src/include/define.h b/omc/plat/bicc/src/include/define.h new file mode 100644 index 0000000..63fc073 --- /dev/null +++ b/omc/plat/bicc/src/include/define.h @@ -0,0 +1,34 @@ +#ifndef _DEFINE_H_ +#define _DEFINE_H_ + +//typedef int BOOL; +#ifndef _T_U8 +#define _T_U8 +typedef unsigned char u8; +#endif + +#ifndef _T_U16 +#define _T_U16 +typedef unsigned short u16; +#endif + +#ifndef _T_U32 +#define _T_U32 +typedef unsigned int u32; +#endif + +#define BICC_TOLERANT +#define BICC_REATTEMPT +#define BICC_DEBUG + +//Event +#define EN_NONE 0x00 +#define EN_ANM 0x01 +#define EN_CON 0x02 +#define EN_GROUP 0x03 + +#define M_LOCAL_BLOCK 0x01 +#define M_REMOTE_BLOCK 0x02 + +#endif + diff --git a/omc/plat/bicc/src/include/inc.h b/omc/plat/bicc/src/include/inc.h new file mode 100644 index 0000000..20d1c9c --- /dev/null +++ b/omc/plat/bicc/src/include/inc.h @@ -0,0 +1,162 @@ +#ifndef _INC_H +#define _INC_H + +#include +#include +#include "../../../mtp3/src/include/mtp3.h" +#include "../../../snmp/src/include/snmp.h" +#include "biccif.h" + +#define BICC_VERSION {9, 0, 10, 0} +#define BICC_SCREEN_SIZE 32 + +#define BICC_TIMER_STOP 0 +#define BICC_TIMER_EXPIRED 1 +#define BICC_T1 15 +#define BICC_T5 300 +#define BICC_T7 30 +#define BICC_T8 10 +#define BICC_T9 120 +#define BICC_T12 15 +#define BICC_T13 300 +#define BICC_T14 15 +#define BICC_T15 300 +#define BICC_T16 15 +#define BICC_T17 300 +#define BICC_T18 15 +#define BICC_T19 300 +#define BICC_T20 15 +#define BICC_T21 300 +#define BICC_T22 15 +#define BICC_T23 300 +//#define BICC_T24 1 +//#define BICC_T25 1 +//#define BICC_T26 60 +//#define BICC_T27 240 +#define BICC_T28 10 +#define BICC_T33 12 +#define BICC_T34 2 +#define BICC_T35 15 +//#define BICC_T36 10 +//#define BICC_T37 2 +#define BICC_T40 10 +#define BICC_T41 10 +#define BICC_T42 5 +#define BICC_T43 5 +#define BICC_USER_T10 10//user defined timer,10s + + +#define BICC_CIC_IDLE 0 +#define BICC_INCOMING 1 +#define BICC_OUTGOING 2 +#define BICC_RESET 3 + + +#define BICC_TYPE_INCOMING 0 +#define BICC_TYPE_OUTGOING 1 +#define BICC_TYPE_BIDIRECT 2 + +#define BICC_ORIG_SUSPEND 0 //originating side suspend +#define BICC_TERM_SUSPEND 1 //terminating side suspend + + +typedef struct BiccTimer_struct +{ + int t1; + int t5; + int t7; + int t8; + int t9; + int t12; + int t13; + int t14; + int t15; + int t16; + int t17; + int t18; + int t19; + int t20; + int t21; + int t22; + int t23; + int t28; + int t33; + int t34; + int t35; + int t40; + int t41; + int t42; + int t43; + int user_t10; + +}BiccTimer_struct; + +typedef struct BiccMng_struct { + u8 state; + u32 lnk_id; + RangeStatus_struct rangeStatus; +} BiccMng_struct; + + +typedef struct BiccDebug_struct { + u32 flag; + u8 sap_enable[BICC_SCREEN_SIZE]; + u8 sap_cg_num[BICC_SCREEN_SIZE]; + + //u8 cg_enable[BICC_SCREEN_SIZE]; + //u8 network_id[BICC_SCREEN_SIZE]; + + // page 1 // + u8 cic_enable[BICC_SCREEN_SIZE]; + u8 cic_type[BICC_SCREEN_SIZE]; + u8 l_block[BICC_SCREEN_SIZE]; + u8 r_block[BICC_SCREEN_SIZE]; + // page 2 // + u8 cic_status[BICC_SCREEN_SIZE]; + u8 cpc_state[BICC_SCREEN_SIZE]; + u8 mgbs_state[BICC_SCREEN_SIZE]; + u8 mgbr_state[BICC_SCREEN_SIZE]; + u8 crs_state[BICC_SCREEN_SIZE]; + u8 crr_state[BICC_SCREEN_SIZE]; + u8 cgrs_state[BICC_SCREEN_SIZE]; + u8 cgrr_state[BICC_SCREEN_SIZE]; + // page 3 // + u8 sprc_command[BICC_SCREEN_SIZE]; + u8 mgbs_command[BICC_SCREEN_SIZE]; + u8 mgbr_command[BICC_SCREEN_SIZE]; + u8 crs_command[BICC_SCREEN_SIZE]; + u8 crr_command[BICC_SCREEN_SIZE]; + u8 cgrs_command[BICC_SCREEN_SIZE]; + u8 cgrr_command[BICC_SCREEN_SIZE]; + u8 prim_command[BICC_SCREEN_SIZE]; + // page 4 // + u8 mng_state; + u8 mng_lnk_id; +} BiccDebug_struct; + +typedef struct BiccData_struct +{ + BiccDebug_struct debug_data; + BiccMng_struct mng_data; + BiccDmp_struct dmp_data; + BiccTimer_struct timer_data[BICC_MAX_PORT]; + //BICC_Fsm_state fsm_data[BICC_MAX_PORT]; + BICC_Port_struct port_data[BICC_MAX_PORT]; + +}BiccData_struct; + +typedef struct stat_struct { +// u32 en_cic; + u32 lblo_cic; + u32 rblo_cic; +// u32 in_cic; +// u32 out_cic; +// u32 bi_cic; + u32 idle_call; + u32 in_call; + u32 out_call; + u32 lsus_cic; + u32 rsus_cic; +}stat_struct; +#endif + diff --git a/omc/plat/bicc/src/include/ipbcp.h b/omc/plat/bicc/src/include/ipbcp.h new file mode 100644 index 0000000..813b057 --- /dev/null +++ b/omc/plat/bicc/src/include/ipbcp.h @@ -0,0 +1,60 @@ +// Q.1970E; RFC 2327 // +#ifndef _IPBCP_H_ +#define _IPBCP_H_ + +typedef struct SdpOrig_struct { + char username[16]; + char session_id[16]; + char version[8]; + char network_type[8]; + char address_type[8]; + char address[16]; +} SdpOrig_struct; + +typedef struct SdpConn_struct { + char network_type[8]; + char address_type[8]; + char address[16]; +} SdpConn_struct; + +typedef struct SdpTime_struct { + char start[16]; //0 + char stop[16]; //0 +} SdpTime_struct; + +typedef struct SdpAttrib_struct { + char version[8]; //1 + char type[16]; //"Request"/"Accepted"/"Confused"/"Rejected" +} SdpAttrib_struct; + +typedef struct SdpMediaAnn_struct { + char media[16]; + char port[8]; + char transport[16]; + char fmt_list[128]; +} SdpMediaAnn_struct; + +// specify RTP dynamic payload types // +typedef struct SdpMediaAtt_struct { + char payload[8]; + char encoding_name[16]; + char clock_rate[8]; +// char p_time[8]; +} SdpMediaAtt_struct; + +typedef struct IPBCP_struct { + char proto_ver[8]; //Protocol version (M) + SdpOrig_struct orig; //Orign (M) + char session_name[16]; //Session name (M) + SdpConn_struct conn_data; //Connection data + SdpTime_struct time; //Time + SdpAttrib_struct attrib; //Session attribute + SdpMediaAnn_struct m_ann; //Media announcement (M) + SdpMediaAtt_struct m_att; //Media attributes + char ptime[8]; +} IPBCP_struct; + +extern int ipbcp_decode(IPBCP_struct *ipbcp_ptr, const char *ptr); +extern int ipbcp_encode(char *ptr, const IPBCP_struct *ipbcp_ptr); + +#endif diff --git a/omc/plat/bicc/src/include/q1902_3e.h b/omc/plat/bicc/src/include/q1902_3e.h new file mode 100644 index 0000000..16dc75a --- /dev/null +++ b/omc/plat/bicc/src/include/q1902_3e.h @@ -0,0 +1,456 @@ +#ifndef _q1902_3E_H_ +#define _q1902_3E_H_ +#include "define.h" +#include "q765_5e.h" +/******************************************/ +/******** BICC SIO (Q.1901E C.7.3) ********/ +/******************************************/ +#define BICC_SI 13 + +/******************************************/ +/* Message Type Codes (Q.1902-3E, page 5) */ +/******************************************/ +#define M_ACM 0x06//Address complete +#define M_ANM 0x09//Answer +#define M_APM 0x41//Application transport +#define M_BLO 0x13//Blocking +#define M_BLA 0x15//Blocking acknowledgement +#define M_CPG 0x2c//Call progress +#define M_CGB 0x18//Circuit/CIC group blocking +#define M_CGBA 0x1a//Circuit/CIC group blocking acknowledgement +#define M_CQM 0x2a//Circuit/CIC group query (national use) +#define M_CQR 0x2b//Circuit/CIC group query response (national use) +#define M_GRS 0x17//Circuit/CIC group reset +#define M_GRA 0x29//Circuit/CIC group reset acknowledgement +#define M_CGU 0x19//Circuit/CIC group unblocking +#define M_CGUA 0x1b//Circuit/CIC group unblocking acknowledgement +#define M_CRG 0x31//Charge information (national use) +#define M_CFN 0x2f//Confusion +#define M_CON 0x07//Connect +#define M_COT 0x05//Continuity +#define M_FAC 0x33//Facility +#define M_FAA 0x20//Facility accepted +#define M_FRJ 0x21//Facility reject +#define M_FAR 0x1f//Facility request +#define M_FOT 0x08//Forward transfer +#define M_IDR 0x36//Identification request +#define M_IRS 0x37//Identification response +#define M_INF 0x04//Information (national use) +#define M_INR 0x03//Information request (national use) +#define M_IAM 0x01//Initial address +#define M_LOP 0x40//Loop prevention +#define M_NRM 0x32//Network resource management +#define M_PRI 0x42//Pre-release information +#define M_REL 0x0c//Release +#define M_RLC 0x10//Release complete +#define M_RSC 0x12//Reset circuit/CIC +#define M_RES 0x0e//Resume +#define M_SGM 0x38//Segmentation +#define M_SAM 0x02//Subsequent address +#define M_SDM 0x43//Subsequent Directory Number (national use) +#define M_SUS 0x0d//Suspend +#define M_UBL 0x14//Unblocking +#define M_UBA 0x16//Unblocking acknowledgement +#define M_UCIC 0x2e//Unequipped CIC (national use) +#define M_USR 0x2d//User-to-user information + + +/*********************************************/ +/* Parameter Name Codes (Q.1902-3E, page 10) */ +/*********************************************/ +#define P_APPTRANS 0x78//Application transport +#define P_BACKCALLIND 0x11//Backward call indicators +#define P_CALLEDPTYNUM 0x04//Called party number +#define P_CALLINGPTYNUM 0x0a//Calling party number +#define P_CALLINGPTYCAT 0x09//Calling party's category +#define P_CAUSEIND 0x02//Cause indicators +#define P_CICGRPSPV 0x15//Circuit/CIC group supervision message type +#define P_COLLECTCALLREQ 0x79//Collect call request +#define P_CONFTREATIND 0x72//Conference treatment indicators +#define P_CONNNUM 0x21//Connected number +#define P_CORRELATIONID 0x65//Correlation id +#define P_EVENINFO 0x24//Event information +#define P_FACIND 0x18//Facility indicator +#define P_FWDCALLIND 0x07//Forward call indicators +#define P_NATCONNIND 0x06//Nature of connection indicators +#define P_ORIGCALLEDNUM 0x28//Original called number +#define P_RANGESTATUS 0x16//Range and status +#define P_REDIRGNUM 0x0b//Redirecting number +#define P_REDIRINFO 0x13//Redirection information +#define P_SCFID 0x66//SCF id +#define P_SUBSEQNUM 0x05//Subsequent number +#define P_SUSRESIND 0x22//Suspend/Resume indicators +#define P_TRANSMEDREQ 0x02//Transmission medium requirement +#define P_UTUIND 0x2a//User-to-user indicators +#define P_UTUINFO 0x20//User-to-user information +#define P_CALLDIVERINFO 0x36//Call diversion information +#define P_OPTBACKCALLIND 0x29//Optional backward call indicators + +/**********************************************/ +/* Parameter Structure (Q.1902-3E, section 6) */ +/**********************************************/ +#define MAX_BICC_DIGIT 32 +#define BICC_STATUS_LEN 32 +#define BICC_APP_LEN 200 +#define MAX_DIAGNOSTIC_LEN 32 + +typedef struct AppTrans_struct { + u8 pres; + u8 aci[2]; //Application context identifier + u8 :6; + u8 sni:1; //Send notification indicator + u8 rci:1; //Release call indicator + u16 :1; + u16 si:1; //Sequence indicator + u16 segment:6; //APM segmentation indicator + u16 :1; + u16 slr:7; //Segmentation local reference + // APM-user information (For APM'98-user application only) // + ApmUser_struct apm_info; +} AppTrans_struct; + +typedef struct BackCallInd_struct { + u8 pres; + u8 val[2]; +} BackCallInd_struct; + +typedef struct CalledPtyNum_struct { + u8 pres; + u8 nai; + u8 inn; + u8 npi; + u8 numOfDigit; + u8 digit[MAX_BICC_DIGIT]; +} CalledPtyNum_struct; + +typedef struct CallingPtyNum_struct { + u8 pres; + u8 nai; + u8 ni; + u8 npi; + u8 apri; + u8 si; + u8 numOfDigit; + u8 digit[MAX_BICC_DIGIT]; +} CallingPtyNum_struct; + +typedef struct CallingPtyCat_struct { + u8 pres; + u8 val; +} CallingPtyCat_struct; + +/* defined in Q.850E */ +typedef struct CauseInd_struct { + u8 pres; + u8 codingStd; + u8 location; + u8 causeVal; + //diagnostic +} CauseInd_struct; + +typedef struct CicGrpSpv_struct { + u8 pres; + u8 val; +} CicGrpSpv_struct; + +typedef struct CollectCallReq_struct { + u8 pres; + u8 val; +} CollectCallReq_struct; + +typedef struct ConfTreatInd_struct { + u8 pres; + u8 val; +} ConfTreatInd_struct; + +typedef struct ConnNum_struct { + u8 pres; + u8 nai; + u8 npi; + u8 apri; + u8 si; + u8 numOfDigit; + u8 digit[MAX_BICC_DIGIT]; +} ConnNum_struct; + +typedef struct EventInfo_struct { + u8 pres; + u8 val; +} EventInfo_struct; + +typedef struct FacInd_struct { + u8 pres; + u8 val; +} FacInd_struct; + +typedef struct FwdCallInd_struct { + u8 pres; + u8 val[2]; +} FwdCallInd_struct; + +typedef struct GenericNumber_struct { + u8 pres; + u8 nqi; //Number qualifier indicator + u8 nai; + u8 ni; + u8 npi; + u8 apri; + u8 si; + u8 numOfDigit; + u8 digit[MAX_BICC_DIGIT]; +} GenericNumber_struct; + + +typedef struct GenericDigits_struct /* Generic Digits */ +{ + u8 pres; + u8 typeOfDigits; + u8 encodeScheme; + u8 numOfDigit; + u8* digits; +} GenericDigits_struct; + + +typedef GenericDigits_struct CorrelationId_struct; //R10 + +//typedef struct CorrelationId_struct { //R9 +// u8 pres; +// u8 digit[4]; //4 bytes +//}CorrelationId_struct; +typedef struct NatConnInd_struct { + u8 pres; + u8 val; +} NatConnInd_struct; + +typedef struct OrigCalledNum_struct { + u8 pres; + u8 nai; + u8 npi; + u8 apri; + u8 numOfDigit; + u8 digit[MAX_BICC_DIGIT]; +} OrigCalledNum_struct; + +typedef struct RangeStatus_struct { + u8 pres; + u8 range; + u8 status[BICC_STATUS_LEN]; +} RangeStatus_struct; + +typedef struct RedirgNum_struct { + u8 pres; + u8 nai; + u8 npi; + u8 apri; + u8 numOfDigit; + u8 digit[MAX_BICC_DIGIT]; +} RedirgNum_struct; + +typedef struct RedirInfo_struct{ + u8 pres; + u8 redInd; + u8 origRedirReason; + u8 redirCounter; + u8 redirReason; +}RedirInfo_struct; + +typedef GenericDigits_struct ScfId_struct; +/*typedef struct ScfId_struct { + u8 pres; + u8 nai; + u8 inn; + u8 npi; + u8 numOfDigit; + u8 digit[MAX_BICC_DIGIT]; +}ScfId_struct; +*/ +typedef struct SubseqNum_struct { + u8 pres; + u8 numOfDigit; + u8 digit[MAX_BICC_DIGIT]; +} SubseqNum_struct; + +typedef struct SusResInd_struct { + u8 pres; + u8 val; +} SusResInd_struct; + +typedef struct TransMedReq_struct { + u8 pres; + u8 val; +} TransMedReq_struct; + +typedef struct UserToUserInd_struct { + u8 pres; + u8 val; +} UserToUserInd_struct; + +typedef struct UserToUserInfo_struct { + u8 pres; + u8 len; + u8 val[129]; +} UserToUserInfo_struct; + +typedef struct CallDiverInfo_struct +{ + u8 pres; + u8 notifSubsOption; + u8 redirReason; +}CallDiverInfo_struct; + +typedef struct OptBackCallInd_struct +{ + u8 pres; + u8 inbandInfoInd; + u8 callDiverOccurInd; + u8 simpSegmInd; + u8 mlppUserInd; +}OptBackCallInd_struct; +/********************************************/ +/* Message structure (Q.1902-3E, section 7) */ +/********************************************/ +typedef struct BiccAcm_struct { + BackCallInd_struct backCall;//F + AppTrans_struct app; + CauseInd_struct cause; + ConfTreatInd_struct confTreat; + OptBackCallInd_struct optBackCall; + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; +} BiccAcm_struct; + +typedef struct BiccAnm_struct { + AppTrans_struct app; + BackCallInd_struct backCall; + ConfTreatInd_struct confTreat; + ConnNum_struct connNum; + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; +} BiccAnm_struct; + +typedef struct BiccApm_struct { + AppTrans_struct app; +} BiccApm_struct; + +typedef struct BiccCpg_struct { + EventInfo_struct eventInfo;//F + AppTrans_struct app; + BackCallInd_struct backCall; + CallDiverInfo_struct calldiver; + CauseInd_struct cause; + ConfTreatInd_struct confTreat; + ConnNum_struct connNum; + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; +} BiccCpg_struct; + +typedef struct BiccCgb_struct { + CicGrpSpv_struct cicGrpSpv;//F + RangeStatus_struct rangeStatus;//V +} BiccCgb_struct; + +typedef struct BiccCgba_struct { + CicGrpSpv_struct cicGrpSpv;//F + RangeStatus_struct rangeStatus;//V +} BiccCgba_struct; + +typedef struct BiccCgu_struct { + CicGrpSpv_struct cicGrpSpv;//F + RangeStatus_struct rangeStatus;//V +} BiccCgu_struct; + +typedef struct BiccCgua_struct { + CicGrpSpv_struct cicGrpSpv;//F + RangeStatus_struct rangeStatus;//V +} BiccCgua_struct; + +typedef struct BiccGrs_struct { + RangeStatus_struct rangeStatus;//V +} BiccGrs_struct; + +typedef struct BiccGra_struct { + RangeStatus_struct rangeStatus;//V +} BiccGra_struct; + +typedef struct BiccCon_struct { + BackCallInd_struct backCall;//F + AppTrans_struct app; + ConfTreatInd_struct confTreat; + ConnNum_struct connNum; + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; +} BiccCon_struct; + +typedef struct BiccIam_struct { + NatConnInd_struct natConn;//F + FwdCallInd_struct fwdCall;//F + CallingPtyCat_struct callingPtyCat;//F + TransMedReq_struct transMedReq;//F + CalledPtyNum_struct calledPtyNum;//V + AppTrans_struct app; + CallingPtyNum_struct callingPtyNum; + CollectCallReq_struct collectCallReq; + ConfTreatInd_struct confTreat; + CorrelationId_struct correlationId; + OrigCalledNum_struct origCalledNum; + RedirgNum_struct redirgNum; + RedirInfo_struct redirInfo; + ScfId_struct scfId; + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; + +} BiccIam_struct; + +typedef struct BiccRel_struct { + CauseInd_struct cause;//V + UserToUserInd_struct utuInd; + UserToUserInfo_struct utuInfo; +} BiccRel_struct; + +typedef struct BiccRlc_struct { + CauseInd_struct cause; +} BiccRlc_struct; + +typedef struct BiccRes_struct { + SusResInd_struct susRes;//F + //Optional +} BiccRes_struct; + +typedef struct BiccSus_struct { + SusResInd_struct susRes;//F + //Optional +} BiccSus_struct; + +typedef struct BiccSam_struct { + SubseqNum_struct subseqNum;//V + //Optional +} BiccSam_struct; + +typedef struct BiccMsg_struct +{ + +}BiccMsg_struct; + + +typedef union BiccMsg_union { + BiccAcm_struct acm; + BiccAnm_struct anm; + BiccApm_struct apm; + BiccCpg_struct cpg; + BiccCgb_struct cgb; + BiccCgba_struct cgba; + BiccCgu_struct cgu; + BiccCgua_struct cgua; + BiccGrs_struct grs; + BiccGra_struct gra; + BiccCon_struct con; + BiccIam_struct iam; + BiccRel_struct rel; + BiccRlc_struct rlc; + BiccRes_struct res; + BiccSus_struct sus; + BiccSam_struct sam; +} BiccMsg_union; + +#endif + diff --git a/omc/plat/bicc/src/include/q765_5e.h b/omc/plat/bicc/src/include/q765_5e.h new file mode 100644 index 0000000..b404cf0 --- /dev/null +++ b/omc/plat/bicc/src/include/q765_5e.h @@ -0,0 +1,100 @@ +#ifndef _q765_5E_H_ +#define _q765_5E_H_ +#include "define.h" + +#define AP_ACTION 0x01 +#define AP_BNCID 0x02 +#define AP_IWFADDR 0x03 +#define AP_CODECLIST 0x04 +#define AP_SINGLECODEC 0x05 +#define AP_BATCR 0x06 +#define AP_BNCCHR 0x07 +#define AP_BCINFO 0x08 +#define AP_BCTUNNEL 0x09 +#define AP_BCUI 0x0a +#define AP_SIGNAL 0x0b +#define AP_BRC 0x0c +#define AP_BRI 0x0d +#define AP_SIGNALTYPE 0x0e +#define AP_DURATION 0x0f + +/************************************************/ +/***** Encapsulated application information *****/ +/************************************************/ +typedef struct ActionInd_struct { + u8 pres; + u8 comp_info; + u8 val; +} ActionInd_struct; + +typedef struct BncId_struct { + u8 pres; + u8 comp_info; + u8 len; + u8 val[4]; +} BncId_struct; + +typedef struct IwfAddr_struct { + u8 pres; + //... +} IwfAddr_struct; + +typedef struct BncChr_struct { + u8 pres; + u8 comp_info; + u8 val; +} BncChr_struct; + +typedef struct BCTP_struct { + // BTCP (Q.1990) // + u8 :1; + u8 bvei:1; //BCTP Version Error Indicator + u8 :1; + u8 btcp_version:5; //BCTP Version Indicator + u8 :1; + u8 tpei:1; //Tunnelled Protocol Error Indicator + u8 tunnel_protocol:6; //Tunnelled Protocol Indicator + // IPBCP (Q.1970) // + u8 ipbcp_len; + u8 ipbcp_content[200]; +} BCTP_struct; + +typedef struct BcInfo_struct { + u8 pres; + u8 comp_info; + BCTP_struct bctp; +} BcInfo_struct; + +typedef struct BcTunnel_struct { + u8 pres; + u8 comp_info; + u8 val; +} BcTunnel_struct; + +typedef struct SignalType_struct { + u8 pres; + u8 comp_info; + u8 val; +} SignalType_struct; + +typedef struct Duration_struct { + u8 pres; + u8 comp_info; + u16 val; +} Duration_struct; + +typedef struct ApmUser_struct { + u8 :6; + u8 sni:1; //Send notification indicator + u8 rci:1; //Release call indicator + ActionInd_struct action; + BncId_struct bnc_id; + BncChr_struct bnc_chr; + BcInfo_struct bc_info; + BcTunnel_struct bc_tunnel; + SignalType_struct signal_type; + Duration_struct duration; +} ApmUser_struct; + +#endif + diff --git a/omc/plat/bicc/src/include/var_ext.h b/omc/plat/bicc/src/include/var_ext.h new file mode 100644 index 0000000..480534d --- /dev/null +++ b/omc/plat/bicc/src/include/var_ext.h @@ -0,0 +1,14 @@ +#ifndef _VAR_EXT_H_ +#define _VAR_EXT_H_ + +#include "define.h" +#include "biccif.h" +#include "inc.h" + + +extern u8 Bicc_Version[4]; +extern BiccData_struct Bicc_Data; +extern BiccTimer_struct Timer_Data; +extern BiccReadPrim_union readPrim_union[BICC_MAX_PORT]; +extern BiccWritePrim_union writePrim_union[BICC_MAX_PORT]; +#endif diff --git a/omc/plat/debug/.copyarea.db b/omc/plat/debug/.copyarea.db new file mode 100644 index 0000000..b8730bc --- /dev/null +++ b/omc/plat/debug/.copyarea.db @@ -0,0 +1,9 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\debug +2 +5 +3:doc|2|0|0|0|c92966b9bfa411dc8511001c23e19543|0 +2:ut|2|0|0|0|ccc96799bfa411dc8511001c23e19543|0 +3:src|2|0|0|0|ca59670dbfa411dc8511001c23e19543|0 +8:Makefile|1|11d70a3eb18|b39|e7adc250|c9c966f1bfa411dc8511001c23e19543|0 +3:lib|2|0|0|0|c92966d5bfa411dc8511001c23e19543|0 diff --git a/omc/plat/debug/Makefile b/omc/plat/debug/Makefile new file mode 100644 index 0000000..5f7c859 --- /dev/null +++ b/omc/plat/debug/Makefile @@ -0,0 +1,98 @@ + +##----------------------------------------------------------## +## ## +## Universal Makefile for module template : V1.6.3 ## +## ## +## Created : Wei Liu 07/04/11 ## +## Revision: [Last]Wei Liu 07/07/07 ## +## ## +##----------------------------------------------------------## + +##---------------------------------------------------------------------## +##-------------------------------------- +## +## Project correlation(Customer define) +## +##-------------------------------------- + +## MODULE= [Module Name] +## TYPE = app/plat => Module Type + +## DBUG_FLAGS_ADD = [Module Define Gcc Flags for Debug ] +## DBUG_FLAGS_ADD = [Module Define Gcc Flags for Release] + +## BUILD = lib/exef => Output file format +## CFG = debug/release => Build Configuration + +## SRC_PATH = [Source file path] +## INC_PATH = [Include file path] +## APP_PATH = [App Module path] +## PLT_PATH = [Plat Module path] + +## PLT_LIB = [Needed plat lib for Link] => just for test or wxc2main +## APP_LIB = [Needed app lib for Link] => just for test or wxc2main +## LIB_ADD = [Needed Extend lib for Link] => just for test or wxc2main + +## PLT_LIB e.g. = haepub fsm mng proto kernel aif mgc mgcp sip rtp \ +## 8ecp bicc smpp xapp tcap mtp3 m2ua \ +## snmp iptrans debug sccp public +## +## APP_LIB e.g. = msc vlr ssf hlr ae pps mnp smsc vms aas +## LIB_ADD e.g. = -liba3a8 -lm + +## OBJ_ADD = [Extend third party object files needed] +## TEST_OBJ_PATH = [module object files Path for test ] => just for test +##---------------------------------------------------------------------## + +MODULE = debug +TYPE = plat + +DBUG_FLAGS_ADD = -DDEBUG +RELS_FLAGS_ADD = + +##Default commonly as below + +BUILD = lib +CFG = debug + + +PLT_LIB = + +APP_LIB = +LIB_ADD = + +SRC_PATH = ./src +INC_PATH = ./src/include +PLT_PATH = ../../plat +APP_PATH = ../../mss + +OBJ_ADD = +TEST_OBJ_PATH = + +PREPROC_CMD = +POSTPROC_CMD = + +##---------------------------------------------------------------------## +##-------------------------------------- +## +## Make configuration(Customer define) +## +##-------------------------------------- + +## CCFLAG_SWITCH = on/off => gcc flag show on/off +## COVER_NEED = yes/no => PTF cover report needed +## COVER_REPORT_PATH = [path ] => PTF cover report path + +CCFLAG_SWITCH = off +COVER_NEED = no +COVER_REPORT_PATH = ./output + +##---------------------------------------------------------------------## + + +##-------------------------------------- +## +## include makefile.rules (Do not change) +## +##-------------------------------------- +include Makefile.rules diff --git a/omc/plat/debug/lib/libdebug.a b/omc/plat/debug/lib/libdebug.a new file mode 100644 index 0000000000000000000000000000000000000000..3415bc0570f3fdef608ffe076083235e4a38cdb2 GIT binary patch literal 565778 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

5#dPJBgmR{C1(tZG`&T2o&ip)XO5`CjbI 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�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 z
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 literal 0 HcmV?d00001 diff --git a/omc/plat/debug/src/.copyarea.db b/omc/plat/debug/src/.copyarea.db new file mode 100644 index 0000000..427880c --- /dev/null +++ b/omc/plat/debug/src/.copyarea.db @@ -0,0 +1,6 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\debug\src +2 +2 +7:include|2|0|0|0|caf96745bfa411dc8511001c23e19543|0 +7:debug.c|1|11d70a3ec9e|8ae65|9fc7892a|e624829e6cf311dd91a5001c23e19543|0 diff --git a/omc/plat/debug/src/debug.c b/omc/plat/debug/src/debug.c new file mode 100644 index 0000000..965f9eb --- /dev/null +++ b/omc/plat/debug/src/debug.c @@ -0,0 +1,15649 @@ +/* +* ******************************************** +* debug.c * +* Author: Li Long * +* Verified by Liu Zhiguo 2003-04-21 * +* Verified by Wang Jian 2005-01-17 * +* Verified by liu Wei 2005-05-15 * +* 2005-05-15 * +* Function: * +* 1. Monitor other modules status; * +* 2. Use serial port; * +* 3. Use telnet; * +* 4. Use SNMP Agent set MIB tree * +* 5. SNMP sernior agent * +* 6. Custmor setting menu * +* ******************************************** +*/ + + +/* +printf("\033[1;33m Hello World. \033[0m \n"); + +ÑÕÉ«ÈçÏÂ: +none = "\033[0m" +black = "\033[0;30m" +dark_gray = "\033[1;30m" +blue = "\033[0;34m" +light_blue = "\033[1;34m" +green = "\033[0;32m" +light_green -= "\033[1;32m" +cyan = "\033[0;36m" +light_cyan = "\033[1;36m" +red = "\033[0;31m" +light_red = "\033[1;31m" +purple = "\033[0;35m" +light_purple = "\033[1;35m" +brown = "\033[0;33m" +yellow = "\033[1;33m" +light_gray = "\033[0;37m" +white = "\033[1;37m" + + +×Ö±³¾°ÑÕÉ«·¶Î§: 40--49 ×ÖÑÕÉ«: 30--39 + 40: ºÚ 30: ºÚ + 41: ºì 31: ºì + 42: ÂÌ 32: ÂÌ + 43: »Æ 33: »Æ + 44: À¶ 34: À¶ + 45: ×Ï 35: ×Ï + 46: ÉîÂÌ 36: ÉîÂÌ + 47: °×É« 37: °×É« +ANSI¿ØÖÆÂë: +QUOTE: + \033[0m ¹Ø±ÕËùÓÐÊôÐÔ + \033[1m ÉèÖøßÁÁ¶È + \03[4m Ï»®Ïß + \033[5m ÉÁ˸ + \033[7m ·´ÏÔ + \033[8m ÏûÒþ + \033[30m -- \033[37m ÉèÖÃǰ¾°É« + \033[40m -- \033[47m ÉèÖñ³¾°É« + \033[nA ¹â±êÉÏÒÆnÐÐ + \03[nB ¹â±êÏÂÒÆnÐÐ + \033[nC ¹â±êÓÒÒÆnÐÐ + \033[nD ¹â±ê×óÒÆnÐÐ + \033[y;xHÉèÖùâ±êλÖà + \033[2J ÇåÆÁ + \033[K Çå³ý´Ó¹â±êµ½ÐÐβµÄÄÚÈÝ + \033[s ±£´æ¹â±êλÖà + \033[u »Ö¸´¹â±êλÖà + \033[?25l Òþ²Ø¹â±ê + \33[?25h ÏÔʾ¹â±ê + + + +\033=\x1b +*/ + +#include "./include/debug.h" +#include "../../public/src/include/pub_log.h" +#include "../../public/src/include/pub_debug.h" + +// by simon at 23/9/25 +struct debug_shm_struct *debug_shm_ptr; + +/*@ignore@*/ +static char ascii[16] = + { + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x41,0x42,0x43,0x44,0x45,0x46 + }; + +static char title_top[] = {0xc,0x1b,'[','H',0x1b,'[','2','J','\0'}; + +static char prompt_line25[] = {0x1b,'[','2','5','H',0x1b,'[','0','J','>','\0'}; + +static char max_access[7][32]={"invalid", "not-accessible", "accessible-for-notify", "read-only","read-write","read-create "," write-only"}; + +static char title1[TITLE_CHAR*DEBUG_MAX_PAGE] = "\0"; // show the menu page from conf file +char title1_show[TITLE_CHAR*DEBUG_MAX_PAGE] ="\0"; // show the menu page + +unsigned int com_port; +char recser_buf[SERIAL_BUF_LEN]; +int recserbuf_h; +int recserbuf_t; +char sendser_buf[SERIAL_BUF_LEN]; +int sendserbuf_h; +int sendserbuf_t; + +INSTANCE_ARR curr_instance_arr[256]; +char instance_eable_name[80]; +int temp_instance; +BYTE curr_module; +BYTE host_group=0; +debug_snmp_agent snmp_agent_packet; +debug_snmp_agent snmp_agent_packet1; +DWORD debug_mem_size; +DWORD debug_alloc_mem; + +BYTE remark_meet_lf=0; + +debug_shm_struct debug_shared_memory; + +DWORD heap_remark_index; +void *heap_remark_curr; +void *heap_remark; +char heap_work_buf[300*1024]; + +char curr_instance_value[256]; +char set_ins_value[256]; +BYTE none_instance=0; +BYTE set_str_len=0; +BYTE set_all=0; +char set_val_str[256] ; +BYTE SendTelnetFlag=0; +BYTE disp_main_flag; // display the main page +BYTE disp_sub_module_flag; // current module +BYTE disp_page_flag; // current page of each module +BYTE disp_main_page_num; //main page number +BYTE command_flag; // whether in command mode +BYTE first_page; +BYTE bind_num; +BYTE comp_disp[500]; +BYTE m_state; +BYTE m_state_sub_module; +WORD title_top_pt; +WORD title_pt; +WORD title_sub_module_pt; +WORD ascii_in_pt; +WORD space_counter; +WORD row_ptr,col_ptr; +int list_flag,list_start,list_end; +int show_all_value; +int show_type; +int show_expend; +int show_range; +int get_show_state; +int save_flag; +int show_empty=0; +int del_flag; +int expend_view=0; +int list_field=0; +int show_snmp_state; +int show_list; +int list_once; +BYTE set_after_get=0; +BYTE show_field=0; +DWORD list_field_arr[64]; +BYTE Module_Count_Index=0; +BYTE Init_Page=0; +BYTE send_char_flag=0; + +BYTE debug_agent_index; +BYTE snmp_agent_flag=0; // 0 idel 1 get 2 set + +BYTE *disp_ptr; +WORD disp_length;/* displaying length of each row */ +WORD disp_index; /* row number */ +WORD char_ptr; /* how many hex code in a row, < disp_length */ +WORD hex_state; /* the state in function disp_hex */ +BYTE cursor_p[8]; /* control characters as 'ESC[**;**H' */ + +WORD ascii_out_ph,ascii_out_pt; +static BYTE ascii_out_array[MAX_ASCII_LEN]; +static BYTE ascii_in_array[MAX_ASCII_LEN]; + +static BYTE debug_ascii_in_array[MAX_ASCII_LEN]; +static BYTE debug_ascii_out_array[MAX_ASCII_LEN]; +int debug_ascii_out_ph=0; +int debug_ascii_out_pt=0; + + + +BYTE list_msg[128]; + +static BYTE test_array[20]; +WORD t10s_flag; +WORD ascii_out_len; +DWORD debug_counter; +BYTE debug_heartbeat[8]; +char time_buf[64] = "\0"; +char hostip_buf[64] = "\0"; +char current_timer[64]="\0"; + + +BYTE bind_index; +BYTE get_state; +BYTE set_state; +DWORD set_val; + + +DWORD Local_IP; +DWORD Peer_IP[16]; +char Remote_Host_Name[16][64]; +char Remote_Host_IP[16][16]; +BYTE IP_Selected[16]; +BYTE ip_num; +BYTE ip_index; +snmp_pdu send_msgbuf,recv_msgbuf; +snmp_addr send_addr, recv_addr; +WORD t5s_flag; +WORD t100ms_flag; +mib_node_param *param_node; +char paraname[128]; +mib_node *temp_mib_node; +WORD mib_line_count; +mib_node temp_leaf_node; + + +DWORD root_oid[32] = {1,3,6,1,4,1}; //SNMPv2 +DWORD cur_oid[32] = {1,3,6,1,4,1,1373,1,3}; +BYTE root_oid_len = 6; +WORD treehost; +BYTE debug_remark_flag; +WORD debug_remark_ptr; + +/* by simon at 23/9/25 */ +mib_node *mib_root_node; +mib_node *mib_curr_node; +menu_node *menu_root_node; +menu_node *menu_curr_node; +mib_node mib_nodes[MIB_MAX_NODES]; + +char file_name[128]; +FILE *fp_prt; +long int timeuse, max_time; +struct timeval tv_start, tv_end; + +menu_node menu_nodes[MENU_MAX_NODES]; +mib_child_node mib_child_nodes[MIB_MAX_CHILD_NODES]; + +debug_snmp_agent debug_snmp_agent_buf[MAX_PACKET_NUM]; +/* end by simon */ + +struct _wxc2_debug_info wxc2_debuginfo; + +//mib_node *mib_root_node; +//mib_node *mib_curr_node; +WORD mib_node_index=0; +WORD menu_node_index=0; +WORD mib_child_node_index; +int mib_type_num; + +BYTE leaf_compute_field_num=0; +WORD mib_param_select_index; +WORD mib_param_input_index; +WORD mib_node_param_index; + +BYTE debug_cfg; //0: command status, 1: configure status +BYTE debug_log_all; // 0: log none , 1: log all +BYTE debug_log_error_on; //0: log error off, 1: log erro on +BYTE debug_module_num; //if in command status, debug_module_num shows which module's ascii in buf the command send to +BYTE debug_cfg_end; // 0: configure command not over, 1: configure command over +int debug_get_all_value; // 0: not get all value, or means how much children value have to get + +WORD gobal_module_index; +BYTE node_save_flag; +module_command_save_flag node_save_module; + +mib_subsys_module subsys_module[MIB_SUBSYS_MODULE_MAX_NUM]; +mib_host module_host[MIB_HOST_MAX_NUM]; +module_command_save_flag module_save_flag[MIB_SUBSYS_MODULE_MAX_NUM]; + + +mib_param_select mib_param_select_array[MIB_MAX_PARAM_SELECTS]; +mib_param_input mib_param_input_array[MIB_MAX_PARAM_INPUTS]; +mib_node_param mib_node_param_array[MIB_MAX_NODE_PARAMS]; + +mibfile_imports_data imports_data; +mibfile_module_data module_data; +mibfile_object_data object_data; +mibfile_type_data type_data; + +BYTE set_ok_once=0; + + +char *field_input_type[7]={"toDec high 0","KeepHex high 0","KeepHex low 0", + "KeepHex Low E","KeepHex Low F","ToAscii Low 0","KeepAscii Low F"}; + + +//add for compute field +BYTE compute_field_num; //for all compute +compute_field compute_field_arr[16]; //for all compute +compute_list compute_field_list[6]; //unit list +BYTE compute_list_num; //unit list//curr node compute_list_num=0 +char OID_name_str[5][65]; //unit read +DWORD OID_val[5][32]; //unit read +BYTE OID_index=0; //unit read +BYTE line_index; //unit read +BYTE print_line_index=0;; +BYTE compute_field_list_index; +compute_field compute_curr_unit; //unit read +BYTE read_syntax_nor_list=0; //unit read +BYTE compute_state=0; +WORD compute_curr_instance; +mib_node *temp_compute_node; +char temp_value[256][32]; +BYTE print_once=0; +//0 idle +//1 print once(list all once) +//2 print again +BYTE field_compute_state=0; +//field_compute_state +//0 idle +//1 find compute field +//2 translate [v] [l] +//3 list curr node self +//4 list "OID" +//5 list over +//6 translate [c] [p] +//7 translate over +//8 print over + +//end of define for compute field + + + +struct timeval tv_start_rt, tv_end_rt; +mib_node *agent_tmp_node; +menu_node *tmp_menu_node; + + +BYTE ShowRegister=0; +BYTE debug_busy_alarm=0; + + +static char switch_stat[][32] = {"off", "on"}; + +///////////////////////////////////declaration//////////////////////// +void debug_init_serial(); + +void debug_init_shm(); + +void debug_init_var(); + +void debug_ascii_in_cmd_handle(); + + + + +void debug_read_main_title(); + +void debug_change_title1(); + +void debug_module_page(int count); + +void debug_disp_hex(); + +void debug_set_para(); + + + + +int OBJECT_found(char *name, FILE *fp, mib_node *father_node_ptr, DWORD *last_node_oid); + + +int BEGIN_found(FILE *fp); + +int TYPE_found(char *name, FILE *fp, mib_node *father_node_ptr, DWORD +*last_node_oid); + +mib_node *IMPORTS_found(FILE *fp); + +int MODULE_found(char *name, FILE *fp, mib_node *father_node_ptr, DWORD +*last_node_oid); + +int Analyze_Leaf_Description(FILE * fp, mib_node * leaf_node); + +//int analyze_setTemplate(FILE *fp, mib_node *father_node_ptr); + +int MIB_create_tree(char *conf_dir, char *conf_file); + +//int MIB_create_leaves(char *conf_dir, char *sysConf_file, char *param_list_file); + +mib_child_node *create_mib_child_node(char *name, DWORD oid); + +mib_node *create_mib_node(char *name, BYTE oid_len, DWORD *oid, WORD total_instance); + + +mib_node *create_node(char *line, char *nod_name, int instance, mib_node *father_ptr, DWORD *last_node_oid); + +int register_node(mib_node *mib_node_ptr, DWORD *oid, BYTE oid_len); + +int register_child_node(mib_node *mib_node_ptr, mib_child_node *mib_child_node_ptr); + + + + +void debug_mmi_remark(); + + +void debug_mmi_log_status(); + +int debug_mmi_log(char *log_str); + +void debug_mmi_option(char *str); + +int debug_mmi_select_host(char *host_str); + + + +void show_node(mib_node *node_ptr,char *separation); + +int find_OID(int obj_num, char *sysConf_file_name, DWORD *OID); + + +void debug_mmi_view(); + + +void pick_name(char *str_ptr, char *word_ptr,char *temp_ch); + + +void debug_send_serial(); + +int debug_send_char(BYTE ch); + +void debug_read_serial(); + +int debug_read_char(); + +void debug_recv_cmd(); + + + +int debug_mmi_cd(char *path); + +int debug_mmi_contents(char *str); + +int debug_mmi_parent(); + +int debug_mmi_child(char *name); + +int debug_mmi_setins(char *ins); + +void debug_mmi_save(); + +void register_host(); + +int debug_mmi_pwd(); + +int debug_mmi_ip(char *ips); + +void debug_mmi_list(); + +void register_instance(); + +void debug_mmi_create(char *str); + +void debug_mmi_del(char *str); + +void debug_mmi_option(char *str); + +void debug_mmi_remark(); + +void debug_mmi_tree(mib_node *node_ptr,char *separation, BYTE node_levels); + +void debug_mmi_find_host(); + +int debug_mmi_show_host(); + +void debug_mmi_cmm_help(); + +void debug_mmi_cfg_help(); + +int debug_mmi_get(char *child_name); + +int debug_mmi_set(char *set_str); + +int debug_mmi_get_all(); + +int debug_snmp_get(BYTE oidlen,DWORD *oid,BYTE *data_ptr,BYTE *vartype); + +int debug_snmp_set(BYTE oidlen,DWORD *oid,BYTE *data_ptr,WORD data_len); + +void debug_snmp_get_rt(); + +void debug_snmp_set_rt(); + + +int default_value(DWORD *oid,BYTE oid_len,char *value);//,char *default_Value); + +int debug_mmi_select_host(char *host_str); + + + + + +void debug_set_currenttime(); + +void del_space(char *str,BYTE type); + +int read_line(FILE *fp, char *line_ptr); + +int read_begin(FILE *fp, char *stop_ch); + +int read_until(FILE *fp, char *data_ptr, char *stop_ch); + +int read_part(FILE *fp, char *data_ptr,char *start_ch, char *stop_ch); + +char *pick_first_word(char *str_ptr, char *word_ptr); + +int take_str(char *data_str, FILE *fp, char *data_ptr); + +void debug_color_out(int attr,int color,int bg,char *str); + +void help_cmm(int index,char *str1,char *str2); + +void formatstr(int len,char *str,BYTE type); + +void switchchar(char *out_text,BYTE num); + +void debug_ascii_out_proc(const char *str_ptr); + +DWORD my_pow(int x, int y); // y \u4E2A x \u76F8\u4E58 + +BYTE test_str(char *str,BYTE type); + +void AsciiToRbcd (BYTE *bcd_buf, const char *ascii_buf, int len); + +void strpcat(char *dest_str,DWORD *dest_p,const char *src_str); + +//void BcdToAscii (char *ascii_buf, const BYTE *bcd_buf, int len); + + +int create_menu_tree(char *conf_dir,char *menu_page,mib_node *sys_node); + +void debug_mmi_view(); + +void debug_mmi_mcd(char *str); + +void main_menu(char *str); + +int debug_send_string(const char *str_send); + + + + +BYTE create_compute_field(FILE * fp, mib_node * node_ptr, BYTE field_id,char *name); + +void translate_compute_field(); + +BYTE take_compute_value(char *str,char *temp_value); + +void compute_field_WatchDog(); + +void print_compute_field(); +extern inline char *StrToLower ( char *pStr ); +extern inline char *StrTrimCh ( char *pSrc , char cTrim ); + + + +//////////////////////////////////end of declaration////////////////// + + + + +void debug_netcap_start() +{ + char str[] = "net cap start"; + int i; + + NcStart(0,0); + for(i=0; i < MODULE_COUNT; i++) + { + if( (i !='n'-'a') && (debug_shm_ptr->module_d[i].ascii_in_set_flag == 1)) + { + debug_shm_ptr->module_d[i].ascii_in[0] = 1; + strcpy(debug_shm_ptr->module_d[i].ascii_in+1,str); + } + } +} + +void debug_netcap_stop() +{ + char str[] = "net cap stop"; + int i; + + NcStop(); + for(i=0; i < MODULE_COUNT; i++) + { + if( (i !='n'-'a') && (debug_shm_ptr->module_d[i].ascii_in_set_flag == 1)) + { + debug_shm_ptr->module_d[i].ascii_in[0] = 1; + strcpy(debug_shm_ptr->module_d[i].ascii_in+1,str); + } + } +} + + +////////////////////////////////////Intial//////////////////////////// +/* +* +* Fun: debug_read_conf +* +* Desc: debug read conf +* +* Ret: void +* +* File: debug.c +* +*/ +void debug_read_conf () +{ + char file_name[32]; + char *p, *q, line[512]; + BYTE conf_flag = 0; + FILE *fp_conf; + DIR *pdir; + + strcpy ( file_name, "./conf/debug.conf" ); + + wxc2_debuginfo.mmi_switch = 0; //off + + if( ( pdir = opendir ( MIB_FILES_DIR ) ) == NULL && errno == ENOENT ) + { + return; + } + else + { + + closedir ( pdir ); + if( ( fp_conf = fopen ( file_name, "rw" ) ) == NULL ) + { + printf ( "[debug] Error: cannot open debug conf_file: [%s].\r\n", file_name ); + return; + } + } + + while ( !feof ( fp_conf ) ) + { + if( fgets ( line, 256, fp_conf ) == NULL ) + { + break; + } + line[128] = '\0'; + p = line; + while ( *p == ' ' ) + p++; + if( ( q = strstr ( p, "//" ) ) != NULL ) + *q = '\0'; + if( strstr ( p, "System Type" ) ) + { + p = p + 11; + if( ( p = strchr ( p, '=' ) ) && ( q = strchr ( p, ';' ) ) ) + { + p++; + *q = '\0'; + + if( strstr ( p, "CDMA" ) ) + { + wxc2_debuginfo.sys_type = 1; + conf_flag |= 0x01; + } + else if( strstr ( p, "GSM" ) ) + { + wxc2_debuginfo.sys_type = 2; + conf_flag |= 0x01; + } + else if( strstr ( p, "SSW" ) ) + { + wxc2_debuginfo.sys_type = 3; + conf_flag |= 0x01; + } + } + + } + else if( strstr ( p, "MMI Switch" ) ) + { + p = p + 10; + if( ( p = strchr ( p, '=' ) ) && ( q = strchr ( p, ';' ) ) ) + { + p++; + *q = '\0'; + + if( strstr ( p, "ON" ) || strstr ( p, "On" ) || strstr ( p, "on" ) ) + { + wxc2_debuginfo.mmi_switch = 1; + conf_flag |= 0x02; + } + else if( strstr ( p, "off" ) || strstr ( p, "Off" ) || strstr ( p, "OFF" ) ) + { + wxc2_debuginfo.mmi_switch = 0; + conf_flag |= 0x02; + } + } + + } + + } + fclose ( fp_conf ); + if( conf_flag != 0x03 ) + { + printf ( "[debug] Error: debug conf_file ([%s])is incorrect .\r\n", file_name ); + return; + } + return; + +} + +/* +* +* Fun: debug_init +* +* Desc: debug intial function +* +* Ret: void +* +* File: debug.c +* +*/ +extern void WxcDump(int nSigno); + +void debug_init() +{ + + + int i,j; + char temp_str[64]; + char file_name[64]; + FILE *fp_conf; + mib_node *sys_base_node; + +// signal(SIGSEGV, &WxcDump); + NcInit(); + + //heap_remark=calloc(sizeof(char),1024*300); + heap_remark=heap_work_buf; + heap_remark_index=0; + heap_remark_curr=heap_remark; + + for(i=0;ih_addr_list)); + sprintf(hostip_buf,"\x1b[22;10Hlocal ip: %s\x1b[22;35Hhost name: %s",host_ip,hostname); + Local_IP = ((struct in_addr *)(*host->h_addr_list))->s_addr; + Peer_IP[0] = Local_IP; + for(i=1; i<16; i++) + { + Peer_IP[i] = 0; + IP_Selected[i] = 1; + } + } + } + + + debug_counter = 0; + show_all_value=0; + show_type=0; + show_expend=1; + show_range=0; + get_show_state=0; + show_list=1; + + + + show_snmp_state=0; + list_once=0; + for(i=0;i<=255;i++) + { + curr_instance_arr[i].ins=i; + curr_instance_arr[i].eable=0; + } + for(i=0;i<64;i++) + { + list_field_arr[i]=0xFF; + } + list_flag=list_start=list_end=0; + debug_get_all_value = 0; + debug_cfg = 0; + debug_cfg_end = 1; + debug_log_all = 0; + debug_log_error_on = 0; + debug_module_num = 13; + t10s_flag = 0; + t5s_flag=0; + t100ms_flag = 0; + get_state = 0; + set_state = 0; + ip_num=0; + ip_index=0; + set_val = 0; + param_node = NULL; + bind_num=0; + + debug_heartbeat[0] = 3; + debug_heartbeat[1] = 3; + debug_heartbeat[2] = 2; + debug_heartbeat[3] = 1; //status 1-normal 0-abnormal + debug_heartbeat[4] = 0; //module count + debug_heartbeat[5] = 0; //sub module status + debug_heartbeat[6] = 0; //sub module status + debug_heartbeat[7] = 0; + first_page=1; + disp_main_flag = 0; //--lw + disp_main_page_num = 0; + treehost=1; //--lw + disp_sub_module_flag = 13; + disp_page_flag = 0; + m_state = 0; + command_flag = 0; + ascii_out_len = 0; + strcpy(test_array,""); + ascii_in_pt = 1; + ascii_out_ph = 0; + ascii_out_pt = 0; + title_top_pt = 0; + cursor_p[0] = 0x1b; + cursor_p[1] = '['; + cursor_p[4] = ';'; + cursor_p[7] = 'H'; + memset(comp_disp,0x80,500); + for(i = 0;i < MODULE_COUNT;i ++) + { + strcpy(debug_shm_ptr->module_d[i].name,""); + strcpy(debug_shm_ptr->module_d[i].status,""); + strcpy(debug_shm_ptr->module_d[i].version,""); + debug_shm_ptr->module_d[i].maxpage = 0; + debug_shm_ptr->module_d[i].ascii_in_set_flag = 0; + debug_shm_ptr->module_d[i].ascii_out_set_flag = 0; + debug_shm_ptr->module_d[i].ascii_in = NULL; + debug_shm_ptr->module_d[i].ascii_out = NULL; + for(j = 0;j < PAGE_COUNT;j ++) + { + strcpy(debug_shm_ptr->module_d[i].page_d[j].title,title_top); + debug_shm_ptr->module_d[i].page_d[j].pointer_set_flag = 0; + for (k = 0;k < LINE_COUNT;k ++) + { + debug_shm_ptr->module_d[i].page_d[j].line_d[k].length = 0; + debug_shm_ptr->module_d[i].page_d[j].line_d[k].pt_vartype = 0; + debug_shm_ptr->module_d[i].page_d[j].line_d[k].pointer = NULL; + } + } + debug_shm_ptr->module_d[i].seqid_h = 0; + debug_shm_ptr->module_d[i].seqid_t = 0; + for (j = 0;j < DEBUG_SEQID_LEN;j ++) + strcpy(debug_shm_ptr->module_d[i].omc_outbuf[j],""); + } + debug_shm_ptr->TelnetSendData.telsend_datah = 0; + memset(debug_shm_ptr->TelnetSendData.telsend_data,0,sizeof(BYTE)*TELNET_SEND_BUF_LEN); + memset(debug_snmp_agent_buf,0,8*sizeof(debug_snmp_agent)); + memset(&snmp_agent_packet,0,sizeof(debug_snmp_agent)); +} + +////////////////////////////End of Intial/////////////////////////////// + + + + + +////////////////////////////////////Main///////////////////////////// +/* +* +* Fun: debug_rt +* +* Desc: debug main function +* +* Ret: void +* +* File: debug.c +* +*/ +void debug_rt() +{ + register int jj,kk; + int ii; + int otherAsciiOutLen=0; + int localAsciiOutLen=0; + struct debug_module_struct *module_ptr; + //int i; + + + if(Init_Page) + { + if( disp_sub_module_flag == ('n' - 'a') ) // in debug_module + { + + //receive the ascii out buffer of debug module + module_ptr = (struct debug_module_struct *) &debug_shm_ptr->module_d['n'-'a']; + if (module_ptr->ascii_out_set_flag == 1) + { + if (debug_ascii_out_ph < debug_ascii_out_pt) + otherAsciiOutLen = MAX_ASCII_LEN - 1 + debug_ascii_out_ph - debug_ascii_out_pt; + else + otherAsciiOutLen = debug_ascii_out_ph - debug_ascii_out_pt; + + if (ascii_out_ph < ascii_out_pt) + localAsciiOutLen = MAX_ASCII_LEN - 1 + ascii_out_ph - ascii_out_pt; + else + localAsciiOutLen = ascii_out_ph - ascii_out_pt; + if ((otherAsciiOutLen > 0) && (otherAsciiOutLen+localAsciiOutLen < MAX_ASCII_LEN)) + { + kk = ascii_out_ph; + for (jj = 0;jj < otherAsciiOutLen;jj ++) + { + ascii_out_array[kk] = *(module_ptr->ascii_out+debug_ascii_out_pt); + kk = (kk + 1) % MAX_ASCII_LEN; + debug_ascii_out_pt=(debug_ascii_out_pt+1) % MAX_ASCII_LEN; + } + ascii_out_ph = kk % MAX_ASCII_LEN; + } + else if((localAsciiOutLen+MAX_SEND_CHAR_NUM 0)) + { + kk = ascii_out_ph; + for (jj = 0;jj < MAX_SEND_CHAR_NUM;jj ++) + { + ascii_out_array[kk] = *(module_ptr->ascii_out+debug_ascii_out_pt); + kk = (kk + 1) % MAX_ASCII_LEN; + debug_ascii_out_pt=(debug_ascii_out_pt+1) % MAX_ASCII_LEN; + } + ascii_out_ph = kk % MAX_ASCII_LEN; + } + + } + //0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 15 + //a b c d e f g h i j k l m n o p q r s t u v w x y z + //a b c d e f g h i j k l m n o p r s t u v w y z + if(debug_cfg == 0 && Init_Page==2) // in debug cmm status, receive the ascii out buffer of all the other modules + { + for(ii=0;ii< MODULE_COUNT;ii++) + { + if(ii=='l'-'a' || ii=='a'-'a') + continue; + module_ptr = (struct debug_module_struct *) &debug_shm_ptr->module_d[ii]; + if (module_ptr->ascii_out_set_flag == 1) + { + otherAsciiOutLen=strlen(module_ptr->ascii_out)+strlen(module_ptr->name)+5; + if (disp_sub_module_flag != ii) + { + + if (ascii_out_ph < ascii_out_pt) + localAsciiOutLen = MAX_ASCII_LEN - 1 + ascii_out_ph - ascii_out_pt; + else + localAsciiOutLen = ascii_out_ph - ascii_out_pt; + if ((otherAsciiOutLen > (strlen(module_ptr->name)+5)) && (otherAsciiOutLen+localAsciiOutLen < MAX_ASCII_LEN)) + { + + ascii_out_array[ascii_out_ph] = '\r'; + ascii_out_ph = (ascii_out_ph + 1) % MAX_ASCII_LEN; + ascii_out_array[ascii_out_ph] = '\n'; + ascii_out_ph = (ascii_out_ph + 1) % MAX_ASCII_LEN; + ascii_out_array[ascii_out_ph] = '['; + ascii_out_ph = (ascii_out_ph + 1) % MAX_ASCII_LEN; + for (jj = 0;jj < strlen(module_ptr->name);jj ++) + { + ascii_out_array[ascii_out_ph] = module_ptr->name[jj]; + ascii_out_ph = (ascii_out_ph + 1) % MAX_ASCII_LEN; + } + ascii_out_array[ascii_out_ph] = ']'; + ascii_out_ph = (ascii_out_ph + 1) % MAX_ASCII_LEN; + ascii_out_array[ascii_out_ph] = ':'; + ascii_out_ph = (ascii_out_ph + 1) % MAX_ASCII_LEN; + ascii_out_array[ascii_out_ph] = '\r'; + ascii_out_ph = (ascii_out_ph + 1) % MAX_ASCII_LEN; + ascii_out_array[ascii_out_ph] = '\n'; + ascii_out_ph = (ascii_out_ph + 1) % MAX_ASCII_LEN; + + kk = ascii_out_ph; + for (jj = 0;jj < otherAsciiOutLen;jj ++) + { + ascii_out_array[kk] = module_ptr->ascii_out[jj]; + module_ptr->ascii_out[jj] = '\0'; + kk = (kk + 1) % MAX_ASCII_LEN; + } + ascii_out_ph = kk % MAX_ASCII_LEN; + } + } + } + + } + } + } + else + { + for (ii = 0;ii < MODULE_COUNT;ii ++) // not in debug_module + { + module_ptr = (struct debug_module_struct *) &debug_shm_ptr->module_d[ii]; + if (module_ptr->ascii_out_set_flag == 1) + { + otherAsciiOutLen = strlen(module_ptr->ascii_out); + if (disp_sub_module_flag == ii) + { + if (ascii_out_ph < ascii_out_pt) + localAsciiOutLen = MAX_ASCII_LEN - 1 + ascii_out_ph - ascii_out_pt; + else + localAsciiOutLen = ascii_out_ph - ascii_out_pt; + if ((otherAsciiOutLen > 0) && (otherAsciiOutLen+localAsciiOutLen < MAX_ASCII_LEN)) + { + kk = ascii_out_ph; + for (jj = 0;jj < otherAsciiOutLen;jj ++) + { + ascii_out_array[kk] = module_ptr->ascii_out[jj]; + module_ptr->ascii_out[jj] = '\0'; + kk = (kk + 1) % MAX_ASCII_LEN; + } + ascii_out_ph = kk % MAX_ASCII_LEN; + } + } + if ((otherAsciiOutLen > 0) && (otherAsciiOutLen < DEBUG_OMCBUF_LEN-1)) + { + ii = module_ptr->seqid_h % DEBUG_SEQID_LEN; + strcpy(module_ptr->omc_outbuf[ii],module_ptr->ascii_out); + if (((module_ptr->seqid_h+1)%DEBUG_SEQID_LEN) == (module_ptr->seqid_t%DEBUG_SEQID_LEN)) + if (disp_sub_module_flag == ii) + module_ptr->seqid_t = (module_ptr->seqid_t+1) % DEBUG_MAX_SEQID; + module_ptr->seqid_h = (module_ptr->seqid_h+1) % DEBUG_MAX_SEQID; + for (jj = 0;jj < otherAsciiOutLen;jj ++) + module_ptr->ascii_out[jj] = '\0'; + } + } + } + } + } + //else + // debug_mmi_log("none"); + + + // in debug_module, in the configure state, not in command mode, and there is nothing to send by serial, there is nothing received, + if ( (disp_sub_module_flag == ('n'-'a')) && (debug_cfg > 0) && (command_flag == 0) && (ascii_out_ph == ascii_out_pt) && (sendserbuf_h == sendserbuf_t) && (recserbuf_h == recserbuf_t) && (debug_cfg_end == 1) ) + { + recser_buf[recserbuf_h] = 27; // set the debug module in command mode + recserbuf_h = (recserbuf_h + 1) % SERIAL_BUF_LEN; + + } + if((disp_main_flag==0) && (first_page==1) && (command_flag == 0) && (ascii_out_ph == ascii_out_pt) && (sendserbuf_h == sendserbuf_t) && (recserbuf_h == recserbuf_t) ) + { + recser_buf[recserbuf_h] ='n'; // set the debug module in command mode + recserbuf_h = (recserbuf_h + 1) % SERIAL_BUF_LEN; + first_page = 0; + } + debug_read_serial(); + + for (ii = 0;ii < MAX_SEND_CHAR_NUM ;ii ++) + { + debug_recv_cmd(); + if(send_char_flag) + { + send_char_flag=0; + break; + } + debug_module_page(ii); + } + + debug_send_serial(); + + if(disp_sub_module_flag == ('n'-'a')) + debug_ascii_in_cmd_handle(); // handle the ascii command of the debug module + for(ii = 0;ii < 20;ii ++) + test_array[ii] = test_array[ii] + 1; + if ((t10s_flag++) >= 500) + { + t10s_flag = 0; + debug_heartbeat[4] = debug_counter; + set_status(5,7,debug_heartbeat); + } + if( wxc2_debuginfo.mmi_switch ) + { + if((t100ms_flag++) >= 1)//20 ms + { + t100ms_flag=0; + if(get_show_state==0 && list_flag==0) + { + show_all_value=0; + show_type=0; + show_expend=1; + show_range=0; + show_empty=0; + show_snmp_state=0; + } + if(t5s_flag > 250) + t5s_flag=0; + else + t5s_flag++; + debug_get_agent(); + debug_set_agent(); + //if((field_compute_state>0) && print_once==1) + // compute_field_WatchDog(); + + debug_snmp_get_rt(); // get command state machine + + debug_snmp_set_rt(); // set command state machine + if(list_flag>0 ) //&& debug_cfg_end==0 && debug_cfg==1) + { + debug_mmi_list(); + } + if(debug_remark_flag>0) + debug_mmi_remark(); + } + } + +} +//////////////////////////////End of Main//////////////////////////////// + + + + + +////////////////////////////////////Shell/////////////////////////// +/* +* +* Fun: debug_ascii_in_cmd_handle +* +* Desc: handle the command in the debug_ascii_in_array and clear the debug_ascii_in_array +* +* Ret: REVOID +* +* File: debug.c +* +*/ +void debug_ascii_in_cmd_handle() +{ + BYTE cmd_valid, i; + char temp_str[256]=""; + BYTE index_len; + mib_node *find_node_ptr ; + /* + for(i=0;i<80;i++) + { + if(*(debug_ascii_in_array+i)!=' ') + for(j=i;j<80;j++) + debug_ascii_in_array[j]=debug_ascii_in_array[j+1]; + } + */ + if(snmp_agent_flag>0 && debug_cfg>0 && *debug_ascii_in_array!=0) + { + if(!debug_busy_alarm) + { + debug_ascii_out_proc("Busy : Busy now,Debug is working for ews now!\r\n"); + debug_ascii_in_array[0]='\0'; + } + debug_busy_alarm=1; + return; + }else if(snmp_agent_flag==0) + debug_busy_alarm=0; + StrToLower( debug_ascii_in_array +1 ); + if ( *debug_ascii_in_array) + { + cmd_valid = 1; + debug_ascii_in_array[79] = '\0'; + if(debug_cfg == 0) + { + if(debug_module_num != 13) + { + if(strncasecmp(debug_ascii_in_array+1, "DEBUG", 5) == 0) + { + debug_module_num= 13; + debug_shm_ptr->module_d[13].ascii_in[0] = 1; + strcpy(debug_shm_ptr->module_d[13].ascii_in+1, "help"); + debug_color_out(BRIGHT,WHITE,BLACK,"\r\nOK\r\n");/// + return; + } + else + { + i = debug_module_num; + if(debug_shm_ptr->module_d[i].ascii_in_set_flag != 1) + { + sprintf(temp_str, "The module %s did not register\r\nFail\r\n", debug_shm_ptr->module_d[i].name);/// + debug_color_out(BRIGHT,RED,BLACK,temp_str); + return; + } + else + { + debug_shm_ptr->module_d[i].ascii_in[0] = 1; + strcpy(debug_shm_ptr->module_d[i].ascii_in+1,debug_ascii_in_array+1); + strcpy(temp_str,"OK!\r\n"); + debug_color_out(BRIGHT,WHITE,BLACK,temp_str); + strcpy(debug_ascii_in_array, ""); + } + return; + } + } + + for (i=0; i < MODULE_COUNT; i++) + { + if(debug_shm_ptr->module_d[i].ascii_in_set_flag == 1) + { + char module_name[10] , *chpos; + int len = strlen(debug_shm_ptr->module_d[i].name) ; + + + if( len == 0 || len > 8 ) + continue; + strcpy( module_name , debug_shm_ptr->module_d[i].name ); + StrToLower( module_name ); + if( strstr( debug_ascii_in_array+1, module_name ) != NULL ) + { + if( ( ( chpos = strstr( debug_ascii_in_array+1 , "log all" ) ) != NULL ) + ||( ( chpos = strstr( debug_ascii_in_array+1 , "log none" )) != NULL ) + ||( ( chpos = strstr( debug_ascii_in_array+1 , "log error" )) != NULL ) + ||( ( chpos = strstr( debug_ascii_in_array+1 , "log status" )) != NULL ) ) + { + debug_shm_ptr->module_d[i].ascii_in[0] = 1; + strcpy(debug_shm_ptr->module_d[i].ascii_in+1,chpos ); + strcpy(temp_str,"OK!\r\n"); + debug_color_out(BRIGHT,WHITE,BLACK,temp_str); + cmd_valid = 5; + continue; + } + else + { + if(strlen(debug_ascii_in_array) > (2+strlen(debug_shm_ptr->module_d[i].name))) + { + debug_shm_ptr->module_d[i].ascii_in[0] = 1; + strcpy(debug_shm_ptr->module_d[i].ascii_in+1,debug_ascii_in_array+2+strlen(debug_shm_ptr->module_d[i].name)); + strcpy(temp_str,"OK!\r\n"); + debug_color_out(BRIGHT,WHITE,BLACK,temp_str); + strcpy(debug_ascii_in_array, ""); + debug_module_num = 13; + } + else + { + debug_shm_ptr->module_d[i].ascii_in[0] = 1; + strcpy(debug_shm_ptr->module_d[i].ascii_in+1, "help"); + strcpy(temp_str,"OK!\r\n"); + debug_color_out(BRIGHT,WHITE,BLACK,temp_str); + strcpy(debug_ascii_in_array, ""); + debug_module_num = i; + } + return; + } + } + } + } + if( cmd_valid == 5 ) + { + strcpy(debug_ascii_in_array, ""); + return; + } + if (strncasecmp(debug_ascii_in_array+1,"help",4) == 0) + { + debug_mmi_cmm_help(debug_ascii_in_array+5); + + } + else if (strncasecmp(debug_ascii_in_array+1,"log status",10) == 0) + { + debug_mmi_log_status(); + } + else if( strncasecmp(debug_ascii_in_array+ 1 , "net cap start" ,13) == 0) + { + int ip; + char tmpStr[512]; + + strcpy( tmpStr , debug_ascii_in_array+14); + StrTrimCh(tmpStr, ' '); + ip = inet_addr(tmpStr); + if( -1 == ip ) + { + sprintf(tmpStr , "invalid Ip Addr : %s ", debug_ascii_in_array+14); + debug_color_out(BRIGHT,RED,BLACK,tmpStr); + cmd_valid = 2; + } + NcSetIP(ip); + debug_netcap_start(); + debug_color_out(BRIGHT,RED,BLACK,"net cap start!\r\n"); + } + else if( strncasecmp(debug_ascii_in_array+ 1 , "ne tcap stop" ,12)== 0) + { + debug_netcap_stop(); + debug_color_out(BRIGHT,RED,BLACK,"net cap stop!\r\n"); + } + else if (strncasecmp(debug_ascii_in_array+1,"log ",4) == 0) + { + if( debug_mmi_log(debug_ascii_in_array+5) == 0) + cmd_valid = 2; + }else if(strncasecmp(debug_ascii_in_array+1, "cfg", 3) == 0) + { + if( !wxc2_debuginfo.mmi_switch ) + { + debug_ascii_out_proc("[debug] : The debug MMI is not configurated!\r\n"); + cmd_valid = 3; + } + else + { + strcpy(temp_str, "log none"); + debug_log_all = 0; + for (i=0; i < MODULE_COUNT; i++) + { + if( (i != 13) && (debug_shm_ptr->module_d[i].ascii_in_set_flag == 1)) + { + debug_shm_ptr->module_d[i].ascii_in[0] = 1; + strcpy(debug_shm_ptr->module_d[i].ascii_in+1,temp_str); + } + } + debug_cfg = 1; + debug_cfg_end = 1; + debug_mmi_cfg_help(" "); + index_len=9; + find_node_ptr = search_mib_node(mib_root_node, cur_oid, index_len); + if(find_node_ptr) + mib_curr_node = find_node_ptr; + else + { + debug_ascii_out_proc("[debug] : The debug can not find the system node!\r\n"); + return; + } + } + } + else if(strncasecmp(debug_ascii_in_array+1, "menu", 4) == 0) + { + if( !wxc2_debuginfo.mmi_switch ) + { + debug_ascii_out_proc("[debug] : The debug MMI is not configurated!\r\n"); + cmd_valid = 3; + } + else + { + menu_curr_node=menu_root_node; + mib_curr_node=menu_curr_node->menu_oid_node; + main_menu(""); + debug_cfg = 2; + debug_cfg_end = 1 ; + } + } + + else + cmd_valid = 2;//Err + } + else if(debug_cfg == 1 ) + { + if (strncasecmp(debug_ascii_in_array+1,"contents",8) == 0) + { + debug_mmi_contents(debug_ascii_in_array+9); + } + else if (strncasecmp(debug_ascii_in_array+1,"parent",6) == 0) + { + debug_mmi_parent(); + } + else if (strncasecmp(debug_ascii_in_array+1,"quit",4) == 0) + { + debug_send_char('q'); + } + else if (strncasecmp(debug_ascii_in_array+1,"child ", 6) == 0) + { + debug_mmi_child(debug_ascii_in_array+7); + } + else if (strncasecmp(debug_ascii_in_array+1,"create", 6) == 0) + { + debug_mmi_create(debug_ascii_in_array+7); + } + else if (strncmp(debug_ascii_in_array+1,"delete",6) == 0) + { + debug_mmi_del(debug_ascii_in_array+7); + } + else if (strncasecmp(debug_ascii_in_array+1,"list", 4) == 0) + { + list_flag=1; + strcpy(list_msg,debug_ascii_in_array+5); + debug_cfg_end=0; + } + else if (strncasecmp(debug_ascii_in_array+1,"save",4) == 0) + { + save_flag=2; + debug_mmi_save(); + } + else if (strncasecmp(debug_ascii_in_array+1,"option ", 7) == 0) + { + debug_mmi_option(debug_ascii_in_array+8); + } + else if (strncasecmp(debug_ascii_in_array+1,"setins ", 7) == 0) + { + debug_mmi_setins(debug_ascii_in_array+8); + } + else if (strncasecmp(debug_ascii_in_array+1,"set", 3) == 0) + { + if(debug_mmi_set(debug_ascii_in_array+4) == 0) + { + cmd_valid = 3; //fail + debug_cfg_end = 1; + } + else + { + debug_cfg_end = 0; + cmd_valid = 4; //wait + } + } + else if (strncasecmp(debug_ascii_in_array+1,"get ", 4) == 0) + { + if(debug_mmi_get(debug_ascii_in_array+5) == 0) + { + cmd_valid = 3; //fail + debug_cfg_end = 1; + } + else + { + debug_cfg_end = 0; + cmd_valid = 4; //wait + } + } + else if (strncasecmp(debug_ascii_in_array+1,"get", 3) == 0) + { + if(debug_ascii_in_array[4] != '\0') + { + cmd_valid = 2; //fail + debug_cfg_end = 1; + } + else if(debug_mmi_get_all() == 0) + { + cmd_valid = 3; //fail + debug_cfg_end = 1; + } + else + { + debug_cfg_end = 0; + cmd_valid = 4; //wait + } + } + else if (strcmp(debug_ascii_in_array+1,"pwd") == 0) + { + debug_mmi_pwd(); + } + else if (strncasecmp(debug_ascii_in_array+1,"tree", 4) == 0) + { + /*BYTE node_layer; + if(isdigit(debug_ascii_in_array+5)) + node_layer=(BYTE)(debug_ascii_in_array+5); + */ + debug_mmi_tree(mib_curr_node, "{*}--", 3); + treehost=1; + } + else if (strncasecmp(debug_ascii_in_array+1,"cd", 2) == 0) + { + debug_mmi_cd(debug_ascii_in_array+3); + } + /*else if (strncasecmp(debug_ascii_in_array+1,"ip ", 3) == 0) + { + if( debug_mmi_ip(debug_ascii_in_array+4) == 0) + cmd_valid = 3; //Fail + }*/ + else if (strncasecmp(debug_ascii_in_array+1,"find host", 9) == 0) + { + debug_mmi_find_host(debug_ascii_in_array+10); + debug_mmi_show_host(); + } + else if (strncasecmp(debug_ascii_in_array+1,"show host", 9) == 0) + { + if( debug_mmi_show_host() ==0) + cmd_valid = 3; //Fail + } + else if (strncasecmp(debug_ascii_in_array+1,"select", 6) == 0) + { + if( debug_mmi_select_host(debug_ascii_in_array+7) ==0) + cmd_valid = 3; //Fail + else + debug_mmi_show_host(); + } + else if (strncasecmp(debug_ascii_in_array+1,"help",4) == 0) + { + debug_mmi_cfg_help(debug_ascii_in_array+5); + } + else if (strcmp(debug_ascii_in_array+1,"pwd") == 0) + { + debug_mmi_pwd(); + } + else if(strcmp(debug_ascii_in_array+1,"remark") == 0) + { + debug_remark_flag=1; + debug_cfg_end=0; + } + else if(strcmp(debug_ascii_in_array+1, "cmm")==0) + { + + debug_cfg = 0; + debug_cfg_end = 1; + debug_mmi_cmm_help(" "); + } + else + { + cmd_valid = 2; //Err + } + } + else if(debug_cfg==2) + { + if (strncasecmp(debug_ascii_in_array+1,"contents",8) == 0) + { + debug_mmi_view(); + //debug_cfg_end=1; + } + else if (strncasecmp(debug_ascii_in_array+1,"cd",2) == 0) + { + debug_mmi_mcd(debug_ascii_in_array+3); + debug_cfg_end=1; + } + else if(strcmp(debug_ascii_in_array+1,"remark") == 0) + { + debug_remark_flag=1; + debug_cfg_end=0; + } + else if (strncasecmp(debug_ascii_in_array+1,"child",5) == 0) + { + debug_mmi_mcd(debug_ascii_in_array+6); + debug_cfg_end=1; + } + else if (strncasecmp(debug_ascii_in_array+1,"quit",4) == 0) + { + debug_send_char('q'); + } + else if (strncasecmp(debug_ascii_in_array+1,"create", 6) == 0) + { + debug_mmi_create(debug_ascii_in_array+7); + } + else if (strncmp(debug_ascii_in_array+1,"delete",6) == 0) + { + debug_mmi_del(debug_ascii_in_array+7); + } + else if (strncasecmp(debug_ascii_in_array+1,"list", 4) == 0) + { + list_flag=1; + strcpy(list_msg,debug_ascii_in_array+5); + debug_cfg_end=0; + } + else if (strncasecmp(debug_ascii_in_array+1,"save",4) == 0) + { + save_flag=2; + debug_mmi_save(); + } + else if (strncasecmp(debug_ascii_in_array+1,"option ", 7) == 0) + { + debug_mmi_option(debug_ascii_in_array+8); + } + else if (strncasecmp(debug_ascii_in_array+1,"setins ", 7) == 0) + { + debug_mmi_setins(debug_ascii_in_array+8); + } + else if (strncasecmp(debug_ascii_in_array+1,"set", 3) == 0) + { + if(debug_mmi_set(debug_ascii_in_array+4) == 0) + { + cmd_valid = 3; //fail + debug_cfg_end = 1; + } + else + { + debug_cfg_end = 0; + cmd_valid = 4; //wait + } + } + else if (strncasecmp(debug_ascii_in_array+1,"get ", 4) == 0) + { + if(debug_mmi_get(debug_ascii_in_array+5) == 0) + { + cmd_valid = 3; //fail + debug_cfg_end = 1; + } + else + { + debug_cfg_end = 0; + cmd_valid = 4; //wait + } + } + else if (strncasecmp(debug_ascii_in_array+1,"get", 3) == 0) + { + if(debug_ascii_in_array[4] != '\0') + { + cmd_valid = 2; //fail + debug_cfg_end = 1; + } + else if(debug_mmi_get_all() == 0) + { + cmd_valid = 3; //fail + debug_cfg_end = 1; + } + else + { + debug_cfg_end = 0; + cmd_valid = 4; //wait + } + } + /*else if (strcmp(debug_ascii_in_array+1,"pwd") == 0) + { + debug_mmi_pwd(); + } + else if (strncasecmp(debug_ascii_in_array+1,"tree", 4) == 0) + { + BYTE node_layer; + if(isdigit(debug_ascii_in_array+5)) + node_layer=(BYTE)(debug_ascii_in_array+5); + + debug_mmi_tree(mib_curr_node, "{*}--", 3); + treehost=1; + } + */ + else if (strncasecmp(debug_ascii_in_array+1,"find host", 9) == 0) + { + debug_mmi_find_host(debug_ascii_in_array+10); + debug_mmi_show_host(); + } + else if (strncasecmp(debug_ascii_in_array+1,"show host", 9) == 0) + { + if( debug_mmi_show_host() ==0) + cmd_valid = 3; //Fail + } + else if (strncasecmp(debug_ascii_in_array+1,"select", 6) == 0) + { + if( debug_mmi_select_host(debug_ascii_in_array+7) ==0) + cmd_valid = 3; //Fail + else + debug_mmi_show_host(); + } + else if (strncasecmp(debug_ascii_in_array+1,"help",4) == 0) + { + main_menu(debug_ascii_in_array+5); + } + /* + else if(strcmp(debug_ascii_in_array+1,"remark") == 0) + { + debug_mmi_remark(); + }*/ + else if(strcmp(debug_ascii_in_array+1, "cmm")==0) + { + + debug_cfg = 0; + debug_cfg_end = 1; + debug_mmi_cmm_help(" "); + } + else + { + cmd_valid = 2; //Err + } + } + + if (cmd_valid == 1) + { + // debug_color_out(BRIGHT,WHITE,BLACK,"OK!\r\n"); + } + else if(cmd_valid == 3)//Fail + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : Command excute fail!\r\n"); + } + else if(cmd_valid == 2) + { + sprintf(temp_str, "Error : Incorrect command: %s\r\n",debug_ascii_in_array); + debug_color_out(BRIGHT,RED,BLACK,temp_str); + } + strcpy(debug_ascii_in_array, ""); + } +} // end of debug_ascii_in_cmd_handle +///////////////////////////////End of Shell////////////////////////////// + + + + + +//////////////////////////////////buffer process///////////////////// +/* +* +* Fun: debug_ascii_out_porc +* +* Desc: store the string into the out buffer,print in the telnet or pc serial port +* +* Ret: REVOID + +* File: debug.c +* +*/ + +void debug_ascii_out_proc(const char *str_ptr) +{ + int str_len,local_len; + str_len=strlen(str_ptr); + if (debug_ascii_out_ph < debug_ascii_out_pt) + local_len = MAX_ASCII_LEN - 1 + debug_ascii_out_ph - debug_ascii_out_pt;/// + else + local_len = debug_ascii_out_ph - debug_ascii_out_pt; + if( str_len>0 && (local_len + str_len) < (MAX_ASCII_LEN)) + { + while((*(debug_ascii_out_array+debug_ascii_out_ph)=*str_ptr++)) + debug_ascii_out_ph=(debug_ascii_out_ph+1)%MAX_ASCII_LEN; + } +} // debug_ascii_out_proc + +/* +void debug_ascii_out_proc(char *str_ptr) +{ + if( (strlen(debug_ascii_out_array) + strlen(str_ptr)) < (MAX_ASCII_LEN)) + strcat(debug_ascii_out_array, str_ptr); +} // debug_ascii_out_proc +*/ +/////////////////////////////////End of buffer process/////////////////////// + + + + + + + +////////////////////////////////page 0////////////////////////////// +/* +* +* Fun: debug_change_title1 +* +* Desc: show module page form module_page.txt(page=0) +* +* Ret: REVOID +* File: debug.c +* +*/ +void debug_read_main_title() +{ + FILE *fp; + int i,j,k; + int row; + char *temp_ch; + char temp_str[256]; + char top[9]="\0",tail[6]="\0",/*add_help[6]="\0",*/add_menu[6]="\0"; + char title_row[MAX_ROW][MAX_COLUMN]; + + top[0] = 0xc; + top[1] = 0x1b; + top[2] = '['; + top[3] = 'H'; + top[4] = 0x1b; + top[5] = '['; + top[6] = '2'; + top[7] = 'J'; + top[8] = '\0'; + tail[0] = 0x1b; + tail[1] = '['; + tail[2] = '0'; + tail[3] = 'm'; + tail[4] = '%'; + tail[5] = '\0'; + + //page 0 + row = 0; + if ((fp = fopen("./conf/menu_page","r")) == NULL) + { + printf("[debug] Cannot open file [menu_page].\n"); + return; + } + for (i = 0;i < MAX_ROW; i++) + { + if (feof(fp)) + break; + temp_str[0] = '\0'; + fgets(temp_str,256,fp); + if (temp_str[0] == '$') + break; + temp_ch = strchr(temp_str,0xa); + if (temp_ch != NULL) + *temp_ch = '\0'; + strcpy(title_row[row++],temp_str); + } + fclose(fp); + strcpy(title1,top); + add_menu[0] = 0x1b; + add_menu[1] = '['; + for (i = 0;i < row;i ++) + { + for (j = 0;j < PAGE_MODULE_COUNT;j ++) + { + int alph_num = j; + if( j >=22 ) alph_num = j + 2; + if( j > 15 && j < 22 ) alph_num = j + 1; + sprintf(temp_str,"%c -- ",'a'+alph_num); + temp_ch = strstr(title_row[i],temp_str); + if (temp_ch != NULL) + { + temp_ch = temp_ch + strlen(temp_str); + for (k = 0;k < DEBUG_NAME_LEN - 1;k ++) + { + if (isalpha(temp_ch[k]) || isdigit(temp_ch[k])) + debug_shm_ptr->module_d[j].name[k] = temp_ch[k]; + else + break; + } + debug_shm_ptr->module_d[j].name[k] = '\0'; + } + } + if (i < 10) + { + add_menu[2] = i+'0'; + add_menu[3] = 'H'; + add_menu[4] = '\0'; + } + else + { + add_menu[2] = i/10+'0'; + add_menu[3] = i%10+'0'; + add_menu[4] = 'H'; + add_menu[5] = '\0'; + } + strcat(title1,add_menu); + strcat(title1,title_row[i]); + } + + //page 1 + row = 0; + memset(title_row,0,MAX_ROW*MAX_COLUMN); + if ((fp = fopen("./conf/menu_page2","r")) == NULL) + { + printf("[debug] Cannot open file [menu_page].\n"); + return; + } + for (i = 0;i < MAX_ROW; i++) + { + if (feof(fp)) + break; + temp_str[0] = '\0'; + fgets(temp_str,256,fp); + if (temp_str[0] == '$') + break; + temp_ch = strchr(temp_str,0xa); + if (temp_ch != NULL) + *temp_ch = '\0'; + strcpy(title_row[row++],temp_str); + } + fclose(fp); + strcpy(title1+TITLE_CHAR,top); + add_menu[0] = 0x1b; + add_menu[1] = '['; + for (i = 0;i < row;i ++) + { + for (j = 0;j < PAGE_MODULE_COUNT;j ++) + { + int alph_num = j; + if( j >=22 ) alph_num = j + 2; + if( j > 15 && j < 22 ) alph_num = j + 1; + sprintf(temp_str,"%c -- ",'a'+alph_num); + temp_ch = strstr(title_row[i],temp_str); + if (temp_ch != NULL) + { + temp_ch = temp_ch + strlen(temp_str); + for (k = 0;k < DEBUG_NAME_LEN - 1;k ++) + { + if (isalpha(temp_ch[k]) || isdigit(temp_ch[k])) + debug_shm_ptr->module_d[j+PAGE_MODULE_COUNT].name[k] = temp_ch[k]; + else + break; + } + debug_shm_ptr->module_d[j+PAGE_MODULE_COUNT].name[k] = '\0'; + } + } + if (i < 10) + { + add_menu[2] = i+'0'; + add_menu[3] = 'H'; + add_menu[4] = '\0'; + } + else + { + add_menu[2] = i/10+'0'; + add_menu[3] = i%10+'0'; + add_menu[4] = 'H'; + add_menu[5] = '\0'; + } + strcat(title1+TITLE_CHAR,add_menu); + strcat(title1+TITLE_CHAR,title_row[i]); + } +} + +/* +* +* Fun: debug_change_title1 +* +* Desc: Add String to module page(page=0) +* +* Ret: REVOID + +* File: debug.c +* +*/ +void debug_change_title1() +{ + char ch_tmp1[14]="\0"; + int i; + DWORD title_len; + char tail[6] = "\0"; + char menu_line[TITLE_CHAR] = "\0"; + + if(disp_main_page_num >=DEBUG_MAX_PAGE) + { + return; + } + title_len=strlen(title1+TITLE_CHAR*disp_main_page_num); + if (title_len < TITLE_CHAR) + strcpy(title1_show+TITLE_CHAR*disp_main_page_num,title1+TITLE_CHAR*disp_main_page_num); + + sprintf(menu_line,"\x1b[20;20H*** %s ***\x1b[16;4H\r\n",wxc2_debuginfo.wxc2_ver); + //In current page, press 'a--p' or 'A--P' to enter selected sub module",wxc2_debuginfo.wxc2_ver); + //sprintf(menu_line+strlen(menu_line),"\x1b[17;4HIn sub module, press '0--9' and 'a--f' to turn over pages"); + //sprintf(menu_line+strlen(menu_line),"\x1b[18;4HIn sub module, press 'x' or 'X' to return menu page"); + sprintf(menu_line+strlen(menu_line),"\x1b[24;25Hsystem start time:%s\x1b[25;1Hr -- refresh\x1b[22;60H%d/%d",time_buf,disp_main_page_num+1,DEBUG_MAX_PAGE); + tail[0] = 0x1b; + tail[1] = '['; + tail[2] = '0'; + tail[3] = 'm'; + tail[4] = '%'; + tail[5] = '\0'; + for (i = 0;i < PAGE_MODULE_COUNT;i ++) + { + if (debug_shm_ptr->module_d[i+disp_main_page_num*PAGE_MODULE_COUNT].status[0] == 1) + { + ch_tmp1[0] = 0x1b; + ch_tmp1[1] = '['; + if (i < PAGE_MODULE_COUNT/2) + { + ch_tmp1[2] = (i+5)/10 + '0'; + ch_tmp1[3] = (i+5)%10 + '0'; + } + else + { + ch_tmp1[2] = (i+5-PAGE_MODULE_COUNT/2)/10 + '0'; + ch_tmp1[3] = (i+5-PAGE_MODULE_COUNT/2)%10 + '0'; + } + ch_tmp1[4] = ';'; + if(i < PAGE_MODULE_COUNT/2) + ch_tmp1[5] = '2'; + else + ch_tmp1[5] = '5'; + ch_tmp1[6] = '6'; + ch_tmp1[7] = 'H'; + ch_tmp1[8] = '('; + ch_tmp1[9] = '\0'; + if ((title_len+strlen(ch_tmp1)) < TITLE_CHAR) + strpcat(title1_show+TITLE_CHAR*disp_main_page_num,&title_len,ch_tmp1); + if ((title_len+strlen(debug_shm_ptr->module_d[i+disp_main_page_num*PAGE_MODULE_COUNT].version)) < TITLE_CHAR) + strpcat(title1_show+TITLE_CHAR*disp_main_page_num,&title_len,debug_shm_ptr->module_d[i+disp_main_page_num*PAGE_MODULE_COUNT].version); + if ((title_len+1) < TITLE_CHAR) + strpcat(title1_show+TITLE_CHAR*disp_main_page_num,&title_len,")"); + } + } + if (title_len+strlen(hostip_buf) < TITLE_CHAR) + strpcat(title1_show+TITLE_CHAR*disp_main_page_num,&title_len,hostip_buf); + if (title_len+strlen(menu_line) < TITLE_CHAR) + strpcat(title1_show+TITLE_CHAR*disp_main_page_num,&title_len,menu_line); + if (title_len+strlen(tail) < TITLE_CHAR) + strpcat(title1_show+TITLE_CHAR*disp_main_page_num,&title_len,tail); + + title_pt = TITLE_CHAR*disp_main_page_num; + memset(current_timer,0,sizeof(current_timer)); +} +////////////////////////////End of Page 0////////////////////////////// + + + + + +////////////////////////////////Module Page///////////////////////// +int debug_set_response(BYTE oidlen,DWORD *oid,BYTE *data_ptr,WORD data_len) +{ + WORD temp_len; + BYTE temp_id,temp_page; + BYTE ch_m = 0x80; + WORD title_len = 0; + BYTE cancel_control[] = {0x1b,'[','0','m','%','\0'}; + + switch(oid[12]) + { + case 0: + break; + case 1: + break; + case 2: // configure + if (oid[13] > MODULE_COUNT+1 || oid[13] < 2) + return -1; + temp_id = oid[13] - 2; + if( debug_shm_ptr == NULL ) + { + // printf("Wanning : Debug is not init! Here register your module to debug share memery would fail!\r\n"); + // printf(" Please make assure that you function is need to inital debug or not!\r\n"); + return -1; + } + //printf("Module ID: %d regiseted! oid[14] :%ld\n", temp_id, oid[14]); + switch(oid[14]) + { + case 1: // status + if (data_len != 1) + return -1; + debug_shm_ptr->module_d[temp_id].status[0] = *data_ptr; + debug_counter += 1; + if (temp_id <= 7) + debug_heartbeat[5] |= (ch_m >> temp_id); + else + debug_heartbeat[6] |= (ch_m >> (temp_id - 8)); + ch_m = 0x80; + return 1; + break; + case 2: // module version + if (data_len > 20) + return -1; + memcpy(debug_shm_ptr->module_d[temp_id].version,data_ptr,data_len); + debug_shm_ptr->module_d[temp_id].version[data_len] = '\0'; + return strlen(debug_shm_ptr->module_d[temp_id].version); + break; + case 3: // ascii in buffer + debug_shm_ptr->module_d[temp_id].ascii_in = data_ptr; + debug_shm_ptr->module_d[temp_id].ascii_in_set_flag = 1; + return data_len; + break; + case 4: // ascii out buffer + ascii_out_len = (data_len < strlen(data_ptr))?data_len:strlen(data_ptr); + *(data_ptr+ascii_out_len) = '\0'; + debug_shm_ptr->module_d[temp_id].ascii_out = data_ptr; + debug_shm_ptr->module_d[temp_id].ascii_out_set_flag = 1; + return ascii_out_len; + break; + default: // display page 0 -- 15 + if (oid[14] > 20) + return -1; + temp_page = oid[14] - 5; + if (temp_page == 0) // do not fill page 0 + return -1; + switch(oid[15]) + { + case 0: + break; + case 1: // title + title_len = (data_len < strlen(data_ptr))?data_len:strlen(data_ptr); + if (title_len > TITLE_CHAR - 8) + break; + data_ptr[title_len] = '\0'; + strcpy(debug_shm_ptr->module_d[temp_id].page_d[temp_page].title,title_top); + strcat(debug_shm_ptr->module_d[temp_id].page_d[temp_page].title,data_ptr); + temp_len = strlen(debug_shm_ptr->module_d[temp_id].page_d[temp_page].title); + if (temp_len+strlen(cancel_control) < TITLE_CHAR) + debug_shm_ptr->module_d[temp_id].page_d[temp_page].title[temp_len] = '\0'; + if (temp_len+strlen(cancel_control) < TITLE_CHAR) + strcat(debug_shm_ptr->module_d[temp_id].page_d[temp_page].title,cancel_control); + return title_len; + break; + default: // line + if (oid[15] > MAX_ROW || oid[15] < 2) + return -1; + switch(oid[16]) + { + case 0: + break; + case 1: + debug_shm_ptr->module_d[temp_id].page_d[temp_page].line_d[oid[15]-2].pt_vartype = *data_ptr; + break; + case 2: + if (data_len <= 20) + debug_shm_ptr->module_d[temp_id].page_d[temp_page].line_d[oid[15]-2].length = data_len; + else + debug_shm_ptr->module_d[temp_id].page_d[temp_page].line_d[oid[15]-2].length = 20; + debug_shm_ptr->module_d[temp_id].page_d[temp_page].line_d[oid[15]-2].pointer = data_ptr; + debug_shm_ptr->module_d[temp_id].page_d[temp_page].pointer_set_flag = 1; + if (debug_shm_ptr->module_d[temp_id].maxpage < temp_page) + debug_shm_ptr->module_d[temp_id].maxpage = temp_page; + return data_len; + break; + default: + break; + } + break; + } + break; + } + break; + case 3: + break; + default: + break; + } + return -1; +} + + +/* +* +* Fun: debug_module_page +* +* Desc: set debug page(page>0) +* +* Ret: REVOID +* File: debug.c +* +*/ +void debug_module_page(int count) +{ + if (command_flag == 1) + return; + switch (disp_main_flag) + { + case 0: + switch(m_state) + { + case 0: + m_state = 1; + debug_change_title1(); + if(count>=1) + send_char_flag=1; + break; + case 1: + if (title1_show[title_pt] != '%') + { + if (debug_send_char(title1_show[title_pt])) + title_pt++; + } + else + { + debug_set_currenttime(); + SendTelnetFlag = 1; + send_char_flag=1; + } + break; + } + break; + case 1: // module flag + switch(m_state_sub_module) + { + case 0: + title_top_pt = 0; + m_state_sub_module = 1; + break; + case 1: + if (disp_page_flag == 0) + { + debug_send_string(title_top); + SendTelnetFlag = 1; + m_state_sub_module = 2; + ascii_out_ph = ascii_out_pt = 0; + send_char_flag=1; + } + else + { + m_state_sub_module = 3; + title_sub_module_pt = 0; + } + break; + case 2: // send page 0 + if (ascii_out_pt != ascii_out_ph) + { + debug_send_char(ascii_out_array[ascii_out_pt]); + ascii_out_pt = (ascii_out_pt + 1) % MAX_ASCII_LEN; + if (ascii_out_pt == ascii_out_ph) + SendTelnetFlag = 1; + } + else + send_char_flag=1; + break; + case 3: // title + if (disp_page_flag > debug_shm_ptr->module_d[disp_sub_module_flag].maxpage) + return; + if (debug_shm_ptr->module_d[disp_sub_module_flag].page_d[disp_page_flag].title[title_sub_module_pt] == '%') + { + SendTelnetFlag = 1; + m_state_sub_module = 4; + disp_index = 0; + memset(comp_disp,0xeb,500); + } + else if (debug_send_char(debug_shm_ptr->module_d[disp_sub_module_flag].page_d[disp_page_flag].title[title_sub_module_pt])) + title_sub_module_pt = (title_sub_module_pt+1)%TITLE_CHAR; + //if(count>=3) + // send_char_flag=1; + break; + case 4: + char_ptr = 0; + hex_state = 0; + disp_length = debug_shm_ptr->module_d[disp_sub_module_flag].page_d[disp_page_flag].line_d[disp_index].length; + if (debug_shm_ptr->module_d[disp_sub_module_flag].page_d[disp_page_flag].pointer_set_flag == 1) + m_state_sub_module = 5; + disp_ptr = debug_shm_ptr->module_d[disp_sub_module_flag].page_d[disp_page_flag].line_d[disp_index].pointer; + break; + case 5: + if (char_ptr == disp_length) + { + if (disp_index%3 == 0) + SendTelnetFlag = 1; + disp_index = (disp_index + 1) % 23; + m_state_sub_module = 4; + } + else + debug_disp_hex(); + break; + default: + break; + } + break; + default: + break; + } +} + +/* +* +* Fun: debug_disp_hex +* +* Desc: Set debug page show data as hex(page>0) +* +* Ret: REVOID +* File: debug.c +* +*/ +void debug_disp_hex() +{ + WORD r_no; + WORD i; + + switch(hex_state) + { + case 0: + r_no = disp_index*20 + char_ptr; + if (comp_disp[r_no] != disp_ptr[char_ptr]) + { + comp_disp[r_no] = disp_ptr[char_ptr]; + row_ptr = disp_index + 3; + col_ptr = char_ptr; + col_ptr = (col_ptr*3) + 20; + hex_state = 1; + } + else + char_ptr = char_ptr + 1; + break; + case 1: + cursor_p[2] = ascii[row_ptr/10]; + cursor_p[3] = ascii[row_ptr%10]; + cursor_p[5] = ascii[col_ptr/10]; + cursor_p[6] = ascii[col_ptr%10]; + space_counter = 0; + hex_state = 2; + break; + case 2: + if (space_counter == 8) + hex_state = 3; + else + { + if (sendserbuf_t != (sendserbuf_h + 1)) + { + debug_send_char(cursor_p[space_counter]); + space_counter = space_counter + 1; + } + } + break; + case 3: + i = disp_ptr[char_ptr]; + i = ascii[(i>>4)&0xf]; /* high bit */ + if (sendserbuf_t != (sendserbuf_h + 1)) + { + debug_send_char(i); + hex_state = 4; + } + break; + case 4: + i = disp_ptr[char_ptr]; + i = ascii[i&0xf]; + if (sendserbuf_t != (sendserbuf_h + 1)) + { + debug_send_char(i); + // SendTelnetFlag = 1; + char_ptr = char_ptr + 1; + hex_state = 0; + } + break; + default: + break; + } +} + + +void debug_set_para() +{ + DWORD object_id[20]={1,3,6,1,4,1,1373,1,3,2,3,1,2,15,1}; + BYTE data_ptr[TITLE_CHAR]; + int i,j; + BYTE agent_buf_arr[16]; + + /* object_id[0] = 1; + object_id[1] = 3; + object_id[2] = 6; + object_id[3] = 1; + object_id[4] = 4; + object_id[5] = 1; + object_id[6] = 1373; + object_id[7] = 1; + object_id[8] = 3; + object_id[9] = 2; + object_id[10] = 3; + object_id[11] = 1; //debug + object_id[12] = 2; //configuration + object_id[13] = 15; //debug module + object_id[14] = 1; + */ + data_ptr[0] = 1; + debug_set_response(13,object_id,data_ptr,1);//debug status + + object_id[14] = 2; + strcpy(data_ptr,DEBUG_VERSION); + debug_set_response(13,object_id,data_ptr,strlen(data_ptr));//debug name + + object_id[14] = 3; + debug_set_response(13,object_id,debug_ascii_in_array,1); + + object_id[14] = 4; + debug_set_response(13,object_id,debug_ascii_out_array,1); + + object_id[14] = 6; + object_id[15] = 1; + strcpy(data_ptr,"\tDebug\tPage 01\t\tmodule status\r\ + 1 2\r\ + M0 status\r\ + M1 status\r\ + M2 status\r\ + M3 status\r\ + M4 status\r\ + M5 status\r\ + M6 status\r\ + M7 status\r\ + M8 status\r\ + M9 status\r\ + M10 status\r\ + M11 status\r\ + M12 status\r\ + M13 status\r\ + M14 status\r\ + M15 status"); + debug_set_response(14,object_id,data_ptr,strlen(data_ptr));//debug title + + for (i = 0;i < MODULE_COUNT;i ++) + { + object_id[14] = 6; + object_id[15] = 2 + i; + object_id[16] = 2; + debug_set_response( 15 ,object_id,debug_shm_ptr->module_d[i].status,1);//debug page 0 line 1 + } + + object_id[14] = 7; + object_id[15] = 1; + strcpy(data_ptr,"\tDebug\tPage 02\t\tascii_in_flag\r\ + 1 2 3\r\ + current module\r\ + M0 ascii in flag\r\ + M1 ascii in flag\r\ + M2 ascii in flag\r\ + M3 ascii in flag\r\ + M4 ascii in flag\r\ + M5 ascii in flag\r\ + M6 ascii in flag\r\ + M7 ascii in flag\r\ + M8 ascii in flag\r\ + M9 ascii in flag\r\ + M10 ascii in flag\r\ + M11 ascii in flag\r\ + M12 ascii in flag\r\ + M13 ascii in flag\r\ + M14 ascii in flag\r\ + M15 ascii in flag"); + debug_set_response(14,object_id,data_ptr,strlen(data_ptr)); + + for (i = 0;i <= MODULE_COUNT;i ++) + { + object_id[14] = 7; + object_id[15] = i + 2; + object_id[16] = 2; + if (i==0) + debug_set_response(15,object_id,&disp_sub_module_flag,1); + else + debug_set_response(15,object_id,&debug_shm_ptr->module_d[i-1].ascii_in_set_flag,1); + } + object_id[14] = 8; + object_id[15] = 1; + strcpy(data_ptr,"\tDebug\tPage 03\t\tTest Page\r\ + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20\r\ + line1"); + debug_set_response(14,object_id,data_ptr,strlen(data_ptr));//debug page 1 line 1 title + + object_id[14] = 8; + object_id[15] = 2; + object_id[16] = 2; + debug_set_response(15,object_id,test_array,20);//debug page 2 line 1 title + /* + object_id[14] = 9; + object_id[15] = 1; + strcpy(data_ptr,"\tDebug\tPage 04\t\tascii_out_flag\r + 1 2 3\r + M0 ascii out flag\r + M1 ascii out flag\r + M2 ascii out flag\r + M3 ascii out flag\r + M4 ascii out flag\r + M5 ascii out flag\r + M6 ascii out flag\r + M7 ascii out flag\r + M8 ascii out flag\r + M9 ascii out flag\r + M10 ascii out flag\r + M11 ascii out flag\r + M12 ascii out flag\r + M13 ascii out flag\r + M14 ascii out flag\r + M15 ascii out flag"); + debug_set_response(14,object_id,data_ptr,strlen(data_ptr)); + + for (i = 0;i < MODULE_COUNT;i ++) + { + object_id[14] = 9; + object_id[15] = i + 2; + object_id[16] = 2; + debug_set_response(15,object_id,&debug_shm_ptr->module_d[i].ascii_out_set_flag,1); + } + */ + object_id[14] = 9; + object_id[15] = 1; + strcpy(data_ptr,"\tDebug\tPage 05\t\tdebug_snmp_agent_buf\r\ + 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16\r\ + oid 10 \t\r\ + oid 11 \t\r\ + oid 12 \t\r\ + oid 13 \t\r\ + oid 14 \t\r\ + oid 15 \t\r\ + oid 16 \t\r\ + oid 17 \t\r\ + oid 18 \t\r\ + oid_len \t\r\ + cmm_state \t\r\ + result_state \t\r\ + totoal_instance\t\r\ + totoal_field \t\r\ + total_ip "); + /* + para0 in_type \t\r + para0selectid \t\r + total_select \t\r + paran in_type \t\r + paranselectid \t\r + total_select" + */ + debug_set_response(14,object_id,data_ptr,strlen(data_ptr)); + object_id[14]=9; + object_id[15]=2; + object_id[16]=2; + for(j=9;j<18;j++) + { + for(i=0;i<16;i++) + { + agent_buf_arr[i]=(BYTE)debug_snmp_agent_buf[i].oid[j]; + } + debug_set_response(15,object_id,agent_buf_arr,16); + object_id[15]++; + } + for(i=0;i<16;i++) + { + agent_buf_arr[i]=debug_snmp_agent_buf[i].oid_len; + } + debug_set_response(15,object_id,agent_buf_arr,16); + object_id[15]++; + for(i=0;i<16;i++) + { + agent_buf_arr[i]=debug_snmp_agent_buf[i].cmm_state; + } + debug_set_response(15,object_id,agent_buf_arr,16); + object_id[15]++; + for(i=0;i<16;i++) + { + agent_buf_arr[i]=debug_snmp_agent_buf[i].result_state; + } + debug_set_response(15,object_id,agent_buf_arr,16); + object_id[15]++; + for(i=0;i<16;i++) + { + agent_buf_arr[i]=debug_snmp_agent_buf[i].total_instance; + } + debug_set_response(15,object_id,agent_buf_arr,16); + object_id[15]++; + for(i=0;i<16;i++) + { + agent_buf_arr[i]=debug_snmp_agent_buf[i].total_field; + } + debug_set_response(15,object_id,agent_buf_arr,16); + object_id[15]++; + for(i=0;i<16;i++) + { + agent_buf_arr[i]=debug_snmp_agent_buf[i].total_ip; + } + debug_set_response(15,object_id,agent_buf_arr,16); + object_id[15]++; + /* + debug_set_response(15,object_id,&debug_snmp_agent_buf[i].total_field,1); + object_id[15]++; + debug_set_response(15,object_id,&debug_snmp_agent_buf[i].param_field_arr[0].input_type,1); + object_id[15]++; + debug_set_response(15,object_id,&debug_snmp_agent_buf[i].param_field_arr[0].curr_select_id,1); + object_id[15]++; + debug_set_response(15,object_id,&debug_snmp_agent_buf[i].param_field_arr[0].total_select ,1); + object_id[15]++; + debug_set_response(15,object_id,&debug_snmp_agent_buf[i].param_field_arr[1].input_type,1); + object_id[15]++; + debug_set_response(15,object_id,&debug_snmp_agent_buf[i].param_field_arr[1].curr_select_id,1); + object_id[15]++; + debug_set_response(15,object_id,&debug_snmp_agent_buf[i].param_field_arr[1].total_select ,1); + object_id[15]++; + debug_set_response(15,object_id,&debug_snmp_agent_buf[i].param_field_arr[debug_snmp_agent_buf[i].total_field-1].input_type,1); + object_id[15]++; + debug_set_response(15,object_id,&debug_snmp_agent_buf[i].param_field_arr[debug_snmp_agent_buf[i].total_field-1].curr_select_id,1); + object_id[15]++; + debug_set_response(15,object_id,&debug_snmp_agent_buf[i].param_field_arr[debug_snmp_agent_buf[i].total_field-1].total_select ,1); + object_id[15]++; + */ + +} + +/////////////////////////////End of Module Page/////////////////////////// + + + + + + +///////////////////////////////Create OID Tree////////////////////// +/* +* +* Fun: MIB_create_tree +* +* Desc: Create a new MIB tree in memory using the name of configure file which lists mib files +* +* Ret: 1: Successful; 0: Fail +* +* Notes: Wang Jian add +* +* File: debug.c +* +*/ +int MIB_create_tree(char *conf_dir, char *conf_file) +{ + FILE *fp_conf, *fp_mib; + char *temp_ch; + char file_name[256], temp_str[256]; + int i; + BYTE line_count; + mib_type_num = 0; + mib_node_index = 0; + mib_child_node_index = 0; + mib_root_node = NULL; + mib_curr_node = NULL; + memset((BYTE *)mib_nodes, 0, sizeof(mib_node) * MIB_MAX_NODES); + memset((BYTE *)mib_child_nodes, 0, sizeof(mib_child_node) * MIB_MAX_CHILD_NODES); + + strcpy(file_name, ""); + strcpy(file_name, MIB_FILES_DIR); + strcat(file_name, MIB_WRITE_TREE); + remove(file_name); + + + for(i=0;ioid_len;index++) + { + last_node_oid[index] = father_node_ptr->oid[index]; + } + next_line_flag = 1; + state = 0; + break; + } + else + { + printf("[debug] There is error in IMPORTS part.line:%d.\r\n",mib_line_count); + return 0; + } + //} + //next_line_flag =0; + //state=0; + //break; + case 2: // except "MODULE-IDENTITY" + //temp_ch = strstr(temp_str,"MODULE-IDENTITY"); + //if(temp_ch != NULL) + // { + //*temp_ch = '\0'; + pick_name(temp_str, temp_str,temp_ch); // take the first word as a the name of this module-identity + if(strlen(temp_str) == 0) + { + printf("[debug] Error: There is no module name in the line [%s].line:%d.\r\n",temp_str,mib_line_count); + return 0; + } + //printf("module name [%s].\r\nmodule_found:\r\n",temp_str); + if(MODULE_found(temp_str, fp, father_node_ptr, last_node_oid) == 1) + { + next_line_flag = 1; + state = 0; + break; + } + else + { + printf("[debug] Error: There is error in MODULE-IDENTITY part.line:%d.\r\n",mib_line_count); + return 0; + } + // } + //next_line_flag = 0; + //state = 2; + //break; + case 3: // except "OBJECT-IDENTITY" + //temp_ch = strstr(temp_str,"OBJECT-IDENTITY"); + //if(temp_ch != NULL) + //{ + //*temp_ch = '\0'; + pick_name(temp_str, temp_str,temp_ch); // take the first word as a the name of this object-identity + if(strlen(temp_str) == 0) + { + printf("[debug] Error: There is no object name in the line [%s].line:%d.\r\n",temp_str,mib_line_count); + return 0; + } + if(OBJECT_found(temp_str, fp, father_node_ptr, last_node_oid) == 1) + { + next_line_flag = 1; + state = 0; + break; + } + else + { + printf("[debug] Error: There is error in OBJECT-IDENTITY part.line:%d.\r\n",mib_line_count); + return 0; + } + //} + //next_line_flag = 0; + //state = 3; + //break; + case 4: // except "OBJECT-TYPE" + //temp_ch = strstr(temp_str,"OBJECT-TYPE"); + //if(temp_ch != NULL) + //{ + //*temp_ch = '\0'; + pick_name(temp_str, temp_str,temp_ch); // take the first word as a the name of this object-type + if(strlen(temp_str) == 0) + { + printf("[debug] Error: There is no object-type name in the line [%s].line:%d.\r\n",temp_str,mib_line_count); + return 0; + } + + //printf("type_found(temp_str: %s\r\n",temp_str); + if(TYPE_found(temp_str, fp, father_node_ptr, last_node_oid) == 1) + { + next_line_flag = 1; + state = 0; + break; + } + else + { + printf("[debug] Error: There is error in OBJECT-TYPE part.line:%d.\r\n",mib_line_count); + return 0; + } + //} + //next_line_flag=0; + //state=4; + //break; + default: + next_line_flag=0; + state=0; + break; + } + } + printf("[debug] Error: There is not word [END].line:%d.\r\n",mib_line_count); + return 0; +} /* end of BEGIN_found */ + + +/* +* +* Fun: OBJECT_found +* +* Desc: Analyze the OBJECT part and collect data after the string "OBJECT-IDENTITY" was found +* +* Ret: 1: Successful; 0: Fail +* +* Notes: Wang Jian add +* +* File: debug.c +* +*/ +int OBJECT_found(char *name, FILE *fp, mib_node *father_node_ptr, DWORD *last_node_oid) +{ + char temp_str[256]; + char temp_child_str[256]; + char *temp_ch; + DWORD size; + DWORD i; + BYTE find_module=0; + FILE *fp_conf; + char file_name[128]; + int state, next_line, found, index; + mib_node *node_ptr; + next_line=1; + state=1; + + + strcpy(file_name, ""); + strcpy(file_name, MIB_FILES_DIR); + strcat(file_name, MIB_WRITE_TREE ); + for(index=0;index<256;index++) + { + temp_str[index] = '\0'; + temp_child_str[index] = '\0'; + } + temp_ch = NULL; + + strcpy(object_data.name, ""); + object_data.ST = 0; + strcpy(object_data.DE, ""); + strcpy(object_data.RF, ""); + strcpy(object_data.father_name, ""); + strcpy(object_data.ID, ""); + + if(strlen(name) ==0) + { + printf("[debug] Error: Object name can not be NULL.line:%d.\r\n",mib_line_count); + return 0; + } + strcpy(object_data.name,name); + found=0; + + while(!feof(fp)) + { + if(next_line) + { + mib_line_count++; + if( read_line(fp,temp_str) == 0 ) + continue; + } + temp_ch = strchr(temp_str,'"'); // take the string between '"' and '"' into temp_child_str[] + if(temp_ch != NULL) + { + int index = 0; + while(temp_ch[index + 1] != '"') + { + temp_child_str[index] = temp_ch[index + 1]; + index++; + } + temp_child_str[index] = '\0'; + } + else + strcpy(temp_child_str, ""); + + switch(state) + { + case 1: // must be "STATUS" + temp_ch = strstr(temp_str, "STATUS"); + if(temp_ch != NULL) + { + if(strstr(temp_str, "current")) // fill the object_data.ST accroding to the word behind "STATUS" + { + object_data.ST = 1; + } + else + { + if(strstr(temp_str, "deprecated")) + { + object_data.ST = 2; + } + else + { + if(strstr(temp_str, "obsolete")) + { + object_data.ST = 3; + } + else + { + object_data.ST = 0; + printf("[debug] Error: Fail to collect the contents of STATUS.line:%d.\r\n",mib_line_count); + return 0; + } + } + } + found = 1; + next_line=1; + state=2; + break; + } + next_line = 1; + state = 1; + break; + case 2: // must be "DESCRIPTION" + temp_ch = strstr(temp_str,"DESCRIPTION"); + if(temp_ch != NULL) + { + take_str(temp_child_str, fp, temp_str); + if((temp_ch=strstr(temp_str,"[SubSystem_Module]"))) + { + strcpy(object_data.DE, temp_ch+18); + + find_module=1; + found = 2; + next_line=1; + state=3; + break; + + }else if(strlen(temp_str)) + { + strcpy(object_data.DE,temp_str); + found = 2; + next_line=1; + state=3; + break; + } + else + { + printf("[debug] Error: Fail to collect the contents of DESCRIPTION field.line:%d.\r\n",mib_line_count); + return 0; + } + } + next_line = 1; + state = 2; + break; + case 3: // may be "REFERENCE" + temp_ch = strstr(temp_str,"REFERENCE"); + if(temp_ch != NULL) + { + if( take_str(temp_child_str, fp, object_data.RF) ) // take the string between '"' and '"' after "REFERENCE " into object_data.RF[] + { + next_line = 1; + found = 3; + state=4; + break; + } + else + { + printf("[debug] Error: Fail to collect the contents of the REFERENCE field.line:%d.\r\n",mib_line_count); + return 0; + } + } + next_line=0; + state = 4; + break; + case 4: // must be "::=" + temp_ch = strstr(temp_str,"::="); + if(temp_ch != NULL) + { + //printf("object_data.name: %s.\r\n",object_data.name); + if((node_ptr=create_node(temp_str, object_data.name, 0, father_node_ptr, last_node_oid)) ) // create the object nod + { + //show_node(father_node_ptr,"{ }--", 1); + //printf("\r\nmib_node_index: %d. node_name: %s.\r\n",mib_node_index, object_data.name); + if(find_module) + { + strcpy(subsys_module[gobal_module_index].name,object_data.name); + subsys_module[gobal_module_index].index=gobal_module_index; + node_ptr->module_index=gobal_module_index; + for(index=6;indexoid_len;index++) + subsys_module[gobal_module_index].oid[index-6]=node_ptr->oid[index]; + gobal_module_index++; + } + else + node_ptr->module_index=gobal_module_index-1; + if((fp_conf = fopen(file_name,"a+")) == NULL) + { + printf("[debug] Error: cannot open conf_file: [%s].\r\n",file_name); + return 0; + } + if(!strlen(object_data.DE)) + { + node_ptr->remark_ptr=NULL; + } + else + { + for(i=0;i0;i--) + if(temp_str2[i]==' ' || temp_str2[i]=='\t' || temp_str2[i]=='\n') + temp_str2[i]='\0'; + else + break; + strcpy(object_data.DE,temp_str2); + } + + size=strlen(object_data.DE); + memcpy(heap_remark_curr,object_data.DE,sizeof(char)*(size+1)); + node_ptr->remark_ptr=heap_remark_curr; + heap_remark_index+=size+1; + heap_remark_curr=heap_remark+heap_remark_index; + } + fprintf(fp_conf,"Remark: %s\r\n",node_ptr->remark_ptr); + fprintf(fp_conf,"\r\n\r\n"); + fclose(fp_conf); + return 1; + } + else + { + printf("[debug] Error: Fail to create the object nod: [%s].line:%d.\r\n",object_data.name,mib_line_count); + return 0; + } + } + default: + next_line = 1; + state = 1; + break; + } + } + + switch(found) + { + case 0: + printf("[debug] Error: Can not find STATUS field.line:%d.\r\n",mib_line_count); + break; + case 1: + printf("[debug] Error: Can not find DESCRIPTION field.line:%d.\r\n",mib_line_count); + break; + default: + printf("[debug] Error: Can not find ::= field.line:%d.\r\n",mib_line_count); + break; + } + return 0; +} /* end of OBJECT_found */ + + + + + +/* +* +* Fun: TYPE_found +* +* Desc: Analyze the TYPE part and collect data after the string "TYPE-IDENTITY" was found +* +* Ret: 1: Successful; 0: Fail +* +* Notes: Wang Jian add +* +* File: debug.c +* +*/ +int TYPE_found(char *name, FILE *fp, mib_node *father_node_ptr, DWORD *last_node_oid) +{ + char temp_str[256]; + char temp_child_str[256]; + char *temp_ch; + int state, next_line, found, index; + FILE *fp_conf; + char file_name[128]; + char access_str[32]; + mib_node *node_ptr; + mib_node *leaf_node; + mib_child_node *mib_child_node_point; + mib_node_param *mib_node_param_point; + mib_param_select *mib_param_select_point; + WORD i; + BYTE j; + next_line=1; + state=1; + i=j=0; + for(index=0;index<256;index++) + { + temp_str[index] = '\0'; + temp_child_str[index] = '\0'; + } + temp_ch = NULL; + + strcpy(type_data.name, ""); + type_data.ST = 0; + strcpy(type_data.UP, ""); + type_data.MA = 0; + type_data.SY = 0; + strcpy(type_data.DE, ""); + type_data.total_instance = 0; + strcpy(type_data.RF, ""); + strcpy(type_data.father_name, ""); + strcpy(type_data.ID, ""); + + if(strlen(name) ==0) + { + printf("[debug] Error: Type name can not be NULL.line:%d.\r\n",mib_line_count); + return 0; + } + strcpy(type_data.name,name); + + found=0; + + while(!feof(fp)) + { + if(next_line) + { + mib_line_count++; + if( read_line(fp,temp_str) == 0 ) + continue; + + } + + temp_ch = strchr(temp_str,'"'); // take the string between '"' and '"' into temp_child_str[] + if(temp_ch != NULL) + { + int index = 0; + while(temp_ch[index + 1] != '"') + { + temp_child_str[index] = temp_ch[index + 1]; + index++; + } + temp_child_str[index] = '\0'; + } + else + strcpy(temp_child_str, ""); + //printf("t_f read_line: %s. temp_child_str: %s. state= %d\r\n",temp_str, temp_child_str, state); + //printf("state=%d\r\n",state); + switch(state) + { + case 1: // must be "SYNTAX" + temp_ch = strstr(temp_str,"SYNTAX"); + if(temp_ch != NULL) + { + // fill the type_data.SY accroding to the word behind "SYNTAX" + // 1: Integer32, 2: INTEGER, 3: OCTET STRING, + // 4: OBJECT IDENTIFIER, 5: BITS, 6: IpAddress, 7: Counter32, + // 8: Gauge32, 9: TimeTicks, 10: Opaque, 11: Counter64, + // 12: Unsigned32, 13:Conceptual Tables + if(strstr(temp_str, "Integer32")) + { + type_data.ST = 1; + } + else + { + if(strstr(temp_str, "INTEGER")) + { + type_data.SY = 2; + } + else + { + if(strstr(temp_str, "OCTET") && strstr(temp_str, " STRING")) + { + type_data.SY = 3; + } + else + { + if(strstr(temp_str, "OBJECT") && strstr(temp_str, " IDENTIFIER")) + { + type_data.SY = 4; + } + else + { + if(strstr(temp_str, "BITS")) + { + type_data.SY = 5; + } + else + { + if(strstr(temp_str, "IpAddress")) + { + type_data.SY = 6; + } + else + { + if(strstr(temp_str, "Counter32")) + { + type_data.SY = 7; + } + else + { + if(strstr(temp_str, "Gauge32")) + { + type_data.SY = 8; + } + else + { + if(strstr(temp_str, "TimeTicks") && strstr(temp_str, " STRING")) + { + type_data.SY = 9; + } + else + { + if(strstr(temp_str, "Opaque")) + { + type_data.SY = 10; + } + else + { + if(strstr(temp_str, "Counter64")) + { + type_data.SY = 11; + } + else + { + if(strstr(temp_str, "Unsigned32")) + { + type_data.SY = 12; + } + else + { + if(strstr(temp_str, "Conceptual") && strstr(temp_str, " Tables")) + { + type_data.SY = 13; + } + else + { + type_data.SY = 0; + printf("[debug] Error: Fail to collect the contents of SYNTAX field.line:%d.\r\n",mib_line_count); + return 0; + } + } + } + } + } + } + } + } + } + } + } + } + } + found = 1; + next_line=1; + state=2; + break; + } + next_line = 1; + state = 1; + break; + case 2: // may be "UnitsPart" + temp_ch = strstr(temp_str,"UnitsPart"); + if(temp_ch != NULL) + { + if( take_str(temp_child_str, fp, type_data.UP) ) // take the string between '"' and '"' after "UnitsPart " into type_data.UP[] + { + next_line=1; + state=3; + break; + } + else + { + printf("[debug] Error: Fail to collect the contents of UnitsPart field.line:%d.\r\n",mib_line_count); + return 0; + } + } + next_line = 0; + state = 3; + break; + case 3: // must be "MAX-ACCESS" + temp_ch = strstr(temp_str,"MAX-ACCESS"); + if(temp_ch != NULL) + { + // fill the type_data.MA accroding to the word behind "MAX-ACCESS" + // 0: invalid, 1: not-accessible, 2: accessible-for-notify, 3: read-only, 4: read-write, 5: read-create + if(strstr(temp_str, "not-accessible")) + { + type_data.MA = 1; + } + else + { + if(strstr(temp_str, "accessible-for-notify")) + { + type_data.MA = 2; + } + else + { + if(strstr(temp_str, "read-only")) + { + type_data.MA = 3; + } + else + { + if(strstr(temp_str, "read-write")) + { + type_data.MA = 4; + } + else + { + if(strstr(temp_str, "read-create")) + { + type_data.MA = 5; + } + else + { + if(strstr(temp_str, "write-only")) + { + type_data.MA = 6; + } + else + { + type_data.MA = 0; + printf("[debug] Error: Fail to collect the contents of MAX-ACCESS field.line:%d.\r\n",mib_line_count); + return 0; + } + } + } + } + } + } + found = 2; + next_line=1; + state = 4; + break; + } + next_line = 1; + state = 3; + break; + case 4: // must be "STATUS" + temp_ch = strstr(temp_str, "STATUS"); + if(temp_ch != NULL) + { + if(strstr(temp_str, "current")) // fill the type_data.ST accroding to the word behind "STATUS" + { + type_data.ST = 1; + } + else + { + if(strstr(temp_str, "deprecated")) + { + type_data.ST = 2; + } + else + { + if(strstr(temp_str, "obsolete")) + { + type_data.ST = 3; + } + else + { + type_data.ST = 0; + printf("[debug] Error: Fail to collect the contents of STATUS.line:%d.\r\n",mib_line_count); + return 0; + } + } + } + found = 3; + next_line=1; + state=5; + break; + } + next_line = 1; + state = 4; + break; + case 5: // must be "DESCRIPTION" + temp_ch = strstr(temp_str,"DESCRIPTION"); + if(temp_ch != NULL) + { + //printf("description: beginline:%d.\r\n",mib_line_count); + //if( take_str(temp_child_str, fp, type_data.DE) ) // take the string between '"' and '"' after "DESCRIPTION " into type_data.DE[] + //{ + /*int i=0; + // take the first word of Description into type_data.total_instance + while(type_data.DE[i] != 0xa) + { + temp_str[i] = type_data.DE[i]; + i++; + } + temp_str[i]='\0'; + type_data.total_instance = atoi(temp_str);*/ + // type_data.total_instance = 256; + //printf("description end: %s\r\n",type_data.DE); + if(!(strchr(temp_str,'"'))) + { + mib_line_count++; + read_line(fp,temp_str); + if(!(strchr(temp_str,'"'))) + { + printf("[debug] Error: There is no first quotes .line:%d.\r\n",mib_line_count); + return 0; + } + } + memset(&temp_leaf_node,0,sizeof(mib_node)); + leaf_compute_field_num=0; + if(!Analyze_Leaf_Description(fp, &temp_leaf_node)) + { + printf("[debug] Error: Fail to collect the contents of DESCRIPTION field.line:%d.\r\n",mib_line_count); + return 0; + } + mib_line_count++; + read_line(fp,temp_str); + if(!(strchr(temp_str,'"'))) + { + printf("[debug] Error: There is no second quotes.line:%d.\r\n",mib_line_count); + return 0; + } + found = 4; + next_line=1; + state=6; + break; + } + next_line = 1; + state = 5; + break; + case 6: // may be "REFERENCE" + temp_ch = strstr(temp_str,"REFERENCE"); + if(temp_ch != NULL) + { + if( take_str(temp_child_str, fp, type_data.RF) ) // take the string between '"' and '"' after "REFERENCE" into type_data.RF + { + next_line = 1; + state=7; + break; + } + else + { + printf("[debug] Error: Fail to collect the contents of the REFERENCE field %d.line:%d.\r\n",module_data.RE_index,mib_line_count); + return 0; + } + } + next_line=0; + state = 7; + break; + case 7: // may be "INDEX" or "AUGMENTS" + temp_ch = strstr(temp_str,"INDEX"); + if(temp_ch != NULL) + { + // handle the line contenting "INDEX" + next_line = 1; + state = 8; + break; + } + else + { + temp_ch = strstr(temp_str,"AUGMENTS"); + if(temp_ch != NULL) + { + // handle the line contenting "AUGMENTS" + next_line = 1; + state = 8; + break; + } + else + { + next_line = 0; + state = 8; + break; + } + } + case 8: // must be "::=" + temp_ch = strstr(temp_str,"::="); + if(temp_ch != NULL) + { + //printf("type.::= begin: tmep_str: %s....type_data.name: %s\r\n",temp_str,type_data.name); + if( (node_ptr = create_node(temp_str, type_data.name, 0, father_node_ptr, last_node_oid)) ) // create the module node + { + mib_type_num++; + node_ptr->max_access = type_data.MA; + leaf_node=&temp_leaf_node; + node_ptr->module_index=gobal_module_index-1; + node_ptr->data_length=leaf_node->data_length; + node_ptr->total_instance=leaf_node->total_instance; + node_ptr->total_child_nodes=leaf_node->total_child_nodes; + node_ptr->enable_field_id=leaf_node->enable_field_id; + strncpy(node_ptr->init_value,leaf_node->init_value,leaf_node->data_length); + node_ptr->remark_ptr=leaf_node->remark_ptr; + for(index=0;indexchild_nodes[index]=leaf_node->child_nodes[index]; + } + if(node_save_flag==1) + { + module_save_flag[node_ptr->module_index].module_index=node_ptr->module_index; + module_save_flag[node_ptr->module_index].save_select_id=node_save_module.save_select_id; + module_save_flag[node_ptr->module_index].save_field_id=node_save_module.save_field_id; + for(i=0;i<32;i++) + module_save_flag[node_ptr->module_index].oid[i]=node_ptr->oid[i]; + module_save_flag[node_ptr->module_index].oid_len=node_ptr->oid_len; + node_save_flag=0; + if(node_ptr->max_access<4) + { + printf("[Debug] : The save command node can not right!Please check the MIB files!\r\n"); + exit(0); + } + } + + if(leaf_compute_field_num!=0) + for(i=0;iname); + fprintf(fp_conf,"Instance: %d\r\n",node_ptr->total_instance); + fprintf(fp_conf,"Length : %d\r\n",node_ptr->data_length); + fprintf(fp_conf,"Flag : %d\r\n",node_ptr->enable_field_id); + fprintf(fp_conf,"Default : %s\r\n",node_ptr->init_value); + fprintf(fp_conf,"Remark : %s\r\n",node_ptr->remark_ptr); + fprintf(fp_conf,"Field : total(%d)\r\n",node_ptr->total_child_nodes); + + switch(node_ptr->max_access) + { + case 1: + strcpy(access_str,"not-accessible"); + break; + case 2: + strcpy(access_str,"accessible-for-notify"); + break; + case 3: + strcpy(access_str,"read-only"); + break; + case 4: + strcpy(access_str,"read-write"); + break; + case 5: + strcpy(access_str,"read-create"); + break; + case 6: + strcpy(access_str,"write-only"); + break; + default: + strcpy(access_str,"access type error"); + break; + } + fprintf(fp_conf,"Access : %s",access_str); + for(i=0;itotal_child_nodes;i++) + { + mib_child_node_point=node_ptr->child_nodes[i]; + if(mib_child_node_point) + if(mib_child_node_point->child_ptr) + { + mib_node_param_point=(mib_node_param* )mib_child_node_point->child_ptr; + if(mib_node_param_point->select_total==0) + { + if(mib_node_param_point->input_ptr!=NULL) + fprintf(fp_conf,"[%d]%s\r\n {\r\n [u]%d.%d-%d.%d\r\n [u]input\r\n [v]%s\r\n }\r\n",mib_node_param_point->id+1,mib_node_param_point->name,mib_node_param_point->byte_begin,mib_node_param_point->bit_begin,mib_node_param_point->byte_end,mib_node_param_point->bit_end,field_input_type[mib_node_param_point->input_ptr->input_param_type]); + } + else + { + fprintf(fp_conf," [%d]%s\r\n {\r\n [u]%d.%d-%d.%d\r\n [u]select\r\n",mib_node_param_point->id+1,mib_node_param_point->name,mib_node_param_point->byte_begin,mib_node_param_point->bit_begin,mib_node_param_point->byte_end,mib_node_param_point->bit_end); + for(j=0;jselect_total;j++) + { + mib_param_select_point=mib_node_param_point->select_ptr[j]; + if(mib_param_select_point) + fprintf(fp_conf," [v]%d[opt]%s\r\n", mib_param_select_point->number,mib_param_select_point->description); + } + fprintf(fp_conf," }\r\n"); + } + } + } + fprintf(fp_conf,"\r\n\r\n"); + fclose(fp_conf); + return 1; + } + else + { + printf("[debug] Error: Fail to create the type nod: [%s].line:%d.\r\n",type_data.name,mib_line_count); + return 0; + } + } + next_line = 1; + state = 8; + break; + default: + next_line = 1; + state = 0; + break; + } + } + switch(found) + { + case 0: + printf("[debug] Error: Can not find SYNTAX field.line:%d.\r\n",mib_line_count); + break; + case 1: + printf("[debug] Error: Can not find MAX-ACCESS field.line:%d.\r\n",mib_line_count); + break; + case 2: + printf("[debug] Error: Can not find STATUS field.line:%d.\r\n",mib_line_count); + break; + case 3: + printf("[debug] Error: Can not find DESCRIPTION field.line:%d.\r\n",mib_line_count); + break; + default: + printf("[debug] Error: Can not find ::= field.line:%d.\r\n",mib_line_count); + break; + } + return 0; +} /* end of TYPE_found */ + + +/* +* +* Fun: IMPORTS_found +* +* Desc: Analyze the IMPORTS part and collect data after the string "IMPORTS" was found +* +* Ret: return the pointer to the father node if successful. If fail, return null pointer +* +* Notes: Wang Jian add +* +* File: debug.c +* +*/ +mib_node *IMPORTS_found(FILE *fp) +{ + char temp_str[256]; + char *temp_ch; + int index, found[3] = {0,0,0}; + mib_node *father_node_ptr; + + for(index=0;index<256;index++) + temp_str[index] = '\0'; + temp_ch = NULL; + + strcpy(imports_data.father_name, ""); + strcpy(imports_data.from_file, ""); + + while(!feof(fp)) + { + mib_line_count++; + if( read_line(fp,temp_str) == 0) + continue; + //printf("read_line: %s.\r\n",temp_str); + temp_ch = strchr(temp_str,','); // skip the line contents ',' + if(temp_ch == NULL) + { + temp_ch = strstr(temp_str, "FROM"); // except a line contents "FROM" and ';' + if(temp_ch != NULL) + { + found[1] = 1; + if(strchr(temp_str, ';') != NULL) // if the line contents ';', collect the word between "FROM " and ';' + { + index=0; + temp_ch = &temp_ch[5]; + pick_first_word(temp_ch, imports_data.from_file); + temp_ch = strchr(imports_data.from_file, ';'); + if (temp_ch != NULL) + *temp_ch = '\0'; + found[2] = 1; + //printf("from_file: %s.\r\n",imports_data.from_file); + if( strlen(imports_data.father_name) ==0 ) + { + printf("[debug] Error: Can't not find name of Father_nod in IMPORTS part.line:%d.\r\n",mib_line_count); + return NULL; + } + if(mib_node_index == 0) + { + father_node_ptr = create_mib_node(imports_data.father_name, root_oid_len, root_oid, 0); + mib_curr_node = mib_root_node = father_node_ptr; + //printf("the first nod [%s]. return\r\n", imports_data.father_name); + return father_node_ptr; + } + else + father_node_ptr = find_node(mib_root_node, imports_data.father_name, 0, NULL); + return father_node_ptr; + } + } + else // take the name of the father nod into imports_data.father_name[] + { + pick_first_word(temp_str, imports_data.father_name); + //printf("father name: %s.\r\n",imports_data.father_name); + found[0] = 1; + } + } + } + if(found[0]==0) + printf("[debug] Error: Can't not find name of Father_nod in IMPORTS part.line:%d.\r\n",mib_line_count); + else if(found[1] == 0) + printf("[debug] Error: Can't not find name of Import_from_file in IMPORTS part.line:%d.\r\n",mib_line_count); + else if(found[2] == 0) + printf("[debug] Error: Can't not find end sign ';' in IMPORTS part.line:%d.\r\n",mib_line_count); + return NULL; +} // end of IMPORTS_found + + +/* +* +* Fun: MODULE_found +* +* Desc: Analyze the MODULE part and collect data after the string "MODULE-IDENTITY" was found +* +* Ret: 1: Successful; 0: Fail +* +* Notes: Wang Jian add +* +* File: debug.c +* +*/ +int MODULE_found(char *name, FILE *fp, mib_node *father_node_ptr, DWORD *last_node_oid) +{ + char temp_str[256]; + char temp_child_str[256]; + char *temp_ch; + int state, next_line, found, index; + WORD size; + mib_node *node_ptr; + if(strlen(name) ==0) + { + printf("[debug] Error: Module name can not be NULL.line:%d.\r\n",mib_line_count); + return 0; + } + strcpy(module_data.name,name); + found=0; + + next_line=1; + state=1; + strcpy(temp_str, ""); + strcpy(temp_child_str, ""); + temp_ch = NULL; + + strcpy(module_data.LU, ""); + strcpy(module_data.OR, ""); + strcpy(module_data.CI, ""); + strcpy(module_data.DE, ""); + for(index = 0; index < MIB_MODULE_REVISION_MAX_NUM; index++) + { + strcpy(module_data.RE[index], ""); + strcpy(module_data.RE_DE[index], ""); + } + module_data.RE_index = 0; + strcpy(module_data.father_name, ""); + strcpy(module_data.ID, ""); + + while(!feof(fp)) + { + if(next_line) + { + mib_line_count++; + if( read_line(fp,temp_str) == 0 ) + continue; + } + temp_ch = strchr(temp_str,'"'); // take the string between '"' and '"' into temp_child_str[] + if(temp_ch != NULL) + { + int index = 0; + while(temp_ch[index + 1] != '"') + { + temp_child_str[index] = temp_ch[index + 1]; + index++; + } + temp_child_str[index] = '\0'; + } + else + strcpy(temp_child_str, ""); + + //printf("module state [%d].\r\n", state); + switch(state) + { + case 1: // must be "LAST-UPDATED" + temp_ch = strstr(temp_str,"LAST-UPDATED"); + if(temp_ch != NULL) + { + if( take_str(temp_child_str, fp, module_data.LU) ) // take the string between '"' and '"' after "LAST-UPDATED " into module_data.LA[] + { + //printf("module_data.LAST-UPDATED [%s].\r\n", module_data.LU); + found = 1; + next_line=1; + state=2; + break; + } + else + { + printf("[debug] Error: Fail to collect the contents of LAST-UPDATED field.line:%d.\r\n",mib_line_count); + return 0; + } + } + next_line = 1; + state = 1; + break; + case 2: // must be "ORGANIZATION" + temp_ch = strstr(temp_str,"ORGANIZATION"); + if(temp_ch != NULL) + { + if( take_str(temp_child_str, fp, module_data.OR) ) // take the string between '"' and '"' after "ORGANIZATION " into module_data.OR[] + { + //printf("module_data.ORGANIZATION [%s].\r\n", module_data.OR); + found= 2; + next_line=1; + state=3; + break; + } + else + { + printf("[debug] Error: Fail to collect the contents of ORGANIZATION field.line:%d.\r\n",mib_line_count); + return 0; + } + } + next_line = 1; + state = 2; + break; + case 3: // must be "CONTACT-INFO" + temp_ch = strstr(temp_str,"CONTACT-INFO"); + if(temp_ch != NULL) + { + if( take_str(temp_child_str, fp, module_data.CI) ) // take the string between '"' and '"' after "ORGANIZATION " into module_data.CI[] + { + //printf("module_data.CONTACT-INFO [%s].\r\n", module_data.CI); + found = 3; + next_line=1; + state=4; + break; + } + else + { + printf("[debug] Error: Fail to collect the contents of CONTACT-INFO field.line:%d.\r\n",mib_line_count); + return 0; + } + } + next_line = 1; + state = 3; + break; + case 4: // must be "DESCRIPTION" + temp_ch = strstr(temp_str,"DESCRIPTION"); + if(temp_ch != NULL) + { + if( take_str(temp_child_str, fp, module_data.DE) ) // take the string between '"' and '"' after "DESCRIPTION " into module_data.DE[] + { + //printf("module_data.DESCRIPTION [%s].\r\n", module_data.DE); + found = 4; + next_line=1; + state=5; + break; + } + else + { + printf("[debug] Error: Fail to collect the contents of DESCRIPTION field.line:%d.\r\n",mib_line_count); + return 0; + } + } + next_line = 1; + state = 4; + break; + case 5: // may be "REVISION" + temp_ch = strstr(temp_str,"REVISION"); + if(temp_ch != NULL) + { + if( take_str(temp_child_str, fp, module_data.RE[module_data.RE_index]) ) // take the string between '"' and '"' after "REVISION " into module_data.RE[RE_index] + { + //printf("module_data.REVISION(index) [%s](%d).\r\n", module_data.RE[module_data.RE_index], module_data.RE_index); + next_line = 1; + found = 5; + state=6; + break; + } + else + { + printf("[debug] Error: Fail to collect the contents of the REVISION field %d.line:%d.\r\n",module_data.RE_index,mib_line_count); + return 0; + } + } + next_line=0; + state = 7; + break; + case 6: // must be "DESCRIPTION" which belong to the nearest "REVISION" + temp_ch = strstr(temp_str,"DESCRIPTION"); + if(temp_ch != NULL) + { + if( take_str(temp_child_str, fp, module_data.RE_DE[module_data.RE_index]) ) // take the string between '"' and '"' after "DESCRIPTION " into module_data.RE_DE[RE_index] + { + //printf("module_data.REVISION.DESCRIPTION(index) [%s](%d).\r\n", module_data.RE_DE[module_data.RE_index], module_data.RE_index); + module_data.RE_index = (module_data.RE_index + 1) % MIB_MODULE_REVISION_MAX_NUM; + next_line = 1; + found = 6; + state=5; + break; + } + else + { + printf("[debug] Error: Fail to collect the contents of DESCRIPTION field of the REVISION field: %d.line:%d.\r\n",module_data.RE_index,mib_line_count); + return 0; + } + } + next_line = 1; + state = 6; + break; + case 7: // must be "::=" + temp_ch = strstr(temp_str,"::="); + if(temp_ch != NULL) + { + //printf("entering create_node().line:%d.\r\n",mib_line_count); + if( (node_ptr=create_node(temp_str, module_data.name, 0, father_node_ptr, last_node_oid))) // create the module nod + { + if(!strlen(module_data.DE)) + { + node_ptr->remark_ptr=NULL; + return 1; + } + else + { + size=strlen(module_data.DE); + memcpy(heap_remark_curr,module_data.DE,sizeof(char)*(size+1)); + node_ptr->remark_ptr=heap_remark_curr; + heap_remark_index+=size+1; + heap_remark_curr=heap_remark+heap_remark_index; + } + return 1; + } + else + { + printf("[debug] Error: Fail to create the module nod: [%s].line:%d.\r\n",module_data.name,mib_line_count); + return 0; + } + } + default: + next_line = 1; + state = 0; + break; + } + } + switch(found) + { + case 0: + printf("[debug] Error: Can not find LAST-UPDATED field.line:%d.\r\n",mib_line_count); + break; + case 1: + printf("[debug] Error: Can not find ORGANIZATION field.line:%d.\r\n",mib_line_count); + break; + case 2: + printf("[debug] Error: Can not find CONTACT-INFO field.line:%d.\r\n",mib_line_count); + break; + case 3: + printf("[debug] Error: Can not find DESCRIPTION field.line:%d.\r\n",mib_line_count); + break; + case 5: + printf("[debug] Error: Can not find the DESCRIPTION of REVISION field.line:%d.\r\n",mib_line_count); + break; + default: + printf("[debug] Error: Can not find ::= field.line:%d.\r\n",mib_line_count); + break; + } + return 0; +} /* end of MODULE_found */ + + +/* +* +* Fun: Analyze_Description +* +* Desc: Analyze leaf node Description script in the mib script +* +* Ret: 0 err 1 successfull +* +* File: debug.c +* +*/ +int Analyze_Leaf_Description(FILE *fp, mib_node *leaf_node) +{ + BYTE unit_start_flag, + remark_start_flag, + select_start_flag, + field_start_flag, + new_line=0, + leaf_state, + field_state, + i, + j; + char instance_str[5], + default_str[256], + length_str[4], + data_arr[512], + temp_str[128], + *temp_ch, + *p; + WORD total_instance, + pos_arr[4], + length, + size; + mib_child_node *mib_child_node_ptr = NULL; + mib_param_select *mib_param_select_ptr = NULL; + mib_param_input *mib_param_input_ptr = NULL; + mib_node_param *mib_node_param_ptr = NULL; + + unit_start_flag=remark_start_flag=select_start_flag=field_start_flag=0; + leaf_node->enable_field_id=0xFF; + leaf_state=0; + field_state=0; + while(!feof(fp)) + { + if(leaf_state==10) + { + printf("[Debug] Error: Script error.The field segment error.Line: %d.\r\n", mib_line_count); + return 0; + } + if((leaf_state<=5 && field_start_flag==0) || ((remark_start_flag==1)&& leaf_state>=8)) + { + mib_line_count++; + memset(data_arr,0,512*sizeof(char)); + if( read_line(fp,data_arr) == 0 ) + continue; + + } + new_line=0; + switch (leaf_state) + { + case 0: + temp_ch = strstr(data_arr, "[Begin]"); + if(temp_ch != NULL) + leaf_state = 1; + else + leaf_state = 10; + break; + case 1: + temp_ch = strstr(data_arr, "Instance"); + if(temp_ch != NULL) + { + temp_ch+=8; + for(i=0;i MAX_TOTAL_INSTANCE) + { + printf + ("[Debug] Error: script error.The max instance number is %d.line:%d.\r\n", + MAX_TOTAL_INSTANCE, mib_line_count); + return 0; + } + leaf_node->total_instance = total_instance; + leaf_state = 2; + break; + } + } + leaf_state = 10; + break; + case 2: + temp_ch = strstr(data_arr, "Length"); + if(temp_ch != NULL) + { + temp_ch+=6; + for(i=0;i MAX_NODE_PACKET_LENGTH) + { + printf + ("[Debug] Error: script error.The max data length is %d. line:%d.\r\n", + MAX_NODE_PACKET_LENGTH, + mib_line_count); + return 0; + } + leaf_node->data_length = length; + leaf_state = 3; + break; + } + } + leaf_state = 10; + break; + case 3: + temp_ch = strstr(data_arr, "Default"); + if(temp_ch != NULL) + { + temp_ch+=7; + for(i=0;i 256 && (test_str(default_str,1))) + { + printf("[Debug] Error: script error.The max default value length is 256.Line: %d.\r\n", mib_line_count); + return 0; + } + memset(leaf_node->init_value,0,256*sizeof(char)); + AsciiToRbcd (leaf_node->init_value, default_str, strlen(default_str)); + leaf_node->init_value[leaf_node->data_length]='\0'; + leaf_state = 5; + break; + } + leaf_state=10; + break; + case 5: + temp_ch = strstr(data_arr, "Flag"); + if(temp_ch != NULL) + { + temp_ch+=4; + if((temp_ch=strstr(data_arr, "E")) ) + { + leaf_state=6; + break; + } + else if((temp_ch=strstr(data_arr, "S"))) + { + leaf_state=7; + break; + } + else leaf_state=10; + } + field_start_flag=1; + leaf_state=4; + break; + case 6: + temp_ch++; + if(*temp_ch=='\0') + { + printf("[Debug] Error: script error.The enable Flag format is not right.Line: %d.\r\n", mib_line_count); + return 0; + } + strcpy(temp_str,temp_ch); + leaf_node->enable_field_id=atoi(temp_ch)-1; + leaf_state=4; + break; + case 7: + temp_ch++; + i=0; + while(*(temp_ch+i)!='\0') + { + if(*(temp_ch+i)=='.') + break; + if(!isdigit(*(temp_ch+i))) + { + printf("[Debug] Error: script error.The save Flag format is not right.Line: %d.\r\n", mib_line_count); + return 0; + } + i++; + } + if(*(temp_ch+i)=='\0') + { + printf("[Debug] Error: script error.The save Flag format is not right.Line: %d.\r\n", mib_line_count); + return 0; + } + node_save_flag=1; + strncpy(temp_str,temp_ch,i); + temp_str[i]='\0'; + temp_ch=temp_ch+i+1; + node_save_module.save_field_id=atoi(temp_str); + strcpy(temp_str,temp_ch); + if(!(test_str(temp_str,0)) ) + { + printf("[Debug] Error: script error.The save Flag format is not right.Line: %d.\r\n", mib_line_count); + return 0; + } + node_save_module.save_select_id=atoi(temp_str); + leaf_state=4; + break; + case 4: + field_start_flag=0; + if(unit_start_flag==0) + { + temp_ch = strstr(data_arr, "Field"); + if(temp_ch != NULL) + { + temp_ch = strstr(data_arr, "["); + if(temp_ch != NULL) + { + field_state = 1; + } + else + { + field_state=0; + temp_ch=data_arr; + } + } + else + { + leaf_state = 10; + break; + } + unit_start_flag=1; + } + else if(field_state!=1 && (temp_ch=strstr(data_arr,"Remark"))!=NULL) + { + printf("[Debug] Error: The field is not over! line:%d.\r\n",mib_line_count); + return 0; + } + else + temp_ch=data_arr; + p=temp_ch; + while(*p != '\0') + { + if(field_state==13) + { + printf("[Debug] Error: Script error.The field segment error.Line: %d.\r\n", mib_line_count); + return 0; + } + if((strstr(p,"Remark")!=NULL) && (strstr(p,":"))!=NULL) + { + leaf_state=8; + break; + } + if(new_line==1) + break; + switch (field_state) + { + case 0: //idle + field_state = 1; + new_line=1; + break; + case 1: //meet the "[" + if(select_start_flag==1) + { + temp_ch=strstr(p,"}"); + if(temp_ch != NULL) + { + field_state=7; + break; + } + } + temp_ch = strstr(p, "["); + if(temp_ch != NULL) + { + p = temp_ch + 1; + if(isdigit(*p)) + { + field_state = 2; + break; + } + else if(*p == 'i' || *p == 'I') + { + field_state = 3; + break; + } + else if(*p == 'u' || *p == 'U') + { + field_state = 4; + break; + } + else if(*p == 'v' || *p == 'V') + { + field_state = 5; + break; + } + } + field_state = 13; + break; + case 2: //meet the "[num" + // p--; + i = strcspn(p, "]"); + if(i != 0) + { + strncpy(temp_str, p, i); + temp_str[i]='\0'; + del_space(temp_str,2); + if((test_str(temp_str,0)) && strlen(temp_str)<4) + { + p=p+i+1; + if(*p=='\0') + { + printf("[debug] : Script Error. There is no field name.Line: %d.\r\n", mib_line_count); + return 0; + } + if (mib_node_param_index >= MIB_MAX_NODE_PARAMS) + { + printf("[debug] : Script Error. There is no field have been alloced in the memery.Line: %d.\r\n", mib_line_count); + return 0; + } + mib_node_param_ptr = &mib_node_param_array[mib_node_param_index++]; + strcpy( mib_node_param_ptr->name, p); + if(atoi(temp_str)>0) + mib_node_param_ptr->id =(BYTE)(atoi(temp_str)-1); + else + { + printf("[Debug] : The field id start from 1!line:%d.\r\n",mib_line_count); + return 0; + } + //leaf_node->total_child_nodes++; + mib_node_param_ptr->parent_ptr=leaf_node; + if (!(mib_child_node_ptr = create_mib_child_node(mib_node_param_ptr->name, leaf_node->total_child_nodes))) + { + printf("[debug] Error: Faile to Create child nod.id:%s,name:%s.line:%d\r\n", temp_str,p,mib_line_count); + return 0; + } + if (!register_child_node(leaf_node, mib_child_node_ptr)) + { + printf("[debug] Error: Fail to register the child nod id:%s,name:%s..line:%d.\r\n",temp_str,p,mib_line_count); + return 0; + } + mib_child_node_ptr->child_ptr = mib_node_param_ptr; + + field_state=6; + new_line=1; + break; + } + } + field_state = 13; + break; + case 3: //meet the "[I" + p++; + i = strcspn(p, "]"); + if(i != 0) + { + strncpy(temp_str, p, i); + temp_str[i]='\0'; + p+=i+1; + i = 0; + while(temp_str[i] != '\0') + { + if(!isdigit(temp_str[i])) + break; + i++; + } + if(i == strlen(temp_str) && atoi(temp_str)<256) + { + j=atoi(temp_str)-1; + + } + else + { + printf("[debug] Error: The field id is not right.line:%d.\r\n",mib_line_count); + return 0; + } + if(*p!='\0') + strcpy(temp_str,p); + else + { + printf("[debug] Error: There field name is not right.line:%d.\r\n",mib_line_count); + return 0; + } + if(create_compute_field(fp,leaf_node,j,temp_str)==0) + { + field_state=13; + break; + } + field_state=1; + leaf_compute_field_num++; + new_line=1; + break; + } + field_state = 13; + break; + case 4: //meet the "[u" + temp_ch=strstr(data_arr, "[u]select"); + if(temp_ch!=NULL) + { + field_state = 8; + break; + } + temp_ch=strstr(data_arr, "[u]input"); + if(temp_ch!=NULL) + { + field_state = 9; + break; + } + temp_ch=strstr(data_arr,"]"); + if(temp_ch!=NULL) + if(isdigit(temp_ch[1])) + { + p=temp_ch; + field_state=10; + break; + } + field_state=13; + break; + case 5: //meet the "[v" + if(strncasecmp(mib_node_param_ptr->name,"Reserved",strlen("Reserved"))==0 && strcmp(p,"{")) + { + field_state=7; + break; + } + temp_ch=strstr(p,"]"); + if(temp_ch!=NULL) + { + if(isdigit(*(temp_ch+1))) + field_state=12; + else + field_state=11; + break; + } + field_state=13; + break; + case 6: //meet the "{" + temp_ch=strstr(p,"{"); + field_state=1; + new_line=1; + break; + case 7: //meet the "}" + temp_ch=strstr(p,"}"); + field_state=1; + new_line=1; + break; + case 8: //meet the "[u]select" + field_state=5; + new_line=1; + break; + case 9: //meet the "[u]input" + field_state=5; + new_line=1; + break; + case 10: //meet the "[u]00.0-10.0" + p++; + for(i=0,j=0;i<4;i++) + { + while(*p!='\0') + { + if(*(p+j)=='.' || *(p+j)=='-') + break; + j++; + } + strncpy(temp_str,p,j); + temp_str[j]='\0'; + pos_arr[i]=atoi(temp_str); + p+=j+1; + j=0; + } + + mib_node_param_ptr->byte_begin=pos_arr[0]; + mib_node_param_ptr->bit_begin=pos_arr[1]; + mib_node_param_ptr->byte_end=pos_arr[2]; + mib_node_param_ptr->bit_end=pos_arr[3]; + field_state=1; + new_line=1; + break; + case 11: //meet the "[v]keepHex-low-E" + if (mib_param_input_index >= MIB_MAX_PARAM_INPUTS) + { + printf("[debug] Error: There are not enough mib_param_inputs in the array.line:%d.\r\n",mib_line_count); + return 0; + } + mib_param_input_ptr = &mib_param_input_array[mib_param_input_index++]; + mib_node_param_ptr->input_ptr = mib_param_input_ptr; + strcpy(temp_str,data_arr); + if(strstr(temp_str, "toDec-high-0")) + { + mib_param_input_ptr->input_param_type = TODEC_HIGH_0; + } + else + { + if(strstr(temp_str, "keepHex-high-0")) + mib_param_input_ptr->input_param_type = KEEPHEX_HIGH_0; + else + { + if(strstr(temp_str, "keepHex-low-0")) + mib_param_input_ptr->input_param_type = KEEPHEX_LOW_0; + else + { + if(strstr(temp_str, "keepHex-low-E")) + mib_param_input_ptr->input_param_type = KEEPHEX_LOW_E; + else + { + if(strstr(temp_str, "keepHex-low-F")) + mib_param_input_ptr->input_param_type = KEEPHEX_LOW_F; + else + { + if(strstr(temp_str, "toAscii-low-0")) + mib_param_input_ptr->input_param_type = TOASCII_LOW_0; + else + { + if(strstr(temp_str, "keepAsc-low-F")) + mib_param_input_ptr->input_param_type = KEEPASC_LOW_F; + else + { + printf("[debug] Error: There is not input param like %s.line:%d.\r\n",temp_str,mib_line_count); + return 0; + } + } + } + } + } + } + } + field_state=7; + new_line=1; + break; + case 12: //meet the "[v]1[opt]Spare" + mib_param_select_ptr = &mib_param_select_array[mib_param_select_index++]; + mib_node_param_ptr->select_ptr[mib_node_param_ptr->select_total++] = mib_param_select_ptr; + temp_ch=strtok(data_arr,"[]"); //'V' + temp_ch=strtok(NULL,"[]"); //'1' + for(i=0;inumber = (BYTE)atoi(temp_ch); + } + else + { + field_state=13; + break; + } + temp_ch=strtok(NULL,"[]"); //'opt' + temp_ch=strtok(NULL,"[]"); //'Spare' + if(temp_ch!=NULL) + strcpy(mib_param_select_ptr->description, temp_ch); + else + printf("[Debug] : There is no select option .line:%d.\r\n",mib_line_count); + select_start_flag=1; + field_state=1; + new_line=1; + break; + } + //if(*p!='\0') + // p++; + } + break; + case 8: + i=0; + if(remark_start_flag==0) + { + temp_ch = strstr(data_arr, "Remark"); + + if(temp_ch != NULL) + { + temp_ch+=6; + for(i=0;iremark_ptr=NULL; + leaf_state=1; + break; + } + else + strcpy(temp_str,temp_ch+i); + } + else + leaf_state=10; + } + else + { + if(strstr(data_arr,"[End]")==NULL) + strcpy(temp_str,data_arr); + else + { + remark_start_flag=0; + leaf_state=9; + break; + } + } + strcat(temp_str,"\n"); + /* + if(strlen(temp_str)>0) + { + for(i=strlen(temp_str)-1;i>0;i--) + { + if(temp_str[i]==' ' || temp_str[i]=='\n') + temp_str[i]='\0'; + else + break; + } + } + */ + size=strlen(temp_str); + if(remark_start_flag==1) + strcat(leaf_node->remark_ptr,temp_str); + else + memcpy(heap_remark_curr,temp_str,sizeof(char)*(size+1)); + if(remark_start_flag==0) + leaf_node->remark_ptr=heap_remark_curr; + heap_remark_index+=size+1; + heap_remark_curr=heap_remark+heap_remark_index; + remark_start_flag=1; + //strcpy(father_node_ptr->remark, temp_str); + break; + case 9: + temp_ch = strstr(data_arr, "[End]"); + if(temp_ch != NULL) + { + + return 1; + } + else + leaf_state = 10; + break; + } + } + return 1; +} + + + + +/* +* +* Fun: analyze_setTemplate +* +* Desc: analyze the text of the setTemplate field, create and register field nods to the father nod which father_nod_ptr points to +* +* Ret: successful: 1, fail: 0 +* +* Notes: Wang Jian add +* +* File: debug.c +* + +int analyze_setTemplate(FILE *fp, mib_node *father_node_ptr) +{ + char temp_str[1024*6], *temp_ch, stop_ch[32], temp_ch_2; + int state = 0,i; + DWORD size; + mib_child_node *mib_child_node_ptr = NULL; + mib_param_select *mib_param_select_ptr = NULL; + mib_param_input *mib_param_input_ptr = NULL; + mib_node_param *mib_node_param_ptr = NULL; + fpos_t pos_3; + + strcpy(stop_ch , "["); + while(!feof(fp)) + { + read_until(fp, temp_str, stop_ch); + if(mib_node_param_ptr) + { + if(temp_str[strlen(temp_str)-3]=='#' && temp_str[strlen(temp_str)-2]=='*' && temp_str[strlen(temp_str)-1]=='#') + { + father_node_ptr->enable_field_id=mib_node_param_ptr->id-1;//remember the param id + //remember the enable select id,no need ,default is 1 or 0 + } + if(temp_str[strlen(temp_str)-3]=='#' && temp_str[strlen(temp_str)-2]=='#' && temp_str[strlen(temp_str)-1]=='*') + {//remmember the param id and the save select id + module_save_flag[father_node_ptr->module_index].module_index=father_node_ptr->module_index; + module_save_flag[father_node_ptr->module_index].save_field_id=father_node_ptr->total_child_nodes; + //father_node_ptr->max_access=4; + module_save_flag[father_node_ptr->module_index].save_select_id=mib_node_param_ptr->select_total; + for(i=0;i<32;i++) + module_save_flag[father_node_ptr->module_index].oid[i]=father_node_ptr->oid[i]; + module_save_flag[father_node_ptr->module_index].oid_len=father_node_ptr->oid_len; + } + } + //printf("setTem state: %d , temp_str: %s\r\n",state,temp_str); + switch(state) + { + case 0: // name of the father node, not save, not null + strcpy(stop_ch , "]"); + state = 1; + break; + case 1: // find unit or remark + if( strstr(temp_str, "remark") != NULL ) + { + strcpy(stop_ch,";"); + state = 18; + } + else if( strstr(temp_str, "unit") != NULL ) + { + strcpy(stop_ch,"["); + state = 2; + } + else + { + printf("[debug] Error: Fail to find [unit] or [remark] in the setTemplate.\r\n"); + return 0; + } + break; + case 2: // apply a mib_node_param and fill its name + if(strlen(temp_str) == 0) + { + printf("[debug] Error: Fail to get the field name after the string [unit] in the setTemplate.\r\n"); + return 0; + } + if (mib_node_param_index >= MIB_MAX_NODE_PARAMS) + { + printf("[debug] Error: There are not enough mib_node_param in the array.\r\n"); + return 0; + } + mib_node_param_ptr = &mib_node_param_array[mib_node_param_index++]; + strcpy( mib_node_param_ptr->name, temp_str); + mib_node_param_ptr->id = (BYTE)(father_node_ptr->total_child_nodes+1); + mib_node_param_ptr->parent_ptr=father_node_ptr; + if (!(mib_child_node_ptr = create_mib_child_node(temp_str, father_node_ptr->total_child_nodes+1))) + { + printf("[debug] Error: Faile to Create child nod: [%s].\r\n", temp_str); + return 0; + } + if (!register_child_node(father_node_ptr, mib_child_node_ptr)) + { + printf("[debug] Error: Fail to register the child nod which named [%s].\r\n",temp_str); + return 0; + } + mib_child_node_ptr->child_ptr = mib_node_param_ptr; + + strcpy(stop_ch,"]"); + state = 3; + break; + case 3: + if( strstr(temp_str, "u") == NULL ) + { + printf("[debug] Error: Fail to find [%s] after [%s] in the setTemplate.\r\n", "u", "unit"); + return 0; + } + strcpy(stop_ch,"."); + state = 4; + break; + case 4: + if(strlen(temp_str) == 0) + { + printf("[debug] Error: Fail to get the byte_begin in the setTemplate.\r\n"); + return 0; + } + mib_node_param_ptr->byte_begin = (BYTE)atoi(temp_str); + strcpy(stop_ch,"-"); + state = 5; + break; + case 5: + if(strlen(temp_str) == 0) + { + printf("[debug] Error: Fail to get the bit_begin in the setTemplate.\r\n"); + return 0; + } + mib_node_param_ptr->bit_begin = (BYTE)atoi(temp_str); + strcpy(stop_ch,"."); + state = 6; + break; + case 6: + if(strlen(temp_str) == 0) + { + printf("[debug] Error: Fail to get the byte_end in the setTemplate.\r\n"); + return 0; + } + mib_node_param_ptr->byte_end = (BYTE)atoi(temp_str); + strcpy(stop_ch,"["); + state = 7; + break; + case 7: + if(strlen(temp_str) == 0) + { + printf("[debug] Error: Fail to get the bit_end in the setTemplate.\r\n"); + return 0; + } + mib_node_param_ptr->bit_end = (BYTE)atoi(temp_str); + strcpy(stop_ch,"]"); + state = 8; + break; + case 8: + if( strstr(temp_str, "u") == NULL ) + { + printf("[debug] Error: Fail to find [%s] after [%s] in the setTemplate.\r\n", "u", "u"); + return 0; + } + strcpy(stop_ch,"["); + state = 9; + break; + case 9: // meet "select" or "input" + if( strstr(temp_str, "select") != NULL ) + state = 10; + else + { + if( strstr(temp_str, "input") != NULL ) + { + state = 15; + } + else + { + printf("[debug] Error: Fail to find [%s] or [%s] in the setTemplate.\r\n", "select", "input"); + return 0; + } + } + strcpy(stop_ch,"]"); + break; + case 10: // "v" or "remark" or "unit" + if( strstr(temp_str, "v") != NULL ) + { + strcpy(stop_ch,"["); + state = 11; + } + else + { + if( strstr(temp_str, "unit") != NULL ) + { + strcpy(stop_ch,"["); + state = 2; + } + else + { + if( strstr(temp_str, "remark") != NULL ) + { + strcpy(stop_ch, ";"); + // may meet "[uint]" or a ';', so must handle the whole remark field and then find "[unit]" or ';' + state = 18; + } + else + { + printf("[debug] Error: Fail to find [%s] or [%s] or [%s] in the setTemplate.\r\n", "v", "unit", "remark"); + return 0; + } + } + } + break; + case 11: + if(strlen(temp_str) == 0) + { + printf("[debug] Error: Fail to get the select number in the setTemplate.\r\n"); + return 0; + } + if(mib_param_select_index >= MIB_MAX_PARAM_SELECTS) + { + printf("[debug] Error: There are not enough mib_param_selects in the array.\r\n"); + return 0; + } + mib_param_select_ptr = &mib_param_select_array[mib_param_select_index++]; + mib_node_param_ptr->select_ptr[mib_node_param_ptr->select_total++] = mib_param_select_ptr; + mib_param_select_ptr->number = (BYTE)atoi(temp_str); + strcpy(stop_ch,"]"); + state = 12; + break; + case 12: + if( strstr(temp_str, "opt") == NULL ) + { + printf("[debug] Error: Fail to find [%s] after [%s] in the setTemplate.\r\n", "opt", "v"); + return 0; + } + strcpy(stop_ch,"["); + + fgetpos(fp, &pos_3); + while(!feof(fp)) + { + temp_ch_2 = fgetc(fp); + if(temp_ch_2 == '[') + { + strcpy(stop_ch,"["); + break; + } + else if(temp_ch_2 == ';') + { + strcpy(stop_ch,";"); + break; + } + } + fsetpos(fp, &pos_3); + + state = 13; + break; + case 13: + if(strlen(temp_str) == 0) + { + printf("[debug] Error: Fail to get the description of the select option in the setTemplate.\r\n"); + return 0; + } + if( (temp_ch=strchr(temp_str, 0xd)) != NULL ) + *temp_ch = '\0'; + if( (temp_ch=strchr(temp_str, 0xa)) != NULL ) + *temp_ch = '\0'; + strcpy(mib_param_select_ptr->description, temp_str); + if(stop_ch =="[") + strcpy(stop_ch,"]"); + else + { + strcpy(stop_ch,";"); + return 1; + } + state = 10; + break; + case 15: // has meet "input" + if( strstr(temp_str, "v") == NULL ) + { + printf("[debug] Error: Fail to find [%s] after [%s] in the setTemplate.\r\n", "v", "input"); + return 0; + } + state = 16; + strcpy(stop_ch,"["); + break; + case 16: + if (mib_param_input_index >= MIB_MAX_PARAM_INPUTS) + { + printf("[debug] Error: There are not enough mib_param_inputs in the array.\r\n"); + return 0; + } + mib_param_input_ptr = &mib_param_input_array[mib_param_input_index++]; + mib_node_param_ptr->input_ptr = mib_param_input_ptr; + + if(strstr(temp_str, "toDec-high-0")) + { + mib_param_input_ptr->input_param_type = TODEC_HIGH_0; + } + else + { + if(strstr(temp_str, "keepHex-high-0")) + mib_param_input_ptr->input_param_type = KEEPHEX_HIGH_0; + else + { + if(strstr(temp_str, "keepHex-low-0")) + mib_param_input_ptr->input_param_type = KEEPHEX_LOW_0; + else + { + if(strstr(temp_str, "keepHex-low-E")) + mib_param_input_ptr->input_param_type = KEEPHEX_LOW_E; + else + { + if(strstr(temp_str, "keepHex-low-F")) + mib_param_input_ptr->input_param_type = KEEPHEX_LOW_F; + else + { + if(strstr(temp_str, "toAscii-low-0")) + mib_param_input_ptr->input_param_type = TOASCII_LOW_0; + else + { + if(strstr(temp_str, "keepAsc-low-F")) + mib_param_input_ptr->input_param_type = KEEPASC_LOW_F; + else + { + printf("[debug] Error: There is not input param like %s.\r\n",temp_str); + return 0; + } + } + } + } + } + } + } + strcpy(stop_ch,"]"); + state = 17; + break; + case 17: + if( strstr(temp_str, "unit") != NULL ) + { + strcpy(stop_ch,"["); + state = 2; + } + else + { + if( strstr(temp_str, "remark") != NULL ) + { + strcpy(stop_ch, ";"); + // may meet "[uint]" or a ';', so must handle the whole remark field and then find "[unit]" or ';' + state = 18; + } + else + { + printf("[debug] Error: Fail to find [%s] or [%s] in the setTemplate.\r\n", "unit", "remark"); + return 0; + } + } + break; + case 18: + if(strlen(temp_str) == 0) + { + father_node_ptr->remark_ptr=NULL; + return 1; + } + else + { + while((temp_ch = strstr(temp_str, "\n")) != NULL) + { + temp_ch[0] = ' '; + } + while((temp_ch = strstr(temp_str, "

")) != NULL) + { + temp_ch[0] = '\n'; + temp_ch[1] = ' '; + temp_ch[2] = ' '; + temp_ch[3] = '\r'; + temp_ch[4] = ' '; + temp_ch[5] = ' '; + temp_ch[6] = ' '; + temp_ch[7] = ' '; + } + while((temp_ch = strstr(temp_str, "
")) != NULL) + { + temp_ch[0] = ' '; + temp_ch[1] = ' '; + temp_ch[2] = ' '; + temp_ch[3] = ' '; + } + size=strlen(temp_str); + memcpy(heap_remark_curr,temp_str,sizeof(char)*(size+1)); + father_node_ptr->remark_ptr=heap_remark_curr; + heap_remark_index+=size+1; + heap_remark_curr=heap_remark+heap_remark_index; + //strcpy(father_node_ptr->remark, temp_str); + return 1; + } + } + } + printf("[debug] Error: There is an Error in the state %d in the setTemplate.\r\n", state); + return 0; +} // end of analyze_setTemplate + + +* +* Fun: MIB_create_leaves +* +* Desc: Create the leaves of the MIB tree in memory using the name of configure file which lists mib files +* +* Ret: 1: Successful; 0: Fail +* +* Notes: Wang Jian add +* +* File: debug.c +* + +int MIB_create_leaves(char *conf_dir, char *sysConf_file, char *param_list_file) +{ + FILE *fp_list, *fp_param; + char ch, file_name[256], temp_str[256],out_text[32], temp_str_2[DEBUG_OMCBUF_LEN]; + DWORD OID[32]; + int obj_num, oid_len, state, index, Disable; + fpos_t pos_1, pos_2; + mib_node *grand_node_ptr, *father_node_ptr; + mib_child_node *mib_child_node_ptr; + int module_index,i; + char total_instance[4]; + + mib_node_param_index = 0; + mib_param_select_index = 0; + mib_param_input_index = 0; + + memset((BYTE *)mib_param_select_array, 0, sizeof(mib_param_select) * MIB_MAX_PARAM_SELECTS); + memset((BYTE *)mib_param_input_array, 0, sizeof(mib_param_input) * MIB_MAX_PARAM_INPUTS); + memset((BYTE *)mib_node_param_array, 0, sizeof(mib_node_param) * MIB_MAX_NODE_PARAMS); + grand_node_ptr = NULL; + father_node_ptr = NULL; + + strcpy(temp_str, ""); + strcpy(temp_str_2, ""); + + strcpy(file_name, ""); + strcpy(file_name, conf_dir); + strcat(file_name, param_list_file); + + if((fp_list = fopen(file_name, "r")) == NULL) + { + printf("[debug] Error: cannot open param_list_file: [%s].\n",file_name); + return 0; + } + + while(!feof(fp_list)) + { + strcpy(file_name, ""); + strcpy(file_name, conf_dir); + strcpy(temp_str, ""); + if( read_line(fp_list, temp_str) == 0) + continue; + + if(!( (strstr(temp_str, "OBJ_")) && (strstr(temp_str, "_paramConf.csv"))) ) + { + strcpy(temp_str, "OBJ_***_paramConf.csv"); + printf("[debug] Error: The name of a mib_param_file should like %s, the * presents digit. \nAnd we need the digit to find the OID prefix of this file.\n",temp_str); + fclose(fp_list); + return 0; + } + + for(index = 4; (index < 7) && (temp_str[index] != '_'); index++) + { + temp_str_2[index - 4] = temp_str[index]; + } + temp_str_2[index - 4] = '\0'; + i=0; + while(i256) + { + printf("the max init value long is 256!\r\n"); + printf(father_node_ptr->name); + strcpy(temp_str_2,""); + for(i=0;i<32;i++) + { + printf("%ld.",father_node_ptr->oid[i]); + strcat(temp_str_2,out_text); + } + printf("oid:%s\n",temp_str_2); + strcpy(temp_str_2,""); + printf("length:%d\n",strlen(temp_str)); + printf("OBJ_%d_param.cvs\r\nstring:",obj_num); + printf(temp_str); + return 0; + } + } + state++; + break; + case 14: + fgetpos(fp_param, &pos_1); + state++; + break; + case 19: + //printf("state: %d. ",state); + for(index=0;index<10;index++) + { + read_until(fp_param, temp_str, ";"); + OID[oid_len + index] = atoi(temp_str); + //printf("%ld. ",OID[oid_len + index]); + if(OID[oid_len + index] == 0) + break; + } + read_until(fp_param, temp_str, ";"); + read_until(fp_param, temp_str, "\n");//0x0a + if(Disable==0) // used + { + fgetpos(fp_param, &pos_2); + + fsetpos(fp_param, &pos_1); + if(fgetc(fp_param) != ';') + { + fsetpos(fp_param, &pos_1); + + father_node_ptr = search_mib_node(grand_node_ptr, OID, oid_len + index); + if( father_node_ptr == NULL ) + { + int length = oid_len + index; + printf("[debug] Error: can not find the father node whose oid is %d",(int)OID[0]); + for(index = 1; index < length; index ++) + printf(".%d",(int)OID[index]); + printf("\ngrand_father->name: %s, OID= %d",grand_node_ptr->name, (int)grand_node_ptr->oid[0]); + for(index = 1; index < grand_node_ptr->oid_len; index ++) + printf(".%d",(int)grand_node_ptr->oid[index]); + printf("\n"); + for(index=0; indextotal_child_nodes; index++) + { + mib_child_node_ptr=grand_node_ptr->child_nodes[index]; + if(mib_child_node_ptr) + printf("oid: %d, name: %s\n", (int)mib_child_node_ptr->oid,grand_node_ptr->child_nodes[index]->name); + } + fclose(fp_param); + fclose(fp_list); + return 0; + } + else + { + if(strlen(total_instance)) + father_node_ptr->total_instance=atoi(total_instance); + else + father_node_ptr->total_instance=0; + strcpy(father_node_ptr->init_value,curr_instance_value); + father_node_ptr->module_index=module_index; + if(analyze_setTemplate(fp_param, father_node_ptr) != 1) + { + printf("analyze_setTemplate2 fail.\n"); + fclose(fp_param); + fclose(fp_list); + return 0; + } + } + } + fsetpos(fp_param, &pos_2); + } + state = 0; + break; + default: + ch = fgetc(fp_param); + if( ch == ';' ) + state++; + break; + } + } + if(state == 0) + fclose(fp_param); + else + { + printf("[debug] Error: There is an error in the mib_param_file %s.\n", file_name); + fclose(fp_param); + fclose(fp_list); + return 0; + } + } + fclose(fp_list); + return 1; +}// end of MIB_create_leaves +*/ + + + + +/* +* +* Fun: create_node +* +* Desc: create and register node using the given parameters +* +* Ret: successful: 1, fail: 0 +* +* Notes: Wang Jian add +* +* File: debug.c +* +*/ +mib_node *create_node(char *line, char *nod_name, int instance, mib_node *father_ptr, DWORD *last_node_oid) +{ + mib_node *mib_node_ptr, *father_node_ptr; + mib_child_node *mib_child_node_ptr; + char *tmp_ch, father_name[64], id[32]; + DWORD ID_c=0, curr_oid[32]; + int index , curr_oid_len; + FILE *fp_conf; + char file_name[128]; + char space[32]="-> ";; + + strcpy(file_name, ""); + + strcpy(file_name, MIB_FILES_DIR); + strcat(file_name, MIB_WRITE_TREE ); + + if((fp_conf = fopen(file_name,"a+")) == NULL) + { + printf("[debug] Error: cannot open conf_file: [%s].\r\n",file_name); + return 0; + } + + strcpy(father_name, ""); + strcpy(id, ""); + //fprintf(fp_conf,"line = [%s], nod_name = [%s].\r\n",line , nod_name); + tmp_ch = strchr(line, '}'); // collect the father_name and nod's ID from the line + if(tmp_ch != NULL) + { + tmp_ch = strchr(line, '{'); + if(tmp_ch != NULL) + { + tmp_ch = &tmp_ch[1]; + tmp_ch = pick_first_word(tmp_ch, father_name); + if( strchr(father_name, '}') ) + { + printf("[debug] Error: There is not ID between '{' and '}' in line [%s].\r\n",line); + fclose(fp_conf); + return 0; + } + pick_first_word(tmp_ch, id); + tmp_ch = strchr(id, '}'); + if(tmp_ch != NULL) + *tmp_ch = '\0'; + if(strlen(id) == 0) + { + printf("[debug] Error: There is not ID between '{' and '}' in line [%s].\r\n",line); + fclose(fp_conf); + return 0; + } + ID_c = atol(id); + + } + else + { + printf("[debug] Error: Can not find a '{' as a beginning of a text.\r\n"); + fclose(fp_conf); + return NULL; + } + } + else + { + printf("[debug] Error: Can not find a '}' as an ending of a text.\r\n"); + fclose(fp_conf); + return NULL; + } + + father_node_ptr = find_node(father_ptr, father_name, 1, last_node_oid); + if(!father_node_ptr) + { + fprintf(fp_conf,"father_ptr->name: %s , father_name: %s\r\n",father_ptr->name,father_name); + printf("[debug] Error: Can not find the father nod which named [%s].\r\n",father_name); + fclose(fp_conf); + return NULL; + } + + for(index=0; index<32; index++) + curr_oid[index] = father_node_ptr->oid[index]; + curr_oid_len = father_node_ptr->oid_len; + + curr_oid[curr_oid_len++] = ID_c; + + if(!(mib_node_ptr = create_mib_node(nod_name, curr_oid_len, curr_oid, instance))) + { + printf("[debug] Error: Create nod: [%s] fail. mib_node_index = %d.\r\n", nod_name, mib_node_index); + fclose(fp_conf); + return 0; + } + + //mib_node_ptr->module_index=gobal_module_index-1; + + fprintf(fp_conf,"Create node: %s(OID: ",nod_name); + for(index=0;index "); + // this nod is not the first nod, must register it to its father nod and itself. + if (!(mib_child_node_ptr = create_mib_child_node(nod_name, ID_c))) + { + printf("[debug] Error: Create child nod: [%s] fail.\r\n", nod_name); + fclose(fp_conf); + return NULL; + } + + if (!register_child_node(father_node_ptr, mib_child_node_ptr)) + { + printf("[debug] Error: Can not register the child nod which named [%s].\r\n",nod_name); + fclose(fp_conf); + return NULL; + } + + //fprintf(fp_conf,"register the child nod [%s].father nod name [%s] father nod total_child_nodes [%d].\r\n",nod_name,father_node_ptr->name, father_node_ptr->total_child_nodes); + for(index = 0; index< father_node_ptr->total_child_nodes; index++) + { + mib_child_node_ptr=father_node_ptr->child_nodes[index]; + if(mib_child_node_ptr) + fprintf(fp_conf,"%s %s(%d)\r\n", space,father_node_ptr->child_nodes[index]->name,index); + } + + if (!register_node(mib_node_ptr, curr_oid, curr_oid_len)) + { + printf("[debug] Error: Can not register the nod which named [%s].\r\n",nod_name); + fclose(fp_conf); + return NULL; + } + memset(last_node_oid, 0, sizeof(DWORD) * 32); + for(index =0; index < mib_node_ptr->oid_len; index++) + last_node_oid[index] = mib_node_ptr->oid[index]; + fprintf(fp_conf,"\r\n\r\n"); + fclose(fp_conf); + return mib_node_ptr; +} // end of create_node + +/* +* +* Fun: create_mib_child_node +* +* Desc: create a mib_child_node +* +* Ret: return the mib_child_node pointer if successful, return null if fail +* +* Notes: Wang Jian add +* +* File: debug.c +* +*/ +mib_child_node *create_mib_child_node(char *name, DWORD oid) +{ + mib_child_node *mib_child_node_ptr; + + if (mib_child_node_index >= MIB_MAX_CHILD_NODES) + return NULL; + + mib_child_node_ptr = &mib_child_nodes[mib_child_node_index++]; + + strcpy(mib_child_node_ptr->name, name); + mib_child_node_ptr->oid = oid; + mib_child_node_ptr->child_ptr = NULL; + + return mib_child_node_ptr; +} // end of create_mib_child_node + + + +/* +* +* Fun: create_mib_node +* +* Desc: create a mib_node +* +* Ret: return the mib_node pointer if successful, return null if fail +* +* Notes: Wang Jian add +* +* File: debug.c +* +*/ +mib_node *create_mib_node(char *name, BYTE oid_len, DWORD *oid, WORD total_instance) +{ + mib_node *mib_node_ptr; + if (mib_node_index >= MIB_MAX_NODES) + return NULL; + + mib_node_ptr = &mib_nodes[mib_node_index++]; + /* + index=0xFF; + if(oid_len>9) + { + memcpy(temp_oid, oid, oid_len * sizeof(DWORD)); + max_len=0; + for(j=0;subsys_module[j].index!=0xFF;j++) + { + for(i=8;subsys_module[j].oid[i-6]!=0 && i<14;i++) + if(temp_oid[i]!=subsys_module[j].oid[i-6]) + break; + if(subsys_module[j].oid[i-6]==0 && i>max_len) + { + max_len=i; + index=j; + } + } + if(index!=0xFF) + mib_node_ptr->module_index=index; + } + */ + strcpy(mib_node_ptr->name, name); + mib_node_ptr->oid_len = oid_len; + memcpy(mib_node_ptr->oid, oid, oid_len * sizeof(DWORD)); + mib_node_ptr->total_instance = total_instance; + mib_node_ptr->curr_instance = 0; + mib_node_ptr->parent_ptr = NULL; + //mib_node_ptr->mib_proc = mib_proc; + + return mib_node_ptr; +} // end of create_mib_node + + + + +int register_node(mib_node *mib_node_ptr, DWORD *oid, BYTE oid_len) +{ + mib_node *node_ptr; + mib_child_node *child_node_ptr = NULL; + BYTE i, loop_times; + WORD child_index; + + if (oid_len <= mib_root_node->oid_len) + return 0; + if ((loop_times = oid_len - mib_root_node->oid_len) >= 20) + return 0; + + node_ptr = mib_root_node; + for (i = 0; i < loop_times; i++) + { + if ((child_index = find_child_index(node_ptr, oid[mib_root_node->oid_len + i], NULL, 0)) >= MIB_MAX_CHILD_NODES_PER_NODE) + return 0; + child_node_ptr = node_ptr->child_nodes[child_index]; + if(child_node_ptr) + if (i != (loop_times - 1)) + { + if (child_node_ptr->child_ptr == NULL) + return 0; + node_ptr = (mib_node *) child_node_ptr->child_ptr; + } + } + + child_node_ptr->child_ptr = mib_node_ptr; + mib_node_ptr->parent_ptr = node_ptr; + + return 1; +} + + +/* +* +* Fun: register_child_node +* +* Desc: register a child node to its father mib node +* +* Ret: return 1 if successful, return 0 if fail +* +* Notes: Wang Jian add +* +* File: debug.c +* +*/ +int register_child_node(mib_node *mib_node_ptr, mib_child_node *mib_child_node_ptr) +{ + char text_out[128]; + int index; + mib_child_node *tmp_child_node; + if (mib_node_ptr->total_child_nodes >= MIB_MAX_CHILD_NODES_PER_NODE) + { + printf("[Debug] Error: The total child is more then the max child number.%d,MAX:%d.\r\n",mib_node_ptr->total_child_nodes,MIB_MAX_CHILD_NODES_PER_NODE); + return 0; + } + if(!mib_child_node_ptr) + { + sprintf(text_out,"[Debug] : The child node is NULL! Father:%s,ID: %d\r\n",mib_node_ptr->name,mib_node_ptr->total_child_nodes); + TxtColor(BRIGHT,RED,BLACK,text_out); + printf(text_out); + return 0; + } + for (index = 0; index < mib_node_ptr->total_child_nodes; index++) + { + tmp_child_node = mib_node_ptr->child_nodes[index]; + if ( mib_child_node_ptr->oid <= tmp_child_node->oid ) + { + printf("[debug] Error: The oid have register or it is not written by ascending! Can not be Reisterted again\r\nLine: %d.\r\n", mib_line_count); + exit(1); + } + } + mib_node_ptr->child_nodes[mib_node_ptr->total_child_nodes] = mib_child_node_ptr; + mib_node_ptr->total_child_nodes++; + return 1; +}// end of register_child_node + +//////////////////////////////End of Create OID Tree////////////////////// + + + +void debug_mmi_remark() +{ + + //char out_char[16]; + char out_text[128]; + WORD out_len=0; + WORD i; + BYTE j,k,m; + BYTE line_count=0; + char ch; + switch(debug_remark_flag) + { + case 0: + return; + case 1: + if(mib_curr_node->remark_ptr==NULL) + { + debug_ascii_out_proc("Fail : Sorry,No Remark for the object!\r\n"); + return; + } + debug_ascii_out_proc("Remark : "); + for(i=0;*(mib_curr_node->remark_ptr+i);i++) + { + ch=mib_curr_node->remark_ptr[i]; + if(ch!='\n' && ch!='\t' && ch!=' ') + break; + } + if(!*(mib_curr_node->remark_ptr+i)) + { + debug_remark_flag=0; + debug_cfg_end=1; + return; + } + debug_remark_ptr=i; + debug_remark_flag=2; + debug_cfg_end=0; + remark_meet_lf=0; + break; + case 2: + if(debug_remark_ptr) + { + strcpy(out_text," "); + out_len=10; + } + else + { + strcpy(out_text," "); + out_len=3; + j=3; + } + if(remark_meet_lf) + { + j=3; + strcat(out_text," "); + out_len=13; + remark_meet_lf=0; + } + else if(debug_remark_ptr) + j=0; + i=debug_remark_ptr; + for(;*(mib_curr_node->remark_ptr+i)!='\0';i++) + { + ch=mib_curr_node->remark_ptr[i]; + if(ch!='\n' && ch!='\t') + { + *(out_text+out_len++)=ch; + j++; + } + if((ch=='\n' && i) || j==70) + { + if(ch!='\n') + { + while((ch=mib_curr_node->remark_ptr[i+1])) + { + if(ch==' ' || ch=='\t') + { + i++; + continue; + }else if(ch=='\n') + { + i++; + j=0; + continue; + } + else + break; + } + } + else + { + i++; + while((ch=*(mib_curr_node->remark_ptr+i))) + if(ch!=' ' || ch!='\n' || ch!='\t') + break; + else + i++; + if(*(mib_curr_node->remark_ptr+i)=='\0') + line_count=3; + i--; + } + + *(out_text+out_len++)='\r'; + *(out_text+out_len++)='\n'; + *(out_text+out_len)='\0'; + debug_color_out(BRIGHT,YELLOW,BLACK,out_text); + line_count++; + if(j==70) + m=10; + else + { + m=13; + remark_meet_lf=1; + } + if(line_count==3) + { + debug_remark_ptr=(mib_curr_node->remark_ptr[i]=='\n')?(i+1):i; + if(*(mib_curr_node->remark_ptr+i)=='\0') + { + debug_remark_flag=0; + debug_remark_ptr=0; + remark_meet_lf=0; + debug_cfg_end=1; + } + return; + } + *out_text='\0'; + out_len=0; + for(k=0;kremark_ptr+i)=='\0' && j!=0 && line_count<3) + debug_color_out(BRIGHT,YELLOW,BLACK,out_text); + if(!(out_text[out_len-1]=='\n' && out_text[out_len-2]=='\r')) + debug_ascii_out_proc("\r\n"); + debug_remark_flag=0; + debug_remark_ptr=0; + remark_meet_lf=0; + debug_cfg_end=1; + break; + } +} + + +void register_host() +{ + char file_name[48],temp_str[128],ch2[32],*p,*q,*m,ip[4],stop_ch[32]; + char temp_str2[32]; + FILE *fp; + BYTE i,j,state,group_index,member_index,max_group; + WORD module_index; + group_index=0; + member_index=0; + /* + strcpy(file_name, ""); + strcpy(file_name, MIB_FILES_DIR); + strcat(file_name, MIB_SYSTEM_CONFIG_FILE ); + */ + /* + if((fp = fopen(file_name, "r")) == NULL) + { + sprintf(temp_str, "Fail : cannot open system config file: [%s].\r\n",file_name); + debug_color_out(BRIGHT,RED,BLACK,temp_str); + return ; + } + strcpy(stop_ch," "); + module_index=0; + state=1; + while(!feof(fp)) + { + read_until(fp, temp_str,stop_ch); + if(strlen(temp_str)>64) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : The config file is not right format!\r\n"); + return ; + } + switch(state) + { + case 1: //get the module oid + for(i=0;i<=12;i++) //del the root_oid 6X2=1.3.6.1.4.1. + { + p=temp_str+i; + } + subsys_module[module_index].index=module_index; + i=0; + for(j=0;j<6;j++) + { + while(*(p+i)!='.' && *(p+i)!='\0') + { + oid[i]=*(p+i); + i++; + } + oid[i]='\0'; + subsys_module[module_index].oid[j]=atoi(oid); + if(*(p+i)=='\0') + break; + q=p+i+1; + p=q; + i=0; + } + state=2; + break; + case 2: //get the module name + strcpy(subsys_module[module_index].name,temp_str); + state=3; + break; + case 3://get the module obj_type_num + strcpy(subsys_module[module_index].obj_type_no,temp_str); + while((ch=fgetc(fp))!=0xa && ch!=EOF) + {} + if(ch==EOF) + break; + state=1; + module_index++; + break; + } + + } + fclose(fp); + */ + strcpy(file_name, ""); + strcpy(file_name, MIB_FILES_DIR); + strcat(file_name, MIB_SYSTEM_IP_LIST_FILE); + + if((fp = fopen(file_name, "r")) == NULL) + { + sprintf(temp_str, "Fail : cannot open system ip list file: [%s].\r\n",file_name); + debug_color_out(BRIGHT,RED,BLACK,temp_str); + return; + } + state=1; + module_index=0; + strcpy(stop_ch," "); + while(!feof(fp)) + { + read_line(fp, temp_str); + if(temp_str[0]=='/' && temp_str[1]=='/') + { + continue; + } + if(strlen(temp_str)==0) + continue; + else if(strlen(temp_str)>64) + { + printf("Error : The config file is not right format!\r\n"); + return ; + } + for(i=0;i=1) + { + for(j=i-1;j>0;j--) + { + if(temp_str[j]!=' ') + break; + } + } + strncpy(temp_str2,temp_str,j+1); + temp_str2[j+1]='\0'; + m=temp_str+i+1; + module_host[module_index].index=module_index; + strcpy(module_host[module_index].host_name,temp_str2); + for(i=0;i=1) + { + if(module_save_flag[curr_module].save_field_id==0) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : The module do not contain save flag!\r\n"); + save_flag=0; + return; + } + if(mib_curr_node->module_index!=curr_module || save_flag==2) + { + if(debug_cfg==1) + temp_mib_node=mib_curr_node; + else if(debug_cfg==2) + { + tmp_menu_node=menu_curr_node; + temp_mib_node=mib_curr_node; + } + find_node_ptr=search_mib_node(mib_root_node,module_save_flag[curr_module].oid,module_save_flag[curr_module].oid_len); + if(find_node_ptr) + mib_curr_node=find_node_ptr; + mib_child_node_ptr=mib_curr_node->child_nodes[module_save_flag[curr_module].save_field_id-1]; + if(mib_child_node_ptr) + param_node = (mib_node_param *)mib_child_node_ptr->child_ptr; + else + printf("[Debug] : The child node is NULL. Father_node:%s,ID:%d.\r\n",mib_curr_node->name,module_save_flag[curr_module].save_field_id-1); + strcpy(temp_text,"#0."); + gcvt((double)(module_save_flag[curr_module].save_field_id),2,temp_text2); + strcat(temp_text,temp_text2); + strcat(temp_text,"="); + sprintf(temp_text2,"%X",param_node->select_ptr[module_save_flag[curr_module].save_select_id-1]->number); + //gcvt((double)param_node->select_ptr[module_save_flag[curr_module].save_select_id]->number,4,temp_text2); + strcat(temp_text,temp_text2); + if(save_flag==1) + save_flag=3; + else + save_flag=4; + debug_mmi_set(temp_text); + + } + } + else + debug_color_out(BRIGHT,RED,BLACK,"Fail : No change the data ,so not need to save!\r\n"); + debug_ascii_out_proc("Status : "); + sprintf(temp_text2,"Saving the module of %s,NOW!\r\n",subsys_module[curr_module].name); + debug_color_out(BRIGHT,CYAN,BLACK,temp_text2); + +} + + +///////////////////////////////Create Menu Tree////////////////////// +int create_menu_tree(char *conf_dir,char *menu_page,mib_node *sys_node) +{ + char *p,*q,temp_str1[256],file_name[64],temp_str2[64],temp_str3[64],oid[16]; + BYTE index1,index2,sys_group,group_type;//group_type:'/' is 0,'M' is 1,'m' afer '/' is 2 + WORD index3, line_count=0; + menu_node *menu_node_ptr; + menu_node *menu_father_node; + mib_node *mib_tmp_node; + BYTE father_id[16]; + FILE *fp; + DWORD full_oid[32]; + + mib_tmp_node=search_mib_node(mib_root_node,cur_oid,9); + strcpy(file_name, ""); + strcpy(file_name, conf_dir); + strcat(file_name, menu_page); + if((fp = fopen(file_name, "r")) == NULL) + { + printf("Error: cannot open menu tree file [%s].\n",file_name); + return 0; + } + while(!feof(fp)) + { + line_count++; + if( read_line(fp,temp_str1) == 0) + continue; + if(temp_str1[0]=='#') + continue; + for(index1=0;index1name,"WXC2"); + menu_node_ptr->father_ptr=NULL; + menu_node_ptr->menu_id[0]=0; + menu_node_ptr->id_len=0; + menu_node_ptr->sys_group=9; + for(index1=0;index1<10;index1++) + menu_node_ptr->oid[index1]=0; + menu_node_ptr->menu_oid_node=search_mib_node(mib_root_node,cur_oid,9); + menu_root_node=menu_father_node=menu_node_ptr; + father_id[0]=0; + break; + } + else + { + strcpy(temp_str2,p); + q=strtok(temp_str2,"."); + index2=0; + for(index2=0;index2<16;index2++) + { + father_id[index2]=0; + } + index2=0; + father_id[index2++]=atoi(q); + while((q=strtok(NULL,"."))) + { + if(q!=NULL && isdigit(*q)) + father_id[index2++]=atoi(q); + else if(*q!='\0') + break; + } + menu_father_node=search_menu_node(menu_root_node,father_id,index2);//(BYTE)((father_id-1)/2)); + if(!menu_father_node) + { + printf("[Debug] Error: Can not find menu father node,line:%d\n",line_count); + return 0; + } + p=q; + } + } + break; + case '(' : + p++; + if(isdigit(*(p))) + { + if(group_type==0) + { + *(p+1)='\0'; + sys_group=atoi(p); + group_type=1; + *p=';'; + } + else if(group_type==1) + { + temp_str2[0]=*p; + temp_str2[1]='\0'; + menu_node_ptr->sys_group=atoi(temp_str2); + if(menu_node_ptr->sys_group==0) + { + for(index1=0;index1name);index1++) + if(menu_node_ptr->name[index1]=='_') + break; + if(index1==strlen(menu_node_ptr->name)) + { + printf("[Debug] Error: The menu item sysgroup for '8kE1' format must be '8KE1_*',line:%d\n",line_count); + return 0; + } + } + p+=2; + } + + } + break; + case 'M': + case 'm': + menu_node_ptr=&menu_nodes[menu_node_index++]; + if(menu_father_node) + menu_node_ptr->father_ptr=menu_father_node; + else + { + printf("[Debug] Error:fail to create the menu tree,id %s,line:%d\n",temp_str3,line_count); + return 0; + } + if(index3child_node[index3]=menu_node_ptr; + index3++; + menu_father_node->total_menu_child=index3; + + } + else + { + printf("The child node is more than the max number!,line:%d\n",line_count); + return 0; + } + if(*(p+1)==':') + { + p+=2; + for(index1=0;*(p+index1)!='\0';index1++) + { + if(*(p+index1)==' ') + { + break; + } + } + } + if(index1==0) + { + printf("Format is not right,eg: 'M:13 name {1.2};',line:%d\n",line_count); + return 0; + } + strncpy(temp_str2,p,index1); + temp_str2[index1]='\0'; + for(index2=0;father_id[index2]!=0;index2++) + menu_node_ptr->menu_id[index2]=father_id[index2]; + menu_node_ptr->menu_id[index2]=strtoul(temp_str2, NULL, 10); + menu_node_ptr->id_len=index2+1; + if(group_type==1) + menu_node_ptr->sys_group=sys_group; + p+=index1-1; + break; + case '[': + q=p+1; + index1=0; + while(*p!=']' && *p!='\0') + { + p++; + index1++; + } + if(*p==']') + strncpy(menu_node_ptr->name,q,index1-1); + p++; + break; + case '{': + p++; + q=p; + while(*p!='}' && *p!='\0') + { + p++; + index1++; + } + if(*p=='}') + strncpy(oid,q,index1); + p=oid; + index2=0; + for(index1=0;index1<10;index1++) + menu_node_ptr->oid[index1]=0; + index1=0; + while(*p!=';') + { + if(isdigit(*(p+index1))) + { + index1++; + continue; + } + strncpy(temp_str2,p,index1); + temp_str2[index1]='\0'; + menu_node_ptr->oid[index2++]=strtoul(temp_str2, NULL, 10); + p+=index1+1; + index1=0; + } + for(index1=0;index1<9;index1++) + full_oid[index1]=cur_oid[index1]; + for(index1=9;index1<19 && menu_node_ptr->oid[index1-9]!=0;index1++) + full_oid[index1]=(DWORD)menu_node_ptr->oid[index1-9]; + menu_node_ptr->menu_oid_node=search_mib_node(mib_tmp_node,full_oid,index1); + if(!menu_node_ptr->menu_oid_node) + { + printf("[debug] : can not find mib node ,please check oid.menu_tree.txt,line:%d\r\n",line_count); + printf("oid: "); + for(index2=0;index2Press \"Esc\" then \"Enter\"<--\r\n"); +} // end of debug_mmi_cmm_help + + +/* +* +* Fun: debug_mmi_log_status +* +* Desc: display the log status +* +* Ret: REVOID +* +* File: debug.c +* +*/ +void debug_mmi_log_status() +{ + char temp_str[256]=""; + int i; + + if(debug_log_all == 1) + strcat(temp_str, " log all\r\n"); + else + strcat(temp_str, " log none \r\n"); + if(debug_log_error_on == 1) + strcat(temp_str, " log error on\r\n"); + else + strcat(temp_str, " log error off\r\n"); + debug_ascii_out_proc(temp_str); + + strcpy(temp_str, "lot status"); + for (i=0; i < MODULE_COUNT; i++) + { + if( (i != 13) && (debug_shm_ptr->module_d[i].ascii_in_set_flag == 1)) + { + debug_shm_ptr->module_d[i].ascii_in[0] = 1; + strcpy(debug_shm_ptr->module_d[i].ascii_in+1,temp_str); + } + } +} // end of debug_mmi_log_status + +/* +* +* Fun: debug_mmi_log +* +* Desc: send the log command(log_str) to all the other modules +* +* Ret: 1: succeful, 0: fail +* +* File: debug.c +* +*/ +int debug_mmi_log(char *log_str) +{ + char temp_str[128]=""; + int i; + + if( strstr(log_str, "all") != NULL ) + { + strcpy(temp_str, "log all"); + debug_log_all = 1; + } + else if( strstr(log_str, "none") != NULL ) + { + strcpy(temp_str, "log none"); + debug_log_all = 0; + } + else if( strstr(log_str, "error on") != NULL ) + { + strcpy(temp_str, "log error on"); + debug_log_error_on = 1; + } + else if( strstr(log_str, "error off") != NULL ) + { + strcpy(temp_str, "log error off"); + debug_log_error_on = 0; + } + else + return 0; + + for(i=0; i < MODULE_COUNT; i++) + { + if( (i !='n'-'a') && (debug_shm_ptr->module_d[i].ascii_in_set_flag == 1)) + { + debug_shm_ptr->module_d[i].ascii_in[0] = 1; + strcpy(debug_shm_ptr->module_d[i].ascii_in+1,temp_str); + } + } + return 1; +} // end of debug_mmi_log +//////////////////////////////End of CMM Command///////////////////////// + + + + +///////////////////////////////Cfg OID Tree Command///////////////// + + +/* +* +* Fun: debug_mmi_cfg_help +* +* Desc: display the commands and their usage in the configure state +* +* Ret: RVOID +* +* Notes: Wang Jian add +* +* File: debug.c +* +*/ +void debug_mmi_cfg_help(char *str) +{ + char out_text[128],*ch; + BYTE i; + for(i=0;i<80 && *(str+i)!='\0';i++) + { + if(*(str+i)!=' ') + break; + } + ch=str+i; + strcpy(out_text,ch); + if(*out_text!='\0') + { + if(strncasecmp(out_text,"help",4)==0) + { + debug_ascii_out_proc(" Usage 1: "); + debug_color_out(BRIGHT,YELLOW,BLACK,"help \r\n"); + debug_ascii_out_proc(" Show the cfg main page\r\n"); + debug_ascii_out_proc(" Usage 1: "); + debug_color_out(BRIGHT,YELLOW,BLACK,"help command\r\n"); + debug_ascii_out_proc(" Show the usage of the command\r\n"); + } + else if(strncasecmp(out_text,"cd",2)==0) + { + debug_ascii_out_proc(" Usage 1: "); + debug_color_out(BRIGHT,YELLOW,BLACK,"cd \r\n"); + debug_ascii_out_proc(" Enter the root node:enterprises oid=1.3.6.1.4.1\r\n"); + debug_ascii_out_proc(" Usage 2: "); + debug_color_out(BRIGHT,YELLOW,BLACK,"cd //\r\n"); + debug_ascii_out_proc(" Enter our system node:wxc2 oid=1.3.6.1.4.1.1373.1.3\r\n"); + debug_ascii_out_proc(" Usage 3: "); + debug_color_out(BRIGHT,YELLOW,BLACK,"cd ....\r\n"); + debug_ascii_out_proc(" Enter the above node untill up to the roor node,the layer to go back \r\n"); + debug_ascii_out_proc(" can control by the point number(layers=point number-1,the max point \r\n"); + debug_ascii_out_proc(" number is 8) behind the 'cd'. eg:'cd ..' enter the parent node \r\n"); + debug_ascii_out_proc(" Usage 4: "); + debug_color_out(BRIGHT,YELLOW,BLACK,"cd ./XXX or ./name\r\n"); + debug_ascii_out_proc(" Enter the child node which id or name is xxx or name\r\n"); + debug_ascii_out_proc(" Usage 5: "); + debug_color_out(BRIGHT,YELLOW,BLACK,"cd ./X.X.X\r\n"); + debug_ascii_out_proc(" Enter the descendant's node whose oid is x.x.x from the current oid\r\n"); + debug_ascii_out_proc(" Usage 6: "); + debug_color_out(BRIGHT,YELLOW,BLACK,"cd ../X.X.X\r\n"); + debug_ascii_out_proc(" Enter the descendant's node whose oid is x.x.x from the parent oid\r\n"); + debug_ascii_out_proc(" Usage 7: "); + debug_color_out(BRIGHT,YELLOW,BLACK,"cd module\r\n"); + debug_ascii_out_proc(" Enter the module's node \r\n"); + debug_ascii_out_proc(" Usage 8: "); + debug_color_out(BRIGHT,YELLOW,BLACK,"cd -name\r\n"); + debug_ascii_out_proc(" Find the node as the name from the current node\r\n"); + debug_ascii_out_proc(" Usage 9: "); + debug_color_out(BRIGHT,YELLOW,BLACK,"cd --name\r\n"); + debug_ascii_out_proc(" Find the node as the name from the root node \r\n"); + } + else if(strncasecmp(out_text,"get",3)==0) + { + help_cmm(1,"get or get *","Get and printf the current instance's value of the node\r\n"); + help_cmm(2,"get #XX","Get and printf the special instance's value of the node\r\n"); + help_cmm(3,"get *.X or get *.name","Get and printf the current instance's special field value of the node\r\n"); + help_cmm(4,"get #X.X or get #x.name","Get and printf the special instance's special field value of the node\r\n"); + } + else if(strncasecmp(out_text,"set",3)==0) + { + help_cmm(1,"set or set *","Set the current instance's value to default value of the node and open the isntance ,then printf\r\n"); + help_cmm(2,"set #XX ","Set the special instance's value to default value of the node and open the isntance ,then printf\r\n"); + help_cmm(3,"set *.X =X or set *.name=X ","Set the current instance's field value to given value of the node and open the isntance ,then printf\r\n"); + help_cmm(4,"set #X.X =X or set #x.name=X ","Set the special instance's field value to given value of the node and open the isntance ,then printf\r\n"); + help_cmm(5,"set #X =XXX","Set the special instance's whole value to given value of the node and open the isntance ,then printf\r\n"); + } + else if(strncasecmp(out_text,"create",3)==0) + { + help_cmm(1,"creat or create *","Create an instance with the min closed instance id and set it's value to default value of the node and open the isntance ,then printf\r\n"); + help_cmm(2,"create #XX","Create the special instance,and set it's value to default value of the node and open the isntance ,then printf\r\n"); + help_cmm(3,"create *.X =X or create *.name=X ","Create an instance's with the min closed instance id ,and set it's field value to given value of the node and open the isntance ,then printf\r\n"); + help_cmm(4,"create #X.X =X or create #x.name=X ","Create the special instance,and set it's field value to given value of the node and open the isntance ,then printf\r\n"); + help_cmm(5,"create #X =XXX","Create the special instance,and set is's whole value to given value of the node and open the isntance ,then printf\r\n"); + } + else if(strncasecmp(out_text,"delete",3)==0) + { + help_cmm(1,"delete ","Delete the current instance ,if it is opened,clost it.set the value to default value of the node\r\n"); + help_cmm(2,"delete #XX","Delete the special instance,if it is opened,clost it.set the value to default value of the node\r\n"); + } + else if(strncasecmp(out_text,"contents",3)==0) + { + help_cmm(1,"contents ","Show the information about the object .if it is parent node ,will print the name,the all child node.if it is leaf node ,will print the module,the read-write property,the type,the current instance(the mix id of the opened instance),the total instance,the all instance which are opened,and show the current isntance and all it's field .if it is parent node\r\n"); + } + else if(strncasecmp(out_text,"list",3)==0) + { + help_cmm(1,"list [-a]","the switch of show all the field and value of the instance include the 'NULL' and the closed instance,default:off\r\n"); + help_cmm(2,"list [-e]","the switch of show opened the instance,hide the field and it's value default:off\r\n"); + help_cmm(3,"list [-r]","the switch of show the field data range.default:off\r\n"); + help_cmm(4,"list [-t]","the switch of show input data type ,default:off\r\n"); + help_cmm(5,"list [-f[X XX X]]","the switch of show the special field list in the [ ] ,default:off\r\n"); + help_cmm(6,"list [X-XX]","the switch of show the instance range form x to xxx.default:off\r\n"); + } + else if(strncasecmp(out_text,"child",3)==0) + { + help_cmm(1,"child X","Enter the child node whose id is X\r\n"); + help_cmm(2,"child name","Enter the child node whose name is 'name'\r\n"); + } + else if(strncasecmp(out_text,"parent",3)==0) + { + help_cmm(1,"parent","Enter the parent node\r\n"); + } + else if(strncasecmp(out_text,"pwd",3)==0) + { + help_cmm(1,"pwd","Show the full path and the full oid\r\n"); + } + else if(strncasecmp(out_text,"remark",3)==0) + { + help_cmm(1,"remark","Show the description of the node\r\n"); + } + else if(strncasecmp(out_text,"option",3)==0) + { + help_cmm(1,"option X","Show the select option of the fied node whose id is x of leaf node \r\n"); + help_cmm(2,"option name","Show the select option of the fied node whose name is ''name' of leaf node \r\n"); + } + else if(strncasecmp(out_text,"save",3)==0) + { + help_cmm(1,"save","save the debug\r\n"); + } + else if(strncasecmp(out_text,"quit",3)==0) + { + help_cmm(1,"quit","Quit and save teh debug\r\n"); + } + else if(strncasecmp(out_text,"find host",3)==0) + { + help_cmm(1,"find host","Find all the host who have the object about the current node\r\n"); + } + else if(strncasecmp(out_text,"select",3)==0) + { + help_cmm(1,"select X","Select the host ip list,if been selected ,the set command would do effect on the host\r\n"); + } + else if(strncasecmp(out_text,"setinst",3)==0) + { + help_cmm(1,"setinst X","Set the current instance as the special number\r\n"); + } + else if(strncasecmp(out_text,"cmm",3)==0) + { + help_cmm(1,"cmm","Enter the debug cmm state\r\n"); + } + else if(strncasecmp(out_text,"addhost",3)==0) + {} + else if(strncasecmp(out_text,"delhost",3)==0) + {} + else if(strncasecmp(out_text,"tree",4)==0) + { + help_cmm(1,"tree","Print the three layer of the tree from the current node\r\n"); + } + else + { + sprintf(out_text,"Error : Sorry, No support this command %s!\r\n" ,ch); + debug_color_out(BRIGHT,RED,BLACK,out_text); + } + } + else + { + time_t tick_2; + char time_buf_2[64]= "\0", str_buf[128]="\0"; + tick_2 = time(NULL); + debug_ascii_out_proc("\033[2J\033[1;1H"); + snprintf(time_buf_2, sizeof(time_buf_2), "%.24s", ctime(&tick_2)); + sprintf(str_buf, " -----Start Time: %s----- \r\n", time_buf_2); + debug_color_out(BRIGHT,CYAN,WHITE,str_buf); + debug_ascii_out_proc("\r\n"); + debug_ascii_out_proc(" "); + debug_ascii_out_proc("*************************\r\n");//80-20=60/2=30 + debug_ascii_out_proc(" "); + debug_ascii_out_proc("*"); + debug_ascii_out_proc(" "); + debug_color_out(BRIGHT,WHITE,BLACK,"Configure Help Menu");//80-20=60/2=30 + debug_ascii_out_proc(" "); + debug_ascii_out_proc("*\r\n"); + debug_ascii_out_proc(" "); + debug_ascii_out_proc("*************************\r\n");//80-20=60/2=30 + debug_ascii_out_proc("\r\n"); + debug_ascii_out_proc("================================================================================\r\n"); + debug_ascii_out_proc("|help : show the configure command help or main cfg menu |\r\n"); + debug_ascii_out_proc("|contents : show the contents of the current object |\r\n"); + debug_ascii_out_proc("|parent : enter the parent object of the current object |\r\n"); + debug_ascii_out_proc("|child : entr the child object of the current object |\r\n"); + debug_ascii_out_proc("|cd : go to the object use name or oid or other control char |\r\n"); + debug_ascii_out_proc("|pwd : show the current object path from the root object |\r\n"); + debug_ascii_out_proc("|tree : show the object tree from the current object node |\r\n"); + //debug_ascii_out_proc("|setins : set the instance number of the current object |\r\n"); + //debug_ascii_out_proc("|find host : find the hosts in which the current node exist. |\r\n"); + //debug_ascii_out_proc("|show host : show the hosts in which the current node exist. |\r\n"); + debug_ascii_out_proc("|select : select the host which get and set command use. |\r\n"); + debug_ascii_out_proc("|get : get the value of a paticular parameter field |\r\n"); + debug_ascii_out_proc("|set : set the value of a paticular parameter field |\r\n"); + debug_ascii_out_proc("|create : create and set the intance value of a parameter field |\r\n"); + debug_ascii_out_proc("|delete : delete an opened instance of a parameter field |\r\n"); + debug_ascii_out_proc("|cmm : change to the state of command |\r\n"); + debug_ascii_out_proc("|quit : exit the debug telnet interview |\r\n"); + debug_ascii_out_proc("================================================================================\r\n"); + } +} // end of debug_mmi_cfg_help + + + + +/* +* +* Fun: debug_mmi_cd +* +* Desc: change to a mib_node by path +* +* Ret: return 1 if successful, return 0 if fail +* +* File: debug.c +* +*/ +int debug_mmi_cd(char *path) +{ + BYTE str_len, index, index_2, index_3; + mib_node *find_node_ptr; + mib_node_param *find_node_ptr2; + DWORD OID[32]; + char temp_str[128], path_name[128], *temp_ch,temp_str2[128]; + int temp; + int i; + strcpy(path_name, path); + temp_mib_node=mib_curr_node; + for(i=0;i!=strlen(path_name);i++) + { + if(*(path+i)!=' ') + break; + } + if(*(path_name+i)=='\0') + { + index_3=6; + temp_mib_node=mib_curr_node; + mib_curr_node= mib_root_node; + if(curr_module!=mib_curr_node->module_index && save_flag==1) + debug_mmi_save(); + else + debug_mmi_contents(""); + //find_node_ptr=find_node(mib_root_node,"MTP3",0,0); + //if(find_node_ptr!=NULL) + // mib_curr_node=find_node_ptr; + + return 1; + } + temp_ch=path_name+i; + strcpy(path_name,temp_ch); + strcpy(temp_str,path_name); + for(i=0;i3) + strcpy(path_name,temp_ch+2); + } + if(!isdigit(*temp_ch)) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : Please input system number!\r\n"); + return 0; + } + host_group=atoi(temp_str2); + if(host_group>GROUP_NUM-1) + { + sprintf(temp_str2,"Error : Please input valid system id,the max is %d!\r\n",GROUP_NUM-1); + debug_color_out(BRIGHT,RED,BLACK,temp_str2); + return 0; + } + } + + + + + if (!(str_len = strlen(path_name))) + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : The path you put is not right for current object!\r\n"); + return 0; + } + index=0; + while(path_name[index]==' ') + { + temp=index+1; + while(path_name[temp]!='\0') + { + path_name[temp-1]=path_name[temp]; + temp++; + } + path_name[temp-1]=path_name[temp]; + } + temp=0; + if(strncmp(path_name,"--",2)==0)//locate the para or node by name + { + temp=1;//find from the root node + } + else if(path_name[0]=='-') + { + temp=2;//find from the current node + } + if(temp>0) + { + if(strlen(path_name)>80) + debug_color_out(BRIGHT,RED,BLACK,"Error : no node have so long name!\r\n"); + if(temp==1) + { + mib_curr_node=mib_root_node; + strcpy(temp_str,path_name+2); + } + if(temp==2) + strcpy(temp_str,path_name+1); + find_node_ptr= find_node(mib_curr_node, temp_str, 0, NULL); + if(find_node_ptr!=NULL) + { + mib_curr_node=find_node_ptr; + if(mib_curr_node->total_instance) + { + list_once=0; + curr_module=mib_curr_node->module_index; + register_instance(); + } + if(curr_module!=mib_curr_node->module_index && save_flag==1) + debug_mmi_save(); + else + debug_mmi_contents(""); + return 1; + } + else + { + debug_color_out(BRIGHT,RED,BLACK,"Error : There is no the special node of the name!\r\n"); + return 0; + } + } + index=0; + if(path_name[0]=='.' && path_name[1]=='.' && path_name[2]=='\0') + { + if(curr_module!=mib_curr_node->module_index && save_flag==1) + debug_mmi_save(); + else + debug_mmi_parent(); + return 1 ; + } + while(path_name[index]=='.') + index++; + if(index>2 && path_name[index]=='\0' && index<8 ) + { + for(index_2=1;index_2oid_len-1; + if(index_3<=6) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : Have reached the root!\r\n"); + debug_mmi_contents(""); + return 0; + } + mib_curr_node= search_mib_node(mib_root_node, mib_curr_node->oid, index_3); + if(mib_curr_node==mib_root_node) + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : Have reached the root node!\r\n"); + return 0; + } + + } + + if(mib_curr_node->total_instance) + { + list_once=0; + curr_module=mib_curr_node->module_index; + register_instance(); + //for(i=0;i<=255;i++) + // if(curr_instance_arr[i].eable==1) + // break; + // mib_curr_node->curr_instance=i; + //debug_mmi_get_all(); + } + if(curr_module!=mib_curr_node->module_index && save_flag==1) + debug_mmi_save(); + else + debug_mmi_contents(""); + return 1; + } + else if(index>8) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : Input error,the max layer number you can go back is 8.\r\n"); + return 0; + } + + if(path_name[0]=='/' && path_name[1]=='/') + { + index_3=9; + mib_curr_node= search_mib_node(mib_root_node, cur_oid, index_3); + if(curr_module!=mib_curr_node->module_index && save_flag==1) + debug_mmi_save(); + else + debug_mmi_contents(""); + return 1; + } + + if( (path_name[0] != '.') && ( !isdigit(path_name[0]) ) ) // path is module_name + { + + index_2 = strlen(path_name); + for(index=0; indexoid[index]; + index_3 = mib_curr_node->oid_len - 1; + OID[index_3] = 0; + index = 3; + } + else if( (path_name[0]== '.') && (path_name[1] == '/') ) // path is ./oid, \u5C06\u5728\u5F53\u524D\u76EE\u5F55\u4E0B\u67E5\u627Eoid\u6240\u5BF9\u5E94\u7684object + { + for(index=0; index<32; index++) + OID[index] = mib_curr_node->oid[index]; + index_3 = mib_curr_node->oid_len; + index = 2; + } + else + { + OID[0]=1; + OID[1]=3; + OID[2]=6; + OID[3]=1; + OID[4]=4; + OID[5]=1; + OID[6]=1373; + for(index=7; index<32; index++) + OID[index]=0; + index_3 = 7; + index = 0; + } + str_len = strlen(path_name); + for(index_2=0; indexparent_ptr; + if(find_node_ptr!=NULL) + { + if (find_node_ptr->total_instance) + { + if(strlen(path_name)>4) + mib_curr_node=find_node_ptr->parent_ptr; + debug_color_out(BRIGHT,RED,BLACK,"Error : Have reach the leaf node!\r\n"); + return 0; + } + else + mib_curr_node = (mib_node*)find_node_ptr2; + } + } + + if(mib_curr_node->total_instance) + { + list_once=0; + + curr_module=mib_curr_node->module_index; + register_instance(); + //for(i=0;i<=255;i++) + //{ + // if(curr_instance_arr[i].eable==1) + // break; + //} + //mib_curr_node->curr_instance=i; + //debug_mmi_get_all(); + } + //debug_ascii_out_proc("Current object changed to: "); + //debug_color_out(BRIGHT,YELLOW,BLACK,mib_curr_node->name); + //debug_ascii_out_proc("\r\n"); + if(curr_module!=mib_curr_node->module_index && save_flag==1) + debug_mmi_save(); + else + debug_mmi_contents(""); + return 1; +} // end of debug_mmi_cd + +/* +* +* Fun: debug_mmi_contents +* +* Desc: show the current mib_node's all information such as name, path, child nodes and so on +* +* Ret: 1: succeful, 0: fail +* +* File: debug.c +* +*/ +int debug_mmi_contents(char *str) +{ + WORD i,j; + DWORD k; + BYTE ascii_text[256*5]; + //char temp_str[64]; + mib_child_node *child_node_ptr; + mib_node *mib_tmp_node; + char ins_str[16],temp_str[128]; + BYTE max_group,ismodule; + + if(strlen(str)!=0) + { + for(i=0;itotal_child_nodes) + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : No contents in this object,no child,Please go back! \r\n"); + return 0; + } + debug_ascii_out_proc("Name : "); + sprintf(ascii_text,"%s",mib_curr_node->name); + debug_color_out(BRIGHT,YELLOW,BLACK,ascii_text); + debug_ascii_out_proc("\r\n"); + debug_ascii_out_proc("Type : "); + if(mib_curr_node->total_instance) + { + debug_mmi_find_host(""); + } + if(mib_curr_node->total_instance) + { + debug_color_out(BRIGHT,YELLOW,BLACK,"Leaf node("); + debug_color_out(BRIGHT,YELLOW,BLACK,max_access[mib_curr_node->max_access]); + debug_color_out(BRIGHT,YELLOW,BLACK,")"); + } + else + debug_color_out(BRIGHT,YELLOW,BLACK,"Parent node"); + debug_ascii_out_proc("\r\n"); + + if(debug_cfg==1) + { + if(mib_curr_node->module_index!=0xFF) + { + max_group=subsys_module[mib_curr_node->module_index].max_group; + if(host_group<=max_group) + { + debug_ascii_out_proc("Module : "); + sprintf(temp_str,"%s-%d\r\n",subsys_module[mib_curr_node->module_index].name,host_group); + debug_color_out(BRIGHT,YELLOW,BLACK,temp_str); + } + else + { + debug_ascii_out_proc("Module : "); + sprintf(temp_str,"%s-0\r\n",subsys_module[mib_curr_node->module_index].name); + debug_color_out(BRIGHT,YELLOW,BLACK,temp_str); + sprintf(temp_str,"Error : the max system id is %d.\r\n",max_group); + debug_color_out(BRIGHT,RED,BLACK,temp_str); + } + } + } + else if(debug_cfg==2) + { + if(menu_curr_node->sys_group==9) + { + debug_ascii_out_proc("Module : "); + for(i=0;imodule_index].name,i); + debug_color_out(BRIGHT,YELLOW,BLACK,temp_str); + } + debug_ascii_out_proc("\r\n"); + } + else + { + debug_ascii_out_proc("Module : "); + sprintf(temp_str,"%s-%d",subsys_module[mib_curr_node->module_index].name,menu_curr_node->sys_group); + debug_color_out(BRIGHT,YELLOW,BLACK,temp_str); + debug_ascii_out_proc("\r\n"); + } + + + } + + if(!mib_curr_node->total_instance) + { + debug_ascii_out_proc("Child : "); + sprintf(temp_str, "[%d]\r\n",mib_curr_node->total_child_nodes); + debug_color_out(BRIGHT,YELLOW,BLACK,temp_str); + max_group=0; + for (i = 0; i < mib_curr_node->total_child_nodes; i++) + { + child_node_ptr = mib_curr_node->child_nodes[i]; + if(!child_node_ptr) + continue; + mib_tmp_node=(mib_node*)child_node_ptr->child_ptr; + if(mib_tmp_node!=NULL) + { + max_group=subsys_module[mib_tmp_node->module_index].max_group; + } + if(strncmp(subsys_module[mib_tmp_node->module_index].name,mib_tmp_node->name,strlen(mib_tmp_node->name))==0) + ismodule=1; + else + ismodule=0; + if(ismodule==0 || max_group==0) + { + sprintf(temp_str, " |---(%ld) %s\r\n", child_node_ptr->oid,child_node_ptr->name); + debug_color_out(BRIGHT,YELLOW,BLACK,temp_str); + } + else + { + j=0; + while(max_group>0) + { + sprintf(temp_str, " |---(%ld) %s-%d\r\n", child_node_ptr->oid,child_node_ptr->name,j); + debug_color_out(BRIGHT,YELLOW,BLACK,temp_str); + j++; + if(j==max_group+1) + break; + } + } + } + } + else + { + if(list_once==0) + list_flag=1; + debug_cfg_end=0; + } + if(list_once==1) + { + + if (mib_curr_node->total_instance) + { + strcpy(ascii_text,""); + k=0; + for(i=0;i<=255;i++) + { + if(curr_instance_arr[i].eable==1) + { + sprintf(ins_str,"#%-3d ",i); + strpcat(ascii_text,&k,ins_str); + } + } + debug_ascii_out_proc("Instance: "); + strcpy(ins_str,""); + if(strlen(ascii_text)) + sprintf(ins_str, "#%-3d(%-3d): ", mib_curr_node->curr_instance,mib_curr_node->total_instance); + else + sprintf(ins_str, "None(%-3d): ", mib_curr_node->total_instance); + debug_color_out(BRIGHT,YELLOW,BLACK,ins_str); + //formatstr(10,ascii_text,1);//,(int)ceil(strlen(ascii_text)/70)+1); + debug_color_out(BRIGHT,BLUE,BLACK,ascii_text); + debug_ascii_out_proc("\r\n"); + if(strlen(ascii_text)) + { + none_instance=0; + } + else + none_instance=1; + if(none_instance==0) + { + if(mib_curr_node->max_access>=2 && mib_curr_node->max_access<=5) + { + IP_Selected[0]=1; + for(i=1;i<16;i++) + { + IP_Selected[i]=0; + } + debug_cfg_end=0; + debug_mmi_get_all(); + debug_cfg_end=0; + } + } + else + { + + strcpy(ascii_text,""); + debug_ascii_out_proc("Child : "); + sprintf(ascii_text, "[%d]\r\n",mib_curr_node->total_child_nodes); + debug_color_out(BRIGHT,YELLOW,BLACK,ascii_text); + + for (i = 0; i < mib_curr_node->total_child_nodes; i++) + { + child_node_ptr = mib_curr_node->child_nodes[i]; + if(!child_node_ptr) + continue; + sprintf(ascii_text, " |---(%ld) %s\r\n",child_node_ptr->oid+1, child_node_ptr->name); + debug_color_out(BRIGHT,YELLOW,BLACK,ascii_text); + } + debug_cfg_end=1; + } + } + } + + /* + if(!mib_curr_node->total_instance) + { + debug_ascii_out_proc("Command : Now,you can execute the commands include "); + debug_color_out(BRIGHT,YELLOW,BLACK,"\"cd ,child ,parent ,contnets ,pwd ,tree ,remark ,"); + } + else + { + debug_ascii_out_proc("Command : Now,you can execute the commands include "); + debug_color_out(BRIGHT,YELLOW,BLACK,"\"cd ,parent ,contnets ,pwd , tree ,get ,set ,list ,create ,del ,remark ,"); + } + if(save_flag==1) + debug_color_out(BRIGHT,YELLOW,BLACK,"save ,cmm ,q ,help .\"\r\n"); + else + debug_color_out(BRIGHT,YELLOW,BLACK,"cmm ,q ,help .\"\r\n"); + */ + return 1; +} +// end of debug_mmi_contents + + +/* +* +* Fun: debug_mmi_child +* +* Desc: change to the current mib_node's child node by the child node's name or id if it exists +* +* Ret: 1: succeful, 0: fail +* +* File: debug.c +* +*/ +int debug_mmi_child(char *name) +{ + BYTE str_len; + WORD child_index; + WORD oid=0; + mib_child_node *child_node_ptr; + + if (mib_curr_node->total_instance) + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : The current object is a leaf node, can not change to its child node.\r\n"); + return 0; + } + + if (!(str_len = strlen(name))) + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : No such child object for the current object\r\n"); + return 0; + } + + if (!mib_curr_node->total_child_nodes) + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : No child object for the current object\r\n"); + return 0; + } + + name[str_len] = '\0'; + + if (isdigit(name[0])) + { + oid = strtoul(name, NULL, 10); + child_index = find_child_index(mib_curr_node, oid, NULL, 0); + } + else + child_index = find_child_index(mib_curr_node, 0, name, 1); + + if (child_index < MIB_MAX_CHILD_NODES_PER_NODE) + { + child_node_ptr = mib_curr_node->child_nodes[child_index]; + if(child_node_ptr) + { + if (!child_node_ptr->child_ptr) + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : No such child object for the current object\r\n"); + return 0; + } + mib_curr_node = (mib_node *)child_node_ptr->child_ptr; + //debug_ascii_out_proc("Current object changed to: "); + //debug_color_out(BRIGHT,YELLOW,BLACK,mib_curr_node->name); + //debug_ascii_out_proc("\r\n"); + debug_mmi_contents(""); + return 1; + } + } + + debug_color_out(BRIGHT,RED,BLACK,"Error : No such child object for the current object\r\n"); + return 0; +} // end of debug_mmi_child + +/* +* +* Fun: debug_mmi_parent +* +* Desc: changet to the current mib_node's parent node if it exists +* +* Ret: 1: succeful, 0: fail +* +* File: debug.c +* +*/ +int debug_mmi_parent() +{ + if (mib_curr_node->parent_ptr == NULL) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : No parent object for the current object\r\n"); + return 0; + } + + mib_curr_node = (mib_node *) mib_curr_node->parent_ptr; + //debug_ascii_out_proc("Current object changed to: "); + //debug_color_out(BRIGHT,YELLOW,BLACK,mib_curr_node->name); + //debug_ascii_out_proc("\r\n"); + debug_mmi_contents(""); + return 1; +}// end of debug_mmi_parent + +/* +* +* Fun: debug_mmi_pwd +* +* Desc: show the current object path +* +* Ret: return 1 if successful, return 0 if fail +* +* Notes: Wang Jian add +* +* File: debug.c +* +*/ +int debug_mmi_pwd() +{ + mib_node *node_ptr; + mib_child_node *child_node_ptr = NULL; + BYTE i, loop_times, text_string[1024], text_oid[128]; + WORD child_index; + BYTE tem_str[30]; + BYTE ascii_text[DEBUG_OMCBUF_LEN],oid[16]; + //DWORD temp_oid[32]={1,3,6,1,4,1,1373,1,3,3,2,2,2,1,2,0}; + + + /*if(!ShowRegister) + { + for(i=0;i<16;i++) + { + printf("id:%d,Module name: %s,ascii_in: 0X%ld,ascii_out:0X%ld\r\n",i,debug_shm_ptr->module_d[i].name,&(debug_shm_ptr->module_d[i].ascii_in),&(debug_shm_ptr->module_d[i].ascii_out)); + } + ShowRegister=1; + } + */ + if ((loop_times = mib_curr_node->oid_len - mib_root_node->oid_len) >= 15) + { + sprintf(tem_str, "Object path error for the current object\r\n"); + TxtColor(BRIGHT,RED,BLACK,tem_str); + debug_ascii_out_proc(tem_str); + return 0; + } + sprintf(text_string,"%s(%ld)", mib_root_node->name,mib_root_node->oid[mib_root_node->oid_len-1]); + node_ptr = mib_root_node; + for (i = 0; i < loop_times; i++) + { + if ((child_index = find_child_index(node_ptr, mib_curr_node->oid[mib_root_node->oid_len + i], NULL, 0)) >= MIB_MAX_CHILD_NODES_PER_NODE) + { + sprintf(tem_str,"Object path error for the current object\r\n"); + TxtColor(BRIGHT,RED,BLACK,tem_str); + debug_ascii_out_proc(tem_str); + return 0; + } + child_node_ptr = node_ptr->child_nodes[child_index]; + if(child_node_ptr) + { + sprintf(text_oid, ".%s(%ld)", child_node_ptr->name, child_node_ptr->oid); + strcat(text_string, text_oid); + + if (i != (loop_times - 1)) + { + if (child_node_ptr->child_ptr == NULL) + { + debug_color_out(BRIGHT,RED,BLACK,"Object path error for the current object\r\n"); + return 0; + } + node_ptr = (mib_node *) child_node_ptr->child_ptr; + } + } + } + debug_ascii_out_proc("Path : "); + formatstr(10,text_string,0);//,(int)ceil(strlen(text_string)/70)+1); + debug_color_out(BRIGHT,YELLOW,BLACK,text_string); + debug_ascii_out_proc("\r\n"); + strcpy(ascii_text, "\0"); + for (i = 0; i < (mib_curr_node->oid_len - 1); i++) + { + sprintf(oid, "%ld.", mib_curr_node->oid[i]); + strcat(ascii_text, oid); + } + sprintf(oid, "%ld", mib_curr_node->oid[mib_curr_node->oid_len - 1]); + strcat(ascii_text, oid); + debug_ascii_out_proc("OID : "); + debug_color_out(BRIGHT,YELLOW,BLACK,ascii_text); + debug_ascii_out_proc("\r\n"); + /* + for(i=0;i<32;i++) + snmp_agent_packet1.oid[i]=temp_oid[i]; + snmp_agent_packet1.oid_len=16; + snmp_agent_packet1.total_ip=1; + strcpy(snmp_agent_packet1.dst_ip[0],"172.18.144.1"); + snmp_agent_packet1.cmm_state=1; + snmp_agent_packet1.total_instance=255; + for(i=0;i=1 && node_levels<=8) + layer=node_levels; + else + { + layer=3; + debug_ascii_out_proc("the max layer number is eight!\r\n"); + } + */ + debug_ascii_out_proc("Layers : "); + sprintf(print_buf,"%d-%d\r\n",mib_curr_node->oid_len,mib_curr_node->oid_len+layer); + debug_color_out(BRIGHT,GREEN,BLACK,print_buf); + debug_ascii_out_proc("Host OID: "); + sprintf(print_buf,"%d",(int)mib_curr_node->oid[0]); + debug_color_out(BRIGHT,GREEN,BLACK,print_buf); + for(index=1; indexoid_len-1; index++) // ."id"."id"... + { + sprintf(print_buf, ".%d",(int)mib_curr_node->oid[index]); + TxtColor(BRIGHT,GREEN,BLACK,print_buf); + debug_ascii_out_proc(print_buf); + } + debug_ascii_out_proc("\r\n"); + } + treehost=0; + strcpy(separation2, separation); + length = strlen(separation2); + if(node_ptr == NULL) + { + debug_ascii_out_proc("\r\n"); + return; + } + for(index=0; indexname, (int)node_ptr->oid[node_ptr->oid_len-1]);//[][][]node name: "node name" + debug_color_out(BRIGHT,YELLOW,BLACK,print_buf); + if( node_ptr->total_child_nodes == 0 ) + return; + + if(node_ptr->total_instance != 0) + { + for(index = 0; index < (node_ptr->total_child_nodes); index++) + { + mib_node_param *mib_node_param_ptr; + mib_child_node_ptr=node_ptr->child_nodes[index]; + if(!mib_child_node_ptr) + continue; + mib_node_param_ptr = (mib_node_param *)mib_child_node_ptr->child_ptr; // id:"id",name: "name",byte_begin.bit_begin-byte_end.bit_end + sprintf(print_buf, "%s id:%d; %s; [%d.%d-%d.%d]\r\n", spaces, (int)mib_node_param_ptr->id+1, mib_node_param_ptr->name, (int)mib_node_param_ptr->byte_begin, (int)mib_node_param_ptr->bit_begin, (int)mib_node_param_ptr->byte_end, (int)mib_node_param_ptr->bit_end); + debug_color_out(BRIGHT,YELLOW,BLACK,print_buf); + } + return; + } + spaces[index-1]='-'; + spaces[index-2]='*'; + spaces[index-3]='-'; + spaces[index-4]='|'; + for(index = 0; index < node_ptr->total_child_nodes; index++) + { + mib_child_node_ptr=node_ptr->child_nodes[index]; + if(!mib_child_node_ptr) + continue; + sprintf(print_buf, "%s %s(%d)\r\n",spaces, mib_child_node_ptr->name,(int)mib_child_node_ptr->oid); + TxtColor(BRIGHT,YELLOW,BLACK,print_buf); + debug_ascii_out_proc(print_buf); + } + sprintf(print_buf,"{%d}--",(int)node_ptr->oid[node_ptr->oid_len-1]); + strcat(separation2, print_buf); + for(index = 0; index < node_ptr->total_child_nodes; index++) + { + mib_child_node_ptr=node_ptr->child_nodes[index]; + if(!mib_child_node_ptr) + continue; + child_node_ptr = mib_child_node_ptr->child_ptr; + debug_mmi_tree(child_node_ptr,separation2, layer-1); + } + debug_ascii_out_proc("\r\n"); +} // end of debug_mmi_tree + +void debug_mmi_create(char *str) +{ + //DWORD oid[20]; + BYTE i; + BYTE byte,bit; + char str_id[10]; + //char str_value[128]; + char temp_str[256]; + char *p; + int id; + //mib_node *temp_node; + save_flag=1; + strcpy(str_id,""); + //strcpy(str_value,""); + for(i=0;i!=strlen(str);i++) + { + if(*(str+i)!=' ') + break; + } + p=str+i; + strcpy(str,p); + if(str[0]=='\0') + { + if(mib_curr_node->enable_field_id==0xFF) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : Please input the instance value for the special input type!\r\n"); + return ; + } + for(id=0;id<255;id++) + if(curr_instance_arr[id].eable==0) + { + curr_instance_arr[id].eable=1; + break; + } + byte=(id)/8; + bit=(id)%8; + mib_curr_node->enable_flag[byte]=mib_curr_node->enable_flag[byte] | (BYTE)my_pow(2,bit); + mib_curr_node->curr_instance=id; + debug_mmi_set("*"); + //debug_mmi_contents(""); + if(mib_curr_node->enable_flag[byte] & (BYTE)my_pow(2,bit)) + { + debug_ascii_out_proc("State : "); + sprintf(temp_str,"The %s #%d have been created successfully!\r\n",mib_curr_node->name,id); + debug_color_out(BRIGHT,CYAN,BLACK,temp_str); + } + return; + } + else if(str[0]=='#') + { + p=str+1; + strcpy(str,p); + for(i=0;ienable_field_id==0xFF) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : Please input the value !\r\n"); + return ; + } + id=strtol(str_id,NULL,10); + if(id>mib_curr_node->total_instance-1) + { + sprintf(temp_str,"Error : The max instance id is %d\r\n",mib_curr_node->total_instance-1); + debug_color_out(BRIGHT,RED,BLACK,temp_str); + return; + } + /* + for(i=0;i0) + { + strncpy(str_id,str,i); + break; + } + } + + if(curr_instance_arr[id].eable==1) + { + debug_color_out(BRIGHT,RED,BLACK,"Erorr : the instance is not exist!please select another id!\r\n"); + return; + } + p=str+i; + strcpy(str_value,p); + + for(i=0;i96 && *(str_value+i)<103) || (*(str_value+i)>64 && *(str_value+i)<72))//other flag||0-f + ; + else + { + debug_color_out(BRIGHT,RED,BLACK,"Error : Please in put Value form 0-f!\r\n"); + return ; + } + } + //for(i=0;ioid_len;i++) + // oid[i]=mib_curr_node->oid[i]; + //oid[i+1]=id; + //temp_node=search_mib_node(mib_root_node, oid, i+1); + //if(!temp_node) + //{ + // mib_curr_node=temp_node; + */ + + if(curr_instance_arr[id].eable==1) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : The instance have exist!\r\n"); + return; + } + else + { + if(mib_curr_node->enable_field_id!=0xFF) + { + byte=(id)/8; + bit=(id)%8; + mib_curr_node->enable_flag[byte]=mib_curr_node->enable_flag[byte] | ((BYTE)my_pow(2,bit)); + } + curr_instance_arr[id].eable=1; + + } + temp_instance=mib_curr_node->curr_instance; + mib_curr_node->curr_instance=id; + + if(*(str+i)=='\0') + { + + debug_mmi_set("*"); + //debug_mmi_contents(""); + mib_curr_node->curr_instance=temp_instance; + if(curr_instance_arr[id].eable==1) + { + debug_ascii_out_proc("State : "); + sprintf(temp_str,"The %s #%d have been created successfully!\r\n",mib_curr_node->name,id); + debug_color_out(BRIGHT,CYAN,BLACK,temp_str); + } + return; + } + else if(*(str+i)=='=') + { + p=str+i+1; + strcpy(str,p); + if(strlen(str)>254) + { + str[255]='\0'; + } + strcpy(temp_str,"*="); + strcat(temp_str,str); + debug_mmi_set(temp_str); + //debug_mmi_contents(""); + mib_curr_node->curr_instance=temp_instance; + if(curr_instance_arr[id].eable==1) + { + debug_ascii_out_proc("State : "); + sprintf(temp_str,"The %s #%d have been created successfully!\r\n",mib_curr_node->name,id); + debug_color_out(BRIGHT,CYAN,BLACK,temp_str); + } + return; + } + else if(*(str+i)=='.') + { + p=str+i+1; + strcpy(str,p); + if(strlen(str)>254) + { + str[255]='\0'; + } + strcpy(temp_str,"*."); + strcat(temp_str,str); + debug_mmi_set(temp_str); + //debug_mmi_contents(""); + mib_curr_node->curr_instance=temp_instance; + if(curr_instance_arr[id].eable==1) + { + debug_ascii_out_proc("State : "); + sprintf(temp_str,"The %s #%d have been created successfully!\r\n",mib_curr_node->name,id); + debug_color_out(BRIGHT,CYAN,BLACK,temp_str); + } + return; + } + } + else + debug_color_out(BRIGHT,RED,BLACK,"Error : Input error!\r\n"); +} + +void debug_mmi_del(char *str) +{ + //DWORD oid[20]; + int i; + BYTE byte,bit; + char str_id[128]; + char str_value[128]; + char *p; + int id; + //mib_node *temp_node; + save_flag=1; + strcpy(str_id,""); + strcpy(str_value,""); + for(i=0;i!=strlen(str);i++) + { + if(*(str+i)!=' ') + break; + } + p=str+i; + strcpy(str,p); + if(str[0]!='\0' && str[0]!='#') + { + debug_color_out(BRIGHT,RED,BLACK,"Error : Input Error!\r\n"); + return; + } + + if(strlen(str)==0) + { + id=mib_curr_node->curr_instance; + } + else if(str[0]=='#') + { + p=str+1; + strcpy(str,p); + for(i=0;imib_curr_node->total_instance-1) + { + sprintf(str_value,"Error : The max instance id is %d\r\n",mib_curr_node->total_instance-1); + debug_color_out(BRIGHT,RED,BLACK,str_value); + return; + } + } + /* + for(i=0;i0) + { + strncpy(str_id,str,i); + break; + } + } + + if(curr_instance_arr[id].eable==1) + { + debug_color_out(BRIGHT,RED,BLACK,"Erorr : the instance is not exist!please select another id!\r\n"); + return; + } + p=str+i; + strcpy(str_value,p); + + for(i=0;i96 && *(str_value+i)<103) || (*(str_value+i)>64 && *(str_value+i)<72))//other flag||0-f + ; + else + { + debug_color_out(BRIGHT,RED,BLACK,"Error : Please in put Value form 0-f!\r\n"); + return ; + } + } + //for(i=0;ioid_len;i++) + // oid[i]=mib_curr_node->oid[i]; + //oid[i+1]=id; + //temp_node=search_mib_node(mib_root_node, oid, i+1); + //if(!temp_node) + //{ + // mib_curr_node=temp_node; + */ + + + + if(curr_instance_arr[id].eable!=0) + { + byte=(id)/8; + bit=(id)%8; + mib_curr_node->enable_flag[byte]=mib_curr_node->enable_flag[byte] & (~(BYTE)my_pow(2,bit)); + curr_instance_arr[id].eable=0; + } + else + { + debug_color_out(BRIGHT,RED,BLACK,"Error : The instance is not exist!\r\n"); + return; + } + temp_instance=mib_curr_node->curr_instance; + mib_curr_node->curr_instance=id; + del_flag=1; + debug_mmi_set("*"); + // debug_mmi_contents(""); + if(temp_instance==id) + { + for(i=0;i<256;i++) + if(curr_instance_arr[i].eable==1) + { + temp_instance=i; + break; + } + } + mib_curr_node->curr_instance=temp_instance; + debug_ascii_out_proc("State : "); + sprintf(str_value,"The %s #%d have been deleted successfully!\r\n",mib_curr_node->name,id); + debug_color_out(BRIGHT,CYAN,BLACK,str_value); + return ; +} + + + +void debug_mmi_option(char *str) +{ + int select_id; + int child_index; + mib_child_node *child_node_ptr; + char out_text[80]; + int i=0; + if(!mib_curr_node->total_instance) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : This is no a leaf node!\r\n"); + return ; + } + del_space(str,0); + if(isdigit(str[0])) + { + for(i=0;imib_curr_node->total_child_nodes+1 || select_id==0) + { + sprintf(out_text,"Error : The max field id is %d\r\n",mib_curr_node->total_child_nodes); + debug_color_out(BRIGHT,RED,BLACK,out_text); + return; + } + select_id--; + child_index = find_child_index(mib_curr_node, select_id, NULL, 0); + } + else + child_index = find_child_index(mib_curr_node, 0, str, 1); + + + if (child_index < MIB_MAX_CHILD_NODES_PER_NODE) + { + child_node_ptr = mib_curr_node->child_nodes[child_index]; + if (!child_node_ptr->child_ptr) + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : No such child object for the current object\r\n"); + return ; + } + + param_node = (mib_node_param *)child_node_ptr->child_ptr; + } + else + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : There is no such child.\n"); + return ; + } + debug_ascii_out_proc("Option : "); + debug_color_out(BRIGHT,YELLOW,BLACK,param_node->name); + debug_ascii_out_proc("\r\n"); + + if(param_node->select_total == 0) + { + debug_ascii_out_proc("Fail : There is no description for the select option.\n"); + return ; + } + else + { + i=0; + while(iselect_total) + { + debug_ascii_out_proc(" "); + sprintf(out_text, "%-2d :%-18s ", param_node->select_ptr[i]->number, param_node->select_ptr[i]->description); + debug_color_out(BRIGHT,BLUE,BLACK,out_text); + i+=1; + if(iselect_total) + { + + sprintf(out_text, "%-2d :%-18s ", param_node->select_ptr[i]->number, param_node->select_ptr[i]->description); + debug_color_out(BRIGHT,BLUE,BLACK,out_text); + i+=1; + if(iselect_total) + { + sprintf(out_text, "%-2d :%-18s\r\n", param_node->select_ptr[i]->number, param_node->select_ptr[i]->description); + debug_color_out(BRIGHT,BLUE,BLACK,out_text); + i+=1; + } + } + } + if(param_node->select_total%3!=0) + debug_ascii_out_proc("\r\n"); + } + return; +} + +/* +* +* Fun: debug_mmi_ip +* +* Desc: set the hosts' ip which are used by get or set command +* +* Ret: return 1 if successful, return 0 if fail +* +* Notes: Wang Jian add +* +* File: debug.c +* +*/ +int debug_mmi_ip(char *ips) +{ + BYTE str_len, index, index_2, index_3, index_4; + char temp_str[32], ip[80]; + + strcpy(ip, ips); + printf("ips: %s\r\n", ip); + if (!(str_len = strlen(ip))) + { + debug_ascii_out_proc("Null IP strings.\r\n"); + return 0; + } + strcpy(temp_str, ""); + Peer_IP[0] = 0; + for(index_4=0, index_3=0, index_2=0, index=0; index <= str_len; index++) + { + if( (ip[index] != '.') && (ip[index] != ' ')) + { + temp_str[index_2] = ip[index]; + index_2++; + if(index_2 > 3) + break; + } + else + { + temp_str[index_2] = '\0'; + Peer_IP[index_3] += atoi(temp_str) * my_pow(256, index_4++); + index_2 = 0; + if(index_4 >= 4) + { + index_3++; + Peer_IP[index_3] = 0; + index_4 = 0; + if(index_3 >= 16) + break; + } + } + } + + if(index < str_len) + { + debug_ascii_out_proc("Wrong IP.\r\n"); + return 0; + } + + temp_str[index_2] = '\0'; + if(index_3<16) + Peer_IP[index_3++] += atoi(temp_str) * my_pow(256, index_4++); + if(index_3<16) + Peer_IP[index_3] = 0; + + for(index = 0; index<16; index++) + printf("peer_id[%d] = %lx ", index,Peer_IP[index]); + return 1; +} // end of debug_mmi_ip + + +void debug_mmi_find_host(char *str) +{ + BYTE index,i,j,find_all=0,find; + char temp_str1[64],temp_str2[64],temp_str3[64],*p; + + + for(i=0;imodule_index].name); + if(debug_cfg==2 && menu_curr_node!=NULL) + { + if(menu_curr_node->sys_group==9) + find_all=1; + else if(menu_curr_node->sys_group==0) + { + strcpy(temp_str2,menu_curr_node->name); + for(i=0;isys_group-1; + } + if(find_all==0) + { + strcat(temp_str1,"_"); + gcvt(host_group,1,temp_str2); + strcat(temp_str1,temp_str2); + } + i=0; + ip_num=0; + if(mib_curr_node->total_instance) + { + while(module_host[i].index!=0xFF) + { + find=!strncmp(module_host[i].host_name,temp_str1,strlen(temp_str1)); + if(find_all==2 && isdigit(module_host[i].host_name[strlen(temp_str1)])) + find=0; + if(find) + { + strcpy(Remote_Host_Name[ip_num],module_host[i].host_name); + IP_Selected[ip_num]=1; + strcpy(temp_str2,""); + strcpy(temp_str3,""); + for(j=0;j<4;j++) + { + + Peer_IP[ip_num] += module_host[i].host_ip[j] * my_pow(256, j); + gcvt((double)(module_host[i].host_ip[j]),3,temp_str2); + strcat(temp_str3,temp_str2); + strcat(temp_str3,"."); + } + temp_str3[strlen(temp_str3)-1]='\0'; + strcpy(Remote_Host_IP[ip_num],temp_str3); + ip_num++; + if(ip_num >= 16) + break; + + } + i++; + } + } + for(index=0;index<16;index++) + { + if(Peer_IP[index]!=0) + break; + } + if(list_once==1) + if(snmp_agent_flag==0) + if(index==16) + { + debug_color_out(BRIGHT,RED,BLACK,"Fial : Can not find the host!\r\n"); + return ; + } + + find_all=0; +} + +/* +* +* Fun: debug_mmi_show_host +* +* Desc: if the current node is a leaf node, show its hosts' name and ips +* +* Ret: 1: succeful, 0: fail +* +* Notes: Wang Jian add +* +* File: debug.c +* +*/ +int debug_mmi_show_host() +{ + int index; + char out_text[256]; + if( Remote_Host_Name[0]=="" && Remote_Host_IP[0]=="") + { + debug_color_out(BRIGHT,RED,BLACK,"Host : there is no host for the object!\r\n"); + return 0; + } + if (mib_curr_node->total_instance) + { + if(ip_num!=0) + debug_ascii_out_proc("Host : Count Host Name Host IP Selected\r\n"); + else + { + if(list_once==1) + debug_color_out(BRIGHT,RED,BLACK,"Host : can not show host because no host for the object!\r\n"); + } + for(index=0; index= index_2) + { + if(index_2!=0) + sprintf(temp_str, "Error : The select item must be less than %d.\r\n", index_2); + debug_color_out(BRIGHT,RED,BLACK,temp_str); + return 0; + } + IP_Selected[num]=1; + index_2=0; + temp_str[index_2] = '\0'; + } + } + } + return 1; +}// end of debug_mmi_select_host + + +/* +* +* Fun: debug_mmi_setins +* +* Desc: if the current node is a leaf node, set the current node's current instance number +* +* Ret: 1: succeful, 0: fail +* +* Notes: Wang Jian add +* +* File: debug.c +* +*/ +int debug_mmi_setins(char *ins) +{ + BYTE str_len; + WORD instance; + BYTE ascii_text[128]; + + if (!(str_len = strlen(ins))) + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : No such instance for the current object\r\n"); + return 0; + } + + if (!mib_curr_node->total_instance) + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : No instance for the current object\r\n"); + return 0; + } + + ins[str_len] = '\0'; + + instance = strtoul(ins, NULL, 10); + + if ( instance >= mib_curr_node->total_instance ) + { + sprintf(ascii_text, "Error : The instance value must less than the total instance: %d\r\n",mib_curr_node->total_instance); + debug_ascii_out_proc(ascii_text); + return 0; + } + + mib_curr_node->curr_instance = instance; + debug_ascii_out_proc("Current instance changed to:"); + sprintf(ascii_text,"%d\r\n", instance); + debug_color_out(BRIGHT,YELLOW,BLACK,ascii_text); + + return 1; +} // end of debug_mmi_setins + + +////////////////////////////////End of Cfg OID Tree Command///////// + + + +////////////////////////////////MIB OID Operation////////////////// +//find the the child index on just given node +WORD find_child_index(mib_node *node_ptr, DWORD oid, char *name, BYTE type) +{ + WORD i; + mib_child_node *child_node_ptr; + + //printf("oid[%d], name [%s], type [%d], total_child: %d.\r\n",(int)oid, name,(int)type,node_ptr->total_child_nodes); + if (!node_ptr->total_child_nodes) + return 0xFFFF; + + for (i = 0; i < node_ptr->total_child_nodes; i++) + { + child_node_ptr = node_ptr->child_nodes[i]; + //printf("child_nod_ptr id [%d], name [%s]. para_name: [%s]\r\n", (int)child_node_ptr->oid, child_node_ptr->name, name); + if ( (!type) && (oid == child_node_ptr->oid) ) + { + return i; + } + else if (type && (!strncasecmp(child_node_ptr->name, name,strlen(child_node_ptr->name)))) + return i; + } + //printf("can't find the nod oid=%d.\r\n",(int)oid); + return 0xFFFF; +} + + +/* +* +* Fun: search_mib_node +* +* Desc: begin form the start_mib_node_ptr, search the node whose OID is equal to the oid +* +* Ret: the pionter which point to the node whose OID is equal to the oid , or the NULL pointer if fali +* +* Notes: Wang Jian add +* +* File: debug.c +* +*/ +mib_node *search_mib_node(mib_node *start_mib_node_ptr, DWORD *oid, BYTE oid_len) +{ + mib_node *node_ptr; + mib_child_node *child_node_ptr = NULL; + BYTE i, loop_times; + WORD child_index; + + if(start_mib_node_ptr == NULL) + { + printf("start_mib_node_ptr is NULL.\r\n"); + return NULL; + } + if (oid_len <= start_mib_node_ptr->oid_len) + return NULL; + if ((loop_times = oid_len - start_mib_node_ptr->oid_len) >= 15) + return NULL; + node_ptr = start_mib_node_ptr; + for (i = 0; i < loop_times; i++) + { + if ((child_index = find_child_index(node_ptr, oid[start_mib_node_ptr->oid_len + i], NULL, 0)) >= MIB_MAX_CHILD_NODES_PER_NODE) + return NULL; + child_node_ptr = node_ptr->child_nodes[child_index]; + if (i != (loop_times - 1)) + { + if (child_node_ptr->child_ptr == NULL) + return NULL; + node_ptr = (mib_node *) child_node_ptr->child_ptr; + } + } + return (mib_node *) child_node_ptr->child_ptr; +} // end of search_mib_node + + + +/* +* +* Fun: find_node +* +* Desc: find the node whose name is node_name from the start_node_ptr +* +* Ret: successful: the pointer to the node, fail: NULL +* +* Notes: Wang Jian add +* +* File: debug.c +* +*/ +mib_node *find_node(mib_node *start_node_ptr, char *node_name, int find_type, DWORD *last_node_oid) +{ + int index, index_2; + mib_node *child_node_ptr; + mib_child_node *mib_child_node_ptr; + //printf("find_node begin: %s", start_node_ptr->name); + if(start_node_ptr == NULL) + return NULL; + //printf("nod_name: %s.\r\n",start_node_ptr->name); + if(!strcmp(start_node_ptr->name, node_name)) + { + if(find_type) + { + for(index_2=0; index_2 < start_node_ptr->oid_len-1; index_2++) + { + //printf("%ld.\r\n",start_node_ptr->oid[index_2]); + if(start_node_ptr->oid[index_2] != last_node_oid[index_2]) + break; + } + if(index_2 == (start_node_ptr->oid_len -1)) + return start_node_ptr; + } + else + return start_node_ptr; + } + if(start_node_ptr->total_child_nodes == 0) + return NULL; + if(!start_node_ptr->total_instance) + { + for(index = 0; index < start_node_ptr->total_child_nodes; index++) + { + //printf("child nod_name[%d]: %s.\r\n",index,start_node_ptr->child_nodes[index]->name); + mib_child_node_ptr=start_node_ptr->child_nodes[index]; + if(mib_child_node_ptr) + if( !(strcmp(mib_child_node_ptr->name, node_name)) ) + { + child_node_ptr = mib_child_node_ptr->child_ptr; + if(child_node_ptr!=NULL) + { + if(find_type) + { + for(index_2=0; index_2 < child_node_ptr->oid_len-1; index_2++) + { + if(child_node_ptr->oid[index_2] != last_node_oid[index_2]) + break; + } + if(index_2 == (child_node_ptr->oid_len -1)) + return child_node_ptr; + } + else + return child_node_ptr; + } + } + } + + for(index = 0; index < start_node_ptr->total_child_nodes; index++) + { + mib_child_node_ptr=start_node_ptr->child_nodes[index]; + if(mib_child_node_ptr) + { + child_node_ptr = find_node(mib_child_node_ptr->child_ptr, node_name, find_type, last_node_oid); + if( child_node_ptr != NULL) + { + if(find_type) + { + for(index_2=0; index_2oid_len-1; index_2++) + { + if(child_node_ptr->oid[index_2] != last_node_oid[index_2]) + break; + } + if(index_2 == (child_node_ptr->oid_len -1)) + return child_node_ptr; + } + else + return child_node_ptr; + } + } + } + } + return NULL; +} // end of find_node + +/* +** +* Fun: show_node +* +* Desc: show the mib_tree start from the node_ptr whit the separation as a class sign +* +* Ret: RETVOID +* +* Notes: Wang Jian add +* +* File: debug.c +* +*/ +void show_node(mib_node *node_ptr,char *separation) +{ + int index, length; + mib_node *child_node_ptr; + char spaces[256], separation2[256]; + strcpy(separation2, separation); + length = strlen(separation2); + if(node_ptr == NULL) + { + printf("\r\n"); + return; + } + for(index=0; indexname, spaces, (int)node_ptr->oid[0]); + + for(index=1; indexoid_len; index++) + { + printf(".%d",(int)node_ptr->oid[index]); + } + } + else + printf("%snode name: %s\r\n%soid: %d",separation2, node_ptr->name, spaces, (int)node_ptr->oid[node_ptr->oid_len - 1]); + printf("\n"); + if( node_ptr->total_child_nodes == 0 ) + return; + else + { + printf("%schild nodes:\r\n",spaces); + } + if(node_ptr->total_instance != 0) + { + for(index = 0; index < (node_ptr->total_child_nodes); index++) + { + mib_node_param *mib_node_param_ptr; + + printf("%s oid: %d, name: %s\r\n",spaces, (int)node_ptr->child_nodes[index]->oid, node_ptr->child_nodes[index]->name); + + mib_node_param_ptr = (mib_node_param *)node_ptr->child_nodes[index]->child_ptr;//?? + + printf("%s id: %d, name: %s, %d . %d - %d . %d\r\n", spaces, (int)mib_node_param_ptr->id+1, mib_node_param_ptr->name, (int)mib_node_param_ptr->byte_begin, (int)mib_node_param_ptr->bit_begin, (int)mib_node_param_ptr->byte_end, (int)mib_node_param_ptr->bit_end ); + + if(mib_node_param_ptr->select_total != 0) + { + int index_s; + mib_param_select *mib_param_select_ptr; + + printf("%s selects: \r\n", spaces); + + for(index_s=0; index_s< mib_node_param_ptr->select_total; index_s++) + { + mib_param_select_ptr = mib_node_param_ptr->select_ptr[index_s]; + + printf("%s number: %d, opt: %s\r\n", spaces, (int)mib_param_select_ptr->number, mib_param_select_ptr->description); + } + } + if(mib_node_param_ptr->input_ptr != NULL) + { + mib_param_input *mib_param_input_ptr; + mib_param_input_ptr = mib_node_param_ptr->input_ptr; + printf("%s input:\r\n%s input_param_type: %d, input_string: %s\r\n", spaces, spaces, (int)mib_param_input_ptr->input_param_type, mib_param_input_ptr->input); + } + } + return; + } + + for(index = 0; index < node_ptr->total_child_nodes; index++) + printf("%s oid: %d, name: %s\r\n",spaces, (int)node_ptr->child_nodes[index]->oid, node_ptr->child_nodes[index]->name); + strcat(separation2, "{ }--"); + for(index = 0; index < node_ptr->total_child_nodes; index++) + { + child_node_ptr = node_ptr->child_nodes[index]->child_ptr; + show_node(child_node_ptr,separation2); + } + printf("\r\n"); +} // end of show_node + + +/* +* +* Fun: find_OID +* +* Desc: search the OID which number is obj_num in the sysConf_file, and store them to the *OID +* +* Ret: the length of the OID; 0: Fail +* +* Notes: Wang Jian add +* +* File: debug.c +* +*/ + +int find_OID(int obj_num, char *sysConf_file_name, DWORD *OID) +{ + char temp_str[256], stop_ch[32]; + int state = 0, find; + FILE *fp_sysConf; + + if((fp_sysConf = fopen(sysConf_file_name, "r")) == NULL) + { + printf("[debug] Error: cannot open param_sysConf_file: [%s].\r\n",sysConf_file_name); + return 0; + } + + strcpy(stop_ch,";"); + while( !feof(fp_sysConf) ) + { + read_until(fp_sysConf, temp_str, stop_ch); + + switch(state) + { + case 0: + if(strlen(temp_str) == 0) + { + printf("[debug] Error: Fail to get the object number in the sysConf_file.\r\n"); + fclose(fp_sysConf); + return 0; + } + if( obj_num == atoi(temp_str) ) + find = 1; + else + find = 0; + strcpy(stop_ch,";"); + state = 1; + break; + case 6: + if(find && (strlen(temp_str) != 0)) + { + int i, j, k, length=strlen(temp_str); + char temp_str_2[256]; + strcpy(temp_str_2, ""); + for(k=0; k<32; k++) + OID[k] = 0; + for(i=0,j=0,k=0 ; imenu_oid_node==mib_curr_node && menu_curr_node->total_menu_child) + { + debug_ascii_out_proc("Name : "); + sprintf(ascii_text,"%s",menu_curr_node->name); + debug_color_out(BRIGHT,YELLOW,BLACK,ascii_text); + debug_ascii_out_proc("\r\n"); + debug_ascii_out_proc("Contents: "); + sprintf(ascii_text, "[%d]\r\n",menu_curr_node->total_menu_child); + debug_color_out(BRIGHT,YELLOW,BLACK,ascii_text); + for (i = 0; i < menu_curr_node->total_menu_child; i++) + { + menu_tmp_node = menu_curr_node->child_node[i]; + if(menu_tmp_node!=NULL) + { + sprintf(ascii_text, " |---(%d) %s\r\n",menu_tmp_node->menu_id[menu_tmp_node->id_len-1], menu_tmp_node->name); + debug_color_out(BRIGHT,YELLOW,BLACK,ascii_text); + } + } + } + else + { + debug_mmi_contents(""); + } +} + +void debug_mmi_mcd(char *str) +{ + char input_str[32]; + int index;//,index1; + menu_node *menu_tmp_node; + mib_child_node *child_node_ptr; + mib_node *find_node_ptr; + DWORD temp_index; + DWORD OID[32]; + BYTE index_start,index_end; + + + if(mib_curr_node->total_instance && strstr(str,"..")==0) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : Have reached the leaf node!\r\n"); + return; + } + + + if(strlen(str)>32) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : No need so long command!\r\n"); + return ; + } + + for(index_start=0;index_start0;index_start--) + { + if(*(str+index_end)!=' ') + break; + } + strncpy(input_str,str+index_start,index_end-index_start); + if(!strlen(input_str)) + { + menu_curr_node=menu_root_node; + if(menu_curr_node->menu_oid_node) + mib_curr_node=menu_curr_node->menu_oid_node; + list_once=0; + debug_mmi_view(); + return ; + } + if(input_str[0]=='.'&& input_str[1]=='.') + { + if(mib_curr_node!=menu_curr_node->menu_oid_node) + { + mib_curr_node=(mib_node*)mib_curr_node->parent_ptr; + } + else if(mib_curr_node==menu_curr_node->menu_oid_node) + { + menu_tmp_node=(menu_node *)menu_curr_node->father_ptr; + if(menu_tmp_node) + { + menu_curr_node=menu_tmp_node; + if(menu_curr_node->menu_oid_node) + { + mib_curr_node=menu_curr_node->menu_oid_node; + list_once=0; + } + } + else + { + debug_color_out(BRIGHT,RED,BLACK,"Error : Have reach the 'WXC2' or no father node\r\n"); + return ; + } + } + } + else if(!isdigit(input_str[0]) || (isdigit(input_str[0]) && !isdigit(input_str[1]) && input_str[1]!='\0')) + { + if(mib_curr_node==menu_curr_node->menu_oid_node && menu_curr_node->total_menu_child) + { + for(index=0;indextotal_menu_child;index++) + { + if((menu_tmp_node=(menu_node*)menu_curr_node->child_node[index])) + if(strncasecmp(input_str,menu_tmp_node->name,strlen(menu_tmp_node->name))==0) + { + menu_curr_node=menu_tmp_node; + if(menu_curr_node->menu_oid_node) + mib_curr_node=menu_curr_node->menu_oid_node; + break; + } + } + if(index==menu_curr_node->total_menu_child) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : No such object as the name or input error!\r\n"); + return ; + } + } + else + { + index = find_child_index(mib_curr_node, 0, input_str, 1); + + if (index < MIB_MAX_CHILD_NODES_PER_NODE) + { + child_node_ptr = mib_curr_node->child_nodes[index]; + if (!child_node_ptr->child_ptr) + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : No such child object for the current object\r\n"); + return ; + } + else + mib_curr_node=child_node_ptr->child_ptr; + } + else + { + debug_color_out(BRIGHT,RED,BLACK,"Error : Input error!\r\n"); + return ; + } + } + } + else if(isdigit(input_str[0])) + { + for(index=0;index4) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : Input error!\r\n"); + return ; + } + temp_index=atoi(input_str); + } + if(mib_curr_node==menu_curr_node->menu_oid_node && menu_curr_node->total_menu_child) + { + if(temp_index<=0 || temp_index>menu_curr_node->total_menu_child) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : Input error!\r\n"); + return ; + } + if(!menu_curr_node->total_menu_child || temp_index>menu_curr_node->total_menu_child) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : No child menu item!\r\n"); + return ; + } + else if((menu_tmp_node=(menu_node*)menu_curr_node->child_node[temp_index-1])) + { + menu_curr_node=menu_tmp_node; + if(menu_curr_node->menu_oid_node) + mib_curr_node=menu_curr_node->menu_oid_node; + } + } + else + { + if(mib_curr_node->total_child_nodes) + { + OID[mib_curr_node->oid_len]=temp_index; + find_node_ptr =(mib_node*)search_mib_node(mib_curr_node, OID,mib_curr_node->oid_len+1); + //child_node_ptr=mib_curr_node->child_nodes[temp_index-1]; + if(!find_node_ptr) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : No such child item!\r\n"); + return ; + } + else + { + mib_curr_node=find_node_ptr; + list_once=0; + } + //if(child_node_ptr->child_ptr) + // mib_curr_node=child_node_ptr->child_ptr; + //else + //{ + // debug_color_out(BRIGHT,RED,BLACK,"Error : No such child node!\r\n"); + // return ; + //} + } + else + { + debug_color_out(BRIGHT,RED,BLACK,"Error : No child for current node!\r\n"); + return ; + } + } + } + else + { + debug_color_out(BRIGHT,RED,BLACK,"Error : Input error!\r\n"); + return ; + } + /* + for(index=0;index3) + { + field_compute_state=0; + read_syntax_nor_list=0; + line_index=0; + compute_state=0; + print_line_index=0; + } + */ + if(mib_curr_node==menu_curr_node->menu_oid_node && menu_curr_node->total_menu_child) + debug_mmi_view(); + else + { + if(menu_curr_node->menu_oid_node) + { + curr_module=mib_curr_node->module_index; + if(mib_curr_node->total_instance) + { + list_once=0; + curr_module=mib_curr_node->module_index; + register_instance(); + debug_mmi_contents(" "); + debug_cfg_end=0; + } + else + { + debug_mmi_contents(" "); + } + } + else + { + debug_color_out(BRIGHT,RED,BLACK,"Error : No oid node match along with the menu item!\r\n"); + return ; + } + } + +} + +void main_menu(char *str) +{ + char out_text[128],*ch; + BYTE i; + for(i=0;i<80 && *(str+i)!='\0';i++) + { + if(*(str+i)!=' ') + break; + } + ch=str+i; + strcpy(out_text,ch); + if(*out_text!='\0') + { + if(strncasecmp(out_text,"help",4)==0) + { + debug_ascii_out_proc(" Usage 1: "); + debug_color_out(BRIGHT,YELLOW,BLACK,"help \r\n"); + debug_ascii_out_proc(" Show the WXC2 configer menu page\r\n"); + debug_ascii_out_proc(" Usage 1: "); + debug_color_out(BRIGHT,YELLOW,BLACK,"help command\r\n"); + debug_ascii_out_proc(" Show the usage of the command: contents,cd,child,parent,get,set,lsit,\r\n create,delete,remark,option,cmm,help\r\n"); + } + else if(strncasecmp(out_text,"cd",2)==0) + { + debug_ascii_out_proc(" Usage 1: "); + debug_color_out(BRIGHT,YELLOW,BLACK,"cd \r\n"); + debug_ascii_out_proc(" Enter the system main menu WXC2\r\n"); + debug_ascii_out_proc(" Usage 2: "); + debug_color_out(BRIGHT,YELLOW,BLACK,"cd ..\r\n"); + debug_ascii_out_proc(" Enter the parent menu item \r\n"); + debug_ascii_out_proc(" Usage 3: "); + debug_color_out(BRIGHT,YELLOW,BLACK,"cd name\r\n"); + debug_ascii_out_proc(" Enter the child menu item name as 'name'\r\n"); + debug_ascii_out_proc(" Usage 4: "); + debug_color_out(BRIGHT,YELLOW,BLACK,"cd XX\r\n"); + debug_ascii_out_proc(" Enter the child menu item whose id is 'XX' \r\n"); + } + else if(strncasecmp(out_text,"get",3)==0) + { + help_cmm(1,"get or get *","Get and printf the current instance's value of the node\r\n"); + help_cmm(2,"get #XX","Get and printf the special instance's value of the node\r\n"); + help_cmm(3,"get *.X or get *.name","Get and printf the current instance's special field value of the node\r\n"); + help_cmm(4,"get #X.X or get #x.name","Get and printf the special instance's special field value of the node\r\n"); + } + else if(strncasecmp(out_text,"set",3)==0) + { + help_cmm(1,"set or set *","Set the current instance's value to default value of the node and open the isntance ,then printf\r\n"); + help_cmm(2,"set #XX ","Set the special instance's value to default value of the node and open the isntance ,then printf\r\n"); + help_cmm(3,"set *.X =X or set *.name=X ","Set the current instance's field value to given value of the node and open the isntance ,then printf\r\n"); + help_cmm(4,"set #X.X =X or set #x.name=X ","Set the special instance's field value to given value of the node and open the isntance ,then printf\r\n"); + help_cmm(5,"set #X =XXX","Set the special instance's whole value to given value of the node and open the isntance ,then printf\r\n"); + } + else if(strncasecmp(out_text,"create",3)==0) + { + help_cmm(1,"creat or create *","Create an instance with the min closed instance id and set it's value to default value of the node and open the isntance ,then printf\r\n"); + help_cmm(2,"create #XX","Create the special instance,and set it's value to default value of the node and open the isntance ,then printf\r\n"); + help_cmm(3,"create *.X =X or create *.name=X ","Create an instance's with the min closed instance id ,and set it's field value to given value of the node and open the isntance ,then printf\r\n"); + help_cmm(4,"create #X.X =X or create #x.name=X ","Create the special instance,and set it's field value to given value of the node and open the isntance ,then printf\r\n"); + help_cmm(5,"create #X =XXX","Create the special instance,and set is's whole value to given value of the node and open the isntance ,then printf\r\n"); + } + else if(strncasecmp(out_text,"delete",3)==0) + { + help_cmm(1,"delete ","Delete the current instance ,if it is opened,clost it.set the value to default value of the node\r\n"); + help_cmm(2,"delete #XX","Delete the special instance,if it is opened,clost it.set the value to default value of the node\r\n"); + } + else if(strncasecmp(out_text,"contents",3)==0) + { + help_cmm(1,"contents ","Show the current menu item or the informat about the oid node\r\n"); + } + else if(strncasecmp(out_text,"list",3)==0) + { + help_cmm(1,"list [-a]","the switch of show all the field and value of the instance include the 'NULL' and the closed instance,default:off\r\n"); + help_cmm(2,"list [-e]","the switch of show opened the instance,hide the field and it's value default:off\r\n"); + help_cmm(3,"list [-r]","the switch of show the field data range.default:off\r\n"); + help_cmm(4,"list [-t]","the switch of show input data type ,default:off\r\n"); + help_cmm(5,"list [-f[X XX X]]","the switch of show the special field list in the [ ] ,default:off\r\n"); + help_cmm(6,"list [X-XX]","the switch of show the instance range form x to xxx.default:off\r\n"); + } + else if(strncasecmp(out_text,"child",3)==0) + { + help_cmm(1,"child X","Enter the child node whose id is X\r\n"); + help_cmm(2,"child name","Enter the child node whose name is 'name'\r\n"); + } + else if(strncasecmp(out_text,"parent",3)==0) + { + help_cmm(1,"parent","Enter the parent node\r\n"); + } + /* + else if(strncasecmp(out_text,"pwd",3)==0) + { + help_cmm(1,"pwd","Show the full path and the full oid\r\n"); + } + */ + else if(strncasecmp(out_text,"remark",3)==0) + { + help_cmm(1,"remark","Show the description of the node\r\n"); + } + else if(strncasecmp(out_text,"option",3)==0) + { + help_cmm(1,"option X","Show the select option of the fied node whose id is x of leaf node \r\n"); + help_cmm(2,"option name","Show the select option of the fied node whose name is ''name' of leaf node \r\n"); + } + else if(strncasecmp(out_text,"save",3)==0) + { + help_cmm(1,"save","save the debug\r\n"); + } + else if(strncasecmp(out_text,"find host",3)==0) + { + help_cmm(1,"find host","Find all the host who have the object about the current node\r\n"); + } + else if(strncasecmp(out_text,"select",3)==0) + { + help_cmm(1,"select X","Select the host ip list,if been selected ,the set command would do effect on the host\r\n"); + } + else if(strncasecmp(out_text,"setinst",3)==0) + { + help_cmm(1,"setinst X","Set the current instance as the special number\r\n"); + } + else if(strncasecmp(out_text,"cmm",3)==0) + { + help_cmm(1,"cmm","Enter the debug cmm state\r\n"); + } + /* + else if(strncasecmp(out_text,"addhost",3)==0) + {} + else if(strncasecmp(out_text,"delhost",3)==0) + {} + else if(strncasecmp(out_text,"tree",4)==0) + { + help_cmm(1,"tree","Print the menu three\r\n"); + } + */ + else + { + debug_color_out(BRIGHT,RED,BLACK,"Error : No such Command!\r\n"); + return ; + } + } + else + { + time_t tick_2; + char time_buf_2[64]= "\0", str_buf[128]="\0"; + BYTE count=0; + tick_2 = time(NULL); + debug_ascii_out_proc("\033[2J\033[1;1H"); + snprintf(time_buf_2, sizeof(time_buf_2), "%.24s", ctime(&tick_2)); + sprintf(str_buf, " -----Start Time: %s----- \r\n", time_buf_2); + debug_color_out(BRIGHT,CYAN,WHITE,str_buf); + debug_ascii_out_proc("\r\n"); + debug_ascii_out_proc(" "); + debug_ascii_out_proc("*************************\r\n");//80-20=60/2=30 + debug_ascii_out_proc(" "); + debug_ascii_out_proc("*"); + debug_ascii_out_proc(" "); + debug_color_out(BRIGHT,WHITE,BLACK,"WXC2 System Configer Menu");//80-20=60/2=30 + debug_ascii_out_proc(" "); + debug_ascii_out_proc("*\r\n"); + debug_ascii_out_proc(" "); + debug_ascii_out_proc("*************************\r\n");//80-20=60/2=30 + debug_ascii_out_proc("\r\n"); + debug_ascii_out_proc("\r\n"); + debug_ascii_out_proc(" ============================================================================== \r\n"); + debug_ascii_out_proc(" | | | | | | \r\n"); + debug_ascii_out_proc(" "); + count=menu_root_node->total_menu_child; + for(i=0;ichild_node[i])->name); + debug_color_out(BRIGHT,YELLOW,GREEN,out_text); + debug_ascii_out_proc(" "); + } + debug_ascii_out_proc("\r\n\r\n\r\n\r\n"); + if(debug_cfg==2) + { + debug_ascii_out_proc(" Usage 1: "); + debug_color_out(BRIGHT,YELLOW,BLACK,"help \r\n"); + debug_ascii_out_proc(" Show the WXC2 configer menu page\r\n"); + debug_ascii_out_proc(" Usage 1: "); + debug_color_out(BRIGHT,YELLOW,BLACK,"help command\r\n"); + debug_ascii_out_proc(" Show the usage of the command: contents,cd,child,parent,get,set,list,\r\n create,delete,remark,option,cmm,save,help\r\n"); + } + } +} // end of debug_mmi_cfg_help + + + +menu_node *search_menu_node(menu_node *start_menu_node_ptr, BYTE *menu_id, BYTE id_len) +{ + menu_node *node_ptr,*menu_node_ptr; + BYTE i, loop_times; + + + if(start_menu_node_ptr == NULL) + { + printf("start_menu_node_ptr is NULL.\r\n"); + return NULL; + } + if (id_len <= start_menu_node_ptr->id_len) + return NULL; + if ((loop_times = id_len - start_menu_node_ptr->id_len) >= 15) + return NULL; + node_ptr = start_menu_node_ptr; + for (i = 0; i < loop_times; i++) + { + menu_node_ptr= (menu_node*)node_ptr->child_node[menu_id[i]-1]; + if(menu_node_ptr) + node_ptr=menu_node_ptr; + else + { + printf("[debug] :Fail to search menu node!father node: %s,search_id:%d\n",node_ptr->name,menu_id[loop_times]); + return NULL; + } + } + return (menu_node *) node_ptr; +} // end of search_menu_node +//////////////////////////////End of CMM Menu Tree Command//////////// + + + + + + +///////////////////////////////snmp senior agnet///////////////// + +void debug_set_agent() +{ + DWORD oid[32]; + mib_child_node *child_node_ptr; + mib_node *find_node_ptr; + char *p,temp_str1[16],temp_str2[4]; + WORD ip[16][4]; + DWORD Set_IP[16],sum,sub_sum; + BYTE m; + param_field *tmp_param_field; + WORD i,j,k,child_index,index3,index,index2,index4,select_id; + WORD total_field; + if(snmp_agent_flag==0 && (get_state!=0 || set_state!=0)) + return ; + + + + for(i=0;itotal_instance) + { + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=3; + return ; + } + agent_tmp_node=mib_curr_node; + mib_curr_node=find_node_ptr; + for(i=0;itotal_child_nodes;i++) + { + child_node_ptr=mib_curr_node->child_nodes[i]; + if(child_node_ptr) + { + param_node = (mib_node_param *)child_node_ptr->child_ptr; + tmp_param_field=&debug_snmp_agent_buf[debug_agent_index].param_field_arr[i]; + if(param_node->select_total!=0) + { + tmp_param_field->total_select=param_node->select_total; + for(index=0; indexselect_total; index++) + { + tmp_param_field->value_arr[index]=param_node->select_ptr[index]->number; + strcpy(tmp_param_field->value_arr_remark[index],param_node->select_ptr[index]->description); + } + tmp_param_field->input_type=0xFF; + } + else if(param_node->input_ptr!=NULL) + { + tmp_param_field->total_select=0; + tmp_param_field->input_type=param_node->input_ptr->input_param_type; + } + strcpy(tmp_param_field->name,param_node->name); + } + + } + + if(mib_curr_node->max_access ==0 || mib_curr_node->max_access ==1 || mib_curr_node->max_access ==3) + { + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=6; + mib_curr_node=agent_tmp_node; + return ; + } + + if(snmp_agent_packet.oid[snmp_agent_packet.oid_len-1] >mib_curr_node->total_instance) + { + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=5; + mib_curr_node=agent_tmp_node; + return ; + } + + mib_curr_node->curr_instance=snmp_agent_packet.oid[snmp_agent_packet.oid_len-1]; + + + + + //set the param + if(snmp_agent_packet.total_field!=mib_curr_node->total_child_nodes) + { + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=7; + mib_curr_node=agent_tmp_node; + return ; + } + j=mib_curr_node->data_length; + for(i=0;iinit_value[i]; + } + + total_field=snmp_agent_packet.total_field; + //total_field=mib_curr_node->total_child_nodes; + for(child_index=0;child_indexchild_nodes[child_index]; + if (!child_node_ptr->child_ptr) + { + strcpy(temp_str1,"1"); + sprintf(temp_str2,"%d",child_index); + strcat(temp_str1,temp_str2); + j=atoi(temp_str1); + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=j; + mib_curr_node=agent_tmp_node; + return ; + } + param_node = (mib_node_param *)child_node_ptr->child_ptr; + + if(param_node->select_total != 0) + { + select_id=atoi(snmp_agent_packet.param_field_arr[child_index].curr_input_value); + if(select_id>param_node->select_total) + { + strcpy(temp_str1,"2"); + sprintf(temp_str2,"%d",snmp_agent_packet.param_field_arr[child_index].curr_select_id); + strcat(temp_str1,temp_str2); + j=atoi(temp_str1); + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=j; + mib_curr_node=agent_tmp_node; + return ; + + } + else + { + j=select_id; + set_val=param_node->select_ptr[j]->number; + index3 = sum = 0; + for(index=param_node->byte_begin; index <= param_node->byte_end; index++) + { + if(index == param_node->byte_begin) + index2 = param_node->bit_begin; + else + index2 = 0; + for(; index2<8; index2++) + { + if((set_val & (BYTE)my_pow(2, index3)) == 0) + recv_msgbuf.var[0].msg[index] = recv_msgbuf.var[0].msg[index] & (255 - my_pow(2, index2)); + else + recv_msgbuf.var[0].msg[index] = recv_msgbuf.var[0].msg[index] | my_pow(2, index2); + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + break; + index3++; + } + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + break; + } + } + } + else if(param_node->input_ptr != NULL) + { + strcpy(set_val_str,snmp_agent_packet.param_field_arr[child_index].curr_input_value); + switch(param_node->input_ptr->input_param_type)// ananlise + { + case 0: //toDec_high_0 //\u5224\u65AD\u8F93\u5165\u7684\u6570\u503C\u662F\u5426\u6709\u6548 + j = strlen(set_val_str); + for(i=0; ibyte_end * 8 + 1 + param_node->bit_end) - (param_node->byte_begin * 8 - param_node->bit_begin); + set_val = atol(set_val_str); + if(set_val > my_pow(2, j)) + { + strcpy(temp_str1,"3"); + sprintf(temp_str2,"%d",child_index); + strcat(temp_str1,temp_str2); + j=atoi(temp_str1); + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=j; + mib_curr_node=agent_tmp_node; + return ; + } + } + break; + case 1: //keepHex_high_0 //\u5224\u65AD\u8F93\u5165\u7684\u6570\u503C\u5B57\u7B26\u4E32set_val_str\u662F\u5426\u6709\u6548, \u5982\u679C\u6709\u6548\u5219\u5C06\u9AD8\u4F4D\u8865\u6210\u5B57\u7B26'0'\uFF0C\u8865\u8DB3\u4F4D\u6570 + j = strlen(set_val_str); + for(i=0; i= 'A') && (set_val_str[i] <= 'F')) //is A to F + continue; + break; + } + if(ibyte_end * 8 + 1 + param_node->bit_end) - (param_node->byte_begin * 8 - param_node->bit_begin) )/4; + if(j > i) //\u5B57\u7B26\u4E32\u957F\u5EA6\u5927\u4E8E\u6240\u80FD\u5B58\u50A8\u7684\u4F4D\u6570\uFF0C\u5219\u63D0\u793A\u5E76\u9000\u51FA + { + strcpy(temp_str1,"3"); + sprintf(temp_str2,"%d",child_index); + strcat(temp_str1,temp_str2); + j=atoi(temp_str1); + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=j; + mib_curr_node=agent_tmp_node; + return ; + } + + //\u8F93\u5165\u6709\u6548\uFF0C\u5219\u5C06\u9AD8\u4F4D\u8865\u6210'0' + k = i-j; + for(j=i-1; (j-k)>=0 && j!=0 ; j--) + set_val_str[j]=set_val_str[j-k]; + set_val_str[i] = '\0'; + for(j=0; j= 'A') && (set_val_str[i] <= 'F')) //is A to F + continue; + break; + } + if(ibyte_end * 8 + 1 + param_node->bit_end) - (param_node->byte_begin * 8 - param_node->bit_begin) )/4; + if(j > i) //\u5B57\u7B26\u4E32\u957F\u5EA6\u5927\u4E8E\u6240\u80FD\u5B58\u50A8\u7684\u4F4D\u6570\uFF0C\u5219\u63D0\u793A\u5E76\u9000\u51FA + { + strcpy(temp_str1,"3"); + sprintf(temp_str2,"%d",child_index); + strcat(temp_str1,temp_str2); + j=atoi(temp_str1); + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=j; + mib_curr_node=agent_tmp_node; + return ; + } + + //\u8F93\u5165\u6709\u6548\uFF0C\u5219\u5C06\u4F4E\u4F4D\u8865\u6210'0' + for(; j= 'A') && (set_val_str[i] < 'E')) //is A to D + continue; + break; + } + if(ibyte_end * 8 + 1 + param_node->bit_end) - (param_node->byte_begin * 8 - param_node->bit_begin) )/4; + if(j > i) //\u5B57\u7B26\u4E32\u957F\u5EA6\u5927\u4E8E\u6240\u80FD\u5B58\u50A8\u7684\u4F4D\u6570\uFF0C\u5219\u63D0\u793A\u5E76\u9000\u51FA + { + strcpy(temp_str1,"3"); + sprintf(temp_str2,"%d",child_index); + strcat(temp_str1,temp_str2); + j=atoi(temp_str1); + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=j; + mib_curr_node=agent_tmp_node; + return ; + } + + //\u8F93\u5165\u6709\u6548\uFF0C\u5219\u5C06\u4F4E\u4F4D\u8865\u6210E + for(; j= 'A') && (set_val_str[i] < 'F')) //is A to E + continue; + break; + } + if(ibyte_end * 8 + 1 + param_node->bit_end) - (param_node->byte_begin * 8 - param_node->bit_begin) )/4; + if(j > i) //\u5B57\u7B26\u4E32\u957F\u5EA6\u5927\u4E8E\u6240\u80FD\u5B58\u50A8\u7684\u4F4D\u6570\uFF0C\u5219\u63D0\u793A\u5E76\u9000\u51FA + { + strcpy(temp_str1,"3"); + sprintf(temp_str2,"%d",child_index); + strcat(temp_str1,temp_str2); + j=atoi(temp_str1); + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=j; + mib_curr_node=agent_tmp_node; + return ; + } + + //\u8F93\u5165\u6709\u6548\uFF0C\u5219\u5C06\u4F4E\u4F4D\u8865\u6210'F' + for(; jbyte_end * 8 + 1 + param_node->bit_end) - (param_node->byte_begin * 8 - param_node->bit_begin) )/8; + if(j > i) //\u5B57\u7B26\u4E32\u957F\u5EA6\u5927\u4E8E\u6240\u80FD\u5B58\u50A8\u7684\u4F4D\u6570\uFF0C\u5219\u63D0\u793A\u5E76\u9000\u51FA + { + strcpy(temp_str1,"3"); + sprintf(temp_str2,"%d",child_index); + strcat(temp_str1,temp_str2); + j=atoi(temp_str1); + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=j; + mib_curr_node=agent_tmp_node; + return ; + } + + //\u8F93\u5165\u6709\u6548\uFF0C\u5219\u5C06\u4F4E\u4F4D\u8865\u6210'0' + for(; jbyte_end * 8 + 1 + param_node->bit_end) - (param_node->byte_begin * 8 - param_node->bit_begin) )/8; + if(j > i) //\u5B57\u7B26\u4E32\u957F\u5EA6\u5927\u4E8E\u6240\u80FD\u5B58\u50A8\u7684\u4F4D\u6570\uFF0C\u5219\u63D0\u793A\u5E76\u9000\u51FA + { + strcpy(temp_str1,"3"); + sprintf(temp_str2,"%d",child_index); + strcat(temp_str1,temp_str2); + j=atoi(temp_str1); + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=j; + mib_curr_node=agent_tmp_node; + return ; + } + + //\u8F93\u5165\u6709\u6548\uFF0C\u5219\u5C06\u4F4E\u4F4D\u8865\u6210'F' + for(; jinput_ptr->input_param_type)// set + { + case 0: //toDec_high_0 + index3 = sum = 0; + for(index=param_node->byte_end; index >=param_node->byte_begin; index--) + { + if(index == param_node->byte_begin) + index2 = param_node->bit_begin; + else + index2 = 0; + for(; index2<8; index2++) + { + if((set_val & (BYTE)my_pow(2, index3)) == 0) + recv_msgbuf.var[0].msg[index] = recv_msgbuf.var[0].msg[index] & (255 - my_pow(2, index2)); + else + recv_msgbuf.var[0].msg[index] = recv_msgbuf.var[0].msg[index] | my_pow(2, index2); + index3++; + if( (index == param_node->byte_begin) && (((param_node->byte_begin==param_node->byte_end)&& index2 == param_node->bit_end) || ((param_node->byte_begin!=param_node->byte_end)&& index2==7))) + break; + + } + if( (index == param_node->byte_begin) && (((param_node->byte_begin==param_node->byte_end)&& index2 == param_node->bit_end) || ((param_node->byte_begin!=param_node->byte_end)&& index2==7))) + break; + } + break; + case 1: //keepHex_high_0 + case 2: //keepHex_low_0 + case 3: //keepHex_low_E + case 4: //keepHex_low_F + + index3 = index4 = sum = sub_sum = 0; + for(index=param_node->byte_begin; index <= param_node->byte_end; index++) + { + if(index == param_node->byte_begin) + index2 = param_node->bit_begin; + else + index2 = 0; + if((index3 == 0) && ( (index4+1) <= strlen(set_val_str) )) //\u53D6\u4E24\u4F4D\u5B57\u7B26 + { + set_val = 0; + if( isdigit(set_val_str[index4]) ) //\u6570\u5B57\u5B57\u7B26 + set_val += (set_val_str[index4++] - '0') * 16; + else // A \u81F3 E \u4E4B\u95F4 + set_val += (set_val_str[index4++] - 'A' + 10) * 16; + + if( isdigit(set_val_str[index4]) ) + set_val += set_val_str[index4++] - '0'; + else + set_val += set_val_str[index4++] - 'A' + 10; + } + + for(; index2<8; index2++) + { + if((set_val & (BYTE)my_pow(2, index3)) == 0) + recv_msgbuf.var[0].msg[index] = recv_msgbuf.var[0].msg[index] & (255 - my_pow(2, index2)); + else + recv_msgbuf.var[0].msg[index] = recv_msgbuf.var[0].msg[index] | my_pow(2, index2); + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + break; + index3++; + if(index3 == 8) + index3 = 0; + } + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + break; + } + break; + case 5: //toAscii_low_0 + case 6: //keepAscii_low_F + + index3 = index4 = sum = sub_sum = 0; + for(index=param_node->byte_begin; index <= param_node->byte_end; index++) + { + if(index == param_node->byte_begin) + index2 = param_node->bit_begin; + else + index2 = 0; + if(index3 == 0) //\u53D6\u4E00\u4F4D\u5B57\u7B26 + set_val = set_val_str[index4++]; + + for(; index2<8; index2++) + { + if((set_val & (BYTE)my_pow(2, index3)) == 0) + recv_msgbuf.var[0].msg[index] = recv_msgbuf.var[0].msg[index] & (255 - my_pow(2, index2)); + else + recv_msgbuf.var[0].msg[index] = recv_msgbuf.var[0].msg[index] | my_pow(2, index2); + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + break; + index3++; + if(index3 == 8) + index3 = 0; + } + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + break; + } + break; + } + } + + + } + j=recv_msgbuf.var[0].msglen; + + for(i=0;i15) + break; + } + for(i=0;i<=ip_num;i++) + { + Peer_IP[i]=Set_IP[i]; + IP_Selected[i]=1; + } + for(ip_index=0;ip_index<16;ip_index++) + { + if(IP_Selected[ip_index] != 1) + continue; + send_addr.remote_ip = Peer_IP[ip_index]; + break; + } + if(ip_index>=16) + { + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=4; + mib_curr_node=agent_tmp_node; + return ; + } + } + else + debug_mmi_find_host(""); + send_addr.local_ip = Local_IP; + send_addr.remote_port = SNMP_PORT; + send_addr.local_port = DEBUG_SNMP_PORT; + + send_addr.broadcast = 0; + send_msgbuf.pdu_type = 0; + send_msgbuf.request_id = 0; + send_msgbuf.var_num = 1; + for(i=0; i<32; i++) + send_msgbuf.var[0].oid[i] = mib_curr_node->oid[i]; + send_msgbuf.var[0].oid[mib_curr_node->oid_len] = (DWORD)mib_curr_node->curr_instance; + send_msgbuf.var[0].oidlen = mib_curr_node->oid_len + 1; + recv_msgbuf.pdu_type = 2; + recv_msgbuf.request_id = 0; + recv_msgbuf.var_num = 1; + for(i=0; i<32; i++) + recv_msgbuf.var[0].oid[i] = mib_curr_node->oid[i]; + recv_msgbuf.var[mib_curr_node->oid_len].oid[i] = (DWORD)mib_curr_node->curr_instance; + recv_msgbuf.var[0].oidlen = mib_curr_node->oid_len + 1; + + for(i=0; i<256; i++) + recv_msgbuf.var[0].msg[i] = 0; + + recv_addr.remote_ip = send_addr.remote_ip; + recv_addr.local_ip = Local_IP; + recv_addr.remote_port = SNMP_PORT; + recv_addr.local_port = DEBUG_SNMP_PORT; + recv_addr.broadcast = 0; + + snmp_agent_flag=2; + debug_snmp_agent_buf[debug_agent_index].cmm_state=3; + ip_index = 0; + set_state = 1; + debug_cfg_end = 0; + return ; +} + +void debug_get_agent() +{ + DWORD oid[32]; + mib_node *find_node_ptr; + char *p,temp_str1[16],temp_str2[4]; + WORD ip[16][4]; + DWORD Set_IP[16]; + BYTE m; + WORD i,j,k; + static BYTE t1s; + + if(snmp_agent_flag==0 && (get_state!=0 || set_state!=0)) + return ; + + if(bind_num>0 && snmp_agent_flag>0) + { + for(i=0;i50) + { + t1s=0; + bind_num=0; + get_state=0; + snmp_agent_flag=0; + for(i=0;icurr_instance+=bind_num-1; + + if(mib_curr_node->curr_instance==mib_curr_node->total_instance-1) + { + bind_num=0; + get_state=0; + snmp_agent_flag=0; + mib_curr_node->curr_instance=0; + mib_curr_node=agent_tmp_node; + return; + } + if(mib_curr_node->curr_instancetotal_instance-MAX_PACKET_NUM) + { + //mib_curr_node->curr_instance+=bind_num; + mib_curr_node->curr_instance++; + snmp_agent_flag=1; + for(i=0;icurr_instancetotal_instance-1) + { + mib_curr_node->curr_instance++; + bind_num=mib_curr_node->total_instance+1-mib_curr_node->curr_instance; + snmp_agent_flag=1; + for(i=0;icurr_instance=0; + mib_curr_node=agent_tmp_node; + return; + } + } + + + for(i=0;itotal_child_nodes; + if(mib_curr_node->max_access ==0 || mib_curr_node->max_access ==1) + { + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=6; + mib_curr_node=agent_tmp_node; + return ; + } + + if(snmp_agent_packet.oid[snmp_agent_packet.oid_len-1]>mib_curr_node->total_instance) + { + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=5; + mib_curr_node=agent_tmp_node; + return ; + } + if(mib_curr_node->total_instance==snmp_agent_packet.total_instance && mib_curr_node->total_instance>=MAX_PACKET_NUM ) + { + if(debug_agent_index==0 && !debug_snmp_agent_buf[debug_agent_index].oid[ debug_snmp_agent_buf[debug_agent_index].oid_len-1]) + { + bind_num=MAX_PACKET_NUM; + snmp_agent_flag=1; + mib_curr_node->curr_instance=0; + } + else + printf("Error : The debug SNMP Agent buffer is not start from 0,while getting all instance\r\n"); + } + else if(mib_curr_node->total_instance==snmp_agent_packet.total_instance && mib_curr_node->total_instancecurr_instance=0; + bind_num=mib_curr_node->total_instance; + snmp_agent_flag=1; + } + else + printf("Error : The debug SNMP Agent buffer is not start from 0,while getting all instance\r\n"); + } + else + { + bind_num=1; + snmp_agent_flag=1; + mib_curr_node->curr_instance=snmp_agent_packet.oid[snmp_agent_packet.oid_len-1]; + } + debug_get_all_value=mib_curr_node->total_child_nodes; + + //set the ip + if(snmp_agent_packet.total_ip) + { + for(i=0;i<16;i++) + { + Set_IP[i]=0; + IP_Selected[i]=0; + Peer_IP[i]=0; + } + ip_num=0; + for(m=0;m15) + break; + } + for(i=0;i<=ip_num;i++) + { + Peer_IP[i]=Set_IP[i]; + IP_Selected[i]=1; + } + for(ip_index=0;ip_index<16;ip_index++) + { + if(IP_Selected[ip_index] != 1) + continue; + send_addr.remote_ip = Peer_IP[ip_index]; + break; + } + if(ip_index>=16) + { + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=4; + mib_curr_node=agent_tmp_node; + return ; + } + } + else + debug_mmi_find_host(""); + + + +bind_set: + send_msgbuf.pdu_type = 0; + send_msgbuf.request_id = 0; + send_msgbuf.var_num = bind_num; + for(j=0;joid[i]; + send_msgbuf.var[j].oid[mib_curr_node->oid_len] = (DWORD)mib_curr_node->curr_instance+j; + send_msgbuf.var[j].oidlen = mib_curr_node->oid_len + 1; + } + + send_addr.local_ip = Local_IP; + send_addr.remote_port = SNMP_PORT; + send_addr.local_port = DEBUG_SNMP_PORT; + send_addr.broadcast = 0; + + recv_msgbuf.pdu_type = 2; + recv_msgbuf.request_id = 0; + recv_msgbuf.var_num = bind_num; + for(j=0;joid[i]; + recv_msgbuf.var[j].oid[mib_curr_node->oid_len] = (DWORD)mib_curr_node->curr_instance+j; + recv_msgbuf.var[j].oidlen = mib_curr_node->oid_len + 1; + for(i=0; i<256; i++) + recv_msgbuf.var[j].msg[i] = 0; + } + + recv_addr.remote_ip = send_addr.remote_ip; + recv_addr.local_ip = Local_IP; + recv_addr.remote_port = SNMP_PORT; + recv_addr.local_port = DEBUG_SNMP_PORT; + recv_addr.broadcast = 0; + + get_state = 1; + debug_cfg_end = 0; + if(bind_num!=MAX_PACKET_NUM) + debug_snmp_agent_buf[debug_agent_index].cmm_state=3; + else + for(i=0;itotal_instance)) + { + debug_ascii_out_proc("Fail : There is no instance for the current object\r\n"); + debug_cfg_end=1; + return 0; + } + + if (mib_curr_node->max_access == 0) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : This leaf node's MAX-ACCESS property is 'INVALID'. Can not get its value.\r\n"); + debug_cfg_end=1; + return 0; + } + if (mib_curr_node->max_access == 1) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : This leaf node's MAX-ACCESS property is 'NOT-ACCESSIBLE'. Can not get its value.\r\n"); + debug_cfg_end=1; + return 0; + } + if (mib_curr_node->max_access == 6 && snmp_agent_flag==0) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : This leaf node's MAX-ACCESS property is 'WRITE-ONLY'. Can not get its value.\r\n"); + debug_cfg_end=1; + return 0; + } + + if(mib_curr_node->total_child_nodes == 0) + { + strcpy(paraname, mib_curr_node->name); + } + else + { + debug_get_all_value = mib_curr_node->total_child_nodes; + if(mib_curr_node->total_child_nodes==1) + param_node = mib_curr_node->child_nodes[0]->child_ptr; + } + + if( (toupper(temp_str[0]) == 'R') && (toupper(temp_str[1]) == 'E') && (toupper(temp_str[2]) == 'S') && (toupper(temp_str[3]) == 'E') && (toupper(temp_str[4]) == 'R') && (toupper(temp_str[5]) == 'V') && (toupper(temp_str[6]) == 'E') && (toupper(temp_str[7]) == 'D') && (toupper(temp_str[8]) == '\0') ) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : This node is Reserved. Can not get its value.\r\n"); + return 0; + } + + //if(print_once==0 && field_compute_state==5) + // print_once=2; + + + send_msgbuf.pdu_type = 0; + send_msgbuf.request_id = 0; + send_msgbuf.var_num = 1; + for(i=0; i<32; i++) + send_msgbuf.var[0].oid[i] = mib_curr_node->oid[i]; + send_msgbuf.var[0].oid[mib_curr_node->oid_len] = (DWORD)mib_curr_node->curr_instance; + send_msgbuf.var[0].oidlen = mib_curr_node->oid_len + 1; + + for(i=0;ip_index=16) + { + debug_ascii_out_proc("Fail : There is not host ip available.\r\n"); + return 0; + } + send_addr.local_ip = Local_IP; + send_addr.remote_port = SNMP_PORT; + send_addr.local_port = DEBUG_SNMP_PORT; + send_addr.broadcast = 0; + + recv_msgbuf.pdu_type = 2; + recv_msgbuf.request_id = 0; + recv_msgbuf.var_num = 1; + for(i=0; i<32; i++) + recv_msgbuf.var[0].oid[i] = mib_curr_node->oid[i]; + recv_msgbuf.var[0].oid[mib_curr_node->oid_len] = (DWORD)mib_curr_node->curr_instance; + recv_msgbuf.var[0].oidlen = mib_curr_node->oid_len + 1; + + for(i=0; i<256; i++) + recv_msgbuf.var[0].msg[i] = 0; + + recv_addr.remote_ip = send_addr.remote_ip; + recv_addr.local_ip = Local_IP; + recv_addr.remote_port = SNMP_PORT; + recv_addr.local_port = DEBUG_SNMP_PORT; + recv_addr.broadcast = 0; + bind_num=1; + + ip_index = 0; + get_state = 1; + debug_cfg_end = 0; + for(i=0;i<256;i++) + { + if(curr_instance_arr[i].eable==1) + break; + } + if(i==256) + none_instance=1; + else + none_instance=0; + if(list_flag==0) + { + get_show_state=1; + //show_snmp_state=1; + show_all_value = 1; + } + + /* + if(show_snmp_state==1) + { + debug_ascii_out_proc("GetStatus:"); + debug_color_out(BRIGHT,CYAN,BLACK,"Waiting..."); + } + //sprintf(out_text, "1 %s = ", temp_str); + //debug_ascii_out_proc(out_text); + */ + return 1; +}// end of debug_mmi_get_all + + +/* +* +* Fun: debug_mmi_get +* +* Desc: handle the get command, if valid, start the debug_snmp_get_rt +* +* Ret: return 1 if successful, return 0 if fail +* +* File: debug.c +* +*/ +int debug_mmi_get(char *child_name) +{ + int i,ins; + WORD child_index; + mib_child_node *child_node_ptr; + char out_text[256], temp_str[256]; + char *p,str_ins_id[32]; + WORD oid=0; + + if (!(mib_curr_node->total_instance)) + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : There is no instance for the current object\r\n"); + debug_cfg_end=1; + return 0; + } + if (!mib_curr_node->total_child_nodes) + { + debug_cfg_end=1; + debug_color_out(BRIGHT,RED,BLACK,"Fail : No child object for the current object\r\n"); + return 0; + } + + if (mib_curr_node->max_access == 0) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : This leaf node's MAX-ACCESS is 'INVALID'. Can not get its value.\r\n"); + debug_cfg_end=1; + return 0; + } + if (mib_curr_node->max_access == 1) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : This leaf node's MAX-ACCESS is 'NOT-ACCESSIBLE'. Can not get its value.\r\n"); + debug_cfg_end=1; + return 0; + } + if (mib_curr_node->max_access == 6 && snmp_agent_flag==0) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : This leaf node's MAX-ACCESS is 'WRITE-ONLY'. Can not get its value.\r\n"); + debug_cfg_end=1; + return 0; + } + for(i=0;i!=strlen(child_name);i++) + { + if(*(child_name+i)!=' ') + break; + } + p=child_name+i; + strcpy(child_name,p); + if(child_name[0]=='#')//get # + { + p=child_name+1; + strcpy(child_name,p); + for(i=0;icurr_instance; + if(ins>mib_curr_node->total_instance-1) + { + sprintf(temp_str,"Error : The max instance id is %d\r\n",mib_curr_node->total_instance-1); + debug_color_out(BRIGHT,RED,BLACK,temp_str); + return 0; + } + mib_curr_node->curr_instance=ins; + if(i==strlen(child_name)) //#3 + { + debug_get_all_value= mib_curr_node->total_child_nodes; + } + else + { + p=child_name+i+1; + strcpy(child_name,p); + if (isdigit(child_name[0])) //#3.2 + { + oid = strtoul(child_name, NULL, 10); + if(oid>0) + { + oid--; + child_index = find_child_index(mib_curr_node, oid, NULL, 0); + } + else + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : There is no such child.\n"); + return 0; + } + } + else //#3.ENABLE + child_index = find_child_index(mib_curr_node, 0, child_name, 1); + + if (child_index < MIB_MAX_CHILD_NODES_PER_NODE) + { + child_node_ptr = mib_curr_node->child_nodes[child_index]; + if (!child_node_ptr->child_ptr) + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : No such child object for the current object\r\n"); + return 0; + } + debug_get_all_value= 301; + param_node = (mib_node_param *)child_node_ptr->child_ptr; + } + else + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : There is no such child.\n"); + return 0; + } + strcpy(temp_str, param_node->name); + if( (toupper(temp_str[0]) == 'R') && (toupper(temp_str[1]) == 'E') && (toupper(temp_str[2]) == 'S') && (toupper(temp_str[3]) == 'E') && (toupper(temp_str[4]) == 'R') && (toupper(temp_str[5]) == 'V') && (toupper(temp_str[6]) == 'E') && (toupper(temp_str[7]) == 'D') && (toupper(temp_str[8]) == '\0') ) + { + sprintf(out_text, "Error : %s is Reserved. Can not get its value.\r\n", param_node->name); + debug_color_out(BRIGHT,RED,BLACK,out_text); + return 0; + } + } + } + else if(child_name[0]=='*' && child_name[1]=='\0') //get * + { + debug_mmi_get_all(); + return 1; + } + else if(strncmp(child_name,"*.",2)==0) //get *. + { + p=child_name+2; + strcpy(child_name,p); + + if (isdigit(child_name[0])) + { + oid = strtoul(child_name, NULL, 10); + if(oid>0) + { + oid--; + child_index = find_child_index(mib_curr_node, oid, NULL, 0); + } + else + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : No such child object for the current object\r\n"); + return 0; + } + } + else + child_index = find_child_index(mib_curr_node, 0, child_name, 1); + + if (child_index < MIB_MAX_CHILD_NODES_PER_NODE) + { + child_node_ptr = mib_curr_node->child_nodes[child_index]; + if (!child_node_ptr->child_ptr) + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : No such child object for the current object\r\n"); + return 0; + } + debug_get_all_value= 301; + param_node = (mib_node_param *)child_node_ptr->child_ptr; + } + else + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : There is no such child.\n"); + return 0; + } + strcpy(temp_str, param_node->name); + if( (toupper(temp_str[0]) == 'R') && (toupper(temp_str[1]) == 'E') && (toupper(temp_str[2]) == 'S') && (toupper(temp_str[3]) == 'E') && (toupper(temp_str[4]) == 'R') && (toupper(temp_str[5]) == 'V') && (toupper(temp_str[6]) == 'E') && (toupper(temp_str[7]) == 'D') && (toupper(temp_str[8]) == '\0') ) + { + sprintf(out_text, "Error : %s is Reserved. Can not get its value.\r\n", param_node->name); + debug_color_out(BRIGHT,RED,BLACK,out_text); + return 0; + } + } + /* + if(debug_get_all_value==mib_curr_node->total_child_nodes) + if(print_once==0 && field_compute_state==5) + print_once=2; + */ + + send_msgbuf.pdu_type = 0; + send_msgbuf.request_id = 0; + send_msgbuf.var_num = 1; + for(i=0; i<32; i++) + send_msgbuf.var[0].oid[i] = mib_curr_node->oid[i]; + send_msgbuf.var[0].oid[mib_curr_node->oid_len] = (DWORD)mib_curr_node->curr_instance; + send_msgbuf.var[0].oidlen = mib_curr_node->oid_len + 1; + + for(ip_index=0;ip_index<16;ip_index++) + { + if(IP_Selected[ip_index] != 1) + continue; + send_addr.remote_ip = Peer_IP[ip_index]; + break; + } + if(ip_index>=16) + { + debug_ascii_out_proc("Fail : There is not host ip available.\r\n"); + return 0; + } + send_addr.local_ip = Local_IP; + send_addr.remote_port = SNMP_PORT; + send_addr.local_port = DEBUG_SNMP_PORT; + send_addr.broadcast = 0; + + recv_msgbuf.pdu_type = 2; + recv_msgbuf.request_id = 0; + recv_msgbuf.var_num = 1; + for(i=0; i<32; i++) + recv_msgbuf.var[0].oid[i] = mib_curr_node->oid[i]; + recv_msgbuf.var[0].oid[mib_curr_node->oid_len] = (DWORD)mib_curr_node->curr_instance; + recv_msgbuf.var[0].oidlen = mib_curr_node->oid_len + 1; + + for(i=0; i<256; i++) + recv_msgbuf.var[0].msg[i] = 0; + + recv_addr.remote_ip = send_addr.remote_ip; + recv_addr.local_ip = Local_IP; + recv_addr.remote_port = SNMP_PORT; + recv_addr.local_port = DEBUG_SNMP_PORT; + recv_addr.broadcast = 0; + bind_num=1; + + get_state = 1; + debug_cfg_end = 0; + for(i=0;i<256;i++) + { + if(curr_instance_arr[i].eable==1) + break; + } + if(i==256) + none_instance=1; + else + none_instance=0; + if(list_flag==0) + { + get_show_state=1; + //if(contents_state!=0) + // show_snmp_state=1; + show_all_value = 1; + } + /*if(show_snmp_state==1) + { + debug_ascii_out_proc("GetStatus:"); + debug_color_out(BRIGHT,CYAN,BLACK,"Waiting..."); + }*/ + // strcpy(paraname,child_node_ptr->name); + + return 1; +} // end of deubg_mmi_get + +/* +* +* Fun: debug_mmi_set +* +* Desc: handle the set command, if valid, full fill the value and start the debug_snmp_set_rt +* +* Ret: return 1 if successful, return 0 if fail +* +* File: debug.c +* +*/ +int debug_mmi_set(char *set_str) +{ + int i, j, k, ins; + BYTE str_len; + WORD child_index; + WORD oid=0; + mib_child_node *child_node_ptr; + char child_name[80], out_text[256], *temp_ch; + char str_ins_id[10]; + char p,q; + if(save_flag==0) + save_flag=1; + + if(strlen(set_str)>80) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : the string is too long !\r\n"); + return 0; + } + + strcpy(child_name, set_str); + for(i=0;i!=strlen(child_name);i++) + { + if(*(child_name+i)!=' ') + break; + } + if(*(child_name+i)=='\0') //set + { + strcpy(set_ins_value, curr_instance_value); + temp_instance=mib_curr_node->curr_instance; + strcpy(child_name,""); + set_all=1; + } + temp_ch=child_name+i; + strcpy(child_name,temp_ch); + if(child_name[0]=='#')//set # + { + temp_ch=child_name+1; + strcpy(child_name,temp_ch); + for(i=0;imib_curr_node->total_instance-1) + { + sprintf(out_text,"Error : The max instance id is %d\r\n",mib_curr_node->total_instance-1); + debug_color_out(BRIGHT,RED,BLACK,out_text); + return 0; + } + temp_instance=mib_curr_node->curr_instance; + mib_curr_node->curr_instance=ins; + + if(*(child_name+i)=='\0') //set #3 + { + //debug_get_all_value= mib_curr_node->total_child_nodes; + /* if(mib_curr_node->enable_field_id==0xFF) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : Please input the value !\r\n"); + return 0; + } + */ + + + strcpy(set_ins_value, curr_instance_value); + strcpy(child_name,""); + set_all=1; + } + else if(*(child_name+i)=='=')//#3= + { + if(mib_curr_node->total_child_nodes==1) + { + temp_ch=child_name+i+1; + strcpy(out_text,"1="); + strcat(out_text,temp_ch); + strcpy(child_name,out_text); + strcpy(set_ins_value,""); + } + else + { + temp_ch=child_name+i+1; + if(temp_ch!=NULL) + { + strcpy(child_name,temp_ch); + for(i=0;icurr_instance; + if(child_name[1]=='\0') //* + { + /* + if(mib_curr_node->enable_field_id==0xFF) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : Please input the value !\r\n"); + return 0 ; + } + */ + strcpy(set_ins_value, curr_instance_value); + strcpy(child_name,""); + set_all=1; + } + else if(child_name[1]=='=') //*= + { + if(mib_curr_node->total_child_nodes==1 && save_flag<3) + { + temp_ch=child_name+2; + strcpy(out_text,"1="); + strcat(out_text,temp_ch); + strcpy(child_name,out_text); + strcpy(set_ins_value,""); + } + else + { + if(child_name[2]!='\0') + temp_ch=child_name+2; + strcpy(child_name,temp_ch); + for(i=0;i=48 ))&& (!(*(set_ins_value+i)<=70 && *(set_ins_value+i)>=65)) && (!(*(set_ins_value+i)>=97 && *(set_ins_value+i)<=102))) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : please input 0-9 or a-f or A-F\r\n"); + return 0; + } + else if(isdigit(*(set_ins_value+i))) + { + out_text[i]=*(set_ins_value+i)-48; + } + else if((*(set_ins_value+i)<=70 && *(set_ins_value+i)>=65))//A-F + { + out_text[i]=*(set_ins_value+i)-55; + } + else if((*(set_ins_value+i)>=97 && *(set_ins_value+i)<=102))//a-f + { + out_text[i]=*(set_ins_value+i)-87; + } + } + //strncpy(set_ins_value,out_text,set_str_len); + i=0; + j=0; + k=0; + while(itotal_instance)) + { + debug_ascii_out_proc("Fail : There is no instance for the current object\r\n"); + return 0; + } + + if (!(str_len = strlen(child_name))) + { + debug_ascii_out_proc("Fail : No child name in the set command.\r\n"); + return 0; + } + + if (!mib_curr_node->total_child_nodes) + { + debug_ascii_out_proc("Fail : No child object for the current object\r\n"); + return 0; + } + + if (mib_curr_node->max_access == 0) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : This leaf node's MAX-ACCESS property is 'INVALID'. Can not set its value.\r\n"); + return 0; + } + if (mib_curr_node->max_access == 1) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : This leaf node's MAX-ACCESS property is 'NOT-ACCESSIBLE'. Can not set its value.\r\n"); + return 0; + } + if (mib_curr_node->max_access == 3) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : This leaf node's MAX-ACCESS property is 'READ-ONLY'. Can not set its value.\r\n"); + return 0; + } + + child_name[str_len] = '\0'; + + if (isdigit(child_name[0])) + { + oid = strtoul(child_name, NULL, 10)-1; + child_index = find_child_index(mib_curr_node, oid, NULL, 0); + } + else + child_index = find_child_index(mib_curr_node, 0, child_name, 1); + + if (child_index < MIB_MAX_CHILD_NODES_PER_NODE) + { + child_node_ptr = mib_curr_node->child_nodes[child_index]; + if (!child_node_ptr->child_ptr) + { + debug_ascii_out_proc("Fail : No such child object for the current object\r\n"); + return 0; + } + param_node = (mib_node_param *)child_node_ptr->child_ptr; + if(param_node->select_total != 0) //\u5224\u65AD\u8F93\u5165\u7684\u6570\u503C\u662F\u5426\u6709\u6548\uFF0C\u662F\u5426\u5B58\u5728\u8BE5\u6570\u503C\u4EE3\u8868\u7684select\u9009\u9879 + { + if(set_val == -1) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : The select option value must be digit or a-f.\r\n"); + return 0; + } + + for(i=0; iselect_total; i++) + { + if(param_node->select_ptr[i]->number == set_val) + break; + } + if(i >= param_node->select_total) + { + sprintf( out_text, "Fail : The value %ld is not exist in the select options:\r\n", set_val); + debug_color_out(BRIGHT,RED,BLACK,out_text); + sprintf(out_text,"%d",param_node->id+1); + debug_mmi_option(out_text); + return 0; + } + } + if(param_node->input_ptr != NULL) + { + switch(param_node->input_ptr->input_param_type) + { + case 0: //toDec_high_0 //\u5224\u65AD\u8F93\u5165\u7684\u6570\u503C\u662F\u5426\u6709\u6548 + j = strlen(set_val_str); + for(i=0; i(param_node->byte_end-param_node->byte_begin+(param_node->bit_end-param_node->bit_begin+1)/8)) + { + sprintf( out_text, "Error : The value must be less than %d byte!\r\n",(param_node->byte_end-param_node->byte_begin+(param_node->bit_end-param_node->bit_begin+1)/8)); + debug_ascii_out_proc(out_text); + return 0; + } + */ + j =(param_node->byte_end * 8 + 1 + param_node->bit_end) - (param_node->byte_begin * 8 - param_node->bit_begin); + set_val = atol(set_val_str); + if(set_val > my_pow(2, j)) + { + sprintf( out_text, "Error : The value must be less than %ld.\r\n", (my_pow(2,j)-1) ); + debug_ascii_out_proc(out_text); + return 0; + } + } + break; + case 1: //keepHex_high_0 //\u5224\u65AD\u8F93\u5165\u7684\u6570\u503C\u5B57\u7B26\u4E32set_val_str\u662F\u5426\u6709\u6548, \u5982\u679C\u6709\u6548\u5219\u5C06\u9AD8\u4F4D\u8865\u6210\u5B57\u7B26'0'\uFF0C\u8865\u8DB3\u4F4D\u6570 + j = strlen(set_val_str); + for(i=0; i= 'A') && (set_val_str[i] <= 'F')) //is A to F + continue; + break; + } + if(ibyte_end * 8 + 1 + param_node->bit_end) - (param_node->byte_begin * 8 - param_node->bit_begin) )/4; + if(j > i) //\u5B57\u7B26\u4E32\u957F\u5EA6\u5927\u4E8E\u6240\u80FD\u5B58\u50A8\u7684\u4F4D\u6570\uFF0C\u5219\u63D0\u793A\u5E76\u9000\u51FA + { + sprintf(out_text, "Error : The length of the value string must be less than %d.\r\n", i); + debug_ascii_out_proc(out_text); + return 0; + } + + //\u8F93\u5165\u6709\u6548\uFF0C\u5219\u5C06\u9AD8\u4F4D\u8865\u6210'0' + k = i-j; + for(j=i-1; (j-k)>=0 && j!=0; j--) + set_val_str[j]=set_val_str[j-k]; + set_val_str[i] = '\0'; + for(j=0; j= 'A') && (set_val_str[i] <= 'F')) //is A to F + continue; + break; + } + if(ibyte_end * 8 + 1 + param_node->bit_end) - (param_node->byte_begin * 8 - param_node->bit_begin) )/4; + if(j > i) //\u5B57\u7B26\u4E32\u957F\u5EA6\u5927\u4E8E\u6240\u80FD\u5B58\u50A8\u7684\u4F4D\u6570\uFF0C\u5219\u63D0\u793A\u5E76\u9000\u51FA + { + sprintf(out_text, "The length of the value string must be less than %d.\r\nFAIL\r\n", i); + debug_ascii_out_proc(out_text); + return 0; + } + + //\u8F93\u5165\u6709\u6548\uFF0C\u5219\u5C06\u4F4E\u4F4D\u8865\u6210'0' + for(; j= 'A') && (set_val_str[i] < 'E')) //is A to D + continue; + break; + } + if(ibyte_end * 8 + 1 + param_node->bit_end) - (param_node->byte_begin * 8 - param_node->bit_begin) )/4; + if(j > i) //\u5B57\u7B26\u4E32\u957F\u5EA6\u5927\u4E8E\u6240\u80FD\u5B58\u50A8\u7684\u4F4D\u6570\uFF0C\u5219\u63D0\u793A\u5E76\u9000\u51FA + { + sprintf(out_text, "The length of the value string must be less than %d.\r\nFail\r\n", i); + debug_ascii_out_proc(out_text); + return 0; + } + + //\u8F93\u5165\u6709\u6548\uFF0C\u5219\u5C06\u4F4E\u4F4D\u8865\u6210E + for(; j= 'A') && (set_val_str[i] < 'F')) //is A to E + continue; + break; + } + if(ibyte_end * 8 + 1 + param_node->bit_end) - (param_node->byte_begin * 8 - param_node->bit_begin) )/4; + if(j > i) //\u5B57\u7B26\u4E32\u957F\u5EA6\u5927\u4E8E\u6240\u80FD\u5B58\u50A8\u7684\u4F4D\u6570\uFF0C\u5219\u63D0\u793A\u5E76\u9000\u51FA + { + sprintf(out_text, "The length of the value string must be less than %d.\r\nFAIL\r\n", i); + debug_ascii_out_proc(out_text); + return 0; + } + + //\u8F93\u5165\u6709\u6548\uFF0C\u5219\u5C06\u4F4E\u4F4D\u8865\u6210'F' + for(; jbyte_end * 8 + 1 + param_node->bit_end) - (param_node->byte_begin * 8 - param_node->bit_begin) )/8; + if(j > i) //\u5B57\u7B26\u4E32\u957F\u5EA6\u5927\u4E8E\u6240\u80FD\u5B58\u50A8\u7684\u4F4D\u6570\uFF0C\u5219\u63D0\u793A\u5E76\u9000\u51FA + { + sprintf(out_text, "The length of the AscII string must be less than %d.\r\nFAIL\r\n", i); + debug_ascii_out_proc(out_text); + return 0; + } + + //\u8F93\u5165\u6709\u6548\uFF0C\u5219\u5C06\u4F4E\u4F4D\u8865\u6210'0' + for(; jbyte_end * 8 + 1 + param_node->bit_end) - (param_node->byte_begin * 8 - param_node->bit_begin) )/8; + if(j > i) //\u5B57\u7B26\u4E32\u957F\u5EA6\u5927\u4E8E\u6240\u80FD\u5B58\u50A8\u7684\u4F4D\u6570\uFF0C\u5219\u63D0\u793A\u5E76\u9000\u51FA + { + sprintf(out_text, "The length of the AscII string must be less than %d.\r\nFAIL\r\n", i); + debug_ascii_out_proc(out_text); + return 0; + } + + //\u8F93\u5165\u6709\u6548\uFF0C\u5219\u5C06\u4F4E\u4F4D\u8865\u6210'F' + for(; jsys_group==9) + for(i=0;ioid[i]; + send_msgbuf.var[0].oid[mib_curr_node->oid_len] = (DWORD)mib_curr_node->curr_instance; + send_msgbuf.var[0].oidlen = mib_curr_node->oid_len + 1; + + for(i=0;i<16;i++) + { + if(IP_Selected[i] != 1) + continue; + send_addr.remote_ip = Peer_IP[i]; + break; + } + if(i>=16) + { + debug_ascii_out_proc("There is not host ip available.\r\n"); + return 0; + } + + + send_addr.local_ip = Local_IP; + send_addr.remote_port = SNMP_PORT; + send_addr.local_port = DEBUG_SNMP_PORT; + send_addr.broadcast = 0; + + recv_msgbuf.pdu_type = 2; + recv_msgbuf.request_id = 0; + recv_msgbuf.var_num = 1; + for(i=0; i<32; i++) + recv_msgbuf.var[0].oid[i] = mib_curr_node->oid[i]; + recv_msgbuf.var[mib_curr_node->oid_len].oid[i] = (DWORD)mib_curr_node->curr_instance; + recv_msgbuf.var[0].oidlen = mib_curr_node->oid_len + 1; + + for(i=0; i<256; i++) + recv_msgbuf.var[0].msg[i] = 0; + + recv_addr.remote_ip = send_addr.remote_ip; + recv_addr.local_ip = Local_IP; + recv_addr.remote_port = SNMP_PORT; + recv_addr.local_port = DEBUG_SNMP_PORT; + recv_addr.broadcast = 0; + + ip_index = 0; + set_state = 1; + debug_cfg_end = 0; + + return 1; +} // end of debug_mmi_set + + + +/* +* +* Fun: debug_snmp_get_rt +* +* Desc: get the mib_node's value from the host by snmp, then analyze and show the value of its field's value +* +* Ret: RVOID +* +* Notes: Wang Jian add +* +* File debug.c +* +*/ +void debug_snmp_get_rt() +{ + int request_id=0, index,i; + char out_text[256]=""; + BYTE value_valid; + char type_str[31]; + char out_text1[128]; + char temp_str[32]; + char out_ins_text[256]; + BYTE ins_byte,field_id; + BYTE ins_bit; + BYTE byte,bit; + WORD curr_select_id; + mib_child_node *child_node_ptr; + param_field *tmp_param_field; + + + + + switch(get_state) + { + case 0: //idle + break; + case 1: //send local get request to local host + t5s_flag=0; + + if (mib_curr_node->max_access == 0) + { + //debug_color_out(BRIGHT,RED,BLACK,"Error : This leaf node's MAX-ACCESS is 'INVALID'. Can not get its value.\r\n"); + get_state=0; + debug_cfg_end=1; + return ; + } + if (mib_curr_node->max_access == 1) + { + //debug_color_out(BRIGHT,RED,BLACK,"Error : This leaf node's MAX-ACCESS is 'NOT-ACCESSIBLE'. Can not get its value.\r\n"); + get_state=0; + debug_cfg_end=1; + return ; + } + if (mib_curr_node->max_access == 6 && snmp_agent_flag==0) + { + //debug_color_out(BRIGHT,RED,BLACK,"Error : This leaf node's MAX-ACCESS is 'WRITE-ONLY'. Can not get its value.\r\n"); + get_state=0; + debug_cfg_end=1; + return ; + } + for(ip_index=0;ip_index=ip_num) + { + if(snmp_agent_flag==0) + debug_color_out(BRIGHT,RED,BLACK,"Fail : Can not get the value because there is not host ip available.\r\n"); + else + { + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=4; + mib_curr_node=agent_tmp_node; + } + ip_index = 0; + snmp_agent_flag=0; + debug_cfg_end = 1; + get_state = 0; + snmp_agent_flag=0; + debug_get_all_value = 0; + break; + } + + request_id = snmp_send(&send_msgbuf, &send_addr); + if(request_id == 0) + { + if(snmp_agent_flag==0) + { + sprintf(out_text, "Error : Fail to send snmp get request to the host: %s %s\r\n", Remote_Host_Name[ip_index], Remote_Host_IP[ip_index]); + debug_ascii_out_proc(out_text); + } + else + { + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=9; + mib_curr_node=agent_tmp_node; + } + ip_index = 0; + snmp_agent_flag=0; + debug_cfg_end = 1; + get_state = 0; + snmp_agent_flag=0; + debug_get_all_value = 0; + } + else + { + recv_msgbuf.pdu_type = 2; + recv_msgbuf.request_id = request_id; + recv_addr.remote_ip = send_addr.remote_ip; + get_state = 2; + } + break; + case 2: //receive local get response + request_id = snmp_receive(&recv_msgbuf, &recv_addr); + if(request_id == 0) // not received + { + if(t5s_flag > 250) + { + if(snmp_agent_flag==0) + { + //if(list_once==1) + { + if(list_once==0) + { + mib_node_param *node_param_ptr; + debug_ascii_out_proc("Child : "); + sprintf(out_text, "[%d]\r\n",mib_curr_node->total_child_nodes); + debug_color_out(BRIGHT,YELLOW,BLACK,out_text); + for (i = 0; i < mib_curr_node->total_child_nodes; i++) + { + child_node_ptr = mib_curr_node->child_nodes[i]; + node_param_ptr=(mib_node_param *)child_node_ptr->child_ptr; + sprintf(out_text, " |---(%ld) %s\r\n",child_node_ptr->oid+1, node_param_ptr->name); + debug_color_out(BRIGHT,YELLOW,BLACK,out_text); + } + } + sprintf(out_text, "Fail : Time out! Check the connection to Host:%s(%s)\r\n",Remote_Host_Name[ip_index], Remote_Host_IP[ip_index]); + debug_ascii_out_proc(out_text); + } + + } + else + { + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=1; + mib_curr_node=agent_tmp_node; + } + ip_index=0; + list_flag=0; + snmp_agent_flag=0; + list_start=list_end=0; + get_show_state=0; + debug_cfg_end = 1; + get_state = 0; + snmp_agent_flag=0; + debug_get_all_value = 0; + break; + } + else + break; + } + debug_cfg_end = 0; + get_state = 3; + break; + case 3: // received + //for look + if(snmp_agent_flag==0) + { + if(recv_msgbuf.error_status != 0) + { + //sprintf(out_text, "Fail : get value from the host: %s[%s]",Remote_Host_Name[ip_index], Remote_Host_IP[ip_index]); + switch(recv_msgbuf.error_status) + { + case 1: + strcat(out_text,"Error : TooBig\r\n"); + break; + case 5: + strcat(out_text,"Error : GenErr\r\n"); + break; + case 6: + strcat(out_text,"Error : NoAccessl\r\n"); + break; + case 7: + strcat(out_text,"Error : WrongType\r\n"); + break; + case 8: + strcat(out_text,"Error : WrongLength\r\n"); + break; + case 9: + strcat(out_text,"Error : WrongEncoding\r\n"); + break; + case 10: + strcat(out_text,"Error : WrongValue\r\n"); + break; + case 11: + strcat(out_text,"Error : NoCreation\r\n"); + break; + case 12: + strcat(out_text,"Error : inconsistentValue\r\n"); + break; + case 13: + strcat(out_text,"Error : resourceUnavailable\r\n"); + break; + case 14: + strcat(out_text,"Error : commitFailed\r\n"); + break; + case 15: + strcat(out_text,"Error : UndoFailed\r\n"); + break; + case 16: + strcat(out_text,"Error : AuthorizationError\r\n"); + break; + case 17: + strcat(out_text,"Error : NoWritable\r\n"); + break; + case 18: + strcat(out_text,"Error : inconsistentName\r\n"); + break; + default: + break; + } + if(snmp_agent_flag==0) + debug_color_out(BRIGHT,RED,BLACK,out_text); + ip_index=0; + snmp_agent_flag=0; + debug_cfg_end = 1; + get_state = 0; + snmp_agent_flag=0; + debug_get_all_value = 0; + break; + } + strcpy(out_ins_text,""); + if(get_show_state==1) + { + show_all_value=1; + show_type=0; + show_expend=1; + show_range=0; + } + } + + while(bind_indexname); + TxtColor(BRIGHT,YELLOW,BLACK,out_text1); + strcat(out_ins_text,out_text1); + if(!(none_instance==1 || show_empty==1)) + sprintf(out_text1,"#%-3d ",mib_curr_node->curr_instance+bind_index); + else + strcpy(out_text1,""); + + if(mib_curr_node->total_child_nodes>1 || show_expend==0) + strcat(out_text1,"\r\n"); + strcat(out_ins_text,out_text1); + + show_list=1; + } + + if(show_all_value==0 ) + { + if(mib_curr_node->total_child_nodes==1) + { + param_node=mib_curr_node->child_nodes[0]->child_ptr; + if(param_node!=NULL) + { + if(param_node->input_ptr!=NULL) + { + if(param_node->input_ptr->input_param_type==0) + index=1; + else + index=strncmp(mib_curr_node->init_value,recv_msgbuf.var[bind_index].msg,mib_curr_node->data_length); + } + } + } + else + index=strncmp(mib_curr_node->init_value,recv_msgbuf.var[bind_index].msg,mib_curr_node->data_length); + + if(mib_curr_node->enable_field_id!=0xFF) + { + param_node = mib_curr_node->child_nodes[mib_curr_node->enable_field_id]->child_ptr; + if(param_node->byte_begin==param_node->byte_end && param_node->bit_begin ==param_node->bit_end) + { + ins_byte=param_node->byte_begin; + ins_bit=param_node->bit_begin ; + if(recv_msgbuf.var[bind_index].msg[ins_byte] & (BYTE)my_pow(2,ins_bit)) + index=1; + else + index=0; + } + } + if(index) + { + byte=(mib_curr_node->curr_instance+bind_index)/8; + bit=(mib_curr_node->curr_instance+bind_index)%8; + mib_curr_node->enable_flag[byte]=mib_curr_node->enable_flag[byte] | (BYTE)my_pow(2,bit); + curr_instance_arr[mib_curr_node->curr_instance+bind_index].ins=mib_curr_node->curr_instance+bind_index; + curr_instance_arr[mib_curr_node->curr_instance+bind_index].eable=1; + } + else + { + byte=(mib_curr_node->curr_instance+bind_index)/8; + bit=(mib_curr_node->curr_instance+bind_index)%8; + mib_curr_node->enable_flag[byte]=mib_curr_node->enable_flag[byte] & (~(BYTE)my_pow(2,bit)); + curr_instance_arr[mib_curr_node->curr_instance+bind_index].ins=mib_curr_node->curr_instance+bind_index; + curr_instance_arr[mib_curr_node->curr_instance+bind_index].eable=0; + } + } + } + if(((bind_num==1 && debug_snmp_agent_buf[debug_agent_index].cmm_state==3 )|| (debug_snmp_agent_buf[bind_index].cmm_state ==3 && bind_num!=1)) && snmp_agent_flag==1) + { + show_list=1; + show_all_value=1; + show_expend=1; + debug_get_all_value=mib_curr_node->total_child_nodes; + } + + + if(show_list==1) + { + if(index!=0 || show_all_value==1) + { + if(snmp_agent_flag==0 && field_compute_state!=4) + debug_ascii_out_proc(out_ins_text); + if(show_expend==1) + { + + while(debug_get_all_value != 0 ) + { + debug_cfg_end = 0; + get_state = 3; + if(debug_get_all_value!=301) + { + param_node = mib_curr_node->child_nodes[mib_curr_node->total_child_nodes - debug_get_all_value]->child_ptr; + if(snmp_agent_flag==0) + if(show_field==1) + { + for(i=0;list_field_arr[i]!=0xFF && i<64;i++) + { + if(list_field_arr[i]==mib_curr_node->total_child_nodes - debug_get_all_value+1) + { + break; + } + } + if( list_field_arr[i]==0xFF || i==64) + { + debug_get_all_value--; + continue; + } + else if(list_field_arr[i]==mib_curr_node->total_child_nodes - debug_get_all_value+1) + { + ; + } + } + } + if(param_node == NULL) + {// not error but mib_curr_node has no child + int index2, index3; + DWORD sum; + int sub_sum, find_first, byte_begin, byte_end, bit_begin, bit_end; + find_first = 0; + strcpy(out_text, ""); + sub_sum=0; + index3 = 0; + sum = 0; + byte_begin = 0; + byte_end = recv_msgbuf.var[bind_index].msglen - 1; + bit_begin = 0; + bit_end = 7; + strcpy(out_text, "0x"); + for(index=byte_begin; index <= byte_end; index++) + { + if(index == byte_begin) //index--byte index + index2 = bit_begin; + else + index2 = 0; + for(; index2<8; index2++)//index2--bit index + { + if(index3 == 0) + sub_sum = 0; + if((recv_msgbuf.var[bind_index].msg[index] & (BYTE)my_pow(2, index2)) != 0)//get index bit + sub_sum += my_pow(2, index3); + index3++; + if( (index == byte_end) && (index2 == bit_end)) + { + switchchar(out_text,sub_sum & 0xF0); + switchchar(out_text,sub_sum & 0x0F); + } + if(index3==8) + { + switchchar(out_text,sub_sum & 0xF0); + switchchar(out_text,sub_sum & 0x0F); + index3 = 0; + } + } + } + if(strlen(out_text) == 2) + value_valid=0; + strcpy(type_str,"Hex"); + ip_index = 0; + debug_cfg_end = 1; + get_state = 0; + debug_get_all_value = 0; + break; + } + + else if((recv_msgbuf.var[bind_index].vartype == 2) || (recv_msgbuf.var[bind_index].vartype == 4)) //int or string + {// not error but mib_curr_node has children + + char temp_str[16]=""; + int index2, index3; + DWORD sum; + int sub_sum, find_first, index4; + find_first = 0; + strcpy(out_text, ""); + + if(param_node->input_ptr != NULL) + { + switch(param_node->input_ptr->input_param_type) + { + case 0: //toDec_high_0 + index3 = sum = 0; + for(index=param_node->byte_end; index >=param_node->byte_begin; index--) + { + if(index == param_node->byte_begin) + index2 = param_node->bit_begin; + else + index2 = 0; + for(; index2<8; index2++) + { + if((recv_msgbuf.var[bind_index].msg[index] & (BYTE)my_pow(2, index2)) != 0) + sum += my_pow(2, index3); + index3++; + if( (index == param_node->byte_begin) && (((param_node->byte_begin==param_node->byte_end)&& index2 == param_node->bit_end) || ((param_node->byte_begin!=param_node->byte_end)&& index2==7))) + break; + + } + if( (index == param_node->byte_begin) && (((param_node->byte_begin==param_node->byte_end)&& index2 == param_node->bit_end) || ((param_node->byte_begin!=param_node->byte_end)&& index2==7))) + break; + } + sprintf(out_text, "%ld", sum); + strcpy(type_str,"toDec-hight-0"); + break; + case 1: //keepHex_high_0 + sub_sum=0; + index3 = 0; + sum = 0; + strcpy(out_text, ""); + for(index=param_node->byte_begin; index <= param_node->byte_end; index++) + { + if(index == param_node->byte_begin) + index2 = param_node->bit_begin; + else + index2 = 0; + for(; index2<8; index2++) + { + if(index3 == 0) + sub_sum = 0; + if((recv_msgbuf.var[bind_index].msg[index] & (BYTE)my_pow(2, index2)) != 0) + sub_sum += my_pow(2, index3); + index3++; + + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + { + switchchar(out_text,sub_sum & 0xF0); + switchchar(out_text,sub_sum & 0x0F); + if(out_text[strlen(out_text)]=='0') + ; + value_valid=0; + break; + } + if(index3==8) + { + switchchar(out_text,sub_sum & 0xF0); + switchchar(out_text,sub_sum & 0x0F); + index3 = 0; + } + } + } + sprintf(out_text1,"%s ",out_text); + strcpy(out_text,out_text1); + strcpy(type_str,"keepHex-high-0"); + break; + case 2: //keepHex_low_0 + sub_sum=0; + index4=0; + index3 = 0; + sum = 0; + strcpy(out_text, ""); + for(index=param_node->byte_begin; index <= param_node->byte_end ; index++) + { + if(index == param_node->byte_begin) + index2 = param_node->bit_begin; + else + index2 = 0; + for(; index2<8; index2++) + { + if(index3 == 0) + sub_sum = 0; + if((recv_msgbuf.var[bind_index].msg[index] & (BYTE)my_pow(2, index2)) != 0) + sub_sum += my_pow(2, index3); + index3++; + if(index3==8) + { + switchchar(out_text,sub_sum & 0xF0); + if((sub_sum & 0xF0)==0x00 ) + { + out_text[strlen(out_text)-1]='\0'; + find_first = 1; + break; + } + switchchar(out_text,sub_sum & 0x0F); + if((sub_sum & 0x0F)==0x00) + { + out_text[strlen(out_text)-1]='\0'; + find_first = 1; + break; + } + index3 = 0; + } + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + { + switchchar(out_text,sub_sum & 0x00); + if((sub_sum & 0xF0)==0x00 ) + { + if(strlen(out_text) == 1) + value_valid=0; + out_text[strlen(out_text)-1]='\0'; + find_first = 1; + break; + } + switchchar(out_text,sub_sum & 0x0F); + if((sub_sum & 0x0F)==0x00) + { + out_text[strlen(out_text)-1]='\0'; + find_first = 1; + break; + } + index3=0; + } + } + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + break; + if(find_first == 1) + break; + } + strcpy(type_str,"keepHex-low-0"); + break; + case 3: //keepHex_low_E + sub_sum=0; + index4=0; + index3 = 0; + sum = 0; + strcpy(out_text, ""); + for(index=param_node->byte_begin; index <= param_node->byte_end ; index++) + { + if(index == param_node->byte_begin) + index2 = param_node->bit_begin; + else + index2 = 0; + for(; index2<8; index2++) + { + if(index3 == 0) + sub_sum = 0; + if((recv_msgbuf.var[bind_index].msg[index] & (BYTE)my_pow(2, index2)) != 0) + sub_sum += my_pow(2, index3); + index3++; + if(index3==8) + { + switchchar(out_text,sub_sum & 0xF0); + if((sub_sum & 0xF0)==0xE0 ) + { + if(strlen(out_text) == 1) + value_valid=0; + out_text[strlen(out_text)-1]='\0'; + + find_first = 1; + break; + } + switchchar(out_text,sub_sum & 0x0F); + if((sub_sum & 0x0F)==0x0E) + { + out_text[strlen(out_text)-1]='\0'; + find_first = 1; + break; + } + index3 = 0; + } + if( (index == param_node->byte_end) && (index2 == param_node->bit_end) && param_node->bit_end!=7) + { + switchchar(out_text,sub_sum & 0xF0); + if((sub_sum & 0xF0)==0xE0 ) + { + out_text[strlen(out_text)]='\0'; + find_first = 1; + break; + } + switchchar(out_text,sub_sum & 0x0F); + if((sub_sum & 0x0F)==0x0E) + { + out_text[strlen(out_text)-1]='\0'; + find_first = 1; + break; + } + index3=0; + } + } + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + break; + if(find_first == 1) + break; + } + strcpy(type_str,"keepHex-low-E"); + //printf("The keephex_low_e:%s",out_text); + break; + case 4: //keepHex_low_F + sub_sum=0; + index4=0; + index3 = 0; + sum = 0; + strcpy(out_text, ""); + for(index=param_node->byte_begin; index <= param_node->byte_end; index++) + { + if(index == param_node->byte_begin) + index2 = param_node->bit_begin; + else + index2 = 0; + for(; index2<8; index2++) + { + if(index3 == 0) + sub_sum = 0; + if((recv_msgbuf.var[bind_index].msg[index] & (BYTE)my_pow(2, index2)) != 0) + sub_sum += my_pow(2, index3); + index3++; + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + { + switchchar(out_text,sub_sum & 0xF0); + if((sub_sum & 0xF0)==0xF0 ) + { + out_text[strlen(out_text)-1]='\0'; + find_first = 1; + break; + } + switchchar(out_text,sub_sum & 0x0F); + if((sub_sum & 0x0F)==0x0F) + { + out_text[strlen(out_text)-1]='\0'; + find_first = 1; + break; + } + index3=0; + } + if(index3==8) + { + switchchar(out_text,sub_sum & 0xF0); + if((sub_sum & 0xF0)==0xF0 ) + { + if(strlen(out_text) == 1) + value_valid=0; + out_text[strlen(out_text)-1]='\0'; + find_first = 1; + break; + } + switchchar(out_text,sub_sum & 0x0F); + if((sub_sum & 0x0F)==0x0F) + { + out_text[strlen(out_text)-1]='\0'; + + find_first = 1; + break; + } + index3 = 0; + } + } + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + break; + if(find_first == 1) + break; + } + strcpy(type_str,"keepHex-low-F"); + break; + case 5: //toAscii_low_0 + sub_sum=0; + index3 = 0; + sum = 0; + strcpy(out_text, ""); + strcpy(temp_str, ""); + for(index=param_node->byte_begin; index <= param_node->byte_end; index++) + { + if(index == param_node->byte_begin) + index2 = param_node->bit_begin; + else + index2 = 0; + for(; index2<8; index2++) + { + if(index3 == 0) + sub_sum = 0; + if((recv_msgbuf.var[bind_index].msg[index] & (BYTE)my_pow(2, index2)) != 0) + sub_sum += my_pow(2, index3); + index3++; + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + { + if(sub_sum == '0') //\u4EE5 '0' \u7ED3\u5C3E + { + if(strlen(out_text) == 2) + value_valid=0; + find_first = 1; + break; + } + else + { + strcpy(temp_str, ""); + sprintf(temp_str, "%c", sub_sum); + strcat(out_text, temp_str); + } + break; + } + if(index3==8) + { + if(sub_sum == '0') //\u4EE5 0 \u7ED3\u5C3E + { + if(strlen(out_text) == 0) + value_valid=0; + find_first = 1; + break; + } + else + { + strcpy(temp_str, ""); + sprintf(temp_str, "%c", sub_sum); + strcat(out_text, temp_str); + } + index3 = 0; + } + } + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + break; + if(find_first == 1) + break; + } + strcpy(type_str,"toAscii-low-0"); + break; + case 6: //keepAscii_low_F + sub_sum=0; + index3 = 0; + sum = 0; + strcpy(out_text, ""); + strcpy(temp_str, ""); + + for(index=param_node->byte_begin; index <= param_node->byte_end; index++) + { + if(index == param_node->byte_begin) + index2 = param_node->bit_begin; + else + index2 = 0; + for(; index2<8; index2++) + { + if(index3 == 0) + sub_sum = 0; + if((recv_msgbuf.var[bind_index].msg[index] & (BYTE)my_pow(2, index2)) != 0) + sub_sum += my_pow(2, index3); + index3++; + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + { + if(sub_sum == 'F') //\u4EE5 'F' \u7ED3\u5C3E + { + if(strlen(out_text) == 2) + value_valid=0; + find_first = 1; + break; + } + else + { + strcpy(temp_str, ""); + sprintf(temp_str, "%c", sub_sum); + strcat(out_text, temp_str); + } + break; + } + if(index3==8) + { + if(sub_sum == 'F') //\u4EE5 'F' \u7ED3\u5C3E + { + if(strlen(out_text) == 0) + value_valid=0; + find_first = 1; + break; + } + else + { + strcpy(temp_str, ""); + sprintf(temp_str, "%c", sub_sum); + strcat(out_text, temp_str); + } + index3 = 0; + } + } + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + break; + if(find_first == 1) + break; + } + strcpy(type_str,"toAscii-low-F"); + break; + default: + break; + } + param_node->input_ptr->input[0] = sum; + } + else if(param_node->select_total != 0) + { + index3 = sum = 0; + for(index=param_node->byte_begin; index <= param_node->byte_end; index++) + { + if(index == param_node->byte_begin) + index2 = param_node->bit_begin; + else + index2 = 0; + for(; index2<8; index2++) + { + if((recv_msgbuf.var[bind_index].msg[index] & (BYTE)my_pow(2, index2)) != 0) + sum += my_pow(2, index3); + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + break; + index3++; + } + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + break; + } + strcpy(out_text, ""); + for(index=0; indexselect_total; index++) + { + if(param_node->select_ptr[index]->number == sum) + { + sprintf(out_text, "%ld (%s)", sum, param_node->select_ptr[index]->description); + curr_select_id=index; + } + } + if(strlen(out_text) == 0) + sprintf(out_text, "%ld (UNREGESTER VALUE)", sum); + } + else + sprintf(out_text, "%ld ", sum); + } + + + + del_space(out_text,1); + if(strncasecmp(param_node->name, "reserved", 8) == 0 ) + { + if(snmp_agent_flag==1) + { + field_id=mib_curr_node->total_child_nodes-debug_get_all_value; + tmp_param_field=&snmp_agent_packet.param_field_arr[field_id]; + strcpy(tmp_param_field->name,param_node->name); + } + } + else + { + + if(snmp_agent_flag==0 && field_compute_state!=4) + { + if(mib_curr_node->total_child_nodes==1) + sprintf(out_text1, " |---(%d) %s",param_node->id+1, param_node->name); + else + { + if(debug_get_all_value==301) + sprintf(out_text1, " |---(%d) %s",param_node->id+1, param_node->name); + else + sprintf(out_text1, " |---(%d) %s",1+mib_curr_node->total_child_nodes - debug_get_all_value, param_node->name); + } + + debug_color_out(BRIGHT,YELLOW,BLACK,out_text1); + + if(!(none_instance==1 && show_empty==1)) + { + if(!strlen(out_text)) + { + debug_ascii_out_proc(" = "); + debug_color_out(BRIGHT,BLUE,BLACK,"NULL "); + } + else + { + debug_ascii_out_proc(" = "); + debug_color_out(BRIGHT,BLUE,BLACK,out_text); + debug_ascii_out_proc(" "); + } + } + + if(param_node->input_ptr!=NULL) + { + if(show_type==1 ) + { + //debug_ascii_out_proc("Type : "); + debug_color_out(BRIGHT,YELLOW,BLACK,type_str); + } + } + if(show_range==1) + { + //debug_ascii_out_proc("Range : "); + sprintf(out_text, " [%d.%d - %d.%d]\r\n", param_node->byte_begin, param_node->bit_begin, param_node->byte_end, param_node->bit_end); + debug_color_out(BRIGHT,YELLOW,BLACK,out_text); //for look + } + else + { + if( strncasecmp(param_node->name, "reserved", 8) != 0 ) + debug_ascii_out_proc("\r\n"); + } + + } + else if(snmp_agent_flag==1) + { + + field_id=mib_curr_node->total_child_nodes-debug_get_all_value; + tmp_param_field=&snmp_agent_packet.param_field_arr[field_id]; + if(param_node->select_total!=0) + { + + tmp_param_field->curr_select_id=curr_select_id; + for(index=0; indexselect_total; index++) + { + tmp_param_field->value_arr[index]=param_node->select_ptr[index]->number; + strcpy(tmp_param_field->value_arr_remark[index],param_node->select_ptr[index]->description); + } + tmp_param_field->total_select=param_node->select_total; + tmp_param_field->curr_input_value[0]='\0'; + tmp_param_field->input_type=0xFF; + } + else if(param_node->input_ptr!=NULL) + { + tmp_param_field->curr_select_id=0xFF; + for(index=0; indexvalue_arr[index]=0xFF; + strcpy(tmp_param_field->value_arr_remark[index],""); + } + tmp_param_field->total_select=0; + strcpy(tmp_param_field->curr_input_value,out_text); + tmp_param_field->input_type=param_node->input_ptr->input_param_type; + } + strcpy(tmp_param_field->name,param_node->name); + } + else if(field_compute_state==4 ) + { + if(param_node->select_total!=0) + { + sprintf(temp_str,"%d",param_node->select_ptr[curr_select_id]->number); + strcpy(compute_field_list[compute_field_list_index].field_val[mib_curr_node->curr_instance+bind_index-1],temp_str); + } + else if(param_node->input_ptr!=NULL) + { + strcpy(compute_field_list[compute_field_list_index].field_val[mib_curr_node->curr_instance+bind_index-1],out_text); + } + } + + } + + if(debug_get_all_value==301) + debug_get_all_value=1; + debug_get_all_value--; + + + } + + } + } + } + if(snmp_agent_flag==1) + { + + if(bind_num==1) + { + memcpy(&debug_snmp_agent_buf[debug_agent_index],&snmp_agent_packet,sizeof(debug_snmp_agent)); + debug_snmp_agent_buf[debug_agent_index].cmm_state=5; + debug_snmp_agent_buf[debug_agent_index].result_state=0; + } + else + { + memcpy(&debug_snmp_agent_buf[bind_index],&snmp_agent_packet,sizeof(debug_snmp_agent)); + debug_snmp_agent_buf[bind_index].cmm_state=5; + debug_snmp_agent_buf[bind_index].result_state=0; + debug_snmp_agent_buf[bind_index].oid[debug_snmp_agent_buf[bind_index].oid_len-1]=mib_curr_node->curr_instance+bind_index; + } + + } + bind_index++; + //printf("send ins %d ",mib_curr_node->curr_instance+bind_index); + if(bind_indextotal_child_nodes>4) + return; + } + if(snmp_agent_flag==0 && list_once==1) + { + if(recv_msgbuf.var[bind_index].vartype == 5) //NULL + { + debug_ascii_out_proc("Error : NULL\r\n"); + } + else if(recv_msgbuf.var[bind_index].vartype == 6) //Object identifier + { + debug_ascii_out_proc("Error : Object identifier wrong\r\n"); + } + else if(recv_msgbuf.var[bind_index].vartype == 0x80) //noSuchObject + { + debug_ascii_out_proc("Error : noSuchObject\r\n"); + } + else if(recv_msgbuf.var[bind_index].vartype == 0x81) //NoSuchInstance + { + debug_ascii_out_proc("Error : NoSuchInstance\r\n"); + } + else if(recv_msgbuf.var[bind_index].vartype == 0x82) //endOfMibView + { + debug_ascii_out_proc("Error : endOfMibView\r\n"); + } + } + //sprintf(out_text,"%d-%d ",debug_snmp_agent_buf[debug_agent_index].cmm_state,debug_snmp_agent_buf[debug_agent_index].result_state); + ip_index = 0; + if(list_flag==0) + debug_cfg_end=1; + if(((list_start>=list_end && list_flag) || !list_flag) && !snmp_agent_flag) + { + get_state=0; + bind_num=0; + bind_index=0; + } + if(snmp_agent_flag>0) + get_state=0; + if(snmp_agent_flag>0) + bind_index=0; + get_show_state=0; + //if(snmp_agent_flag==0) + // bind_num=0; + //snmp_agent_flag=0; + expend_view=0; + debug_get_all_value = 0; + t5s_flag=0; + break; + default: + debug_ascii_out_proc("\r\nError : no value for this node.\r\nFail\r\n"); + while(debug_get_all_value != 0) + { + param_node = mib_curr_node->child_nodes[mib_curr_node->total_child_nodes - debug_get_all_value]->child_ptr; + if( strncmp(param_node->name, "Reserved", 8) == 0 ) + { + sprintf(out_text, "%d Reserved.\r\n",1+mib_curr_node->total_child_nodes - debug_get_all_value); + debug_ascii_out_proc(out_text); + debug_get_all_value--; + } + else + break; + } + if(debug_get_all_value != 0) + { + param_node = mib_curr_node->child_nodes[mib_curr_node->total_child_nodes - debug_get_all_value]->child_ptr; + sprintf(out_text, "%d %s = ", 1+mib_curr_node->total_child_nodes - debug_get_all_value, param_node->name); + debug_get_all_value--; + debug_ascii_out_proc(out_text); + debug_cfg_end = 0; + get_state = 3; + } + else + { + ip_index =0; + debug_cfg_end = 1; + get_state = 0; + } + break; + } + +}//end of debug_snmp_get_rt + + + +/* +* +* Fun: debug_snmp_set_rt +* +* Desc: get the mib_node's value from the host by snmp, then analyze and replace the value of its field's value, then set back the mib_node's value to the host by snmp +* +* Ret: RVOID +* +* Notes: Wang Jian add +* +* File: debug.c +* +*/ +void debug_snmp_set_rt() +{ + int request_id=0, index; + char out_text[256]=""; + char out_text2[256]=""; + int ins_byte,ins_bit; + mib_node_param *temp_param; + int i; + + switch(set_state) + { + case 0: //idle + break; + case 1: //send the not null and selected ip in the Peer_IP[16] set request to local host + t5s_flag=0; + if(ip_index >= ip_num) + { + debug_cfg_end = 1; + set_state = 0; + ip_index = 0; + set_ok_once=0; + save_flag=0; + break; + } + if(Peer_IP[ip_index] == 0) + { + debug_cfg_end = 1; + set_state = 0; + if(snmp_agent_flag==0) + { + if(ip_index == 0 ) + debug_color_out(BRIGHT,RED,BLACK,"Error : There is not host ip available.\r\n"); + + } + else + { + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=4; + mib_curr_node=agent_tmp_node; + return ; + } + ip_index = 0; + break; + } + + if(IP_Selected[ip_index] == 1) + send_addr.remote_ip = Peer_IP[ip_index]; + else + { + for(; ip_index 250) + { + if(snmp_agent_flag==0) + { + if(save_flag>=3) + { + + //debug_ascii_out_proc("Status : "); + //sprintf(out_text,"Fail to save the module of %s,time out,please check the host\r\n",subsys_module[curr_module].name); + //debug_color_out(BRIGHT,CYAN,BLACK,out_text); + mib_curr_node=temp_mib_node; + sprintf(out_text, "Host : %s %s (State: Time out !)\r\n", Remote_Host_Name[ip_index], Remote_Host_IP[ip_index]); + if(save_flag==3) + debug_mmi_contents(""); + if(debug_cfg==1) + mib_curr_node=temp_mib_node; + else if(debug_cfg==2) + { + menu_curr_node=tmp_menu_node; + mib_curr_node=temp_mib_node; + } + save_flag=0; + } + else + sprintf(out_text, "Host : %s %s (State: Time out !)\r\n", Remote_Host_Name[ip_index], Remote_Host_IP[ip_index]); + debug_color_out(BRIGHT,RED,BLACK,out_text); + } + else + { + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=1; + mib_curr_node=agent_tmp_node; + snmp_agent_flag=0; + } + ip_index++; + debug_cfg_end = 0; + set_ok_once=0; + set_state = 1; + break; + } + else + break; + } + else //received + { + char byte_val1[16]; + if(snmp_agent_flag==0) + { + if(save_flag<3 || save_flag==4) + { + // debug_ascii_out_proc("OldValue: "); + for(index=0; indexbyte_begin, param_node->bit_begin, param_node->byte_end, param_node->bit_end); + //debug_color_out(BRIGHT,YELLOW,BLACK,out_text1);//for look + } + if(recv_msgbuf.error_status != 0) + { + if(snmp_agent_flag==0) + { + //sprintf(out_text, "Error : get value from the host: %s %s\r\n",Remote_Host_Name[ip_index], Remote_Host_IP[ip_index]); + //debug_color_out(BRIGHT,RED,BLACK,out_text); + switch(recv_msgbuf.error_status) + { + case 1: + debug_color_out(BRIGHT,RED,BLACK,"Error : TooBig\r\n"); + break; + case 5: + debug_color_out(BRIGHT,RED,BLACK,"Error : GenErr\r\n"); + break; + case 6: + debug_color_out(BRIGHT,RED,BLACK,"Error : NoAccess\r\n"); + break; + case 7: + debug_color_out(BRIGHT,RED,BLACK,"Error : WrongType\r\n"); + break; + case 8: + debug_color_out(BRIGHT,RED,BLACK,"Error : WrongLength\r\n"); + break; + case 9: + debug_color_out(BRIGHT,RED,BLACK,"Error : WrongEncoding\r\n"); + break; + case 10: + debug_color_out(BRIGHT,RED,BLACK,"Error : WrongValue\r\n"); + break; + case 11: + debug_color_out(BRIGHT,RED,BLACK,"Error : NoCreation\r\n"); + break; + case 12: + debug_color_out(BRIGHT,RED,BLACK,"Error : inconsistentValue\r\n"); + break; + case 13: + debug_color_out(BRIGHT,RED,BLACK,"Error : resourceUnavailable\r\n"); + break; + case 14: + debug_color_out(BRIGHT,RED,BLACK,"Error : commitFailed\r\n"); + break; + case 15: + debug_color_out(BRIGHT,RED,BLACK,"Error : UndoFailed\r\n"); + break; + case 16: + debug_color_out(BRIGHT,RED,BLACK,"Error : AuthorizationError\r\n"); + break; + case 17: + debug_color_out(BRIGHT,RED,BLACK,"Error : NoWritable\r\n"); + break; + case 18: + debug_color_out(BRIGHT,RED,BLACK,"Error : inconsistentName\r\n"); + break; + default: + break; + } + ip_index++; + debug_cfg_end = 0; + set_state = 1; + } + else + { + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=9; + mib_curr_node=agent_tmp_node; + snmp_agent_flag=0; + } + break; + } + else if((recv_msgbuf.var[0].vartype == 2) || (recv_msgbuf.var[0].vartype == 4)) //int or string + { + char out_text[128]; + int index2, index3, index4; + DWORD sum; + int sub_sum; + //int child_index; + strcpy(out_text, ""); + if(debug_snmp_agent_buf[debug_agent_index].cmm_state==3 && snmp_agent_flag==2) + { + index2=mib_curr_node->data_length*2; + for(i=0;ienable_field_id!=0xFF) + { + param_node = (mib_node_param *)mib_curr_node->child_nodes[mib_curr_node->enable_field_id]->child_ptr; + + if(param_node->byte_begin==param_node->byte_end && param_node->bit_begin ==param_node->bit_end) + { + ins_byte=param_node->byte_begin; + ins_bit=param_node->bit_begin ; + if(del_flag==0) + { + recv_msgbuf.var[0].msg[ins_byte] =recv_msgbuf.var[0].msg[ins_byte] | (BYTE)my_pow(2,ins_bit); + } + else + { + recv_msgbuf.var[0].msg[ins_byte] =recv_msgbuf.var[0].msg[ins_byte] & (~(BYTE)my_pow(2,ins_bit)); + } + } + } + set_all=0; + } + else + { + temp_param=param_node; + + if(mib_curr_node->enable_field_id!=0xFF) + { + param_node = (mib_node_param *)mib_curr_node->child_nodes[mib_curr_node->enable_field_id]->child_ptr; + + if(param_node->byte_begin==param_node->byte_end && param_node->bit_begin ==param_node->bit_end) + { + ins_byte=param_node->byte_begin; + ins_bit=param_node->bit_begin ; + if(del_flag==0) + recv_msgbuf.var[0].msg[ins_byte] =recv_msgbuf.var[0].msg[ins_byte] | (BYTE)my_pow(2,ins_bit); + else + recv_msgbuf.var[0].msg[ins_byte] =recv_msgbuf.var[0].msg[ins_byte] & (~(BYTE)my_pow(2,ins_bit)); + } + } + param_node=temp_param; + if(param_node->select_total != 0) + { + index3 = sum = 0; + for(index=param_node->byte_begin; index <= param_node->byte_end; index++) + { + if(index == param_node->byte_begin) + index2 = param_node->bit_begin; + else + index2 = 0; + for(; index2<8; index2++) + { + if((set_val & (BYTE)my_pow(2, index3)) == 0) + recv_msgbuf.var[0].msg[index] = recv_msgbuf.var[0].msg[index] & (255 - my_pow(2, index2)); + else + recv_msgbuf.var[0].msg[index] = recv_msgbuf.var[0].msg[index] | my_pow(2, index2); + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + break; + index3++; + } + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + break; + } + } + else if(param_node->input_ptr != NULL) + { + switch(param_node->input_ptr->input_param_type) + { + case 0: //toDec_high_0 + strcpy(out_text, ""); + index3 = sum = 0; + for(index=param_node->byte_end; index >=param_node->byte_begin; index--) + { + if(index == param_node->byte_begin) + index2 = param_node->bit_begin; + else + index2 = 0; + for(; index2<8; index2++) + { + if((set_val & (BYTE)my_pow(2, index3)) == 0) + recv_msgbuf.var[0].msg[index] = recv_msgbuf.var[0].msg[index] & (255 - my_pow(2, index2)); + else + recv_msgbuf.var[0].msg[index] = recv_msgbuf.var[0].msg[index] | my_pow(2, index2); + index3++; + if( (index == param_node->byte_begin) && (((param_node->byte_begin==param_node->byte_end)&& index2 == param_node->bit_end) || ((param_node->byte_begin!=param_node->byte_end)&& index2==7))) + break; + + } + if( (index == param_node->byte_begin) && (((param_node->byte_begin==param_node->byte_end)&& index2 == param_node->bit_end) || ((param_node->byte_begin!=param_node->byte_end)&& index2==7))) + break; + } + break; + case 1: //keepHex_high_0 + case 2: //keepHex_low_0 + case 3: //keepHex_low_E + case 4: //keepHex_low_F + strcpy(out_text, ""); + index3 = index4 = sum = sub_sum = 0; + for(index=param_node->byte_begin; index <= param_node->byte_end; index++) + { + if(index == param_node->byte_begin) + index2 = param_node->bit_begin; + else + index2 = 0; + if((index3 == 0) && ( (index4+1) <= strlen(set_val_str) )) //\u53D6\u4E24\u4F4D\u5B57\u7B26 + { + set_val = 0; + if( isdigit(set_val_str[index4]) ) //\u6570\u5B57\u5B57\u7B26 + set_val += (set_val_str[index4++] - '0') * 16; + else // A \u81F3 E \u4E4B\u95F4 + set_val += (set_val_str[index4++] - 'A' + 10) * 16; + + if( isdigit(set_val_str[index4]) ) + set_val += set_val_str[index4++] - '0'; + else + set_val += set_val_str[index4++] - 'A' + 10; + } + + for(; index2<8; index2++) + { + if((set_val & (BYTE)my_pow(2, index3)) == 0) + recv_msgbuf.var[0].msg[index] = recv_msgbuf.var[0].msg[index] & (255 - my_pow(2, index2)); + else + recv_msgbuf.var[0].msg[index] = recv_msgbuf.var[0].msg[index] | my_pow(2, index2); + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + break; + index3++; + if(index3 == 8) + index3 = 0; + } + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + break; + } + break; + case 5: //toAscii_low_0 + case 6: //keepAscii_low_F + strcpy(out_text, ""); + index3 = index4 = sum = sub_sum = 0; + for(index=param_node->byte_begin; index <= param_node->byte_end; index++) + { + if(index == param_node->byte_begin) + index2 = param_node->bit_begin; + else + index2 = 0; + if(index3 == 0) //\u53D6\u4E00\u4F4D\u5B57\u7B26 + set_val = set_val_str[index4++]; + + for(; index2<8; index2++) + { + if((set_val & (BYTE)my_pow(2, index3)) == 0) + recv_msgbuf.var[0].msg[index] = recv_msgbuf.var[0].msg[index] & (255 - my_pow(2, index2)); + else + recv_msgbuf.var[0].msg[index] = recv_msgbuf.var[0].msg[index] | my_pow(2, index2); + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + break; + index3++; + if(index3 == 8) + index3 = 0; + } + if( (index == param_node->byte_end) && (index2 == param_node->bit_end)) + break; + } + break; + default: + if(snmp_agent_flag==0) + { + sprintf(out_text, "Get value (%s)\r\n", recv_msgbuf.var[0].msg); + debug_ascii_out_proc(out_text); + sprintf(out_text,"from the host: %s %s.\r\nBut can not parse the value type (%d).\r\n", Remote_Host_Name[ip_index], Remote_Host_IP[ip_index], recv_msgbuf.var[0].vartype); + debug_ascii_out_proc(out_text); + } + ip_index++; + debug_cfg_end = 0; + set_state = 1; + return; + } + } + } + } + // send set request + t5s_flag=0; + recv_msgbuf.pdu_type = 3; + recv_msgbuf.request_id = 0; + recv_addr.remote_ip = Peer_IP[ip_index]; + request_id = snmp_send(&recv_msgbuf, &recv_addr); + if(request_id == 0) + { + if(snmp_agent_flag==0) + { + sprintf(out_text, "Error : Fail to send snmp set request to the host: %s %s\r\n",Remote_Host_Name[ip_index],Remote_Host_IP[ip_index]); + debug_color_out(BRIGHT,RED,BLACK,out_text); + } + ip_index++; + debug_cfg_end = 0; + set_state =1; + } + else + { + recv_msgbuf.pdu_type = 2; + recv_msgbuf.request_id = request_id; + recv_addr.remote_ip = Peer_IP[ip_index]; + set_state = 3; + } + break; + } + else + { + if(snmp_agent_flag==0) + { + if(recv_msgbuf.var[0].vartype == 5) //NULL + { + debug_color_out(BRIGHT,RED,BLACK,"Error : NULL\r\n"); + } + else if(recv_msgbuf.var[0].vartype == 6) //Object identifier + { + debug_color_out(BRIGHT,RED,BLACK,"Error : Object identifier wrong\r\n"); + } + else if(recv_msgbuf.var[0].vartype == 0x80) //noSuchObject + { + debug_color_out(BRIGHT,RED,BLACK,"Error : noSuchObject\r\n"); + } + else if(recv_msgbuf.var[0].vartype == 0x81) //NoSuchInstance + { + debug_color_out(BRIGHT,RED,BLACK,"Error : NoSuchInstance\r\n"); + } + else if(recv_msgbuf.var[0].vartype == 0x82) //endOfMibView + { + debug_color_out(BRIGHT,RED,BLACK,"Error : endOfMibView\r\n"); + } + if(save_flag>3) + { + if(debug_cfg==1) + mib_curr_node=temp_mib_node; + else if(debug_cfg==2) + { + menu_curr_node=tmp_menu_node; + mib_curr_node=temp_mib_node; + } + save_flag=0; + } + } + } + + } + debug_cfg_end = 0; + ip_index++; + set_state = 1; + break; + case 3: //receive set response + request_id = snmp_receive(&recv_msgbuf, &recv_addr); + + if(request_id == 0) // not received + { + if(t5s_flag > 250) + { + if(snmp_agent_flag==0) + { + sprintf(out_text, "Error : Time out to set value to the host: %s %s\r\n",Remote_Host_Name[ip_index], Remote_Host_IP[ip_index]); + debug_color_out(BRIGHT,RED,BLACK,out_text); + } + else + { + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=1; + mib_curr_node=agent_tmp_node; + snmp_agent_flag=0; + } + ip_index++; + set_ok_once=0; + debug_cfg_end = 0; + set_state = 1; + break; + } + else + break; + } + else //received + { + if(snmp_agent_flag==0) + { + char out_text1[256], byte_val1[16]; + //debug_ascii_out_proc("\rStatus : "); + //debug_color_out(BRIGHT,CYAN,BLACK,"Successful! \r\n"); + //debug_ascii_out_proc("SNMP MSG: "); + //sprintf(out_text1, "receive snmp response: error_status: %d, vartype: %d, msg_len: %d\r\n",recv_msgbuf.error_status, recv_msgbuf.var[0].vartype, recv_msgbuf.var[0].msglen); + //debug_color_out(BRIGHT,CYAN,BLACK,out_text1); + strcpy(out_text1,""); + for(index=0; indexbyte_begin, param_node->bit_begin, param_node->byte_end, param_node->bit_end); + //debug_color_out(BRIGHT,YELLOW,BLACK,out_text1);//for look + //debug_ascii_out_proc("\r\n"); + //} + //*/ + } + if(recv_msgbuf.error_status != 0) + { + if(snmp_agent_flag==0) + { + //sprintf(out_text, "Error : set value to the host: %s %s\r\n",Remote_Host_Name[ip_index], Remote_Host_IP[ip_index]); + //debug_color_out(BRIGHT,RED,BLACK,out_text); + switch(recv_msgbuf.error_status) + { + case 1: + debug_color_out(BRIGHT,RED,BLACK,"Error : TooBig\r\n"); + break; + case 5: + debug_color_out(BRIGHT,RED,BLACK,"Error : GenErr\r\n"); + break; + case 6: + debug_color_out(BRIGHT,RED,BLACK,"Error : NoAccess\r\n"); + break; + case 7: + debug_color_out(BRIGHT,RED,BLACK,"Error : WrongType\r\n"); + break; + case 8: + debug_color_out(BRIGHT,RED,BLACK,"Error : WrongLength\r\n"); + break; + case 9: + debug_color_out(BRIGHT,RED,BLACK,"Error : WrongEncoding\r\n"); + break; + case 10: + debug_color_out(BRIGHT,RED,BLACK,"Error : WrongValue\r\n"); + break; + case 11: + debug_color_out(BRIGHT,RED,BLACK,"Error : NoCreation\r\n"); + break; + case 12: + debug_color_out(BRIGHT,RED,BLACK,"Error : inconsistentValue\r\n"); + break; + case 13: + debug_color_out(BRIGHT,RED,BLACK,"Error : resourceUnavailable\r\n"); + break; + case 14: + debug_color_out(BRIGHT,RED,BLACK,"Error : commitFailed\r\n"); + break; + case 15: + debug_color_out(BRIGHT,RED,BLACK,"Error : UndoFailed\r\n"); + break; + case 16: + debug_color_out(BRIGHT,RED,BLACK,"Error : AuthorizationError\r\n"); + break; + case 17: + debug_color_out(BRIGHT,RED,BLACK,"Error : NoWritable\r\n"); + break; + case 18: + debug_color_out(BRIGHT,RED,BLACK,"Error : inconsistentName\r\n"); + break; + default: + break; + } + } + else + { + debug_snmp_agent_buf[debug_agent_index].cmm_state=4; + debug_snmp_agent_buf[debug_agent_index].result_state=9; + mib_curr_node=agent_tmp_node; + snmp_agent_flag=0; + } + } + else + { + if( save_flag==4) + { + debug_ascii_out_proc("Host : "); + sprintf(out_text, "%s %s (State: Successful!)\r\n",Remote_Host_Name[ip_index], Remote_Host_IP[ip_index]); + debug_color_out(BRIGHT,YELLOW,BLACK,out_text); + if(debug_cfg==1) + mib_curr_node=temp_mib_node; + else if(debug_cfg==2) + { + menu_curr_node=tmp_menu_node; + mib_curr_node=temp_mib_node; + } + + } + + } + } + debug_cfg_end = 0; + set_state = 1; + if(snmp_agent_flag==0) + { + if(save_flag>=3) + { + if(debug_cfg==1) + mib_curr_node=temp_mib_node; + else if(debug_cfg==2) + { + menu_curr_node=tmp_menu_node; + mib_curr_node=temp_mib_node; + } + if(save_flag==3 && ip_index==0) + debug_mmi_contents(""); + save_flag=5; + ip_index++; + break; + } + } + if(recv_msgbuf.error_status == 0) + { + if(snmp_agent_flag==2) + { + set_after_get=1; + debug_snmp_agent_buf[debug_agent_index].cmm_state=1; + debug_snmp_agent_buf[debug_agent_index].result_state=0; + snmp_agent_flag=1; + } + else + { + if(save_flag<3 && !set_ok_once) + { + get_state=3; + set_ok_once=1; + } + } + bind_num=1; + set_state=0; + debug_get_all_value = mib_curr_node->total_child_nodes; + } + if(del_flag==1) + debug_mmi_contents("*"); + del_flag=0; + ip_index++; + if(snmp_agent_flag==0) + set_state=1; + break; + + default: + ip_index=0; + debug_cfg_end = 1; + set_state = 0; + break; + } +}//end of debug_snmp_set_rt + +int debug_snmp_get(BYTE oidlen,DWORD *oid,BYTE *data_ptr,BYTE *vartype) +{//?? + DWORD ii; + BYTE temp_id; + struct debug_module_struct *module_ptr; + + switch(oid[12]) + { + case 0: + break; + case 1: + break; + case 2: // configure + if (oid[13] > MODULE_COUNT+1 || oid[13] < 2) + return -1; + temp_id = oid[13] - 2; + module_ptr = (struct debug_module_struct *) &debug_shm_ptr->module_d[temp_id]; + switch(oid[14]) + { + case 0: + break; + case 1: + data_ptr[0] = module_ptr->status[0]; + *vartype = 4; + return 1; + break; + case 2: + strcpy(data_ptr,module_ptr->version); + return strlen(module_ptr->version); + break; + case 3: // ascii in buffer + break; + case 4: // ascii out buffer + switch (oid[15]) + { + case 1: // get tail seq id + ii = u32tobcd(data_ptr,module_ptr->seqid_t); + *vartype = 4; + return ii; + break; + case 2: // get head seq id + ii = u32tobcd(data_ptr,module_ptr->seqid_h); + *vartype = 4; + return ii; + break; + case 3: // get out buffer + if (module_ptr->seqid_h < module_ptr->seqid_t) + { + ii = module_ptr->seqid_h + DEBUG_MAX_SEQID; + if (oid[16] >= ii || oid[16] < module_ptr->seqid_t) + return -1; + } + else + { + if (oid[16] >= module_ptr->seqid_h || oid[16] < module_ptr->seqid_t) + return -1; + } + ii = oid[16] % DEBUG_SEQID_LEN; + strcpy(data_ptr,module_ptr->omc_outbuf[ii]); + *vartype = 4; + return strlen(module_ptr->omc_outbuf[ii]); + break; + default: + break; + } + break; + default: + break; + } + break; + default: + break; + } + return -1; +} + +int debug_snmp_set(BYTE oidlen,DWORD *oid,BYTE *data_ptr,WORD data_len) +{ + BYTE temp_id; + + switch(oid[12]) + { + case 0: + break; + case 1: + break; + case 2: // configure + if (oid[13] > MODULE_COUNT+1 || oid[13] < 2) + return -1; + temp_id = oid[13] - 2; + if (oid[14] != 3) // not ascii in buffer + return -1; + if (data_len < 80) + { + if (debug_shm_ptr->module_d[temp_id].ascii_in_set_flag == 1) + { + debug_shm_ptr->module_d[temp_id].ascii_in[0] = disp_page_flag + 1; + memcpy(debug_shm_ptr->module_d[temp_id].ascii_in+1,data_ptr,data_len); + debug_shm_ptr->module_d[temp_id].ascii_in[data_len+1] = '\0'; + } + return data_len; + } + break; + default: + break; + } + return -1; +} + +void debug_mmi_list() +{ + int cur_b,cur_end,list_give_num; + char cur_c[64],temp[2],*p,arr[256],temp_str[256*5],*temp_ch; + char ins_str[16]; + int i,j; + DWORD k; + BYTE index; + mib_child_node *child_node_ptr; + if(strlen(list_msg)>96) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : No need so long string!\r\n"); + list_flag=0; + debug_cfg_end=1; + return; + } + switch(list_flag) + { + case 0: //idel + return; + case 1: + strcpy(arr,list_msg); + for(i=0;i!=strlen(arr);i++) + { + if(*(arr+i)!=' ') + break; + } + p=arr+i; + strcpy(arr,p); + list_give_num=0; + if(mib_curr_node->total_instance==0) + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : This is not leaf node,so can't list the para and value.\r\n"); + list_flag=0; + debug_cfg_end=1; + return; + } + strcpy(temp,""); + p=temp; + if(strlen(arr)==0) + { + list_give_num=0; + } + while(strlen(arr)!=0) + { + for(i=0;i!=strlen(arr);i++) + { + if(*(arr+i)!=' ') + break; + } + p=arr+i; + strcpy(temp_str,""); + strcpy(temp_str,p); + strcpy(arr,temp_str); + i=0; + if(arr[0]!='-' && !isdigit(arr[0])) + { + debug_color_out(BRIGHT,RED,BLACK,"Fail : Format is not right!list [-a] [-e] [xxx-xxx].\r\n"); + list_flag=0; + debug_cfg_end=1; + return; + } + + else if(strncmp(arr,"-s",2)==0) //show get state,default hide + { + show_snmp_state=1; + p=arr+2; + strcpy(arr,p); + } + else if(strncmp(arr,"-a",2)==0) //show all include NULL,default hide + { + show_all_value=1; + p=arr+2; + strcpy(arr,p); + } + else if(strncmp(arr,"-f",2)==0) //show the special field + { + for(i=2;i=3) + { + sprintf(cur_c,"Error : Please input number between 1-%d!\r\n",mib_curr_node->total_child_nodes); + debug_color_out(BRIGHT,RED,BLACK,cur_c); + list_flag=0; + debug_cfg_end=1; + return; + } + } + if(i!=0) + { + strncpy(cur_c,temp_ch,i); + list_field_arr[index]=atoi(cur_c); + if(list_field_arr[index]<1 || list_field_arr[index]>(mib_curr_node->total_child_nodes)) + { + sprintf(cur_c,"Error : Please input number between 1-%d!\r\n",mib_curr_node->total_child_nodes); + debug_color_out(BRIGHT,RED,BLACK,cur_c); + list_flag=0; + debug_cfg_end=1; + return; + } + else + index++; + } + if(*(temp_ch+i)!='\0') + k+=i+1; + else + k+=i; + j=0; + } + } + + else if(strncmp(arr,"-r",2)==0) //show para arrange,default hide + { + show_range=1; + p=arr+2; + strcpy(arr,p); + } + + + else if(strncmp(arr,"-t",2)==0) //show para type,defualt hide + { + show_type=1; + p=arr+2; + strcpy(arr,p); + } + + else if(strncmp(arr,"-e",2)==0) //show without expand ,defualt expand + { + show_expend=0; + p=arr+2; + strcpy(arr,p); + } + else if(isdigit(arr[0]) || (arr[0]=='-' && isdigit(arr[1]))) + { + p=temp; + for(i=0;i<=strlen(arr);i++) + { + *p=arr[i]; + if(!isdigit(*p) && *p!='-') + { + debug_color_out(BRIGHT,RED,BLACK,"Error : Please input number!format list:2-10\r\n"); + list_flag=0; + debug_cfg_end=1; + return; + } + if(*p=='-') + { + if(i>=1) + { + strncpy(cur_c,arr,i); + cur_b=strtoul(cur_c,NULL,10); + break; + } + else + { + cur_b=0; + break; + } + } + } + i++; + if(i==(strlen(arr)+2)) + cur_end=mib_curr_node->total_instance-1; + else + { + strcpy(cur_c,""); + for(;itotal_instance-1; + } + list_start=cur_b; + list_end=cur_end; + if(list_start>list_end) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : Input error!Example:list -a -e 2-10!\r\n"); + list_flag=0; + debug_cfg_end=1; + return; + } + if(list_end>mib_curr_node->total_instance-1) + { + sprintf(cur_c,"Error : The max instance num is %d!\r\n",mib_curr_node->total_instance-1); + debug_color_out(BRIGHT,RED,BLACK,cur_c); + list_flag=0; + debug_cfg_end=1; + return; + } + list_flag=2; + debug_cfg_end=0; + break; + case 2: + //temp_instance=mib_curr_node->curr_instance; + if(list_start<=list_end) + { + mib_curr_node->curr_instance=(DWORD)list_start; + if(list_start+15<=list_end) + bind_num=16; + else + bind_num=list_end-list_start+1; + send_msgbuf.pdu_type = 0; + send_msgbuf.request_id = 0; + send_msgbuf.var_num =bind_num; + for(j=0;joid[i]; + send_msgbuf.var[j].oid[mib_curr_node->oid_len] = (DWORD)mib_curr_node->curr_instance+j; + send_msgbuf.var[j].oidlen = mib_curr_node->oid_len + 1; + } + for(ip_index=0;ip_index<16;ip_index++) + { + if(IP_Selected[ip_index] != 1) + continue; + send_addr.remote_ip = Peer_IP[ip_index]; + break; + } + if(ip_index>=16) + { + debug_ascii_out_proc("Fail : There is not host ip available.\r\n"); + return ; + } + send_addr.local_ip = Local_IP; + send_addr.remote_port = SNMP_PORT; + send_addr.local_port = DEBUG_SNMP_PORT; + send_addr.broadcast = 0; + recv_msgbuf.pdu_type = 2; + recv_msgbuf.request_id = 0; + recv_msgbuf.var_num = bind_num; + for(j=0;joid[i]; + recv_msgbuf.var[j].oid[mib_curr_node->oid_len] = (DWORD)mib_curr_node->curr_instance+j; + recv_msgbuf.var[j].oidlen = mib_curr_node->oid_len + 1; + for(i=0; i<256; i++) + recv_msgbuf.var[j].msg[i] = 0; + } + recv_addr.remote_ip = send_addr.remote_ip; + recv_addr.local_ip = Local_IP; + recv_addr.remote_port = SNMP_PORT; + recv_addr.local_port = DEBUG_SNMP_PORT; + recv_addr.broadcast = 0; + bind_index=0; + get_state=1; + debug_cfg_end = 0; + list_field=mib_curr_node->total_child_nodes; + list_start+=bind_num; + } + list_flag=3; + break; + case 3: + if(get_state==3 && bind_index=bind_num && bind_num!=0 && list_start=list_end+1) + { + + show_all_value=0; + show_type=0; + show_range=0; + show_field=0; + bind_num=1; + bind_index=0; + show_snmp_state=0; + show_expend=1; + debug_cfg_end=0; + /* + if(read_syntax_nor_list==0 && list_once==1) + { + list_start=0; + list_end=0; + list_flag=0; + compute_field_list_index++; + if(compute_field_list_index == compute_list_num && compute_field_list_index>0) + { + read_syntax_nor_list = 1; + field_compute_state=5; + mib_curr_node=temp_compute_node; + list_field=mib_curr_node->total_child_nodes; + debug_mmi_get_all(); + debug_cfg_end=0; + } + return; + } + */ + + + list_flag=4; + break; + } + if(t5s_flag> 250 && list_once==0) + { + list_flag=0; + list_start=0; + list_end=0; + debug_ascii_out_proc("Instance: "); + debug_color_out(BRIGHT,RED,BLACK,"Unknow Because can not get it value in time\r\n"); + strcpy(temp_str,""); + debug_ascii_out_proc("Child : "); + sprintf(temp_str, "[%d]\r\n",mib_curr_node->total_child_nodes); + debug_color_out(BRIGHT,YELLOW,BLACK,temp_str); + + for (i = 0; i < mib_curr_node->total_child_nodes; i++) + { + child_node_ptr = mib_curr_node->child_nodes[i]; + if(child_node_ptr) + sprintf(temp_str, " |---(%ld) %s\r\n",child_node_ptr->oid+1,child_node_ptr->name); + debug_color_out(BRIGHT,YELLOW,BLACK,temp_str); + } + debug_cfg_end=1; + } + break; + case 4: + if(list_once==0) + { + if(list_start>=list_end+1) + { + for(i=0;i<256;i++) + { + if(curr_instance_arr[i].eable==1) + break; + } + if(i==256) + { + //debug_color_out(BRIGHT,RED,BLACK,"Error : no instance was used!\r\n"); + none_instance=1; + } + else + none_instance=0; + mib_curr_node->curr_instance=i; + temp_instance=mib_curr_node->curr_instance; + } + } + else + mib_curr_node->curr_instance=temp_instance; + + if (mib_curr_node->total_instance) + { + strcpy(temp_str,""); + strcpy(ins_str,""); + k=0; + for(i=0;i<=255;i++) + { + if(curr_instance_arr[i].eable==1) + { + sprintf(ins_str,"#%-3d ",i); + strpcat(temp_str,&k,ins_str); + } + } + debug_ascii_out_proc("Instance: "); + strcpy(ins_str,""); + if(k) + sprintf(ins_str, "#%-3d(%-3d): ", mib_curr_node->curr_instance,mib_curr_node->total_instance); + else + sprintf(ins_str, "None(%-3d): ", mib_curr_node->total_instance); + debug_color_out(BRIGHT,YELLOW,BLACK,ins_str); + debug_color_out(BRIGHT,BLUE,BLACK,temp_str); + debug_ascii_out_proc("\r\n"); + if(k) + none_instance=0; + else + none_instance=1; + } + list_flag=0; + get_state=0; + debug_cfg_end=1; + + IP_Selected[0]=1; + for(i=1;i<16;i++) + IP_Selected[i]=0; + if(list_once==0) + { + if(none_instance==0) + { + if(mib_curr_node->max_access>=2 && mib_curr_node->max_access<=5) + { + + debug_mmi_get_all(); + debug_cfg_end=0; + } + } + else + { + + strcpy(temp_str,""); + debug_ascii_out_proc("Child : "); + sprintf(temp_str, "[%d]\r\n",mib_curr_node->total_child_nodes); + debug_color_out(BRIGHT,YELLOW,BLACK,temp_str); + + for (i = 0; i < mib_curr_node->total_child_nodes; i++) + { + child_node_ptr = mib_curr_node->child_nodes[i]; + sprintf(temp_str, " |---(%ld) %s\r\n",child_node_ptr->oid+1, child_node_ptr->name); + debug_color_out(BRIGHT,YELLOW,BLACK,temp_str); + } + debug_cfg_end=1; + + } + } + list_once=1; + list_start=0; + list_end=0; + list_flag=0; + break; + + } + return ; +} + + + +void register_instance() +{ + char ascii_text[32],byte_val1[8]; + int i,index; + if(mib_curr_node->total_instance) + { + memset(curr_instance_value,0,sizeof(char)); + //strncpy(curr_instance_value,mib_curr_node->init_value,mib_curr_node->data_length); + *curr_instance_value='\0'; + for(index=0; indexdata_length; index++) + { + if((mib_curr_node->init_value[index] & 0xF0)==0) + { + strcat(curr_instance_value,"0"); + sprintf(byte_val1,"%X",mib_curr_node->init_value[index]); + strcat(curr_instance_value,byte_val1); + } + else + { + sprintf(byte_val1, "%X", mib_curr_node->init_value[index]); + strcat(curr_instance_value,byte_val1); + } + } + gcvt((double)(mib_curr_node->total_instance-1),3,ascii_text); + strcpy(list_msg,""); + strcat(list_msg," -e "); + strcat(list_msg,"0"); + strcat(list_msg,"-"); + strcat(list_msg,ascii_text); + + + //default_value(mib_curr_node->oid,mib_curr_node->oid_len,curr_instance_value); + show_list=0; + for(i=0;i<=255;i++) + { + curr_instance_arr[i].eable=0; + } + debug_mmi_list(); + } +} + + + +//////////////////////////////End of Operation get-set/////////// + + + + +//////////////////////////////Data Send and recieve////////////// + +void debug_send_serial() +{ + //int n; + int i; + message_list iptr_msg; + + for (i = 0;i < MAX_SEND_CHAR_NUM ;i ++) + { + if (sendserbuf_t != sendserbuf_h) + { + //n = write(com_port,&sendser_buf[sendserbuf_t],1); + // if (n > -1) + // { + debug_shm_ptr->TelnetSendData.telsend_data[debug_shm_ptr->TelnetSendData.telsend_datah] = sendser_buf[sendserbuf_t]; + sendserbuf_t = (sendserbuf_t + 1) % SERIAL_BUF_LEN; + debug_shm_ptr->TelnetSendData.telsend_datah = (debug_shm_ptr->TelnetSendData.telsend_datah+1)%TELNET_SEND_BUF_LEN; + if (debug_shm_ptr->TelnetSendData.telsend_datah > 256) + // if (debug_shm_ptr->TelnetSendData.telsend_datah == 0) + SendTelnetFlag = 1; + // } + } + } + if (SendTelnetFlag == 1) + { + if (debug_shm_ptr->TelnetSendData.telsend_datah > 0) + { + iptr_msg.msgSrcPort = DEBUG_PORT; + iptr_msg.msgLength = debug_shm_ptr->TelnetSendData.telsend_datah; + memcpy(iptr_msg.msgContent,debug_shm_ptr->TelnetSendData.telsend_data,debug_shm_ptr->TelnetSendData.telsend_datah); + iptrPutMessage(iptr_msg); + memset(debug_shm_ptr->TelnetSendData.telsend_data,0,sizeof(BYTE)*TELNET_SEND_BUF_LEN); + debug_shm_ptr->TelnetSendData.telsend_datah = 0; + } + SendTelnetFlag = 0; + } +} + +int debug_send_char(BYTE ch) +{ + sendser_buf[sendserbuf_h] = ch; + sendserbuf_h = (sendserbuf_h + 1) % SERIAL_BUF_LEN; + return 1; +} + + +int debug_send_string(const char *str_send) +{ + int len,i; + i=0; + len=strlen(str_send); + if(sendserbuf_h+len>SERIAL_BUF_LEN && (sendserbuf_h+len)% SERIAL_BUF_LEN='a' && recser_buf[recserbuf_h]<='a'+MODULE_COUNT) + // send_char_flag=0; + recserbuf_h = (recserbuf_h + 1) % SERIAL_BUF_LEN; + } + } +} + +int debug_read_char() +{ + char sig; + + if (recserbuf_t == recserbuf_h) + return 0; + if (recserbuf_t != recserbuf_h) + { + sig = recser_buf[recserbuf_t]; + recserbuf_t = (recserbuf_t + 1) % SERIAL_BUF_LEN; + } + return sig; +} + + +void debug_recv_cmd() +{ + int i; + char pp; + int temp_page; + char pr_buf[30];//--lw + pp = debug_read_char(); + switch(pp) + { + case 0: + return; + case 113://"Q" + case 81: //'q' //--lw + { + first_page = 1; + disp_main_flag = 0; + if(debug_cfg) + debug_mmi_save(); + Init_Page=0; + mib_curr_node=mib_root_node; + menu_curr_node=menu_root_node; + debug_cfg=0; + debug_cfg_end=0; + debug_ascii_out_ph=debug_ascii_out_pt=0; + ascii_out_pt=ascii_out_ph=0; + /* + if(debug_cfg>0) + { + debug_send_char('C'); + debug_send_char('M'); + debug_send_char('M'); + debug_cfg=0; + } + */ + break; + } + } + switch (disp_main_flag) + { + case 0: // enter in menu page + if (isupper(pp)) // transfer the upper to lower + pp = tolower(pp); + if (pp == 'x') + { + m_state = 0; + disp_main_flag = 0; + } + //else if ((pp >= 'a') && (pp < 'a'+MODULE_COUNT)) + else if ((pp >= 'a') && ((pp <= 'a'+15 ) || (pp >= 17 + 'a' && pp <= 22 + 'a') || pp == 'y' || pp == 'z' ) ) //!=x !=q + { + disp_main_flag = 1; + debug_module_num= pp - 'a'; + disp_sub_module_flag = pp - 'a'; + if( disp_sub_module_flag >= PAGE_MODULE_COUNT ) + disp_sub_module_flag -= 2; + else if( disp_sub_module_flag > 16 && disp_sub_module_flag < 23 ) + disp_sub_module_flag--; + debug_module_num += disp_main_page_num*PAGE_MODULE_COUNT; + disp_sub_module_flag += disp_main_page_num*PAGE_MODULE_COUNT; + m_state_sub_module = 0; + disp_page_flag = 0; + command_flag = 0; + // title_top_pt = 0; + ascii_out_ph = ascii_out_pt = 0; + // strcpy(ascii_out_array,""); + // show the help info when enter in a new module + if(debug_shm_ptr != NULL) + if (debug_shm_ptr->module_d[disp_sub_module_flag].ascii_in_set_flag == 1) + { + debug_shm_ptr->module_d[disp_sub_module_flag].ascii_in[0] = disp_page_flag + 1; + strcpy(debug_shm_ptr->module_d[disp_sub_module_flag].ascii_in+1,"help"); + } + memset(current_timer,0,sizeof(current_timer)); + } + else if ((pp >= '1') && (pp <= '9')) + { + disp_main_page_num = pp - '1'; + if(disp_main_page_num >= DEBUG_MAX_PAGE) + disp_main_page_num = 0; + m_state = 0; + disp_main_flag = 0; + } + break; + case 1: // enter in module page + if (command_flag == 0) + { + if (isupper(pp)) // transfer the upper to lower + pp = tolower(pp); + if (pp == 'x') + { + disp_main_flag = 0; + m_state = 0; + disp_page_flag = 0; + } + else if ((pp >= '0') && (pp <= '9')) + { + temp_page = pp - '0'; + if ( (debug_shm_ptr->module_d[disp_sub_module_flag].page_d[temp_page].pointer_set_flag == 0) && (temp_page != 0)) + return; // invalid page + disp_page_flag = pp - '0'; + m_state_sub_module = 0; + // title_top_pt = 0; + } + else if ((pp >= 'a') && (pp <= 'f')) + { + temp_page = pp - 'a' + 0x0a; + if (debug_shm_ptr->module_d[disp_sub_module_flag].page_d[temp_page].pointer_set_flag == 0) + return; // invalid page + disp_page_flag = pp - 'a' + 0xa; + m_state_sub_module = 0; + // title_top_pt = 0; + } + else if (pp == 27) // ESC + { + //debug_clear_serial(); + if (disp_page_flag != 0) // not page 0 + { + for (i = 0;i < strlen(prompt_line25);i ++) + debug_send_char(prompt_line25[i]); + } + else + { + //debug_send_char(0xa);//--lw + //debug_send_char(0xd);//--lw + if(disp_sub_module_flag == ('n'-'a')) + { + if(debug_cfg == 0) //cmm status + { + if(debug_module_num == ('n'-'a')) + { + sprintf(pr_buf,"CMM>"); + Init_Page=2; + TxtColor(BRIGHT,WHITE,BLACK,pr_buf); + for(i=0;i<30;i++) + if(pr_buf[i]!='\0') + debug_send_char(pr_buf[i]); + else + break; + m_state_sub_module = 2; + } + else + { + sprintf(pr_buf,"%s>",debug_shm_ptr->module_d[debug_module_num].name); + TxtColor(BRIGHT,WHITE,BLACK,pr_buf); + for (i = 0;i < strlen(pr_buf);i ++) + debug_send_char(pr_buf[i]); + } + } + else if(debug_cfg ==1) //cfg status + { + sprintf(pr_buf,"CFG>"); + TxtColor(BRIGHT,WHITE,BLACK,pr_buf); + debug_send_string(pr_buf); + } + else if(debug_cfg==2) + { + sprintf(pr_buf,"MENU>"); + TxtColor(BRIGHT,WHITE,BLACK,pr_buf); + debug_send_string(pr_buf); + } + } + else + { + debug_send_string(debug_shm_ptr->module_d[disp_sub_module_flag].name); + debug_send_char('>'); + } + + } + ascii_in_array[0] = disp_page_flag + 1; + ascii_in_pt = 1; + command_flag = 1; + SendTelnetFlag = 1; + } + } + else // in command mode + { + switch (pp) + { + case 27: // ESC + //debug_send_char(0xa); + //debug_send_char(0xd); + command_flag = 0; + ascii_in_array[0] = disp_page_flag + 1; + ascii_in_pt = 1; + break; + case 8: // backspace + if (ascii_in_pt > 1) + ascii_in_pt -= 1; + debug_send_char(pp); + SendTelnetFlag = 1; + break; + case 10: // line feed + if (ascii_in_pt == 1) // empty + return; + break; + case 13: // return + if (ascii_in_pt == 1) // empty + return; + //debug_send_char(pp); + SendTelnetFlag = 1; + //if (disp_page_flag == 0) // display page 0 + // debug_send_char(10); // send line feed + ascii_in_array[ascii_in_pt] = '\0'; + if (debug_shm_ptr->module_d[disp_sub_module_flag].ascii_in_set_flag == 1) + strncpy(debug_shm_ptr->module_d[disp_sub_module_flag].ascii_in,ascii_in_array,80); + command_flag = 0; + ascii_in_pt = 0; + ascii_in_array[0] = '\0'; + break; + default: + ascii_in_array[ascii_in_pt++] = pp; + //debug_send_char(pp); + SendTelnetFlag = 1; + break; + } + } + break; + default: + disp_main_flag = 0; + break; + } +} + + + + +//////////////////////////////end of Data Send and recieve////////////// + +/////////////////////////////compute field//////////////////////////// + +/* +* +* [I]TG to Prefix +* { +* [v]OID="3.2.2.1.3" +* [l]OID.#.1 //for while +* [p]TG=(OID.*.1) //print +* } +* +* +* [I]Prefix to TG +* { +* [v]OID1="3.2.2.1.3" +* [v]OID2="3.2.2.1.4" +* [l]OID1.#.1 +* [l]OID2.#.1 +* [c](OID1.#.1)==(*) [p]prefix (#)=(OID2.#.1) //if +* } + */ +BYTE create_compute_field(FILE * fp, mib_node * node_ptr, BYTE field_id,char *name) +{ + char data_arr[256]; + + + compute_field_arr[compute_field_num].field_id = field_id; + strcpy(compute_field_arr[compute_field_num].name,name); + while(!feof(fp)) + { + mib_line_count++; + if(read_line(fp, data_arr) == 0) + continue; + del_space(data_arr, 2); + switch (data_arr[0]) + { + case '{': //"{" + break; + case '[': + if(data_arr[1] == 'c' || data_arr[1] == 'v' || data_arr[1] == 'p' || data_arr[1] == 'l') + { + if(strlen(data_arr) < 64) + strcpy(compute_field_arr[compute_field_num].syntax_str[compute_field_arr[compute_field_num].syntax_count], data_arr); + else + { + printf("[Debug] Error : Do not support so much line script for compute node.line:%d", mib_line_count); + return 0; + } + if(compute_field_arr[compute_field_num].syntax_count < 10) + compute_field_arr[compute_field_num].syntax_count++; + else + { + printf("[Debug] Error : Do not support so much line script for compute node.line:%d", mib_line_count); + return 0; + } + } + break; + case '}': + if(compute_field_num<16) + compute_field_num++; + else + return 0; + + return 1; + default: + printf("[Debug] Error : The mib compute field is not right.line:%d", mib_line_count); + return 0; + } + } + return 1; +} + +void translate_compute_field() +{ + char *p, *temp_ch, temp_str[32],temp_str1[64], line[64]; + DWORD oid[32]; + char cmp_value[2][32]; + char temp_value[32]; + BYTE i,j, value_index,read_next_line=1,index; + WORD curr_instance_index; + mib_node *find_list_node; + + if(field_compute_state == 1) + { + memset(OID_val, 0, 5 * 16 * sizeof(DWORD)); + memset(OID_name_str, 0, 5 * 32 * sizeof(char)); + line_index = 0; + OID_index=0; + compute_field_list_index=0; + compute_list_num=0; + compute_state = 0; + } + + if(read_syntax_nor_list>0) + { + while(line_index < compute_curr_unit.syntax_count && strlen(compute_curr_unit.syntax_str[line_index]) != 0) + { + if(!print_line_index) + field_compute_state=2; + else + field_compute_state=6; + if(read_syntax_nor_list == 0) + { + field_compute_state=3; + print_line_index=line_index; + return ; + } + if(read_next_line==1 && line_index 5) + { + printf("[Debug] Error: The max define oid number is 5.\r\n"); + return ; + } + temp_ch += 3; + p = strtok(temp_ch, "="); //variable name + strcpy(OID_name_str[OID_index], p); + p=strtok(NULL,"="); + strcpy(temp_str, p); + p = strtok(temp_str, "."); + for(i=0;i<9;i++) + OID_val[OID_index][i]=cur_oid[i]; + OID_val[OID_index][i++] = atoi(p); + while((p = strtok(NULL, "."))) + OID_val[OID_index][i++] = atoi(p); + OID_index++; + } + else if((temp_ch = strstr(line, "[l]")) != NULL) + { + compute_state = 2; + line_index--; + break; + } + else + { + printf("[Debug] Error: The compute filed script is error.\r\n"); + return ; + } + compute_state = 1; + break; + case 2: //[l] + if((temp_ch = strstr(line, "[l]")) != NULL) + { + temp_ch +=3; + /* + if(temp_ch[0] == '.' && temp_ch[1]=='#') + { + compute_field_list[compute_list_num].list_node = mib_curr_node; + strcpy(temp_str,temp_ch+3); + if(test_str(temp_str, 0) && atoi(temp_str) < MAX_SELECT_OPTION_NUM) + { + compute_field_list[compute_list_num].list_field_id = atoi(temp_str); + compute_list_num++; + break; + } + printf("[Debug] Error: The field id in [l] field is error.%s", temp_str); + return ; + } + else + */ + if((p=strtok(temp_ch,"."))!=NULL) + { + for(i = 0; i < OID_index && strlen(OID_name_str[i]) != 0; i++) + { + if(strcmp(OID_name_str[i], p) == 0) + break; + } + if(i == OID_index || strlen(OID_name_str[i]) == 0) + { + printf("[Debug] Error: Can not define the string:%s.\r\n", p); + return ; + } + for(j = 0; j < 32 && OID_val[i][j] != 0; j++) + { + oid[j] = OID_val[i][j]; + } + find_list_node=search_mib_node(mib_root_node,oid,j); + if(find_list_node!=NULL) + compute_field_list[compute_list_num].list_node = find_list_node; + else + { + printf("[Debug] Error: [l] field :no such mib node for the oid.\r\n"); + return ; + } + p=strtok(NULL,"."); + if(*p=='?') + { + if((p=strtok(NULL,"."))!=NULL) + { + if(test_str(p, 0) && atoi(p) < MAX_SELECT_OPTION_NUM) + { + compute_field_list[compute_list_num].list_field_id = atoi(p); + compute_list_num++; + break; + } + } + } + printf("[Debug] Error: [l] field is error.%s", temp_str); + return ; + } + } + else if((temp_ch = strstr(line, "[p]") )!= NULL) + { + read_syntax_nor_list = 0; + compute_state = 3; + line_index--; + break; + } + compute_state = 2; + break; + case 3: //[p] + if((temp_ch = strstr(line, "[p]")) != NULL && (strstr(line, "[c]")) == NULL) + { + temp_ch += 3; + for(i=0;temp_ch[i] != '\0';i++) + { + if(temp_ch[i] == '=') + break; + } + if(temp_ch[i] == '\0') + { + printf("[Debug] Error: The field format is not right.\r\n"); + return ; + } + strncpy(temp_str, temp_ch, i); + temp_str[i] = '\0'; + if(strstr(temp_str,"(")) + { + for(i=0;temp_str[i] != '\0';i++) + { + if(temp_str[i] == '(') + break; + } + if(i == strlen(temp_str) && strstr(temp_str, ")") == NULL) + { + printf("[Debug] Error: The field format is not right.\r\n"); + return ; + } + strncpy(compute_curr_unit.print_name_str[compute_curr_unit.print_count], temp_str, i); + compute_curr_unit.print_name_str[compute_curr_unit.print_count][i] = '\0'; + value_index = take_compute_value(temp_str + i,temp_value); + if(value_index == 0) + { + printf("[Debug] Error: The field format is not right.\r\n"); + return ; + } + if(value_index == 1) + strcat(compute_curr_unit.print_name_str[compute_curr_unit.print_count], temp_value); + } + else + strcpy(compute_curr_unit.print_name_str[compute_curr_unit.print_count], temp_str); + temp_ch+=i+1; + for(i=0;temp_ch[i] != '\0';i++) + { + if(temp_ch[i] == '(') + break; + } + if(temp_ch[i] == '\0' && strstr(temp_ch, ")") == NULL) + { + printf("[Debug] Error: The field format is not right.\r\n"); + return ; + } + temp_ch += i; + value_index = take_compute_value(temp_ch,temp_value); + if(value_index == 0) + { + printf("[Debug] Error: The field format is not right.\r\n"); + return ; + } + if(value_index == 1) + strcpy(compute_curr_unit.print_val_str[compute_curr_unit.print_count], temp_value); + compute_curr_unit.print_count++; + } + else if((temp_ch = strstr(line, "[c]") )!= NULL) + { + line_index--; + compute_state = 4; + break; + } + compute_state = 3; + break; + case 4: //[c] + if((temp_ch = strstr(line, "[c]")) != NULL && strstr(line, "==") != NULL && (strstr(line, "[p]")) != NULL) + { + + for(curr_instance_index=0;curr_instance_indextotal_instance;curr_instance_index++) + { + strcpy(temp_str1,line); + temp_ch = strstr(temp_str1, "[c]"); + compute_curr_instance=curr_instance_index; + temp_ch += 3; + p = strtok(temp_ch, "=["); + if(p[0] == '(' && p[strlen(p) - 1] == ')') + { + value_index = take_compute_value(p,temp_value); + if(value_index == 0) + { + printf("[Debug] Error: The field format is not right.\r\n"); + return ; + } + if(value_index == 1) + strcpy(cmp_value[0], temp_value); + } + p = strtok(NULL, "=[");; + if(p[0] == '(' && p[strlen(p) - 1] == ')') + { + value_index = take_compute_value(p,temp_value); + if(value_index == 0) + { + printf("[Debug] Error: The field format is not right.\r\n"); + return ; + } + if(value_index == 1) + strcpy(cmp_value[1], temp_value); + } + else + { + printf("[Debug] Error: The field format is not right.\r\n"); + return ; + } + if(strcmp(cmp_value[0], cmp_value[1]) == 0) + { + strcpy(temp_str1,line); + if((temp_ch = strstr(temp_str1, "[p]")) != NULL) + { + + temp_ch += 3; + for(i=0;temp_ch[i] != '\0';i++) + { + if(temp_ch[i] == '=') + break; + } + if(temp_ch[i] == '\0') + { + printf("[Debug] Error: The field format is not right.\r\n"); + return ; + } + strncpy(temp_str, temp_ch, i); + temp_str[i] = '\0'; + if(strstr(temp_str,"(")) + { + for(i=0;temp_str[i] != '\0';i++) + { + if(temp_str[i] == '(') + break; + } + if(i == strlen(temp_str) && strstr(temp_str, ")") == NULL) + { + printf("[Debug] Error: The field format is not right.\r\n"); + return ; + } + strncpy(compute_curr_unit.print_name_str[compute_curr_unit.print_count], temp_str, i); + compute_curr_unit.print_name_str[compute_curr_unit.print_count][i] = '\0'; + value_index = take_compute_value(temp_str + i,temp_value); + if(value_index == 0) + { + printf("[Debug] Error: The field format is not right.\r\n"); + return ; + } + if(value_index == 1) + strcat(compute_curr_unit.print_name_str[compute_curr_unit.print_count], temp_value); + + } + else + strcpy(compute_curr_unit.print_name_str[compute_curr_unit.print_count], temp_str); + temp_ch+=i+1; + for(i=0;temp_ch[i] != '\0';i++) + { + if(temp_ch[i] == '(') + break; + } + if(temp_ch[i] == '\0' && strstr(temp_ch, ")") == NULL) + { + printf("[Debug] Error: The field format is not right.\r\n"); + return ; + } + temp_ch += i; + value_index = take_compute_value(temp_ch,temp_value); + if(value_index == 0) + { + printf("[Debug] Error: The field format is not right.\r\n"); + return ; + } + if(value_index == 1) + strcpy(compute_curr_unit.print_val_str[compute_curr_unit.print_count], temp_value); + compute_curr_unit.print_count++; + + } + else + { + printf("[Debug] Error: No '[p]' in the [c] line.\r\n"); + return ; + } + } + + } + compute_curr_instance=0; + } + else if((temp_ch = strstr(line, "[p]")) != NULL) + { + line_index--; + compute_state = 4; + break; + } + break; + } + } + line_index=print_line_index; + for(index=0;indexcurr_instance+bind_index); + value_index = 1; + return value_index; + } + else if(temp_str[0] == '#') + { + sprintf(temp_str,"%d",compute_curr_instance); + strcpy(temp_value, temp_str); + value_index =1; + return value_index; + } + else + /* + if(temp_str[0] == '.') + { + if(temp_str[2]=='.') + { + strcpy(temp_str1,temp_str); + if(*(temp_str1+1)=='\0' && atoi(temp_str1)==compute_field_list[0].list_field_id) + { + if(temp_str[1] == '#') + { + for(i = 0; i < mib_curr_node->total_instance; i++) + { + strcpy(temp_value[i], compute_field_list[0].field_val[i]); + } + value_index = mib_curr_node->total_instance; + return value_index; + } + else if(temp_str[1] == '*') + { + strcpy(temp_value[0], compute_field_list[0].field_val[mib_curr_node->curr_instance]); + value_index = 1; + return value_index; + } + } + } + } + else + */ + if((temp_ch = strstr(temp_str, "OID"))!=NULL) + { + if(isdigit(temp_ch[3])) + { + strncpy(temp_str1, temp_ch, 4); + temp_ch += 4; + } + else + { + strcpy(temp_str1,"OID"); + temp_ch += 3; + } + for(i = 0; i < OID_index; i++) + { + if(strcmp(OID_name_str[i], temp_str1) == 0) + break; + } + if(i == OID_index) + { + printf("[Debug] Error: Can not find the oid define.\r\n"); + return 0; + } + compute_list_index= i; + + if(temp_ch[0] == '.') + { + strcpy(temp_str1,temp_ch+3); + if(*(temp_str1+1)=='\0' && atoi(temp_str1)==compute_field_list[compute_list_index].list_field_id) + { + if(temp_ch[1] == '#') + { + strcpy(temp_value, compute_field_list[compute_list_index].field_val[compute_curr_instance]); + value_index = 1; + return value_index; + } + else if(temp_ch[1] == '*') + { + strcpy(temp_value, compute_field_list[compute_list_index].field_val[mib_curr_node->curr_instance+bind_index]); + value_index = 1; + return value_index; + } + } + + } + } + return 0; +} + +void compute_field_WatchDog() +{ + char temp_str[32]; + if(list_once==1 && read_syntax_nor_list == 0) + { + if(list_flag == 0 && get_state==0) + { + if(compute_field_list_index < compute_list_num) + { + field_compute_state=4; + mib_curr_node = compute_field_list[compute_field_list_index].list_node; + strcpy(list_msg,""); + //strcat(list_msg," -e "); + strcat(list_msg, "-f["); + sprintf(temp_str, "%d", compute_field_list[compute_field_list_index].list_field_id); + strcat(list_msg, temp_str); + strcat(list_msg, "] "); + strcat(list_msg,"0"); + strcat(list_msg,"-"); + gcvt((double)(mib_curr_node->total_instance-1),3,temp_str); + strcat(list_msg,temp_str); + list_flag=1; + show_list=0; + debug_mmi_list(); + } + } + } + +} + + +void print_compute_field() +{ + char out_text[256],temp_str[64]; + BYTE j,index,k,i=0; + if(list_once==1) + { + if(compute_field_list_index >= compute_list_num && compute_list_num>0) + { + for(index=0;indextotal_child_nodes==1) + { + strcpy(temp_str,""); + for(k=0;kname)+9;k++) + { + strcat(temp_str," "); + } + sprintf(out_text, "%s|---(%d) %s %d",temp_str,compute_field_arr[index].field_id+1, compute_field_arr[index].name,mib_curr_node->curr_instance); + } + else + sprintf(out_text, " |---(%d) %s %d",compute_field_arr[index].field_id+1, compute_field_arr[index].name,mib_curr_node->curr_instance); + debug_color_out(BRIGHT,CYAN,BLACK,out_text); + + if(compute_field_arr[index].print_count==1) + { + sprintf(out_text, " %s" ,compute_field_arr[index].print_name_str[0]); + debug_color_out(BRIGHT,CYAN,BLACK,out_text); + debug_ascii_out_proc(" = "); + if(strlen(compute_field_arr[index].print_val_str[0])) + sprintf(out_text, "%-8s",compute_field_arr[index].print_val_str[0]); + else + sprintf(out_text, "NULL "); + debug_color_out(BRIGHT,BLUE,BLACK,out_text); + debug_ascii_out_proc("\r\n"); + } + else + { + debug_ascii_out_proc("\r\n"); + for(j=0;j0) + compute_curr_unit.print_count=0; + } + } + field_compute_state=5; + print_once=0; + } + } + +} +/////////////////////////////////end of compute field///////////////////////// + +////////////////////////////////Other/////////////////////////////// +void debug_set_currenttime() +{ + u8 ii,jj; + char temp_timer[64]="\0"; + char send_buf[64]="\0"; + time_t tick; + + tick = time(NULL); + + sprintf(temp_timer,"\x1b[25;25Hcurrent time:%.24s",ctime(&tick)); + if (strlen(current_timer) == 0) // current timer is empty + { + for (jj = 0;jj < strlen(temp_timer);jj ++) + debug_send_char(temp_timer[jj]); + strcpy(current_timer,temp_timer); + return; + } + for (ii = 0;ii < strlen(temp_timer);ii ++) + { + if (temp_timer[ii] != current_timer[ii]) + { + sprintf(send_buf,"\x1b[25;%dH%c",25+ii-8,temp_timer[ii]); + for (jj = 0;jj < strlen(send_buf);jj ++) + debug_send_char(send_buf[jj]); + } + } + strcpy(current_timer,temp_timer); +} +/* +* +* Fun: del_space +* +* Desc: remove the spaces at the beginning of string +* +* Ret: string +* +* File: debug.c +* +*/ +void del_space(char *str,BYTE type) +{ + int i,j,k; + if(!strlen(str)) + return; + if(type==0) //del the ahead space + { + for(i=0;i0;i--) + { + if(str[i]!=' ') + { + break; + } + } + str[i+1]='\0'; + + }else if(type==2) //del all the space + { + for(i=0;i0;i--) + { + if(str[i]!=' ') + { + break; + } + } + str[i+1]='\0'; + + } + + +} + + + +/* +* +* Fun: read_line +* +* Desc: Read a line from file fp, remove the spaces in the beginning and in the end of the line, store it in line_ptr +* +* Ret: the length of line +* +* File: debug.c +* +*/ +int read_line(FILE *fp, char *line_ptr) +{ + char *temp_ch_ptr; + int index, index2, length; + + if(feof(fp)) + return 0; + strcpy(line_ptr, ""); + + fgets(line_ptr,512,fp); + temp_ch_ptr = strchr(line_ptr, 0xa); + if (temp_ch_ptr != NULL ) + *temp_ch_ptr = '\0'; + + + length = strlen(line_ptr); + for(index=0; index=0; index--) // cut off all spaces in the ending of the line + { + /* + if(!isprint(line_ptr[index])) + line_ptr[index] = '\0'; + else + { + if(line_ptr[index] == ' ' || line_ptr[index] == '\t') + line_ptr[index] = '\0'; + else + break; + } + */ + if(line_ptr[index] == ' ' || line_ptr[index] == '\t') + line_ptr[index] = '\0'; + else + break; + } + return strlen(line_ptr); +} /* end of read_line */ + + +/* +* +* Fun: read_begin +* +* Desc: read the fp, stop until meet the stop_ch +* +* Ret: the length of the stored string +* +* File: debug.c +* +*/ +int read_begin(FILE *fp, char *stop_ch) +{ + char ch; + int index = 0,i=0; + + while((ch=fgetc(fp)) != EOF) + { + if(stop_ch[i]!='\0') + { + if(ch==stop_ch[i]) + { + i++; + if(stop_ch[i]=='\0') + { + index-=i-1; + break; + } + } + else + i=0; + } + else + break; + if(index == 3072) + break; + } + + return index; +} // end of read_begin + + + +/* +* +* Fun: read_until +* +* Desc: read the fp, store the string to the data_ptr until meet the stop_ch +* +* Ret: the length of the stored string +* +* File: debug.c +* +*/ +int read_until(FILE *fp, char *data_ptr, char *stop_ch) +{ + char ch; + int index = 0,i=0; + while((ch=fgetc(fp)) != EOF) + { + if(stop_ch[i]!='\0') + { + if(ch==stop_ch[i]) + { + i++; + if(stop_ch[i]=='\0') + { + index-=i-1; + break; + } + } + else + i=0; + } + else + break; + data_ptr[index++] = ch; + if(index == 3072) + break; + } + data_ptr[index]= '\0'; + return index; +} // end of read_until + + + +/* +* +* Fun: read_part +* +* Desc: read the fp, store the string to from the start_ch to syop_ch +* +* Ret: the length of the stored string +* +* File: debug.c +* +*/ +int read_part(FILE *fp, char *data_ptr,char *start_ch, char *stop_ch) +{ + read_begin(fp,start_ch); + read_until(fp,data_ptr,stop_ch); + return strlen(data_ptr); +} // end of read_until + + +/* +* +* Fun: pick_first_word(char *str_ptr, char *word_ptr) +* +* Desc: pick out the first word into word_ptr from the str_ptr +* +* Ret: the char pionter which point to the ending of the first word in the string +* +* File: debug.c +* +*/ +char * pick_first_word(char *str_ptr, char *word_ptr) +{ + int index, index2, length; + length = strlen(str_ptr); + for(index = 0; index < length; index ++) + { + if(!isprint(str_ptr[index]))//find the first print char exclude spacebar + continue; + else + { + if(str_ptr[index] == ' ') + continue; + else + break; + } + } + for(index2=0; index <= length; index++, index2++) + { + if( (isprint(str_ptr[index])) && (str_ptr[index] != ' ')) + word_ptr[index2] = str_ptr[index]; + else + break; + } + word_ptr[index2] = '\0'; + return &str_ptr[index]; +} // end of pick_first_word + + +/* +* +* Fun: take_str +* +* Desc: copy the data_str to the data_ptr if data_str is not NULL, or find two '"' in the file fp and take string between the two '"' into data_ptr +* +* Ret: successful: 1, fail: 0 +* +* File: debug.c +* +*/ +int take_str(char *data_str, FILE *fp, char *data_ptr) +{ + char tmp_ch= '"'; + int index; + //printf("take_str begin:\r\n"); + if(strlen(data_str) != 0) + { + strcpy(data_ptr, data_str); + return 1; + } + else + { + while(( !feof(fp) ) && (fgetc(fp) != '"')) + ; + if(feof(fp)) + { + printf("[debug] Error: Can't find a [%c] as beginning of a text befor the End of file.\r\n",'"'); + return 0; + } + index = 0; + while( !feof(fp) ) + { + if( (tmp_ch = fgetc(fp)) != '"' ) + data_ptr[index++] = tmp_ch; + else + { + data_ptr[index] = '\0'; + //printf("take_str end: %s.\r\n",data_ptr); + return 1; + } + } + printf("[debug] Error: Can't find a [%c] as ending of a text before the End of file.\r\n",'"'); + return 0; + } + //printf("take_str end: %s.\r\n",data_ptr); +} // end of take_str; + +void debug_color_out(int attr,int color,int bg,char *str) +{ + int len=strlen(str); + char tmp_str[len+14]; + strcpy(tmp_str,str); + TxtColor(attr,color,bg,tmp_str); + debug_ascii_out_proc(tmp_str); +} + + +void help_cmm(int index,char *str1,char *str2) +{ + char temp_str[3]; + char temp_str1[64],temp_str2[1024]; + strcpy(temp_str1,str1); + strcpy(temp_str2,str2); + debug_ascii_out_proc("Usage "); + sprintf(temp_str,"%d : ",index); + debug_ascii_out_proc(temp_str); + debug_color_out(BRIGHT,YELLOW,BLACK,temp_str1); + debug_ascii_out_proc("\r\n"); + debug_ascii_out_proc(" "); + formatstr(10,temp_str2,0); + debug_ascii_out_proc(temp_str2); + debug_ascii_out_proc("\r\n"); +} + +void formatstr(int len,char *str,BYTE type) +{ + int i, index_1=0, index_2=0; + char temp_str1[1024],temp_str2[1024]; + char format_str[1024]; + char space[80]; + char *p; + int str_len; + double line_num; + if(type) + { + for(i=0;i1024) + { + debug_color_out(BRIGHT,RED,BLACK,"Error : Remark is too long !\r\n"); + return ; + } + p=str; + strcpy(format_str,""); + while(*p!='\0') + { + i=0; + while(i70 && str[i]<97) || str[i]>102)) + break; + } + if(i==strlen(str)) + return 1; + else + return 0; + } + else if(type==2) + { + for(i=0;i90 && str[i]<97) || str[i]>122)) + break; + } + if(i==strlen(str)) + return 1; + else + return 0; + } + else + return 0; +} + +void strpcat(char *dest_str,DWORD *dest_p,const char *src_str) +{ + while((*(dest_str+(*dest_p)++)=*src_str++)); + (*dest_p)--; +} + +void pick_name(char *str_ptr, char *word_ptr,char *temp_ch) +{ + int start_index,end_index,i; + char temp_str[512],*ch; + strcpy(temp_str,str_ptr); + start_index=end_index=i=0; + if(temp_ch!=NULL) + { + for(start_index=0;start_index0;end_index--) + if(*(word_ptr+end_index)!=' ' && *(word_ptr+end_index)!='\t') + break; + *(word_ptr+end_index+1)='\0'; + } +} + + +int get_my_address (struct in_addr *addr) +{ + struct ifreq req; + int sock; + + sock = socket(AF_INET, SOCK_DGRAM, 0); + strncpy (req.ifr_name, "eth0", IFNAMSIZ); + + if ( ioctl(sock, SIOCGIFADDR, &req) < 0 ) + { + printf("failed to ioctl: %s\n", strerror (errno)); + return 0; + } + + memcpy (addr, &((struct sockaddr_in *) &req.ifr_addr)->sin_addr, sizeof (struct in_addr)); + return 1; +} +/*@end@*/ + +////////////////////////////End of Other/////////////////////////// diff --git a/omc/plat/debug/src/include/.copyarea.db b/omc/plat/debug/src/include/.copyarea.db new file mode 100644 index 0000000..534d80d --- /dev/null +++ b/omc/plat/debug/src/include/.copyarea.db @@ -0,0 +1,6 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\debug\src\include +2 +2 +7:debug.h|1|11d70a3ed79|655|b1b7068c|e6b482ce6cf311dd91a5001c23e19543|0 +e:debug_struct.h|1|11d70a3ed4a|2b53|adf2b80f|e62482b66cf311dd91a5001c23e19543|0 diff --git a/omc/plat/debug/src/include/debug.h b/omc/plat/debug/src/include/debug.h new file mode 100644 index 0000000..cc312a5 --- /dev/null +++ b/omc/plat/debug/src/include/debug.h @@ -0,0 +1,64 @@ +/* Debug module strucutre head file */ +/* Written by Liu Wei 2005-05-10 */ +/* Version 4.0 */ +/* -------------------------------- */ + +#ifndef _DEBUG +#define _DEBUG + +#include "debug_struct.h" +#include "dirent.h" + +/* by simon at 23/9/25 +mib_node *mib_root_node; +mib_node *mib_curr_node; +menu_node *menu_root_node; +menu_node *menu_curr_node; +mib_node mib_nodes[MIB_MAX_NODES]; +*/ + +/* by simon at 23/9/25 +//for test + char file_name[128]; + FILE *fp_prt; + long int timeuse,max_time; + struct timeval tv_start, tv_end; +//for test +*/ + +/* by simon at 23/9/25 +menu_node menu_nodes[MENU_MAX_NODES]; +mib_child_node mib_child_nodes[MIB_MAX_CHILD_NODES]; + +debug_snmp_agent debug_snmp_agent_buf[MAX_PACKET_NUM]; + end by simon */ + +//////////////////////////////interface declaration//////////////////////// + +void debug_init(); + +void debug_rt(); + + +WORD find_child_index(mib_node *node_ptr, DWORD oid, char *name, BYTE type); + +mib_node *find_node(mib_node *start_node_ptr, char *node_name, int find_type, DWORD *last_node_oid); + +mib_node *search_mib_node(mib_node *start_mib_node_ptr, DWORD *oid, BYTE oid_len); + +int debug_set_response(unsigned char object_id_len,unsigned int *object_id,unsigned char *data,unsigned short data_len); + +int debug_get_response(unsigned char object_id_len,unsigned int *object_id,unsigned char *data,unsigned char *vartype); + +menu_node *search_menu_node(menu_node *start_menu_node_ptr, BYTE *menu_id, BYTE id_len); + +void Clear_Access_History(); + +void debug_set_agent(); + +void debug_get_agent(); + +int get_my_address (struct in_addr *addr); + +//////////////////////////////end of interface declaration//////////////////////// +#endif diff --git a/omc/plat/debug/src/include/debug_struct.h b/omc/plat/debug/src/include/debug_struct.h new file mode 100644 index 0000000..f16eb71 --- /dev/null +++ b/omc/plat/debug/src/include/debug_struct.h @@ -0,0 +1,375 @@ + /* Debug module strucutre head file */ +/* Written by Liu Zhiguo 2003-04-22 */ +/* Version 2.0 */ +/* -------------------------------- */ + +#ifndef _DEBUG_STRUCT +#define _DEBUG_STRUCT + +#include "../../../public/src/include/pub_include.h" +#include "../../../iptrans/src/include/iptrans.h" +#include "../../../snmp/src/include/snmp.h" +#include "../../../snmp/src/include/heartbeat.h" + +//Module ID +//0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 +//a b c d e f g h i j k l m n o p q r s t u v w x y z +//a b c d e f g h i j k l m n o p r s t u v w y z + +#define DEBUG_PORT 4965 +#define DEBUG_SNMP_PORT 4956 +#define SNMP_PORT 4957 +#define DEBUG_VERSION "R9V0_03" + +#define TELNET_SEND_BUF_LEN 1000 +#define SERIAL_BUF_LEN 2048 +#define DEBUG_MAX_PAGE 2 +#define PAGE_MODULE_COUNT 24 +#define MODULE_COUNT (PAGE_MODULE_COUNT*DEBUG_MAX_PAGE) +#define DEBUG_MAX_SEQID 0x7fffffff +#define DEBUG_SEQID_LEN 8 +#define DEBUG_OMCBUF_LEN 1024 +#define DEBUG_NAME_LEN 8 +#define PAGE_COUNT 24 +#define LINE_COUNT 23 +#define MAX_ROW 25 +#define MAX_COLUMN 80 +#define TITLE_CHAR 2048 +#define MAX_ASCII_LEN (1024*16) + +#define DEBUG_SHM_KEY 0xa0600000 +#define DEBUG_SHM_PERM 0664 + +#define MENU_TYPE 0 +#define OID_TYPE 1 + +// MIB wangjian add +#define MIB_LIST_FILE "mib_list_file.txt" +#define MIB_FILES_DIR "./conf/MIB_files/" +#define MIB_OMC_PUB_SYSCONF_FILE "OMC_PUB_sysConf.csv" +#define MIB_PARAM_LIST_FILE "mib_param_list_file.txt" +#define MIB_WRITE_TREE "mib_write_tree.txt" +#define MIB_SYSTEM_CONFIG_FILE "System_Config.txt" +#define MIB_SYSTEM_IP_LIST_FILE "System_IP_List.txt" +#define MENU_TREE_FILE "menu_tree.txt" + +#define MIB_MAX_CHILD_NODES_PER_NODE 256 +#define MIB_MAX_NODES 1536 +#define MIB_MAX_CHILD_NODES 1536 * 5 + +#define MIB_MAX_PARAM_SELECTS 1536 * 8 +#define MIB_MAX_PARAM_INPUTS 1536 * 8 +#define MIB_MAX_NODE_PARAMS 1536 * 4 +#define MAX_TOTAL_INSTANCE 2048 +#define MAX_NODE_PACKET_LENGTH 256 +#define MAX_SEND_CHAR_NUM 512 + +//#define MIB_OPER_TYPE_GET 1 +//#define MIB_OPER_TYPE_GET_ALL 2 +//#define MIB_OPER_TYPE_SET 3 +//#define MIB_OPER_TYPE_HELP 4 + +#define MIB_MODULE_REVISION_MAX_NUM 10 + +#define MIB_SUBSYS_MODULE_MAX_NUM 64 + +#define MIB_HOST_MAX_NUM 127 + +#define MIB_NODE_PARAM_MAX_LEN 64 +#define GROUP_NUM 2 +#define MEMBER_MAX_NUM 16 +#define MENU_MAX_NODES 640 + +#define TODEC_HIGH_0 0 +#define KEEPHEX_HIGH_0 1 +#define KEEPHEX_LOW_0 2 +#define KEEPHEX_LOW_E 3 +#define KEEPHEX_LOW_F 4 +#define TOASCII_LOW_0 5 +#define KEEPASC_LOW_F 6 + + +#define MAX_PACKET_NUM 16 +#define MAX_SELECT_OPTION_NUM 21 +#define MAX_OPTION_LENGTH 32 +#define MAX_HOST_IP 16 +#define MAX_PARAM_NUM 64 + +typedef struct CommandList +{ + char cmm[128]; + struct CommandList *nextcmm; +}cmmset,cmmrem; + +// MIB end + +typedef struct _DEBUG_TELNET_SEND_DATA +{ + int telsend_datah; + BYTE telsend_data[TELNET_SEND_BUF_LEN]; +}DEBUG_TELNET_SEND_DATA; + +struct debug_line +{ + BYTE pt_vartype; + WORD length; + BYTE *pointer; +}; + +struct debug_page +{ + BYTE pointer_set_flag; + char title[TITLE_CHAR]; + struct debug_line line_d[LINE_COUNT]; +}; + +typedef struct debug_module_struct +{ + char name[DEBUG_NAME_LEN]; + char status[2]; + char version[20]; + BYTE maxpage; + BYTE ascii_in_set_flag; + BYTE ascii_out_set_flag; + BYTE *ascii_in; + WORD ascii_in_len; + BYTE *ascii_out; + WORD ascii_out_len; + struct debug_page page_d[PAGE_COUNT]; + int seqid_h; // head sequence id for omc get + int seqid_t; // tail sequence id for omc get + BYTE omc_outbuf[DEBUG_SEQID_LEN][DEBUG_OMCBUF_LEN]; +} debug_module_struct; + +typedef struct debug_shm_struct +{ + debug_module_struct module_d[MODULE_COUNT]; + DEBUG_TELNET_SEND_DATA TelnetSendData; +} debug_shm_struct; + +// by simon at 23/9/25 +//struct debug_shm_struct *debug_shm_ptr; +//struct iptrans_shm *pIptransShm; + +// MIB wangjian add +typedef struct _mibfile_imports_data +{ + char father_name[64]; + char from_file[32]; +} mibfile_imports_data; + +typedef struct _mibfile_module_data +{ + char name[64]; // nod name + char LU[32]; // LAST-UPDATED + char OR[64]; // ORGANIZATION + char CI[128]; // CONTACT-INFO + char DE[1024]; // DESCRIPTION + char RE[MIB_MODULE_REVISION_MAX_NUM][32]; // REVISION + char RE_DE[MIB_MODULE_REVISION_MAX_NUM][1024]; // REVISION'S DESCRIPTION + int RE_index; // the number of RE and RE_DE + char father_name[64]; // father's name + char ID[32]; // child ID +} mibfile_module_data; + +typedef struct _mibfile_object_data +{ + char name[64]; // nod name + int ST; // STATUS: 1: current, 2: deprecated, 3: obsolete. 0: invalid + char DE[1024]; // DESCRIPTION + char RF[1024]; // ReferPart + char father_name[64]; // father's name + char ID[32]; // child ID +} mibfile_object_data; + +typedef struct _mibfile_type_data +{ + char name[64]; // nod name + int SY; // SYNTAX: 0:invalid. 1: Integer32, 2: INTEGER, 3: OCTET STRING, 4: OBJECT IDENTIFIER, 5: BITS, 6: IpAddress, 7: Counter32, + // 8: Gauge32, 9: TimeTicks, 10: Opaque, 11: Counter64, 12: Unsigned32, 13:Conceptual Tables + char UP[32]; // UnitsPart + BYTE MA; // MAX-ACCESS: 0: invalid, 1: not-accessible, 2: accessible-for-notify, 3: read-only, 4: read-write, 5: read-create 6: write-only + int ST; // STATUS + char DE[8192]; // DESCRIPTION + int total_instance; // total_instance + char RF[1024]; // ReferPart; + char father_name[64]; // father's name + char ID[32]; // child ID +} mibfile_type_data; + +//typedef int (*mib_call)(DWORD *oid, BYTE oid_len, char *name, char *value, BYTE oper_type); + +typedef struct _mib_child_node +{ + char name[64]; + DWORD oid; + void *child_ptr; +} mib_child_node; + +typedef struct _mib_node +{ + void *parent_ptr; + char name[32]; + BYTE oid_len; + DWORD oid[32]; + BYTE data_length; + BYTE module_index; + WORD total_instance; + WORD curr_instance; + WORD total_child_nodes; + BYTE enable_field_id; + BYTE enable_flag[32]; + BYTE access_history; + char init_value[256]; + //mib_call mib_proc; + char *remark_ptr; + //char remark[DEBUG_OMCBUF_LEN * 2]; + mib_child_node *child_nodes[MIB_MAX_CHILD_NODES_PER_NODE]; + BYTE max_access; // MAX-ACCESS: 0: invalid, 1: not-accessible, 2: accessible-for-notify, 3: read-only, 4: read-write, 5: read-create 6: write-only +}mib_node; + +typedef struct _menu_node +{ + void *father_ptr; + void *child_node[MENU_MAX_NODES]; + mib_node *menu_oid_node; + BYTE oid[23]; + BYTE id_len; + BYTE total_menu_child; + char name[32]; + BYTE menu_id[20]; + BYTE sys_group; +}menu_node; + +// MIB FIELD struct +typedef struct _mib_param_select +{ + WORD number; + char description[MIB_NODE_PARAM_MAX_LEN]; +} mib_param_select; + +typedef struct _instance_arr +{ + DWORD ins; + BYTE eable; +}INSTANCE_ARR; + +typedef struct _mib_param_input +{ + BYTE input_param_type; // 0: toDec_high_0 + // 1: keepHex_high_0 + // 2: keepHex_low_0 + // 3: keepHex_low_E + // 4: keepHex_low_F + // 5: toAscii_low_0 + // 6: keepAscii_low_F + char input[MIB_NODE_PARAM_MAX_LEN]; +} mib_param_input; + +typedef struct _mib_node_param +{ + void *parent_ptr; + char name[64]; + BYTE id; + BYTE byte_begin; + BYTE byte_end; + BYTE bit_begin; + BYTE bit_end; + mib_param_select *select_ptr[16]; + BYTE select_total; + BYTE select_value; + mib_param_input *input_ptr; +} mib_node_param; + + + + +typedef struct _mib_subsys_module +{ + BYTE index; + DWORD oid[8]; + char name[10]; + BYTE max_group; + //char obj_type_no[3]; +}mib_subsys_module; + +typedef struct _mib_host +{ + BYTE index; + BYTE group_index; + BYTE member_index; + char host_name[32]; + WORD host_ip[4]; +}mib_host; + +typedef struct _module_command_save_flag +{ + BYTE module_index; + DWORD oid[32]; + BYTE oid_len; + BYTE save_select_id; + BYTE save_field_id; +}module_command_save_flag; + + +typedef struct param_field +{ + char name[48]; //set fill in + char curr_input_value[32]; //set fill in + BYTE input_type; + BYTE curr_select_id; + BYTE total_select; + WORD value_arr[MAX_SELECT_OPTION_NUM]; + char value_arr_remark[MAX_SELECT_OPTION_NUM][MAX_OPTION_LENGTH]; +}param_field; + +typedef struct debug_snmp_agent_packet +{ + DWORD oid[32]; //set fill in + //0 idle 1 waitting get 2 waitting set 3 process 4 fail 5 success + BYTE cmm_state; //set fill in + //0 success 1 time out 2 buffer full 3 oid error 4 ip str error + //5 instance error 6 leaf node param forbidden 7 total field error + //8 no select option 9 snmp send error 1xx no child 2xx no select 3xx field input error + BYTE result_state; + BYTE agentClient; + BYTE oid_len; //set fill in + BYTE total_field; //set fill in + WORD total_instance; //set fill in + BYTE total_ip; //set fill in + char dst_ip[MAX_HOST_IP][15]; //set fill inxxx.xxx.xxx.xxx + param_field param_field_arr[MAX_PARAM_NUM]; + +}debug_snmp_agent; + +//MIB end + + + +typedef struct _comput_list +{ + BYTE list_field_id; + char field_val[256][32]; + mib_node *list_node; +}compute_list; + +typedef struct _compute_field +{ + char name[32]; + mib_node *compute_node; + BYTE field_id; + char syntax_str[10][64]; + BYTE syntax_count; + char print_val_str[128][32]; + char print_name_str[128][32]; + BYTE print_count; +}compute_field; + +typedef struct _wxc2_debug_info +{ + char wxc2_ver[32]; + BYTE sys_type; // cdma 1 gsm 2 gc_ssw 3 + BYTE mmi_switch; // on 1 0 off +}wxc2_debug_info; + +#endif diff --git a/omc/plat/debug/ut/.copyarea.db b/omc/plat/debug/ut/.copyarea.db new file mode 100644 index 0000000..d0251ac --- /dev/null +++ b/omc/plat/debug/ut/.copyarea.db @@ -0,0 +1,5 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\debug\ut +2 +1 +c:debug_test.c|1|11d70a3ee25|68b1|93f0cb41|cd5967b5bfa411dc8511001c23e19543|0 diff --git a/omc/plat/debug/ut/debug_test.c b/omc/plat/debug/ut/debug_test.c new file mode 100644 index 0000000..7731f30 --- /dev/null +++ b/omc/plat/debug/ut/debug_test.c @@ -0,0 +1,926 @@ + +/************************************************ + * debug_test.c + * Author: LiuWei + * Create: 2005-05-31 +************************************************/ + +#include "./include/debug.h" +#include "../../iptrans/src/include/iptrans.h" +#include "../../snmp/src/include/snmp.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#define BUFLEN 1024 +#define MAX_RECV_NONE 20 +#define REC_NUM 50 + +char shellcode[] = "\x97\x97\x97\x97\x97\x97"; + +//add test line + +static struct itimerval itimer, old_itimer; +fd_set rset; +BYTE connect_flag = 0; +struct sockaddr_in sin_addr; +int flag = 1; +int sockfd; +char buffer[2048]; +int command_list_count; +BYTE recv_over = 0; +int addr_len = sizeof(struct sockaddr_in); +int len = 0; +BYTE recv_ten_times = 0; +BYTE test_style = 2; +BYTE test_snmp_mode = 0; +char oid_cmm_state[128]; +BYTE recv_none = 0; +//char file_name[128]; +FILE *fp_conf,*fp_agent; +struct timeval tv_start, tv_end; +long timeuse; +long max_time; +int i, j; +int time_vel; +int multi; +char data_arr[1024], multi_str[16]; +char command[1024]; +char oid_command[128]; + + +void AsciiToRbcd (BYTE *bcd_buf, const char *ascii_buf, int len); +void MMI_telnet(); +void MMI_telnet_send(char *str); +void MMI_auto_test(); +void MMI_telnet_recv(); +void Set_Timer(); +void On_Timer(); +void MMI_telnet_cmd(); +void debug_snmp_agent_test_input(); +void debug_snmp_agent_test_output(); +void debug_snmp_print(); +void MMI_File_Test(char *data_arr); + +void usage(char *p) +{ + printf("Usage: %s [ip] [-a atuo test] [-m manual test] [-n normal start] [-f script file]\n\n", p); + printf("\n"); + exit(0); +} + +void msg(char *msg) +{ + perror(msg); + exit(errno); +} + +u_int32_t get_ip(char *host) +{ + struct hostent *hp; + + if(!(hp = gethostbyname(host))) + { + fprintf(stderr, "cannot resolve %s\n", host); + return (0); + } + return (*(u_int32_t *) hp->h_addr_list[0]); +} + +int get_socket(char *target, int port) +{ + int sock; + u_int32_t ip; + + if(!(ip = get_ip(target))) + return (0); + + bzero(&sin_addr, sizeof(sin_addr)); + sin_addr.sin_family = AF_INET; + sin_addr.sin_port = htons(port); + sin_addr.sin_addr.s_addr = ip; + + if(!(sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) + msg("Get socket:"); + if(ioctl(sock, FIONBIO, &flag) == -1) + { + printf("Set nonblock:"); + close(sockfd); + exit(1); + } + if(connect(sock, (struct sockaddr *)&sin_addr, sizeof(sin_addr)) < 0) + if((errno != EWOULDBLOCK) && (errno != EINPROGRESS)) + msg("Connect:"); + return (sock); +} + +void send_wont(int sock, int option) +{ + char buf[3], *ptr = buf; + + *ptr++ = IAC; + *ptr++ = WONT; + *ptr++ = (unsigned char)option; + if(write(sock, buf, 3) < 0) + msg("write"); + return; +} + +void send_will(int sock, int option) +{ + char buf[3], *ptr = buf; + + *ptr++ = IAC; + *ptr++ = WILL; + *ptr++ = (unsigned char)option; + if(write(sock, buf, 3) < 0) + msg("write"); + return; +} + +void send_do(int sock, int option) +{ + char buf[3], *ptr = buf; + + *ptr++ = IAC; + *ptr++ = DO; + *ptr++ = (unsigned char)option; + if(write(sock, buf, 3) < 0) + msg("write"); + return; +} + +void send_env(int sock, char *name, char *value) +{ + char buf[BUFLEN], *ptr = buf; + + *ptr++ = IAC; + *ptr++ = SB; + *ptr++ = TELOPT_NEW_ENVIRON; + *ptr++ = TELQUAL_IS; + *ptr++ = NEW_ENV_VAR; + strncpy(ptr, name, BUFLEN - 20); + ptr += strlen(ptr); + *ptr++ = NEW_ENV_VALUE; + strncpy(ptr, value, (&buf[BUFLEN - 1] - ptr) - 1); + ptr += strlen(ptr); + *ptr++ = IAC; + *ptr++ = SE; + + if(write(sock, buf, (ptr - buf)) < 0) + msg("write"); + return; +} + +void do_negotiate(int sock) +{ + send_will(sock, TELOPT_ECHO); + send_wont(sock, TELOPT_TTYPE); + send_wont(sock, TELOPT_NAWS); + send_wont(sock, TELOPT_LFLOW); + send_wont(sock, TELOPT_LINEMODE); + send_wont(sock, TELOPT_XDISPLOC); + send_will(sock, TELOPT_LFLOW); + send_will(sock, TELOPT_LINEMODE); + send_wont(sock, TELOPT_OLD_ENVIRON); + send_will(sock, TELOPT_NEW_ENVIRON); + send_will(sock, TELOPT_BINARY); + send_env(sock, "TTYPROMPT", shellcode); + return; +} + +int main(int argc, char **argv) +{ + int c, port = DEBUG_PORT; + char host[36] = "172.18.234.231"; + + strcpy(command, ""); + strcpy(oid_command, ""); + strcpy(oid_cmm_state, ""); + if(argc < 2) + usage(argv[0]); + + tv_start.tv_sec = 0; + tv_start.tv_usec = 0; + tv_end.tv_sec = 0; + tv_end.tv_usec = 0; + + + + + //ioperm(0x378,3,1); + /* + strcpy(file_name, ""); + strcat(file_name, "debug_agent.txt"); + remove(file_name); + */ + + strcpy(file_name, ""); + strcat(file_name, "debug_test_time_log.txt"); + remove(file_name); + + if((fp_prt = fopen(file_name, "a+")) == NULL) + { + printf("[debug] Error: cannot open %s.\r\n", file_name); + return 0; + } + + + while((c = getopt(argc, argv, "famn")) != -1) + { + switch (c) + { + case 'f': // costumer test + printf("The Debug test control by command script!"); + test_style = 4; + break; + case 'a': // auto test + printf("The Debug Atuo Test!"); + test_style = 1; + break; + case 'm': // manually test + printf("The Debug manually Test!"); + test_style = 2; + break; + case 'n': // normal start + printf("The Debug Normal start!"); + test_style = 3; + break; + } + } + debug_init(1); + iptrMainInit(); + snmp_init(4957); + + if(!(sockfd = get_socket(host, port))) + exit(-1); + command_list_count = 0; + if(test_style == 4) + strcpy(command, ""); + strcpy(multi_str, ""); + strcpy(data_arr, ""); + strcpy(file_name, ""); + strcat(file_name, "debug_test_conf.txt"); + j = REC_NUM + 1; + if((fp_conf = fopen(file_name, "r")) == NULL) + { + printf("[debug] Error: cannot open %s.\r\n", file_name); + return 0; + } + + Set_Timer(); + while(1) + { + usleep(10); + } + +} + +void MMI_File_Test(char *data_arr) +{ + + for(i = 0; i < strlen(data_arr); i++) + if(data_arr[i] == ' ') + break; + if(i != strlen(data_arr)) + strncpy(multi_str, data_arr, i); + multi_str[i] = '\0'; + multi = strtoul(multi_str, NULL, 10); + for(; i < strlen(data_arr); i++) + { + if(data_arr[i] != ' ') + break; + } + strcpy(command, data_arr + i); + if(strncasecmp(command, "\\e", 2) == 0) + { + command[0] = 27; + command[1] = '\0'; + } + if(strcmp(command, oid_command) != 0) + { + strcpy(oid_command, command); + if(strcmp(command, "\e") == 0) + fprintf(fp_prt, "Command :\e\n"); + else + fprintf(fp_prt, "Command :%s \n", command); + } + + if(strcmp(command, "\e") != 0) + { + strcat(command, "\r\n"); + } + printf("%s", command); + MMI_telnet_send(command); + usleep(5); + + recv_over = 0; + usleep(time_vel); + +} + +void MMI_auto_test() +{ + + strcpy(command, ""); + switch (command_list_count) + { + case 0: + strcpy(command, "\e"); + multi = 1; + break; + case 1: + strcpy(command, "menu"); + multi = 5; + break; + case 2: + + strcpy(command, "contents"); + multi = 8; + break; + case 3: + strcpy(command, "cd 1"); + multi = 10; + break; + case 4: + strcpy(command, "cd 4"); + multi = 10; + break; + case 5: + strcpy(command, "list -a -f[2 4 10] -r -t"); + multi = 25; + break; + case 6: + strcpy(command, "get #0.1"); + multi = 15; + break; + case 7: + strcpy(command, "cmm"); + multi = 15; + break; + case 8: + strcpy(command, "\e"); + multi = 20; + break; + /* + case 9: + strcpy(command, "log all"); + multi = 150; + break; + case 10: + strcpy(command, "\e"); + multi = 10; + break; + case 11: + strcpy(command, "\e"); + multi = 10; + break; + case 12: + strcpy(command, "log none"); + multi = 15; + break; + case 13: + strcpy(command, "\e"); + multi = 15; + break; + case 14: + strcpy(command, "help"); + multi = 15; + break; + case 15: + strcpy(command, "\e"); + multi = 15; + break; + */ + default: + command_list_count = 0xfffe; + break; + } + command_list_count++; + if(command_list_count == 0xffff) + { + test_snmp_mode = 1; + printf("The command test over\r\n"); + printf("Test snmp senior interface......\r\n"); + return; + } + time_vel = multi * 500; + if(command_list_count != 0xffff && recv_over == 2) + { + + if(strcmp(command, oid_command) != 0) + { + strcpy(oid_command, command); + if(strcmp(command, "\e") == 0) + fprintf(fp_prt, "Command :\e"); + else + fprintf(fp_prt, "Command :%s ", command); + } + + if(strcmp(command, "\e") != 0) + { + strcat(command, "\r\n"); + } + MMI_telnet_send(command); + + usleep(5); + if(command_list_count > 0) + printf("%s", command); + recv_over = 0; + usleep(time_vel); + } + else + command_list_count--; +} + +void MMI_telnet_recv() +{ + + len = 0; + bzero(buffer, sizeof(buffer)); + + len = recvfrom(sockfd, buffer, sizeof(buffer), 0, + (struct sockaddr *)&sin_addr, &addr_len); + if(len > 0) + { + printf("%s", buffer); + recv_none = 0; + } + else + { + if(recv_none < MAX_RECV_NONE) + recv_none++; + else if(recv_over == 1) + recv_over = 2; + return; + } + if(strstr(buffer, "<--")) + { + recv_over = 1; + return; + } + if(strstr(buffer, "CMM>") || strstr(buffer, "CFG>") || + strstr(buffer, "MENU>") || recv_over == 1) + recv_over = 2; + return; +} + +void MMI_telnet_cmd() +{ + + + + if(ioctl(fileno(stdin), FIONBIO, &flag) == -1) + { + printf("Set stdin nonblock:"); + exit(1); + } + len = 0; + bzero(buffer, sizeof(buffer)); + strcpy(command, ""); + fgets(buffer, sizeof(buffer), stdin); + len = strlen(buffer); + if(!len) + return; + strcpy(command, buffer); + if(strcmp(command, oid_command) != 0) + { + strcpy(oid_command, command); + + if(strcmp(command, "\e") == 0) + fprintf(fp_prt, "Command :ESC"); + else + fprintf(fp_prt, "Command :%s ", command); + + } + usleep(5); + if(strstr(buffer, "\e\n")) + recv_over = 2; + if(strcmp(buffer, "\e\n") != 0) + { + buffer[strlen(buffer) - 1] = '\0'; + strcat(buffer, "\r\n"); + } + if(recv_over > 1) + { + if(sendto(sockfd, buffer, len, 0, (struct sockaddr *)&sin_addr, + addr_len) < 0) + msg("Send"); + recv_over = 0; + } +} + +void MMI_telnet_send(char *str) +{ + bzero(buffer, sizeof(buffer)); + strcpy(buffer, str); + len = strlen(buffer); + if(strlen(str)) + if(sendto(sockfd, buffer, len, 0, (struct sockaddr *)&sin_addr, + addr_len) < 0) + msg("Send"); +} + +void On_Timer() +{ + if(test_style == 1) + { + iptrans_timer(); + snmp_timer(); + outb(0xff, 0x378); + //timeuse = 0; + //gettimeofday(&tv_start, NULL); + debug_rt(); + /* + gettimeofday(&tv_end, NULL); + timeuse = + 1000000 * (tv_end.tv_sec - tv_start.tv_sec) - + tv_start.tv_usec + tv_end.tv_usec; + if(timeuse > max_time) + max_time = timeuse; + fprintf(fp_prt, + " debug_rt time used: %ld (u sec)<=%ld\r\n\r\n", + timeuse, max_time); + */ + outb(0x00, 0x378); + if(connect_flag == 0) + { + do_negotiate(sockfd); + MMI_telnet_recv(); + send_wont(sockfd, TELOPT_BINARY); + MMI_telnet_recv(); + FD_ZERO(&rset); + connect_flag = 1; + } + MMI_telnet_recv(); + if(!test_snmp_mode) + MMI_auto_test(); + else + { + debug_snmp_agent_test_input(); + debug_snmp_agent_test_output(); + debug_snmp_print(); + } + } + if(test_style == 2) + { + + iptrans_timer(); + snmp_timer(); + outb(0xff, 0x378); + //timeuse = 0; + //gettimeofday(&tv_start, NULL); + debug_rt(); + /* + gettimeofday(&tv_end, NULL); + timeuse = + 1000000 * (tv_end.tv_sec - tv_start.tv_sec) - + tv_start.tv_usec + tv_end.tv_usec; + if(timeuse > max_time) + max_time = timeuse; + fprintf(fp_prt, + " debug_rt time used: %ld (u sec)<=%ld\r\n\r\n", + timeuse, max_time); + */ + outb(0x00, 0x378); + if(connect_flag == 0) + { + do_negotiate(sockfd); + MMI_telnet_recv(); + send_wont(sockfd, TELOPT_BINARY); + MMI_telnet_recv(); + FD_ZERO(&rset); + connect_flag = 1; + } + MMI_telnet_recv(); + MMI_telnet_cmd(); + } + if(test_style == 3) + { + iptrans_timer(); + snmp_timer(); + + //timeuse = 0; + // gettimeofday(&tv_start, NULL); + //outb(0xff, 0x378); + debug_rt(); + //outb(0x00, 0x378); + /* + gettimeofday(&tv_end, NULL); + timeuse = + 1000000 * (tv_end.tv_sec - tv_start.tv_sec) - + tv_start.tv_usec + tv_end.tv_usec; + if(timeuse > max_time) + max_time = timeuse; + fprintf(fp_prt, + "debug_rt time used: %ld (u sec)<=%ld\r\n\r\n", + timeuse, max_time); + */ + + } + if(test_style == 4) + { + iptrans_timer(); + snmp_timer(); + + timeuse = 0; + gettimeofday(&tv_start, NULL); + outb(0xff, 0x378); + debug_rt(); + outb(0x00, 0x378); + + gettimeofday(&tv_end, NULL); + timeuse = + 1000000 * (tv_end.tv_sec - tv_start.tv_sec) - + tv_start.tv_usec + tv_end.tv_usec; + + if(timeuse > max_time) + max_time = timeuse; + if(timeuse>500) + fprintf(fp_prt, + " debug_rt time used: %ld (u sec)<=%ld\r\n\r\n", + timeuse, max_time); + + if(connect_flag == 0) + { + do_negotiate(sockfd); + MMI_telnet_recv(); + send_wont(sockfd, TELOPT_BINARY); + MMI_telnet_recv(); + FD_ZERO(&rset); + connect_flag = 1; + } + MMI_telnet_recv(); + if(recv_over == 2) + { + if(!feof(fp_conf)) + { + + fgets(data_arr, 1024, fp_conf); + if(data_arr[strlen(data_arr) - 1] == '\n') + data_arr[strlen(data_arr) - 1] = '\0'; + else + { + if(!feof(fp_conf)) + { + printf("Debug test conf file error!:%s\n",data_arr); + exit(0); + } + } + + if(!strlen(data_arr) ||(strstr(data_arr,"\\")) == data_arr + 0) + return; + MMI_File_Test(data_arr); + + } + else + { + if(j == 1) + test_style = 0; + else if(j > 0) + { + j--; + rewind(fp_conf); + } + } + } + } +} + +void Set_Timer() +{ + struct sigaction act; + + act.sa_handler = On_Timer; + sigemptyset(&act.sa_mask); + act.sa_flags = 0; + if(sigaction(SIGALRM, &act, NULL) < 0) + { + perror("Produce Sigaction"); + exit(1); + } + + itimer.it_interval.tv_sec = 0; + itimer.it_interval.tv_usec = 20 * 1000; + itimer.it_value.tv_sec = 0; + itimer.it_value.tv_usec = 20 * 1000; + + if(setitimer(ITIMER_REAL, &itimer, &old_itimer) != 0) + { + printf("Setting Timer error! \n"); + exit(1); + } +} + +void debug_snmp_agent_test_input() +{ + debug_snmp_agent snmp_agent_packet1; + DWORD temp_oid1[32] = + { 1, 3, 6, 1, 4, 1, 1373, 1, 3, 3, 2, 2, 2, 1, 2 }; + DWORD temp_oid2[32] = + { 1, 3, 6, 1, 4, 1, 1373, 1, 3, 3, 2, 2, 2, 1, 3 }; + WORD i,index; + + for(i=0;i3) + debug_snmp_agent_buf[i].cmm_state=6; + } + +} + + +void debug_snmp_print() +{ + char cmm_state_flag[128], result_state_flag[128], temp_str[32]; + WORD i, j; + + + strcpy(file_name, ""); + strcat(file_name, "debug_agent.txt"); + + if((fp_agent = fopen(file_name, "a+")) == NULL) + { + printf("[debug] Error: cannot open %s.\r\n", file_name); + return ; + } + + strcpy(cmm_state_flag, "cmm_state: "); + strcpy(result_state_flag, "result : "); + fprintf(fp_agent,"\r\nDebug snmp senior interface buffer: \r\n"); + fprintf(fp_agent,"index : "); + for(i = 0; i < 16; i++) + fprintf(fp_agent,"%3d ", i); + fprintf(fp_agent,"\r\n"); + for(i = 0; i < MAX_PACKET_NUM; i++) + if(debug_snmp_agent_buf[i].cmm_state != 0) + break; + //if(i == MAX_PACKET_NUM) + // return; + + for(i = 0; i < MAX_PACKET_NUM; i++) + { + sprintf(temp_str, "%3d ", debug_snmp_agent_buf[i].cmm_state); + strcat(cmm_state_flag, temp_str); + } + if(strcmp(oid_cmm_state, cmm_state_flag) != 0) + { + + strcpy(oid_cmm_state, cmm_state_flag); + fprintf(fp_agent,cmm_state_flag); + fprintf(fp_agent,"\r\n"); + for(i = 0; i < MAX_PACKET_NUM; i++) + { + sprintf(temp_str, "%3d ",debug_snmp_agent_buf[i].result_state); + strcat(result_state_flag, temp_str); + } + fprintf(fp_agent,result_state_flag); + + fprintf(fp_agent,"\r\n id OID OID_len Total field Total instance \r\n"); + for(i = 0; i < MAX_PACKET_NUM; i++) + { + strcpy(cmm_state_flag, ""); + sprintf(temp_str, "[%2d]: ", i); + strcat(cmm_state_flag, temp_str); + for(j = 0; j < 32 && debug_snmp_agent_buf[i].oid[j] != 0; + j++) + { + sprintf(temp_str, "%ld.", + debug_snmp_agent_buf[i].oid[j]); + strcat(cmm_state_flag, temp_str); + } + if(j < debug_snmp_agent_buf[i].oid_len - 1) + { + fprintf(fp_agent,"%ld.", debug_snmp_agent_buf[i].oid[j]); + } + sprintf(temp_str, " %d ", + debug_snmp_agent_buf[i].oid_len); + strcat(cmm_state_flag, temp_str); + fprintf(fp_agent,cmm_state_flag); + fprintf(fp_agent," %3d ", + debug_snmp_agent_buf[i].total_field); + fprintf(fp_agent," %3d \r\n", + debug_snmp_agent_buf[i].total_instance); + } + fprintf(fp_agent,"\r\n"); + } + fclose(fp_agent); +} + + + +/* +#define numFuncs 2 + + +typedef void ( *ptFuncDef )(); +ptFuncDef ptFuncArr[] = { &debug_mmi_list, &debug_snmp_get_rt,&debug_snmp_set_rt,&debug_ }; + +for ( i = 0; i < numFuncs; i++ ) +{ + gettimeofday( &start, NULL ); + ptFuncArr[i](); + gettimeofday( &end, NULL ); +} +*/ diff --git a/omc/plat/haepub/.copyarea.db b/omc/plat/haepub/.copyarea.db new file mode 100644 index 0000000..c35176b --- /dev/null +++ b/omc/plat/haepub/.copyarea.db @@ -0,0 +1,9 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\haepub +2 +5 +3:doc|2|0|0|0|cf2966e1bfa411dc8515001c23e19543|0 +2:ut|2|0|0|0|d47967f9bfa411dc8515001c23e19543|0 +3:src|2|0|0|0|d0596735bfa411dc8515001c23e19543|0 +8:Makefile|1|11d70a3eed1|b72|9d4ed28c|cfb96719bfa411dc8515001c23e19543|0 +3:lib|2|0|0|0|cf2966fdbfa411dc8515001c23e19543|0 diff --git a/omc/plat/haepub/Makefile b/omc/plat/haepub/Makefile new file mode 100644 index 0000000..ba6ca16 --- /dev/null +++ b/omc/plat/haepub/Makefile @@ -0,0 +1,98 @@ + +##----------------------------------------------------------## +## ## +## Universal Makefile for module template : V1.6.3 ## +## ## +## Created : Wei Liu 07/04/11 ## +## Revision: [Last]Wei Liu 07/07/07 ## +## ## +##----------------------------------------------------------## + +##---------------------------------------------------------------------## +##-------------------------------------- +## +## Project correlation(Customer define) +## +##-------------------------------------- + +## MODULE= [Module Name] +## TYPE = app/plat => Module Type + +## DBUG_FLAGS_ADD = [Module Define Gcc Flags for Debug ] +## DBUG_FLAGS_ADD = [Module Define Gcc Flags for Release] + +## BUILD = lib/exef => Output file format +## CFG = debug/release => Build Configuration + +## SRC_PATH = [Source file path] +## INC_PATH = [Include file path] +## APP_PATH = [App Module path] +## PLT_PATH = [Plat Module path] + +## PLT_LIB = [Needed plat lib for Link] => just for test or wxc2main +## APP_LIB = [Needed app lib for Link] => just for test or wxc2main +## LIB_ADD = [Needed Extend lib for Link] => just for test or wxc2main + +## PLT_LIB e.g. = haepub fsm mng proto kernel aif mgc mgcp sip rtp \ +## 8ecp bicc smpp xapp tcap mtp3 m2ua \ +## snmp iptrans debug sccp public +## +## APP_LIB e.g. = msc vlr ssf hlr ae pps mnp smsc vms aas +## LIB_ADD e.g. = -liba3a8 -lm + +## OBJ_ADD = [Extend third party object files needed] +## TEST_OBJ_PATH = [module object files Path for test ] => just for test +##---------------------------------------------------------------------## + +MODULE = haepub +TYPE = plat + +DBUG_FLAGS_ADD = -DDEBUG -D_MODIFY_AUC -D_MODIFY_EIR +RELS_FLAGS_ADD = -D_MODIFY_AUC -D_MODIFY_EIR + +##Default commonly as below + +BUILD = lib +CFG = debug + + +PLT_LIB = + +APP_LIB = +LIB_ADD = + +SRC_PATH = ./src +INC_PATH = ./src/include +PLT_PATH = ../../plat +APP_PATH = ../../mss + +OBJ_ADD = +TEST_OBJ_PATH = + +PREPROC_CMD = +POSTPROC_CMD = + +##---------------------------------------------------------------------## +##-------------------------------------- +## +## Make configuration(Customer define) +## +##-------------------------------------- + +## CCFLAG_SWITCH = on/off => gcc flag show on/off +## COVER_NEED = yes/no => PTF cover report needed +## COVER_REPORT_PATH = [path ] => PTF cover report path + +CCFLAG_SWITCH = off +COVER_NEED = no +COVER_REPORT_PATH = ./output + +##---------------------------------------------------------------------## + + +##-------------------------------------- +## +## include makefile.rules (Do not change) +## +##-------------------------------------- +include Makefile.rules diff --git a/omc/plat/haepub/lib/libhaepub.a b/omc/plat/haepub/lib/libhaepub.a new file mode 100644 index 0000000000000000000000000000000000000000..ef75969f617f807dcd98d855f7ba075e4b8a7922 GIT binary patch literal 248900 zcmeFa2b>gD_BLEqUDbViW~!%PQcq%Akdj81X_U_c25&_%(x zs~Fat)+}pYa}Jnwb*DR|7@4e?aRnvE1cmMzI{k`w^e!uUXA5`C`o^#JR_uN>w zx~qClsBW!UIw@^vLjN0<0+CKVCKAI(j2Z=zqtgt-m}nSI;(y71>&RKgf9wCFUl`W^ zp8vJUnzGhbW9pQ7Rb>kn%w0gKsZ%N|%8cn9txff9OQ$ZaZmp|ts+-xgq`9@Ry1l-+ zX-aFIv9vl_Ro~cFU)9v!T-}MP+nbv@k>uJsQCq;Z)i$N%Q>Zf^bDU41AYXDtduw$~ zdsRzyYjq>(UEERMP`h_rwQK~5)GSTb99z|vY^tqkMyAd)%`L4YQ3R(wk`*_uM9Kw?|#8=D(zQU$a# zN~SGYQ>)8#p80?5e)+5gRdZ)ftD3iIGI z-8#OhhLG~HvAV52*;=)vp&Ct1<>-2@zNxJxDVqb%2U%NWe41-Jvnst+jcs*REv?OL zK%P;Rg)=pcEmee;CD9rhnyY2@*5*cvbyaJ!4Yi@4CwnUTly@&eRBkerin)p}a;uszdhmRgPdK`_6N2i@qHfy?NnsRu=pJ_}oI+1_YFm9V~1z<9zCL8%i z-1t7T$1j!T>pv}Dzw(Rn^&KBPS+?7FvTUchtu=E?+0L~en5RD6UZ|2=zsTIOwfwBI z56aE0nOlstA7rj8+r908RV#OT9pNX-c73xgf3ITStSj5)6Azbfn73Q%_@dl=RG!h7P(Jc+e_#I|{`thy7Kbo0_DLY>$fWV=C(5JF|bJ<8ggQlr#5zLe#bn!nk^Yq%?yLa!c3^LOP z2;7Ew!<2?~o(i-Kow=AzQ;YQsA5N^-q1F8cg}x9hn^? z)EQZd4f9llcC7PAVnewK$&PZV|Gt`?314TPx@OO_yW3l2NmAte*rlGM@TlgMvCNh+&s2eWVM^rf{zz?jg^EdMeW4y!t=yfle2LWa-)qT~ zZNz`b=GT!7uvoTco4rxCHR;2@Y}E;Wj3XzxRm*-Rjd{z`?vZWF`0@>EVP(59@Tm&e z?GIUK6l<(t8Y#|H>APrIowx5z@^8Tg!h>A>VMI>_BRGd%1l5qYr&8Dc?b5`$=QdJ!(Qo z>4jZ7_*wIW6x^|%`tn)xG6>AG<;ORfTjr^=JJykig53aBTUM|;V48wwO}5v5kT~t( zjtIqa+bDIie8Y-3k>%OyBXi4SIRdM(LnXUqZuv$gcg$QbM;nYXDQ>RbZg^_g$><{w z+lQ5}fAFn;$lka9?yd5pw)`x+Zz+|vY{&42%g;JZojpr>dzzA3uN=lHRT4fYi$>?9 z->r?^#ld@ENQWn!cDa*zuWnn4x)MUFvS>ABLH&O#jmal)qFT?uNw#)NtA5=%9 zJ!3TzwqY#e$joO&XI-E~*3ZjEg3p$3D36zKIE{37Ha0(t4D!>7^^Y=KKhLJxl?`A= zZTUXg6q0s_n&-a^$k2u?Rn|P|C=Gr+;V|(Vco_8873~93bSmv{~rpo>{#np z{&rT`Z+kZ8e@m&6iRN2b6=mCHr{1o5MQ4LLHRw~lRYj}blhWKeS!d6l-l@8B`&s`> z^me*Dn>`CAe^m;3)UwcGy>@=A8(fA=?MaHYKVNlcShBZ&pc<2sUU?TLhudUj@0 zZGBC3ds3a9)7)NPlS~AsZ~uNv_h{e?380QX{7;YQ>EqEGCeY^0cTT1mA?y; z^2$+D+j;h1$p%p%&!8bC3Un4bADUumjnAekHY%HrZE9YgsF*r+USgiS?yhgIUzRiy zvy*LY)pbd!p)J|EELm$LxXR=OSwdbCs#@31$*`+>(9X3cmvpqLybF>I$!b}1K}P>X zkc(nAUGCN-h8t*F1V%8B*Nf82hGcD>^o^Qdt&Dw2GNIg*4b4a(&F>z>f4V`v{MNeRZd%IB-F9ONX#OjjuI?r?r4{LOo{2$^$p6A z+T@b@rlhg3YU6r>K%9jTA<1C)KJV?d@EBliXmE+I_KruJl0 zb(0*b7Rz0bV^wJ+-(KC?Zpht6slGGJD!55wZfm{VW0XF~fHgJOCKGM-wMk=|%tL2o zb#$Ip%3B*HUt6z+#ZJO+Hi33~PD5`5~6`$y!(WWW!ujFLtYHFll{o;n?P`#8v=~Z6!w>LXl{>~z5 zdHsCz=T^v?XiroxlRdclKO6kl`SxzemzTR}ZL%UeXzQL{pul~B)4dj-{`jj04+V+&Asg4vja~GBa=3exn zC3dyCr#_YotakOQtz&W9@p5apv5P9IjO(ZVt5(kR-l`lWV*wh@T4Y7a7A%L>;Esn( zC+1X4t87DKxPEF7pOj*=j(|!DaaYPOADx%od#_>i$vtD&h3TqouR&Vg+ta1ALLTKy=G~(Y(a)5Kn-E9D!aD1J+r0g+_RI*l@*o*)VTb{xR+0} z%el^7X%L|gx7DL%N(9+652mf@#r^a&AOQ zS|vwz!K1q1(OvMEF8Dve|Jy$F2z6~AI=d(O@5ZmIhW~E<|2zKa5$rntb?u*dy12Z< zssH8c&?xAF3%lT=F1WZ0?$HISjp5Y4L@JQ!o?URSF1U9W+@}lf+XeUQg8O&DYKuJe zFSu~xlTTkSzfohDG)>aj)wO_znKC8DAsDx4nvL7|5cn`@E{W@+nT{iKni@whlK-RXWZ2Kw<0^?pkbEdRu4Itz5uYH_{W``Op;9{C zuVeTaBQ!W)4UhdgMvgE-Bl46;+@=l`7xY0^cFNOaC1UhwmT8*NJv(!N?3z>pyIb^C zd7eS{s3L^X;{kb!tlL>3OP(qoA`hf-o=gl@e(%mSdR#3()6^j;&yt;}(L;Goc8Z*w z0=eYzr(Mql;wPCI_5+QXssFiaCZ;Kp^TZm}xkLluq+zER>*# zK)SbZq2Ux$I>VbY&v1HB+V#pR45x(BF>lTknIS1o2R6D z6H$nsp5S_NHSWI`*Yw zKRWiOV<{a6&~YFg_o3q;Iu54e5IPQ}<1ji7r{f4Zj-=x#I*z8}7&?xn<2X8wr{lhK z+>eeE=s1y%ljyiV9Ve$$%eAqGWUHpr|39r3biWs66sV)^27b@SmXWrvY}Q}FrIx0aK9O!&avF!e ztn|()ERvn3^kHs^~qlK61Z;?K+TO|IkG(UE2kafJKU`XuC|EPeoj<)WTq7*L?8CxWG1K{rX z0_6jPeS0WBl1+IOUnqP8U3ctm}x|oTlK!O$&ur2xi*Ee6H{yB zq&(%V@M`MnjmSz@nH&bOlPSy-08Sw=k=tUEP94j+v*F@i^Nbg(VN6(f$2kHvjGO!%K1ZNDfW%Y{VbGXLaL7wgHr52 zOiCczlvIfWQcF=T#{NDK8=qQ=Nwz8;mtv}|%!Q$C8u?lZP)5E^1DH;r3}6O<=`x;k z?h8!JOZ8-aswbu5z^?!Ac3XgkV=Bh=1?s6H)FP?M^lHdR3q3V1vcOK%SH9Fv;oSmZJKuUPhzl%Px06?v+; zQS$gaRcDkuAx{O3k|)MhNhx_!T$P5BE91&97+fcsj*9ugXdxRMnd8Vh$F7wCx5YLR z!_X$$3AiYK2La40;$&MD#p@iw#JboS(iTPsI%-!BaOfGa`If+;%SazPba_}2Jdr*m zlQa@Ng>0{hE58e}U7ecknz$+;m*d)e<$*Bzi<>>U_@Qvz68TC-gOayK`pS+4jZtyK zSSf;n-IS{FHd~o8F=U9_LrRkhs1Xu(9x2maO?{0a?xw-aF#1RCKgl=sVB`!bHmaez z-VhH()M<>Xzmq8{jSWRY+;gWq1>5(f+Ww2JEbu@g#G{`FVvnbaJwfB81qDx{CQ~Zn zZ?QDFC%wm1Vx@?D66@bZ#OR;)Rhc|Tk@`nO4MCLrhLUhRUHrX4ioovnRFA&3l|FX7 zQ2cOTAof$L*v~X(Vc8>ggjIEId2$-Wkyt0QaWT( zT~gXM$wf*#CiQqqhfP{!`L6FQm5QK$H++)guWT(5(^lS^(wb{p2m97CQ?z<1>29zf zM;iH;F4D|yt7R6b$}m$EcQe2PrTu~W0hP+|3^uKL zsgHs?G$ka%kcQc~7+`w01!nir%npJwF6VI5R{l9KGy*PV8bwqsBh8R9Mqw@zqfM`S zmS2>yn$B@r?8d_a$8KLOcKd2(B3Cu>TlXz@9~jH?oHe5OK8AGkdYs4q|% zP(PUXM3kG}1A&PHH4_J!dDOI#ah92W~-QIdLg+n1gOWu}!Sw~k4Ag&9_>a7rJa zB7Fi&Q>*$!)SKS9G7HLetmb-~X{%CkSldl!h&0Tt>O|94{&HQN1de;;$w1sAPca=e zs};h+YH%F6QgN!RRk^th@^sDo8Cv^WXNJ|KC%3=#CfF=nvrfz!^_$HoeaSXD-v6xmcU(+XU4|Jyn9(IbjrM9 z#uj#w>D)>aZ<(bG%a(V2K>n(VcAjNjPe~d0d@HW%j0UIzD^Jw{R11-9d9Mblb2Zh4maVL^ z`*G33^2W#=1e7hIiT2dI=mn(iX~;_NZ55CsKz&e94trlnW*a$)eJrb1Y9}8DTluOI zDLurBtDsSOs1;Yv!uLL+)bh>=92%%OG|aMFvZ+Ro-!U-xXG{+WdjvZ>*sstRB!@ymIe1{`qS4&qGTh^h0zFN(dr0)vF zstDR#VhlKL#0()iO3%1*!sgWN3t6JmEB1v~=zR zpPQ{hb+uRu)B^My!crvKEN_v#-3hV-85u2uK{l}*&4X)b1q|{udIBVQPCpSSSY@AV zd6x$!R%s?yTY1!jV15lUvZrf-2EbEKoNjr~25Q!6YSvpts#kH>86xKXpXsf)$)EpI}g=0Z))MO`djYeyav3RBB-4dv|T2pgP z7mL?h-j9Lkjhg69n#G$ni+}23@ixm#$ousO)g79eJAI2e?GIR?!=x0AXb)Mmo}%<$ ztOA+?RC9gUD#X+w(@$E(YG^RJuejH;Rt5U+*Sg75mZMB_t*sJUEbpm6^d8NXr!AZ8 z!_8+tOLMpzD2$?^s@KpyqFyn)kX`{Lu1l3PeBFL_g6ieyUmgtc%4jE$@v$%{EQVcFm#? z|B$mmPrr=cYNFpkE0^(mAYQe_#ZQ)ZaFB6_mhqn!t{xDMUx0Wa@+;KjA~-_qvb@!S z8Y7f?QE!H5JrT@!cF21=5Djahkr1wQU{N3=k3~_SsBbYNiy&WOO31BHQR0!32R>vKb~UQ#cu(Rs5rg{=(5rgvdU z(n^szA{0Bym&r&uUmc2_-b}HzJQVxFKfkA~ zm7!R;@4qbL+E8p*7ZzotV<^SSS)tgRE|MwirckW43%f_Gejkc$>>`t*;j&Qdt}g5z z8mx zUPEW&;rDfIlzJl+S8YFT^e!^r4V@V1druoE-wzcjN?t`M=gyMl^{3VpHdOo+$ zUqf*ya9cLJc$Nq z*{PTO5!+UNv2g)z2PC6F{{%_{`o-v;>}FeQ0)1JUE7^7g6wQ~v4_x6mcDHkF>!Bd8 z{HmqeV`R_r?TETt&K2J-T-$Txjcb_C)ZF&$JT(@w+c~za%EvJ)ux(|x5&dPID7L-B z0yQO?nuML&etO!4$~9Kg%cji`UXu2<^VOhyD(2XQj_7Bf7AP&%ln$^96(ws!d4GZY zpW2A7h=@V!o(KS|13swS+0Iu&fbn^cEjW%8PltRl*cAi=& za`bP;2rv%ZpXBHuH(e&9Gu~nssP#rR_sv^jBA?-HfCUV12P|ZG2cYz>bHn*=yW4Xz z2-G}zaYt#3Zw=mWhg6Wdmpo}(yMkyvt&N}0*bz`P_Qr28j$5^)b6hh5fY%;N$TAuMD5C^Ht}0m*KOv{g!lZvVib&2;tETpGV%M z3|~N1)H8h1E}SYO(#G&5J74vnWem64aTTGH7`_Zus~EllxSCtl7p8dKetno<*f+Jp zzNHoRZ8*V~WPb(XapWDFu2B;R*}G@~eSrQ3v;zfw5B8tuDt;eoUSRkETG^WnKZNiH z3_k+=km1LGA2IyIrd8<2JS}?SbK5H#?w9OKtz>_PS?({}posg+cA!kOh89!&!`>XI z`Bqc&9o%I#-=hwBWAF#eEZot4L@3qwk!6qm2_5tRpr7qLHGP#MKs#W*fr}x;ueSGk zV1K7(e-~ug{%#pMAPb1=;AT_gI&TMR;+mR#m}E5t zKyShRyQ0|f5+nT>lxP_fTE?ER_!g?97tq^KlP&r>UR|K3zow?tNu6v5IMflilMHln z)YT;4jmr>&9q*Pv%}`CvFbA^)><@>1USW*@;$4)480~mJ25QD?YQ|~ajCTsvbjIH7 z>lCRuD%+p4COY1bQGRUp*VIggMGoo|AZ}Rl*Fw{r%Y%&5wTv?~`{f8R+n?#s*2o7a z;(@6CAAk;miCsXmfOf;v3^CX7J_`)a*9kA~lTPg#f>$7>IiCN-r?kdb|>0}5^pALDp`3Nkim85=ck zn%En^-j0*e2r{;58QV3B9bGK0aJ+6~{PLfmWjv8PBW!r$WXD?+h_2E^S8L9#feo(W zwLoslguUL0Et8s3C+rmV94B^h7nY~<&ME&wC-%^PlDX80z1u}5#mZGq%owZtu!of! zo!G#=%8(=vXtub+@hYVl+R$AnE~C30Y=a<%#o`{vyCe|3PZPc02`4+3%MW1C=q8Sp zUmkoA;mz@D`)Q|J!8qUGvrg*z_&Fe6l0FZ_tK}DfLU8m&Aa02-0r7XMwgU04;LAV} z`K6gR9czNLOqW1!JDuOJ`>R7+E^shiye7xSz`-}PV!q?p@V)!w&m3z*AoYcldO7>0 z69Glbu}h^CT?bBrfy2amju#v6N8kg^z=uE_fsfEpI07F#VU>-`{0SBY4yJM>o6kw~Vhs;C{bTfKi(Cu4iT44Ko&FvqYB2a0{<%NE(;aE3Z)J=TlYzVUc zLv#BZ&Fvo@TiN7mi4|gp<2@N<{6)+7D_RPd_ctf51ci~N?moRCljJwI)lp)%;}!4g z2hI$qZf98Gu=)-vD+&Q|6R^X1DqDt;rfzTzmPt~}7cki(686>vYNMLkv~cQmXnHvH z&P7HzuDU3X&2E@>4fsnFp76rnGlA0Xn$j$Yaz$pt1P?elkc=7KpDzqs{|Gb`hf`Zv zk8r-CcVVbm<9&UxDOCtx(x~!sBC@Er3Z)OuS#^a zk*2<{p_1fXCTi{DPMofmoY&i8Sa|#dzn~*DZ%2lUR7+)}qrxSsDe->J=x~85`E6L= zjR_a3BA?1lEJN%Y_F4n26Ev+8Q83mz35ai@*kVf9yEMo+Rm(UnoH~v=Vn*0|BM_ab zi5|$J2+2XVn{IK;~kf%bc)`ejjzIc6|E9Qi~(G&f^%+u6YhHbJ8^#_Nsk%DU6 z7!ikuHv}1v)G{6wrX@Y^PgRBUlr#SR)X`zupPI}|=<0A>?L?j*HoA{ICLFpmP}va1 zufkxxF)TpQDEXL_qWT_gStzmCo*zjEt60g|Qg%@Zrb-qV4> zQ#6CCAj<7%HT>qq*cu>SjAe+k!fD?JYBq$$SE}v9{@G!nzEUoXoQ!p0D`$U>*O?Ha zc%2iDC?|ZMP78aJr5LiG5yr2=fi{MPvSah6!=`XZDRh*zxHvEDofhP~Ae{ZGIxXsJ z4RK*OS83#;TojJ0H5RYOqvDdVcUzF}QmuY2L(sW?o)v!#dtU~kS81YG1M$dyO_+W< z!E?*A;>NJoYqDRao3)I8(lXwnW$Z8R3wsX)86VIxJ{S(4Axp>>A403;Vg4`R`0Gp$ zgX1gYM^Lfd5Yk7%@z-G=3)2dmH>Mtky&kkcdIGU1F}gqdLfHByaOx$^sjXURUe-$U zx_CP5jh*6$;aM%?b79)(;?g{i?vw@}UkTeP2IsoErFW1wO0FADCMet2Z-1H z3GrUo`*V=-11;l+TL1b8G2+?oW1!#*2A_q!j05~)e4(lNQnUYewvS?L1LEm^J5aMUwUQpYGKlDYvNj?l7@W9W%!#5-WBAH#G_ zO$IV@9l8-(K=H^E0}8%c+%4j*57cC7YO*zNaw4fa1i6v8x<=p~f(DTv@wNtP3Ng5%0u6be<+UU(@=QSQzoH4MY#tL=VwKw~NCf-dBO>5t`_cS{#o;I5>_~ zP{ZGdepf7xc%!EKMXuGlrGbhF4ufpq4{>a=GzBirELE*{34#BsaXY4ZgH#O8(#{qfeCJL z8R85%HUw(cYiiEqPA!MRjS*{UAa!me^}^%42oHshoFI+giwzO)){&qTb9f#`Eul_}xY~9bhUmN=q02hHXZQx39t-YGpmAv6uJ~)jdoyt6U68yG|63$e{WzD` zXYYaI_1XIvP10qn{W@ap3^aVBmHb=3)l!@J#ugt%u0O~R(kEKUKh@gIXIh*29HzO= ze4(|OFSR!Fcj)9cvrTI=+qE|H6?FP-=DUck!tl0j?DLJiBl3~-(pGKjmq_Ps+^>;* zwalXPzeNgFp+_Gpe`LHf5>Z=>xLEzc7C%PZS$-jZ)(W{RVyp7o5PiH@n4&fi4GC>w zC1?%AEx{4FN|5g?hQU2tjAj@Ce5BY&Q+~HgK^hhu*(|#W>*BydmPj2j<@OTp%~G>$ z5gEdpI@|XDjRBVr#Lcn*XdJjg zQKBxh#{(6C<8RMoh!WwQ893TgbF`PBe!x-djf~uX`T)tTs7>ZR;wMe161oS-XwUdv{S{e*X8pk|_`W|HR4{&0X-){}vFNje3Hm6nQW!uvK*I$cvb zL-Va%&^n(7rkOC<0|U$;F-v$0=lY?Vqp6vTj2xcbvv3Q;E`Y!N8b%U1iM$O_)T`b-ryrY7Qw`mz~*DT(lS&WM+rsd-dW^BAi^jX#dg7F_;6CA^Upel(uZls>B| zeGY0|^h-~?C~G{(xK+#evX=1`&ItRj0`c#Bi^Lnkdnr)!mZs)yP0e57ILGE4sNvtd zz6-=xc=Bhp!t1lpFVu&c(vLKyA8SfK(Ug9wDUFLSg?D72bepDhyQcIjR*Fa!iEo5= zN09M5E#voE#ve3qe$>4Asf#zi3U6DWbf>0tm!@>L=1p9LqTYx~KQ>M@b#)VtrZ&b% zl%`A$xQNoqClB`s50DyoHA4fyLa|TO>wU1Vb}*|I$u@a=acGogNn6NQiWp*8l2A|xa1$Xp4`>q5eAJ>4Q=;CSpny}gxJ`#>aD#AW)VnGW zJxCLs4ZnFXo`YEMM&x|>&HDrkI2N!!PExLR_Lyhvfw;lQVAQT-y{4|nfK>fh20OIGm91p~I zXO@bSqF&LVej!fw3qg&0l@|NeTI|=rHIDsSDCPK`3dHd}LyPY^Adc^PNb=SAnLzwR zjkAFG*SEhz?D-bL2Kcfc3V1gBXU55JPz+4V3d8p4TP@i1DKSt?_XCNHC5?V$8 zT?NF~I9Er*%4xpFxfa|qNL~lD97CCV7!PGrP~h{$jZyD$c@n}m`vs=jzD29;TeaH0 z4Qjcz?*!tWb{8Vd1-={HP*~UkZWz#?!Oa7@2i$z1d%+zCbRW1@xLqn9jCv;??z{aL z-)*X=N0E{1=`pRI9tX$u^aK#s)00|HdkXour#-Fpv}cfyd)l)=+|!;1;-2;bP=B~R zN^FgK?*(qZ;=4`Jeoc$^>sqwm0LRgO8%nu1{S}ev4ig#TZ&9!B5q@OeXA=nGhbR+A z=3}Udfcpf9Z`ltMpGUnD0yST1o^I1T-L85171Xe&U&A+E{|NDI)Vn57`n~4ckI2aT z5^+oX7Ts~AUyNOvsF6m~Ay2Vp8cnf0typO^bMv$kN(-yUCi7ReZEzWUE8aZD*JX_I!pO*b5kT1A8~a z?qIht%mVuc!)&nr7pQZ<{>*GH*c~Qz3`$LrpEma>Kct0esf(dvWaXC817YLs$pkou z)%Jv18SiuzDOpo})2^)Y)%Mra4$x|9pjK0Zpq6WDuvSw;!1*;b6ej(e8llzHNXYs% zH43tRO^pWY*VGuWeoc)9>(|scuzpRA2kY0=zF_^D+7GN>Qxm}YH8l~eUsIF7`Zcvb zSihzwgH5TascHWVLRzMUbOy3=O_ggkH4~g)QwKt=UsH=LF(>VWYQLuDX=)c}YAZCg z3w5=XzFPE~MN}L8%v@UV9-5}UX*Q7C%3;Vkl;PpXIgH^EVCOMB66}12M}a+#VHMa` zhDU=vmti&7^BC5Ey^~=r*t-}e!M?_D3E0;e)`9(z;Zm?aF{}rh%U^*%2CRIb4~-hf zf*s4S0qi*bZJO+X&1o+O6>ywZ0d2_2_1dmgKnFO#UY9|wtXH}mnJ11<^A1?-*XxO_ z7MCL{(^4--PDT&p>2EdE@>snFT6qp%3vLJ|hf~1~g+W`Kk>*te2G_Ge-$0pdf;oJG}ji=uWG;c1{ytzp8=J%R6v&1E7-rO3$_?P+yX;8m{i;rUb5o);j zS3(V&zY5#{NL~$&*Iw6xI}qG;KnJ0`<>JOP@9Mz(&1@c`w?LFD^;Rh5CF5=2c-e3} zxPJT{qdU?pRV1q4a&cFh7q0aSxJ9#Yk7nUs&BA?}h5L0252RVQOA9oHPY8*J(v~mr zEj+AQcuceKxMtxAwjgSj$eR#PvIUg=DR9$)o(4Aq=oxTzK+l3(3iKSfbwJO9TMzUC zxEp|81a~9QOW>Xb+6wMDpqIgI19}DAcJ$d-!TEE|Yam_j@2`U$EQhyRc|HF|n!2DK z!sMGE=P-N=a4y5Qp~)ZK{tC8**>?c_;q6^Oe|Y;F^7<3gdtm+H?R~KR#Pk7Je|Y;4 z(4Uw-0`w=QkCFG!?8YZx{fX&Qux~N@8Q2{RKL`9L!!IEG3&StL7VzNr_q4cbQbqE` z461vaA=9*p65=MlJqjxRiZftKMIhfw zn)@z-q?t|&(ak_sI;}M?1qy+C5Xc7i5Re1zJ)khS_c>;fbnAQ>M~c}BQ$*AEtM_A; zo{se#O5~=e4*M~9#^YWlEby@J!2%EaS>Sls&j!brZaLuQ!n0g(eCd`4t_55i9ACQS zgWCkI0NlAih2ZW$Jd42H39cC2t3W-#y#`bQ?gyX*xF6A>dxFd1X4wm5F2mkn$1v;z zb}YlbU=Lx~59}h7 zeyF#Rs5c%oM?sS3ozajy2(4`l>hxIH8w*K}|2Rl;{Ktdi`0oquTrSam=~lUHL)4;% zg~Y`4nxI7cYbBbJo~1e{e}mzG^eol%Y>v~^^lTN0ll+e?+{_&yS} z91QFH6X-*rr8l@mKz)D?1>zb!jB60w;o!Iij{wKh-jU#V+B*vNc-pH1*9a{~12q9v z12qFJ2I9J|(dxQ3Jxi?=&PRp58xnQt`Hg<)>$M6!7HYVOHUV)HZAM_^3RC`x76grl zkK-W8w+vfho-3&h++gHu2gid+2e>)lmVx8JWI3vu3wV5bmYOZv(Vb63zS}~8Cjs8h za3%EI!SH0TuP{6XA%2zNYOrrHTm$$v|Gr_eI4#|~D~Q$^T0>p0HPkb;hPnZII0k1! zGKO-V1H?^pBP4nEcoPuc);Sj?;ih>WEbw<^vc-kzUf(9aB7d({7@YBz<_RAJNCO*7bze zx}MZp*HhXs_$(~)F!&r04};IcKDV_Oz>R=!FM=Bh^b)uVpsnB*0=*2b9q1Ks9YC*w zy8!4la2Eo-4sHw38{qy7^d`7Bf!+f57SP+^b^!eq+&>Y+cfk1%ka!oQ{{V@^*qGzGYCJ%@N)=1 z&hQJcpD_Fq?57O>4%Xo%^ER+yhTFmRWB3)={tUlP&rx%AIm3TIcm;3TeFNd+8GZ}) z4-CIcr?vTJhChORfWLtF6X1hko<%J2&-DHse#`w;8w+;wSb*irF0|uxEKznNP?@M% z`Hm#@9HVR?GXr;6fovci`` zFV0a7)O3e5(YV3-58C&SzfT8B(w zm+hlU2KxiEeZcyAXnn!va8vCE*550d5n3my9S>|`h>FgT1V0lLB zmETNcWM^i<1TR!(1Mxy-4%#3)Iu{(fHV@A5Ehbwm%Mu9s998Y@3g5zuc z23X)puPK9;qbtypTafQAUPB&-jCTi*3~0~rP6&#>OpA?NR2`r3%L+d>Co&0tRzfc~ zsgt4BL7kq0xb?-bx(adQeT}tfZoJ4o6C6;TEv|O`Jc2^>5W=ycev06X!m# z{x0YJVEtXr2f+F_aUKNg?{Yo__D-G#|3cHCzsdP9NPqr$1X*8ammdY|&p(fW_3z<4 z4%VN4o&fak;XDc9I8O^tfgQ*2X|UrNJ_GhphR=dMjNx-&Phj{w*b^DP0QM4wF9L36 z_!5LKWwxmwf8Ad4jSKQ@HQ9db8tLJeF1JP zoUz5W4DXr1nXk0r)HB6586U0myYqKUV#xeKn`(a4rkbB%k*C3*fp{AH1tsKC{0fde z{SCh5!S9{m#scjEHx6hwhQ38WhD&Q*UYD9Kt!|G1XSuY>;&o{Vl54@)kUSO00e3Y} z7~C~L5tp`op2j%0H7wHHjjQ~?WVoqIml)LWIF|`EJkE6o*B45&fcgPtLz2h29B?zh z<$~jJE)U#NaB*-v&gFw!53T?lk8_3KZUk2Zj>oxTaLbNWNPnQ~4c5P%(+8|S(DeoD-_Gd=)*tBlgY|Fcl!EmKx&dG}@pv>4tUu801NIIc z*#^04fqy5<4hHEjw1*(8KhO;Y>o2s20r~^oa0vSY-3YM$KsOSsKhTW=>o2rNgY^fx zF)j@_i+I2p3*mJ_VYtED~nOLnxb*Moce& z?qQX`H@+Y@L?-DrRTW#x3T>5^N|kqpmG7?gEft_sK}8`p!~lv&Io@U%Ehe)Wp1K2_W{fJo$(4Ux70ZNIv z8ejl1*8mJ8<_Um(hBryj8j3Q`Qsh2iTANl&|1Y zMkkP%eCL(|6SLI@`8_78bY5i2gQxjbdO&KGPNPgVLQqBkFMo|rCqsDCZFB}P{UBCO zOn-ox#LNIVkeG6SgNRuQFpHRafZ4>X2be?5nE-Q%xe;INOBGMEn3yOIdydND`A{k(njL=`w0-%AI;{h6p`2#=`F&6_g6LTK`-mWWO0i(1XM`8~E zw9=6JE`a}bT@q_2F*i&AZ`U0Ru#ARMIZV(H^t^S#oOOPCJu$Vto)kVqn&bAmlKkNz z=w#B3*Z4+Hp;3p2pj9L`6b)oGiSc-}hM0L^)>4;Q2yhxPn*mOzJeLBTL5$orlz-86 z#5@GBo|yLl&Lrl2fU}6%O~w8l5eDjX0}%;;vx(^ma1Jq3%o24ux=}Td13+vdVllwE zltsRTQh9S8F>3+NC+1YML=DLosPBAU4dOzQx*p&nlDYxl_cWS31MmkDdkzisVrBn% z5SI|K9bhx%{|ewz8r@ygJKl9%2yi)x6#-m93MK&jk-$WND@kk;z*WQ?1#mSnRRGrz za|*z<#K_lBsR&$0%oPCF6Z1!a8>noL0NhAok69(^UdK&CWX8v3y0+Q4xl*cmLZ+K* zjX$Yv+@~xw$cFIkGtcxJLV!omS4r%3Ft5>Av;*LE5-WA6t-L{E0|4G6W+uQ}G#1Tru<+U# zeRt$pe%1diwd&sspCOx$jYZGA<%mv9^4@5CGku#K2w0JalzEWlT!`YeF2No)g3 z`d0M2Nx$<;`h99ie@HFqkEtd7DYc|Oqoh#1gH+3ss$&0>jP^vaf1y0RA@(bYaY=t8 zN4aC{r16;h!Y&fqNEbg*1FwhO1Z0}TokyEw$cQ=p&Ew2NGA^9e* z$jhT?rgxqU2FUc(myAYTh~nBZ8iP_?TSha%;o36lf#bI${}#-&xh7&v z*Y(jnya_lR=H=V6)nJ6H^=Q6{Fbj&Td|S2}v=V|^lzdyZlI(?i{I+a%M!qdu4db}b zjrM?}a??=$MN3Qs8>lCAafI2y{5OM}Uq1 z_bAYj;64J9ujp33d`w@}k5-v#xf8-hL-c4!Mz9MJtu~dUd=W0S`^6ynDVEV1lctM7 z%+`WE0^bIUCQX_cj^^KlmPY04v@Z!FevB6J24v-`YJ`9M;DGYzai+I3$k?i7Y}Yb& z06C(it<{JwgPJf3y&POWp{Nz0_!n5E(UVMX%qG7vtkf)=tXVikb8TsKt?6ACWIR>N zc$${+bj}E8pORuf0AyDqonb%EWbegJ%9l z&HPO!ZLajg#$UiTd$^oB`4x$B3b zya~?t?k!~O&)&Tab_T=0f|c9I`+QL{*Zs$(vWY33^WFIBZk%4=#=rB^6>k26-TC}N zH@|xprz_putQ<}s?8ZC%^M|{mg>hZQMwPP)13t-h3A;^wMX^HRFb%~S8*rSwuaPrX2w()Dg!y&;#<$GCCz8d^#p z>&Df4W+~kuK&kzUhd|pS9el+g`20|#!2bp-8}VzO-i5O=Bc-2Qu;(U zSG_xl(kHpO>eW4zUg_qlH}+8aWH(p6(1y~dxVh>TFqB^9=BoF&P2ut;desA^H@b24_6ACCa&y$9 zoGE>-o1>o9OzHF7oZ0(x`g}KM>=aI4;O4gY=?mT5Kl|y6+?G^}3 zs~*ux>5FA-{q!Ynu6kH1o!{){uJ_ZIy1DAHrF8x>H&;D-l+u^Gx#|I;l)ggNouB@r z8&{8@r1Mw0@%4WCDmPC({*lgK?dGb-eNy@wH&;ESlhW6^x##9^`Z_mPJ(82oU+?Cs zXKqsZ1~*SVRFl#-x_RoUnUuas`Zj~pH@ms&v5j>8Pi|a2myy!9xN-GxMM~f5=Bj55 zQu;PGS3OIQ(zm<0>H%hyzQfH`Pbj1Goo6r8&?nQqVyIwM?IyB z(tmby)RVR-eUBSgkISO;y>47R<%-hxxjE`lRg}Kp&CT@t)B|pgdcG8$f6$GqheT2O zAvdm`^hD{uxH;-^O_YAv%~4NNqVywfj(S`Yr5|;3)H9DL{g|7h9%Dr5$K4$DWFksG z;pV7^4N>|@H%C1`h|#x z)iY`+{jS?fJ$8oDe{*}Or^QhEL$^3faQY*+xY194?DpOm<@2Aoy>0mg5t9GHEmDtr zq4bw-k$TDtrT^~sQx8O;^ftFxJ@JIn+udUIpb|=d2KX)^$Y__f9Dpf2Ln+0d$(Bqf}heqxW(#c_>}(1EmXgrr}WQmq563| zrFXam>UZ6g{-;}@evD1&U)+54D`HCj>gJzN&FSCVf|vdDPPgEI#e9C3TcCc`N%Fhh z0`((KN}I8QmSZ?=#R}AKIp};SR;YelKxsQxsJ=Q+X(v{ozN=2@aI8RmjhxbvSfTm? zG^ItXP<^G8($QF<`l21B(_)3{n{AX%j}@w~nNd0;R;a#JMrk)zsJ>!F=~%2#eWQxf znXv-(?H)>du>$oa21<8}6|3(MP`Z1pSbb%H(mAn$eOGfjH&&qT?a}$XSfRQpMCo{} zP;IzVIzLvV_BttD5GzreUz9G4m8k6@N*Be7)b0qSi(@5fQ-jhyVkPQYozf+-0(Buv z=|rqRU7J$6XRJtFHBq`(tVmr5QMz}mNL{i}x=*Z7U4>A(Z>&&VAW*trtXQqqDcwI- ztQOf=bMGh-Gu)#u<2ARKseKvXKp?ES#X&Buq=hN-8e$eu6lgY38qgddTqujun61{0 z9t;-QVxL&S<-WnexC?6_4)GVjm|?x=zeNLy)oZ(PAm zDeV+9T>&(uv{h!hs#P-p0nV(cf^&sIp;p7FC~bZX4VBI*+@KN~9|YIl%}iU2?IiORWBTJ6-8o=0c* z(a*a3#Fj|^4^n4UB14A2$Y_@bn2EWLobQY!#H#~Ev4^^FBU`bUtqflf@Cs2l$uz`C z(w#__?hY&|y|6@;lG#7H2Du~!*JzCsJleC4mTX(_{rs>-cRM>8x}`K?VyK;3jr9a)#Ox%qTo-E=das&2YD zfz|b?m2U%?ZkDTP2kQ3I)OC9Iy030O-MjtF3960w-tA}3(7YS0sq6Hv&(&Pm!Mb;Y z&HY#%c{kXcp?O!Lsgvsx`ZG7T`RYo{oYcaWnB#nPZSt;ai8)pCE=N;W7^u5isw4Y3 zW&!LsAlMoIBE#!`hK$Y(1C+Y&Q|r3Ugavc+lxqwli}>NHGD4f4t^%x3Z8o&&VTM&I zduY=GRoxnrO~#KjM};=MTh(oG#}ebG@cvR^XwwH(2HAQ))z(3Qt;>8{?+?*zy+6;l zManza#3lE zDDxftfaZ0pua^%WS9z^XP2?nQ*IJvJjlRl-i`ft3R!*3k&-Zm+%&i_eFYfE>RDs;g zN*k4hO9KnX9AjJ>g*i5GvTxwqz(7bAp4>cHGjMXLZ$PTV_ZO^94c)4%jn#p%#fy#A zG&jfsP()08ok5lk<*D|~y%U%_&No-BnX68X5x#-K=4#nob2n+Omd!O%^zeNYWo?|& zZ&rqVd!0S$X5U_=KWb26E4g?_!_mop#@jeyZg#KdxJ=d@ova1^fFKq!N>ft^fq_QfKp)LOpVYwP+h*3LMiuz}sgdZ<`kRdLN~4Ldov7r6>LCBj%~aA1O?yUa zoUtln?U{l1GR~QS_lD^jq1e9Z`#Iy&XJ(C)mv5GK!jV0;R7w=73p-+Z3dqWzrDvI; zSb91#o6?&wXHEBYMUW%9AI?Z+LY@(+=Au1~nOQ@n_B7L+nWeO(lUj#_dV1KT?1l+NT0G561>pvo-$^JivF$XA-OF7qD$~cG-Wco<|DU5;teLJlv)BW>d z;{>wNPkOB?og>)akDza|lxrM*Q}(n1g45JsQmbeD-l!AQ%1W*0EcsvdDLVQGQ#!V{zt3&; zAPHf}t6}*b2=mvNt3K4UEC0(xiQLBd&wrL#Vr6p$}pYi4^G-F$2!pQhB@JOC+{F9d!rM%>@-KzIq{`V&PGRE zCf}gyxEr0^o1LD9Wm} zBJED@EGLV!Wz{*}MkoJfCqdfUmvn0LE}QQZ{p2Ltoze+TY=RT6bJ7k{YO|$iNP4I~ z-f%M2N1cZ9Gsq7QW#`d^T9N|fXP-*j4|I^*Bk)_KU;#i+J-M)9C9gcbEXs1}#T~@o(v(Cwr4sS&6dqpg13o#HQ47wCDp6Ti$Uxm>mSUYD!Z zieuj8j(Ag6!5YUw`OS?^+Wk(hZ2aFl-IkD7qNfuTYh_oHjp5MnC*kGRkpHAM_i`ss zI{)8ReWDZnRJNPZ_!#3vq+LgbO_ngyAyY$CilU>qI(er1UO7wVi%QZwsvD#T}@SOb$hkZ+T77z z-&8lVX-V_+=GIwLE2j>WU&3cRf`d2I4{V`@iTMaSZ{sS$`KuWL%yCRDlF z+LUgRYHF@(ZE3DHT3VZz)z>Clt6G!QZOu(aePf%1?bS6)ljL>9%-Iz)$?Z8+Q|Hc^ zQ#N&B)q=A5Mw9fcF{z4P)7;V2-kLm)9BOM_R#lU1XqY+8m|0ahN9LGORbn$cF* z)>I{3G@5G{qx2Q?s%BTrsG7OZSe9&Ulf^XZYpZIOHrLlARk$k35a9!o)vd|aX|f8) z*wX5zDyp%vhKBlTPRXQdZ6<6j=k1UqyBf1mJQGRx`u&A(dj?Dc7#RSNN z78_I(Mx~`j%#A3Ye7mqjhM`2HR#BKM;z~BwBtwz*TG3BwqclFZvN)(t-jcTb#Wm>) z+0q&;Wl;3o!is1tJ6ckrV;Qe*PbMN5zDhOMDusm1r7)JJ|E-DniPnV7`-qHfurL_j zcwIv<8DVBbZ@y$jghvR`eeMhsVNa}i?t?OA_*B+odRvG)$-L~0D~&y1pUU zykw$DY<_cNXrRhI+T73}eNF_;2*X^JAF52s5?C9Qs3tMLS|(1crM12}GEbxsmX!|s zD6>#(NiZxyjbutz#tO5`W2IG*%DDVds-y(q89nWmBmb>t=*5^agnmR9XnxT^L% znq5_q7ipG7O6Jl$5ot6hU2SEO_}H|_x-aWXytRIwd|jt)P}DMCKg$!rHxT)os)-P@ zWisg8t<0%xtwb-xoQ8U_P-fqYn&auhQpG7O&NGLis;NF&S6!ZH(GHX(+Op&EVwp51 z0l9Aa7tx*O7AY$-uB&b^lX67d93ZK=L|i7B94gQ>Uqxn|sGiLW87Lk8l2~4Dc4c<( zV{#Moqf*zjYEi@>dYxOP^DFAA&CKN5LKdHAt9p4=eyQ{=l$6PvNX~0dF70rl60NPx ztwC*NkxXfjPOPeuyxC>Ja*7*OTvl3=S5g_P5Jw6|8Rj9puPo1&g$V1w%&15snJy0L zZCS;%QX9>fIsy^0rlFehyaJuG!R(}46t%_4rAbvWb#0UNM~F>P!=x@zMC4eW5C>5H zCmx~owWYqHxow`9mZYr3`t^?aC99HOOf=ONu4G$tOJj3WeVYiw`jcH!F)Ob;tTJu2 zqLtzzinrGwgBd4c}%^yir~Wdf-Z&1qtild zZfe!rQU9@C9WnL8WvbUS#pcB$we9sr&HhU-Gi+F)cxbd>xL_j5mP+x{TSaLr+FB!V zn>4YGc3Vf=mdbi3>MWjbu;jtvQ&mY?UdNsDZTeG*Al*aI&#leAFYvCDGNgExGsT(PKuB9TRMOkY{0&cw}1C6k6I< zAzqNQN+wQ*rn?^-Z)i>?LJR-bMJ0%eHA~xUp_AoL1>uocZChQWS^6VENLXIvk_BaA z%JrhM#*ZF1dSb*cCT6rj-8Yqt#E|I@iaCch>X3`iRKaGT-1Jc{seYw+$D+)M2>gB( ze^o(IP_lW65WZ@7mn|0CgWRN>xs0VxHC&@o(S}%XE;OhNF{MPXc@=q;v1opABoP;D zDTteLHHj5RcY z1d|}1KkSy&S}Rv+ktn=PCY;QLNGw`gUr}9O+FDdCt5pb2B?{3|wvf9)t`VHDwq$j{ z>App2fvl>g6G^Qtv{k%}`o?-0p?r<^LleYK!zV9^$!~=+Vbo+L%}xemTT)n(UmAQf z?Lu*>E-*SysrWV(2d4$U(fZc7cq}EQv2yW#@*<@<(aPMiXls4S|7~uJi@<|0o0|2{ zmx(BYCdo7kVwM#_(-30GeS&Gk#bBp7uI)vPyqu(a6O&DFVL?J!X(rQ*KUfqiMs;)_} z(@kxXPm!_FOhLIcPkt>aF3T^lVWMRwrltsfM#w2>k3@XIp-8VYIQ=reHS$&2i+iU6 zh{SCLERPjwejw;kWm;b~fYeNr_^slnwI*aP*GhIl9PYG;by{?$3RI$Hb@Y5GODzeZ z&iuUWO3aVo@rcP!*q4%a)zY-9s>oFYk|nTyhdNYMJHpIb8C{DQs~Zyy>Em9RC!SGx zcKMv3=T+r-k(%cA;Bu!q?3LLv^(^%K{ z=cM*b=awp3nDOS`)@U-MI!t(3NUe^L+=M=xGcr0D`tq3)?Rhp-m!{M(WJfD!{z)<- zw5}zjO2&q1Z;oKBQGEN9>#f#J-5nzz83riCofr(v-#?)1>D6A|jE%6*wB&Q;(VT_E6=77z>i}lq> zd<)e#S?r^A3)1I6YjbsD7(w8>1AJCVB1qs8vxhEPRfJsDiNa^vFqNMW(YL)n#ul3|PGO0u|6 z;&+jz`2TJ3Iuo=;wIQjB;TAWzNy3+~&X@tLh`0|XF0P73Q-&?E#DS^YGrqaj4FEuQjfsh$T{IVUf>Tt-0B3)wlASJU-BTe3u@<+6C?Mnb%$BPGGU zHncP<-h*qD%$v%J>|n0MjnwcUm=!G@OpQeO(G;)&ZdMlo(T9n`h1}8kMaiVTIaLuyPRWz2jPFn6EE*0UI=atFoBEdnCnb1(P*j-6$G$vZ=wPV4KjM2X7v~w3x^JX&p zTcw2N^9m()ciBiXUoR*(tLj%$TN4@-h-@U7FPBek??Tf8l1-CIhGf53K*^N`(T5=o ziRCd*Q7^f<(ATsv|7AnX{ac;FjW<0 zQ4Jv_`)dirWJ^^;S*tpp^@|b}vSe)P*J^0*)mB-^;CmP6GQx?rjb{JpjRJjL9xnYY!ujspC z`m5|;X(LPWDrc3JPuF=HE6tCUmgh>=Ub6!Fp}0|ProMKq3Q@Gua!Y!<7rsd#WiCs( ziIwsKO2rxSqP;iLp<&^zuzO@e(GbP4ITj z#8@gx?UhX{Bw@weR)sA!i4Y_pkla#fdD!^T%@7?ai(NEx?KU^Ja!kjsV?*n8uPNkJ zG_5Jlc*tumf?t+QNJ2>D7&;rWkYWkL8)>p8BUP7uC&On}UQ|LB#fuu}H80U|s*lUA zRD>N)Zxr?Z4q^``e#9F_!vZh7N3&hQq$goVTDYk|@ ze^nmSF6#fss(R=Ub<8N)w^8?3);`NfN*BsJb7p>oHdZvyq6__=H%lDE;-(fIFdbVl zhawSai1^;ND5ZIMVQ^EvQEr*!l;tuKn(H^kqfmFfqebOalAo54%yMF8i!}jOR$iJf znRorF#_alCnRWAO!j@@WOG9I@Ih!V_gI|QjMs}HHQn`|bkfozb6;-8?j_p+O#VnQ= zjf$AIHOj)SJAvVQDQhReUrLuktf96bu5Gie60uWZj*4F(X@2oEbOX9g6RjdKHPQlQ zd#hUe92^h1tRz5l3rh-Q^EHvsPVI+7M6)Y z3GuaDMnWAAM4M`L?bT(zHqq=+scb~etBx;#3g>3K4$E~ckk$*Stx}6DR;0dmVY}?= zrX_EJgB6U4cz4reyU+}mxK^UjLBnGW)%6kNaUyNa&61E>dPE#E&(eR%`o;5;VO`a$ zg;r+9@2S|JxKPve1+i#VMP+HR_zLBDQ8999w#QOq)eWtwttK5YENW_P8+8C=w<+Pd z3JYa}K7_?4TUA_w)Iy&REn!bjr%z)WVk7ZFrIIj;As83=BsX1f3KeaZPTS z7CuL`e~siDVKrmCfQ!1!!Atky<_cpnIg^ z5z4l3VsXpjSaq$O2{8A{uOmTBn0^{tsNi(;5R`@X27_NVLpI9AG1gv)dnEpVPCl9Q z(}Ma*GGR)d~)f(M-5RW*j zc_V3x;ubf$f@N(FzK>#Ufn`{#HJNEfQa_MsuKA}Rnc9q$U2Utl^_H@p-_We5GnR@w z(-KK3v1}-X{Jw-9!Fr|=+q%BVwrKYM$oQ)$q)2Y$h`4CZ{01?2scBqTELOcNxcWs! zVHT_D6IV{-2szf19#a?Qit!hh4F)XO99^kZ$=!LcmB6Phk}KLS8?<_cK?W3)%(E1! z)P%^XEIWi8**3K0auUHjVEIL|kg_Qt)w{Q%=6qgjgNRYLpv^XgTv>4b(`SfeHKlBe zsFMabHj1IGI!ok0RZ!=UN7V&e>Xl$2Y+nX@CbqL8mXj@q9C9VOT2P41GwIDAZKa5t zq0T@U)W&4C?i|}DtnW#u?W=`^%gpSesytgtf_aTLwRL2YgHG#GE89%6+a#-bUHv@q zh$XkKU6qAQmMQVr)56e92U9JS^xG$%t}r2&o!Wc|s@L4u(%huu0uiMaTA4WJw-6rXd#IBkgkrO}-4IL4iYrX8qN?Y`l zln#a*XVSS6`dS-&6Irt1T&A6NQRg5WfiX+qS#q@msW2GZGd}J*p@M|Pn+@TtW*~ie zib%p?rlz&^1DO;>dBw5;Dk>1Z5G}1LN#zkVUlCMD=efv2r&sVrbT2GKUa4V}=vJ(} z>@$kRk@E(U=?0N%$|D=k3)>U27|B_KrrLzqS=n9*QV9yL zX%Hm4byWU1SWoYSu68oVFcGsQdtG1IoD-M5RQIveLkv3r+P08dmZ8u9Ppn>DeQli` z_)3*1QhzArfQ7_z@SIe7#d&%{NrRqfRe?mhmXKD%7iOvqN-!AntKEOMOto&lsYdD8 zi%F_1jg}U9@L)+J(d@9*6ONJSdM>j>qgN|<&U>*+@}vJ$Py;VbEs#(gSaTlB+{Z$~C& zDGx^{efK3qG8L8TlNF~j5GpGjQ;AM&zf#^5S0eg7Ld>Ok^?DtRB=thFn(IMU`KIsl zST-K@mqMqr%ozzobnTagS9kYA|1?XVI#p6w zB1>3du1xcaitK_s1UjK9t?l!}7sLb2&lg9vIMEmti7kmI#D=H5F|{?K*M9g^BP?-8 z#oNx+vmUB(wv`whNozoMRW!H0RZ59lD)N@_&fHl~{Rg`udGWUn}3^`ak?WwJ3kt59^ za#pPjQ&^l3Jz*G57lxyuVr~l6tYt;oCvi4nsT(C9DBe$Q#ExoOtJG18vaNJtZEza@oM+A5pF!FiBRYvg2-ZvtnW zn8S%W%@+j$2f@s!$}U0%Or#cqQk7b2$4d6kwg2@^sUvCGB9>@Fy_8CsH~D6vO-#{O zNgT=44TrJj1=kq)at*B`1$r1)tgY$+ma4WyV~w1r(@zsk6^V>pSPfBS%UvyrrBf42 z65^ssnp`HURG|ASB6S(oXz9#6*|d`_kV-k-CBE?NvcmE?8g+&t4(I07$!Zn{QN^S? z`ADYO#<&i+9j{fvVp#J0h^1)~a@lHSLz>CM)K(Fih{5w7(!!7=b<-SD-1-fTaB6BI zx~t+MvN%@VA{}p}&oZZ}tfn~cV%P9P;Ei>$#9$A<(jvH8(7+m0XUbYuiK?t!d$?oYwEy#SH;)eN(&SWzzOpf6Mh07mG=V7RgSDCW>Sq zVQH9~lBJYbP760Sz)Uq*ZdRwM-EvVZK8M|25SF{7=Q2~Vd=NoLY>kYnF0Lga)8M`8 zvG1I03CVO_4V&Jn`$H;h53Ew96N$>871qe{5X>n_b43fwqg92n?UFh>Zu?O+siQ)b z;Uq@7PRQLLw$lI4qqS;7?ZA9tVPT1cg`TPn9+AxBnCP(_pw$By9Ysqd;V4J3RY6-) zZlRRbb7UfN4SLH(PjpJlku7uDVt(2se{oHEE9JaUTz4hR?-D0g&l{U2Aj__r&=Qa7 z0}9NuPBZ+H^b0wsKQwJfKZeLh+vRCGxk}8nsZclU{Faj7tOv^$fXxUq=fE4#F-gAJsyoaQ^cpyT}e62*C6^USFV5&P3;upW&stVP7KMn1?fhkSS!>C z5c{c-yJl2VzJM+S=3KdprhY(r*wvwoHF8Kwl_6|kyQ2}SoFfl?3px{en^%>7h&rz- z-$GZlCo&$g0jN_@tZ9?(b!-2%nc3}eaU@j#7OB%AcQu%UAx^C(J0u&_)*QTtjHKbh(5&xaMJoWHyGW zHF0=2)E=2x5Y3oOo|jhbOt#tt4QW(esc=M{9;xJ>|t5f^idTuI+ zN5)WeBdB{>O-r;{^gvGd`4Gfq+-zS-`Wtk}PNSu^eeug!wO*=uwgB1^U<-*a9IChG z)~bC7`5(7t>O!^2f0AsnF_rByjBZuQ^pet9C9$Hs0zHsm(ME`Fb$;r2N)W2rV>?BD zvy>{n2gsq(VY|+KijuG^S1$QcNr|TA!*qhQ+u_>|vz(e@Aseq#ENBx>PRlk#DuK}= zBd#;HQO?LW#nViCo}{nSyxqlha6pekFowsiKX9~WkI>YhlQ9OXh)Uogz#IqNbn;*{B8zLET{ zXP;HHK^!5o9Y#(%t#>Pid~BoM6_<*b)D@d=Hbpm?WW7~^h?iwYjx`=J-M6h3oLbD& zo2b;zw)=e-?jY(Y${tlLI~XfDJ>sc^jwH37akcnZRZp61_d;qH=Sk){>~D4)zszop z2aO3Ku68U;L5+soLtx2Bef;6o+lUASdKvAa0_=dVJw%EU{|kY!LHP2^+-S#ZVFJV5Vw;>dX%Fy z6%%Oms-;uW5mY0rsGek3lO>mkS}Wu?3v~5*=||CZh%}+6`mf=x*4rq<8jjIO$AgiO zZt4awa9T?=LuDsf_C#$YXO5hH zMJwg*MHL;~VATXWX(l?Wm37<pX^ zSQdoFrCO29Ot~#hk2h@^pO#DgAtNQXZM(H z(vI#^`YEhnW<}fVYa$c9bx_AGBcdo3EiNdj%8HJekTqt^$Z;b_XN_oVYi~;IAMVYq zkIUO?*)Q9F$;9y^#*fPyQJXbFQlm?o;&rXfP0j7e5$#P9ht!N{)68&EJ{0|nFBl=K zV4JMj&8;J3Q1s?-e4wqZ!^h%g%LnoKY46oLa&J|8V0)@6_{I!truiR_aniRe#UiKT z2~<4Xc)e>;g%*Ad=0MtKiRaL~3f)^u*0ihb zFf(K4_tiQ?b)P$R!>8EUkP~rZqzCu4(8A_$+gljUaQ3o#9s(w{!0qc0~MxJoaYdOCT6}`YVSBrtMU($^*vC@oU0T>bC=k5mfUbDcQ>1>V~0c} z#iIsMoO{{h3pYFC@V)9rOI(9MQv+$6gv&MU5z~)Ishm8DrjF<$yB3^>OLa!sOKX=O1R5cYn9E_hUQvHt%&`s zK^94Jx9S0v7t4=a>?&$)y0;}?KxC?FVmG!2S*IVoS8>aycEmR*DYEM-b&Z*d?2Kh_ zgYBNy@C*nUm(rSf={h5o#N&E(aa~k6lC3V2u(wE$M$0|QvFa8XMUl=XF?_j<2e$Qf z2^Jlb2`h=dNV9C>+F`J0PQE&7zS3zzP`zZmn#@trq$0@~`iF7}%>Zbv&Eaf)(AGpe zPjax0egsdksNKQ`AO(hQMAi`>yuFUy+k<%D=GgwvVESX4RZ%8g6LW%EMgS`kf% z<8<*4j$wmmY&2*nC@ZhPdLfZoYAe@{8|u+A85(VTIZhnvO0B2*bw=s-Z%9alzG@en z8`EO`Fl#K6qN}8QZUMVWK_+gvvqSc66XqJJ3oce)wNBdGwp7mG>iH$vN(*UpO~JcL ziECb&c>{O25;FXHE%kQv9!CxHRs3>r!;z^-qF#=E)P{58y2@Z;=$wW!`#7bJ$f&8( zp#~2jMu&QZdku9${Lht9>X!t+v__lJE|Z}_Jpm8wbacd5#dySUD6M0avk+c8WXJ4P zSiweCB-1>ZcuiwZCa#7 zqMQHmQK-rb)Xy7L8;_3?*FQFX+z5$s+Lw%|ZE7DiX3QvTi`$h);{B+RBRl>JSCq@i ziLTJT|L5I#d`^FNv2O)ezCQ6Ho<9{?NRa|D$|3`5X3%Wt#rnkwq8qva$brQj- z0PL5TBt8=It2~=Tb^!EK?WzoHvQ2)Mw#VebSW(Fc`#ZCb@KeK21v4XZp-~ef?Aam-_tP)aQpNmsfbAZ0hrCQlB4bA4kHYYEz$= zr#`>fKM#-2O@01+>ht^j^YA3!)aRe3K7Z3c504T~eZD&N`LF(YcziKF@6x%G7T8%n zvp>Kmf6-RU;q%UyroKNpJlatnTCP9wd6%5j_Yd*UYcoEdoBI4n|Ga;C{nq_({fqxE zpWo-7|C#*W^v`Ff*WbA`)&5`o^YBP;w7)%kZ2kA=P5#;UC;R7r^nJbLAHDRFT_fNA z{zsp6u?J>u@==$dy_;as;ndTPQy;3XcS_@jc^?Nl$NLuN%5nY|pD3ff zy!@e}bX7p@zg))|Rh?)B+sT_Tx}A62HWE|D$l7y5q}`%|z)wS3P_ zn1U|y_b~XiSU|5Z`|XqP#8LTGAAhYJ@9}e`bF>s({?JD#pCv!_6&_12KXp#`mLB7U zM=n3$9Pj_>1)g+%kbgzLudmnTpVqU5%PZ)zuutXRroD!0f5h^Kz<;CzgC6ptGpkNWj* zFMouW$2e~Mlk(kVoc^eu?S*UmU-Ei_?U8ow@h9c?@$w^lDg|34<@5ife8r#e8n0)8 z*MsY}{Ym*1f5Ol5dLE(nT=^&E*Zc_&`@w0R;3hXOim%N#OJqLihR-P3`%S#?%)97o zEVq!kPiU!<|9u0Cx=!KjZaAr%dKVIHsdr(+HuWwXWcC0q?YwaKTn{>T)THk^YVyzc zNVGp%Qok-6tl_rS5Myt8ldBd!cJ$50F@AC$y<{akYk5^h;eC|n6QI_jH@Pf;B< zp-^4=d-=WN+Tq*$X}F0pRX0AhKgwzTXFr*bzy5BoLqy;8rRG&1(GC8q+gtsSUS1y- zuP-it)t~U!()cd&J=A}y+gq(CD~*@Aom9SC8oxS?@1DkAN#ldk_?^CRay?tQ9aElO z&y+NtUeBB~J|wOFwluzH8owfq4^QK3)3`nc9dh_j8rMHq0p8c`m9{gz{G2pCI<0&n zjgLv=XQc7H)A)^PTzxKF_v=AL|_L(vMXSqt4e+`AX-n60dgtDe)%f z8;JkKx%y4|(vS7Jr}%sOBXk`c^$ex*m-_pO#BcTY(}+Lh?`IQ#*5B6=f5YD|A^xSm zUrGEsf4_?OfBgNm#DDkqcM-S0h!=^hBi_f2#HYk}alV20Ue4{W>UGF-yz_qk6Y@t~ zF_d_@zn@6_5Pv_7c%8qWO}x$D<8xehx$~7&{!D+riuhIj{#xQU`}@0yuk-i#iR(V& z{8cLdfxrKhxcq&?@Y+DUzb-WL>h3>L|44t|kNAQ9ekk$z{(d6yqy7Cf;%E5#*~I_u z@9T))tkmUq$>ge}66UZ~gr`;@#Yjd6oD8=bsYa+xZ6KMb5kXPssT& zf8USz<^Fys@mKvl{4vzC!TB^QpXL76Y~s_L*AZXod%0c$V{(#HTr5MZDJewZvCCzl-=S&esut()p{zKXLvk@!y?qAilHv zk==b9AfNHh`w=g84n0Eo!<|p0@++NBBYwH_*~A}mUPt^5=SzrhaK4iG_Wmb~RuLcS z+=n@27`HN23;<_8DGUt^Ad($TR!f``-2=luyqx!jIPS%Hu=S<2w`I!uval_+8q0~ z2l(}ajrS*hi0k2S;xXT#8bdr!gL`>RAbyc27568;kGBtgI@$Ukf6>eM!Nlk5Mv}bX@8i0Yha0b@^6zMHEU!l51wQUc;xBnXyOcQW;W5OI@bNmH z_~yIXbrDaXore!Ku6a#;fj9d&UO;@38;?tfALJALZ^X~av3jo~e!2ULnjh5{uDizN za0l^K&hI7ulzvfOh+|Mse@!;X>t9sfXe9C!@n;6uCod3x$@y!PL-X8nQ;T`4Q^91|$ zK0YYl>WfT&;!nEa8%X>qw+};zk8ph+L42(9y@|i!_H$q2tGxXO5bx2?`kP05y4#uQ z#J}hHuqpBjosZYBPN z&!dNlU+n%j;#TPA&Th}2rt-7BUoR5h%jNJo@!Nb}y-U2s`};BRU)}C~NxazS<9EbU zaRl)*-QoH#@it!vyLx@-@B6MNTM$3V<+d&H#jbBV5I?~6d1vCk`@G(b_y;~;h7w=y z?LmBxcJAc!VjPtp>UBMh#f9YJ}&uh|MUVkON z(dYZ+#J6{SSWWy?w{JHPzt#J7EAiJ{&+j50@p1ft`1fAEQ(D~ZMMC?xa1MRz?t0aq z_<-$0@yI~pPv;vSLi``jM-Wf?x`uoVuDh+zqkXCTglSg)0mMIXzcG*ach091-zLxM znL+%9J&n&I{-N8wLy7nD_QZ*Ib6!t;n$L@7;)9*H6W`3`u#EWezAhX~{F=_z{u7Be zWEnq=_}=cvolZ3t-~soRo7?rFKQr>|eJ|pt4l>@C_y&&$2N0j=dcHgH&3*pvN&GmUFQbTm<@RbH z;!}L`?MHlDms>XRv3pqi3y4>`JufEytm{<;@t=JCokRSeF8>(uL)`8qh~uc%0^)sr zoE8$l#pS%1_|_g@oI`xdDC_TK&Y?el@qQt1hH)uWEJg~pjvzB=MWaEz#Z}9oP zp7@=$g2BtF{p2~Qk;tSm#zCwJQ%lR$h zKWdUyULO!I_41z+AL-?PBHn$Z)zjJI7>w8cuKzuWUop+f4!5A&&iy--th0 zVAtKk?GV~O!0jr||A2p%W##vw@|XMil}&uO%WVen0@vHQ#Jl#l`mwK~AFJxG^m(_4 z%D=z6m0wQ$9`{2oAwJXle<$%5eg5Knrhcr~g`Pi4<+t+q<#XcD&!34yKR5IE67`RB zd)SNky;1AeF3wdwT$JI1{iyt>uFqx6hgdy_62IQpqXoo2@I38e;*i4%;zwKck+X>J z?(x^9#LN2G7yeGX-0js}#GiJ5_)+4U`TF`i@u%I6y+eFIw@aPe9zgz(+YZcKZo3nQ z+{O^U+~bS=i9>D&5{KMo5l1^~h+pM)U?K72-S0Y@_)9*&P9Y9Gyqx%_-rpOEqrdkO zKg#XTzlfv1FA{&k{g(HLqrX29M|-;XI*jo`dwLPy+t={{#L=E%#7o>hOd!6C+nHSA zXlFU`kA42mC64PZAddS6mJt7Ggw2Z+h`-?W>TKeu|1#p^+#cRee6j1pTH@b(T<`?( zL2CTu^%C)!?svUQe38%VFNh!P{@c&QKgqNDyZCi5z8`vgw=MDOyqyDxFZ23`5x>Ca z`vl_se4geKKh*u48N?sAW=3Mfe|CLtCVrg1ZzulNaI0t;@msuK#}bEpR}yd8)9N{w z_-fbZD~O+;Z{^n#Pq?0}Cl0-OmH2sXS3e^Dv-=6Z5QqP^nXe}p-?;_Wo?gT|yB!-q z{0H|}hY`QP{iTV-QBN-MmwY`)5O4DQ^J&D3$67ltB#!p1Cceu3z1xY;bvyYWame{8 z;sb}-bzdj`p3C7=;+@=HZ6LmGFRSOj#P4)Jr>i>?7?-Ku-z|w}yIt+i+^;*3_%dIY zM-hL`tQ4DQEso65{LXxAYSP5IfwWl_pdG|{+ipd z8;PIg*Zn7P%!_A@dVVHxjPIqy(f%8V_i{bIhdBDRj`-;& z-pI?uKX5(#kocKy_r51S!{yM)^$X*L_V*+X{TV+W#kh)4D%4nJ@Pap=#X#4&#l zC%$fk31SIxwEqO+7~gY=V|=e9j{e?49M^q-_|Gm+oG)N`zE0(#4~PR$9{TVTm4`lb z^*kcVf9-a5JK{KhFpxOpGm1F+yFYP^?{wm?xgRozIL5t}IL3Vu@wIM8RuD%!&nDjF zd4|i0KkxFtiFoY+rYH9k@1A9RJ#k$3HR7n}6XNLakHpd6uD zJCZp1JDE7zc_8tx-QSo)yxrrwTHxeHMXZ0*1j`3PS{2R9~=MaCuzRAL1@;4S-qP2n zPpJHb?$7*4yvyF!-#+f=qMkzwjqgSr?H^4X`Y?q!^r49OGw$acMEpGOR~>Pz*NccB z+QZtpg819MuANPMhUc}eApV2r0oD*lfA1&W$K&Dk#4&$gBaZp|De;~@e|{p4>vna2 z1mglZ_a+WG4$$BCneqyGJgqy5u~qx}aFKV+E6zm7QSUql>oTS5GyGwPXqDpV~n>FU+U$T z63_AY>qO#^^LfPgaX;j5#H)Qi-a`D{{??wg#1C>i`4sUd_ObGB5`WS4;dA0>=LX{U zdY)=?mml;2=g7AwzRcsn-HD_AF~lK<1BgQoCB&!rxF13s^&d_g?O#HCtjpm{;xk?T z7ZV@ha=DK90iM^olQ`mwM~Nf8c#-&DJ??v-IQsPsarEoI#38q>e0{)pt>4%5VJG5{ z|4`!hd;Vl9@r!&NFCu=v+yB|bUvmF8LA;CmOG)C8+p)wUH=Hv?zj}H9FQxL3+YQ7a zw|j^~4v!PxxS7fA72>G>BjVG?TX~%OLpz^vd3N%7436vWNE~^(A;d58_&uL^AGe>C z#L>=q#GxlG#G(I36CdSv_*CN1lfM%G)$P))#EU#%_aN~v++TW!c-c^s=U2qhuZ_eH z*wf1QaQ%XupLeA6Uql@3UqKx0KZp3e z`&s>05J&xMh(mwwCw`Q#ck7Ao;Q8v;h`;CKh;yKj^WIafJwH+T=Y3u1>gzMgqn*8p zW1eOa$9x${9P8s`;#da{Bo4iuL;Pabr&{7@XFKtmJl}%zL$?&q9M9M`>^INHC4_*w1`-%lL%tS654zeXJG|AaW& z{}XXMx1p=|1LKA3_9l+@4rTZv@Is_Vxz;%NU&;%I+@_`#lkND@aq#}Y^T&mfNWUqT%1zkztW`>Xd5$92~c zNBdtP-WsvjN5oOj_r%f8PQGqqywJ{ViLahw_3uI)_3uR-as4FXhi_x`Od~$T+c%5& z;hqOb5XW_s#Ic?pNBmb`zs@9%dM+itev-BG2I7$0J;Wim$BDo1^Wqiaxb8>9Z}GU} z2jYudZnzH#FCjT|W?{h!x0phQD-1;POwC8o=7{^bELq0zfe<;t|vzh1TAWzi49dYR4K;lE) zpBzmb=a!}rNBu>_;olxa9Q~>zj(*|(RJ6a;{h{NjJg$2VarEm7;)n-tCVrv&X%7%b z{ZA4{{jU?pdi^PJ^!F#?=iH}!ROuX#J6^i^Q5T%YLCAr zQTYpf-(f28al@>A1;lY)e>U;OZpUK8x6}s6tA+R?x1WoMe>T#}A4R;@>pz`%md8!! z62IH?suvOer;qy$#Mex<>)uAZ%BRg7`YW?#aYIaQ!@s z_!)lw%bUyvoPrN#ZSD&-275`o8$9#PhxWw~3D& zYx4P!_{+nLe?k1@9gP2nIP7XS9|!2$E54p>PkgZJ^C03Udi%!`NBvWY@8R>kg!o*S z8_s*8J$rc^y@1N2{-wm9^Z9-v@%KD0bRKc+7u-+$Vwci+*iGw8u zV~ImPGl<{n{%4Fh+TTbV@>xb4@;QZg(`b{=g~TC;YluS*cMyjh9w81nyg?jt_>4H@ z(B17ixZyI5IG4TrD&%*xs7E(-I>K9zkucGqk*R90wcf0f; z@n5>xb)O;ry06#o5I@ZA=U2pW-HpVtUi9#FZwqh#sXl%KiT}g>>Jh}Jd-+MkAI-J) zPa}?XXC`s1J59tlx}Gm1e!@7b|0Lq5{{rHue>L&LdsscU6NlU$Cf>V?m4BA_$F5gz z6JO!_^Cj_~-L0Nqh?iv<@8NzT#-+c@b0^|Q`25Wxp7ik^LVT#_8}}iO{zi!pEU@;> zAdY-Uj5zWkjl_@G%IZ0i_}^UqClg0|RuRX!*44zfbGvjq@iTm0JWPD1%l}#8XXRTv z-zMJ2_54fXgM426LcF(+OAjA^jN^K@8-0nRzk3k>z{h=W;zN2_J9CJadHFKpsDCc; z9erJFB)-j5tA81B)N>N?MvvnzARc#nwVL>Nx0AOMNBs{Ihh9BPd^=w^asCc+hQIwK zm7nDL{|oW6eI3F5@u;WC{pTG#o&!JH%TtN>^L4O^vn|NF!@ zc)z|OjyzjWUmq|otKDxNKpc8CoH*>*zQnQK6%c>a?Z8ap_`3iJ;{Wh@(MCMi*RSQo z;kTSkyvF^LD~Rvl`Olk)-@LU6ZY}XLm*dmKul07mMI8CbFNq^R`77~%xqrKb&u@$i zBaXZQ9-xeI!T4@7#`+D8@f|??_^qtmaN@Y`zQiG) z0^+cHRm9gh5FXE8f%ft`z@xb%a zAZOJ79hHCFCXz{kmuRNAt(#gQJM!y89EyyqHcL_HYjI3nyB?>WGi^^?ea>Tz3U=_>E^1 zM}IFTj{dG8{=Bar_Y=o;*Aqv7Un9P!`*WWV|J?mLJl755^1aKstFOc0xNdLa=vNkT z^lKFH$x}_v`x8g~(}|;BbBN>oUM+F#pSBan`M~AGk9GTV7ICacmlMCXo3;NY;%NVU z#P9d_PY{RPUL_8>eM0W$J&MQg4}u$$9+t@GIu>6K^*rhO(wp;?eKxb z(Vp4F(ck&R(cgCBxB33ma^k4}EaK?zWyI0nn}{#j%;a?+anz4wlIw_PJjsj_0$#MI8C!e-nSm^BzACukrZh7vc*&-s$A~Igo$5+lSu7hYvJ4^dmkm z%lIzDXALqwi1=+jzQc)s?d{o@IP|lCIQ(`z{|4(We5Vsfes~UX6$K%a)R37)W zzD&H>?fHkqi`)F^Up2U&28A*JOi9a%# zIIepj@h(1pXA^(j?cRLi^?n~j8*#K}Iq^%ju?C$*9PPP`IO@5P_}eb8dx@X!apeod zp>OXI-#*LQ)5Fg}K+Y)Nm-x+nt^9c6i+47jOC0?wCywVDA4dE|?^iSN?|pqbia6>& zg*f!*LgLV$Yl!2%zdMLS{vQ&*)5q~U;%HCA*BQtY_XBQ29P!1@#FzWH3?q*F1Sb*i z>FeV(;%LuI;(4y;HNS@%vN6UmtAszeaplUq?PBj=z8N197bTojvY{oU!ir zBECz1yY8;UA-564;h*eB9C_?Q;@B6SMI3pX1o3HE)}ADBJYVHF;?KF?awc)K|5D;j zZbxn)j(F-G;)tgnC%($_gs%{Xd_E$M{{BWB<$JhagYjDA_3uC&_tOp{j&UDL9OIr% z9QBkCztQ8{Lx@A3i-}+DdV2!#%Y6QyOC0rFNgQ&xg?PK48(2#m^*lvqX)?cm6(cJcsjJ;;-gM!s~b9 zklWTCmtb55?P%ru6F=PLzbEk*cD3>oiFft(=M%?uD~ZEy%p(rFv5@!`Zm*6Zj`~j{ zj(LH2!;lIQohpqj4X#WYW z=lzMJJ$n+z^HH;jzuMW_Q%bzj=W`SB2X?peM-s<%PbLoeuOfcD>;G!v=cP2%+o?SI`!I3z_c`KyJrDB^ zaa{K+;!pdyY$T3;_3-!-?S$XkkN8%;4>XuKt~-u6`kO->{l&Q|To?U~QTbm7nEV@w zpNiLVw#H;+=(e1=>-G_-|U3iu_>VKO!?%&4#q@G6NXwQ+vPxF1WlZm4} ztB9kXYl!3Tci%xA^*llxdh#4`#24=n$94ZrJZ~qH=dZ+Z-7Va|fZR||KjP4b!Nei| zeTaYNac-12t~-M``WqwuQ$L?y#36@e#83D2=w#xHTwhlaM|)Ni$8(BrCk{D0OdN7} zj`)@Xt^My1$92CV{+s&^8;L_cJzTCBugTuue#FOgw(AZij_Zyij&-MqIQ)u(h{La_ zCw{Q!2Nn~@b&n?w|KS|sknz$N0`Bexk2m^NC}>wT(FD-EqV* z@6ICL=h9R0nK_zQzgUiT8e!Tqtvi9h1=@jc?0k6#nVeE%=;w>PuvZZ$n~ywJ{_ zh+{quC64(xo;c=XE^*Aqa^e`T!-!+tn}|bCjwFuxcrtO!#|w#LKHf?k{e6Hq)~P3m zC)}_5fcOaax4$J0yY@TrT|DmCrYLhe$H#a%-EXkDrI*(@u5XW_g6NmonOB{KR0^-xM z?0Pea$6X(4h~v7g#L?fs5TECIayoI0*Tuv!UVkS(cROq6-NezJe-VcqULxMIo7M9H z@gn!rz9Zht^)pgx-`hfdY$N}0-ED{?Z?-dWTz44pX+5moiNqnFeBzK#74e^kTRm~& zXy-!Wkk2v1A&1k5qx}~X|8SCB_j=;E?p?%D&tt^V-xrCazaJ2v@A1*M#Btr=S#IJL|aUyYCH=j8ARY@HEiW8sU{`NxRsQ(z^=+|k)VaKi}jyUu- z;#l7wCXT-w_bhR==WXJML%$>rIs8H#a_BK5b6hSQWAFPC$94B04ms>i9CFAZzJ8?D zUq&4D&n1rbHxNhrmk}@UyxB>_QU3+R(f+H6qy4uNpW%6lhl!*9XNjZzZxcuRzalG2+L#KiSBd4YKz!hyR?lkU*tfWyIQsQ4aa{LV;<)bH#K-ow>wZZb@yJHvpLu_KRAi19+S8Xf z+Or4ozAn#k#INsT_2v*q{bj^a|6JmzzkxWO>$;5ibG{#U5^-Gj0^+#t)x;sU+lc4* zKJP=szxBBOS>jW>nH=6Gj`n;>9PRmqINH;_GIPA}+}9n5Z{vEn2l1Xg?fZKZM|-k~ zqdld>(Vn@)?{@#NfjH_vf;j45NgVZ`PaOTdia7dv8}ZGzvi?3q9PN3AINI|TakS@4 z;=8yX_zQ8=-@PhxyiorR#8Lks;?VynaXhDf260^XB;sdzKJfzLHx0A)T}}LR&%546 z{9ES_5x>5d)$~N;@^5acop${@7Jxw(VjPn7r6ib zIq~Uk$2Jh}?DF4ymh}VcIONlZ_-fam-H5;LaqDQ}rQV(?#GwyG#Gwxd6MtrkwXdEy zIvy(XT6rL;u$hho0Y09D4p5ap>(Q#FzWH|41DA++}vA{Nd;HA`U+%i}?HF z?fWB%Lq4;KW4z`Qhn}<%hn^fqeD`s7-7|@w;{CmpIOKl=@nX-*-9!8u=j(`1*xIi9 zGVwaMKOYjuxt8yULk}Z!GUX3F+=jXLYXI>E*Z<+fA^!s6(9bI3kWZX=OM$g-A#v#K zF~p&_rxAzVUPs*B#mJq+q0f&Jhu*$G{L(G0o$nEcK7UOd`n=6Snes2&+urX?9P-R3 z4*jeoj^}31BmVp(tG|Uf^xPbLmI z+)jLg=Vu-!j`4k#IL7xK;*Yys{faoQyOH=cZV!7Lk|}5Ow=Z$@cQEl&+#eW69M_#o z9Q|q_j(#m8{^Vq9-$}$#{{_UMKdXtK@BO`p#viEq7~weK&)r~5i` z2Jsv(e<|?;+%LV6_>>*3{`-huHQM-k;;X#;>%$_V0-R9a)_>CC% z?TKT2cPEbV9YcH<-#45}`~a7K8Szfu{<*}_o(AI3!1;hy95|4~G$l9_~vVdN_?Z^l%n&=;3_g(8G4((8CqP zp@-)XhaUco_=lsc|F;mwxUVIS@qLOo#`g{4(8JG(Ll1u;zW)K%p6-Wbjtkne197xx z5OK6;EOF>tHgV`%199lvGUCv;lZiv$E+h_pyO#J5J4C|kPU5e){d|l#?o)b+_==&S zn#hO5q0iqFhdy_%w(r6IK%aXNhdyT!hdz%Y4t<_N9Qs^L9Qu3+ap>~`;?U=1#8z6U*rJo^%dJog|DdG1XderYyw_@!mUo2Obk<`PHy8;EZ{*~%Y5{CD?H zRuaF(_2+!zgZL|LQ^FXy?)(Jh4^u<=S9TvT!1>_Ilb+=i->>ec6bHxTYa9MP5i~K zR?p?c5A}8MCgMkBTlxElpQVQ>+`KyPk|B-t6(kbmB|gKRJl_Nm09QJ@G5^jV~eI?Cm^}c+dT<{Q1PM z+0FRX#J~1=cRTT3+gtfZh#%J9`18c)yTAP&@%vm3-w?mV+xa{3zWuEJZRXogjLTl$ z{sF`{xc=`&{1(@%{fK|&ayyXtd#-PDh}TZEcGMA{wTJPQ#4&%*Bfi1Q|BX22^)19Z z`@Y6n;$6qvb)O=R{OudWdknMkpAk>E+4K{9(7}lZiu5 z3W?8hJ)cD!`ja4z@k$cMcpXa|`fvtu=)>QMV|?!>j`4koIL74z;ux22iDO)TCysI1 z=I~7ULq7e9pX&a`p2Q)y3B()SkIEx{zxz3r#IGJn*bFjj`mzf9QOH6 z;#uw=K1v+Voq2)ySMEQ*M;w2@kIf;1JEsbA59Q&JB6UYA1ZN#x}`w($F z@9!Dn^Ka%i9=7O z5?}7+ONgK9>;56c$GE?AIPtDs?7B;c!0qa0Z_#M|#&{u)-ii1IkJpA0$GDdhe>K4={W-+pSC}`0IS)m;1c9ig>lp zuUm;<=j9(H{;bDkPZM9-$K?AaarpC}6Nf*)fjHKe&6_jF>wNdG`VgPc)ynNg{6NEz z(Zt{Ob+d>#?Dj##VYlmu!)`AjKGOa36Np1kZYGZLeSkRPwI_++;&J!u#4qyxeoFj| z1MGvJi2tjX@vbfQ6Z2xtaC_gI__JOblZnI5A4nW_el~IBm*x{keyNQ( z@=M1NM}Fx{;>a&uN_9d#J%<{;7)UvF?v0p6mYVRN}B3 zCB(75EFlhiasqLz7v~aRpJn~Ik~s1VHxq|Fd4M?V$&d~G#F35NFBaVF6P~r{lZ;vMqyOc{D_NSaU{F%du!;Uo(-^=5dBZfV^OC3zueE>_a%;by$5mV+up>XZ#l$o8D;gC z5l1^?#Q!qV$~O{6`3s0=dHJh}V|}@eIPwn<5l8;v8REz@yhR*&hA)W2|NIYe_@CVt zXUZS`=k~J9Qt+( zap>Dx;;=JM5r>_5gE;i_XX2QTn;nrkE|`zo5r@CJ8*%unV~E3Fok|@3YAJE}t8^2iDRC2UY03;oTKPP z9R6n(armF3h$CK}LLBjOF>&~-hY*Lqx_~(R)gy?*Upy|tr_ zIO4VAh$CJ*lQ`CwONnEBxsmuF&!5~&9PNLC_{CdTJ6|P^@|};$lqdSNEphm7yAX$b z_9BjXJ&8Ex^)%v;+f3q+TMcon*R8}M&%Y3dJWnT%xbkA+nAg`6$GpCaIM(0Ch-3YI zkvQ_h9}wTy&o6yT9OLynajX|xADualSTFh$$9ladaje%9h-1CZBaZdDg7`(&j7T+c z_p;NXA6jDkGAX0Bz~grJ12-^{+3$9i`xajbV|5nt>3O_vbIa}@6+j^|E1N*wh(M?5hp5?*f+hrRlo_;34K z`Jaiu>3NB+$J*z*Y;7a|F7frQ7x4!@E*?c3?b(m`D&GezAdYrc634n$O&s>Ni8$=- zO5#|j&Le)+R@ToeiQ|0l8sb-afA1rXb?0&7Sa)6~zRuT|4~S# zB98eoggE?)am3+QWD|#9Q9>Mk#lghkSJV-QU(rq+e#LRb;a8kN9Dc>c%-yfJjyUx5 zAH;F4@)6=VSNSY)*ps)2!=8Ljyt$i=-_OL4?Pa{{ip=qa-_naX{FYsa!*3Z*9Dd70 z;_zGYh{JCwCl0?QMjU=i19A8*ONqm8Ie|F*mUD>1Z@HW}?8e>1;kP_S9Dd6S#9;^C zB@R3A6>-EDzYs@!(e3!mafJWVhdBJ7fyCkej3f^KXFuZbf2I+K|5HUAd4qYxkvC{2 zj=aH<#NkJsL>zw9`NZKz{f#*MsGEtyk9vT3x6MqxPY{QFdxbdsfe(pe{(egw^Y_2R z;SX$iLgx5l9q&gR>-ZkTVb8}Bhdn=lIM)3l;#l|R5XZVdpE%b2Byp_!e<6-_|1{!Q z_y0;9cJ&(Ku&cKdhh2S$IP$Bn6UTXgPl)3@zz@V>uR5KWIbN_=I}wM!F@!k$jd8@` z&twyaT{?(3{F7SZ@K4%^!_PdHIPBHw#9^;4A`buLTH>%vcMykNdYJg_yPF)JA%53R z#@{3kyYv}x*rlI{!~S$xnK@ptKid+Azche2@?E9G&l+I$9!wl|qmDTIqITl&i;g1> zzvv9&@QW@c4!`I+;+QZ0AddO+2yx7pw}`{OeNG(q?PucfPr9CzDS!AUy@PtF`)tmE4g$2z_najfH`h+`d}OdRX@fy5{8 zW$lpW4t~mj`7<3)J!=;{(Xo;{<{%}{6`aq{0|^r=;t?zi9`Me6UVwxPaNyQ zV&bq@#}kLWI+u9Eme&6(iK9I?6Nf%LNgVp{I&tVj*V8iPjB)Qx9OIrv9OFBZIP_sM zag6(c#4+ykiDRC&5yw0|jyUw>Oyba!ONm2IZXgald7StQy-i-P5XZQDL>%MN>GVuF zV_bR?$GGfE9C9uo4tZ7)hddV&hkTA94*8r$9QNTN;*i^Q#38r4i2tys_5U&AklTyI zF<;&%j`{K}@tek3{l61O{ac@rDSwPhf8rRIJ&9vnCJ=`|nMWM{WCd~9jcVes8_mSw z*BwP1e%&d=;n!VA9Ddz3#NpT7K^%VFBgEm?Jx3gV-8;nL*L_7CeqE0U3U%f zUG_76FY(EpjsJ`InZ1p_K)j3l8}AS=a(n&-@lM{JpNaq5^|Qb}jL* zrdj>#iT`IS+EyR9D%|0{_Y)gLmz zflp%jTLpeU&o4a!AH{rb6ZmZQhl2u-@cekMz~7vw+VvTMe}nz=!ve2odw5ddf0?iN z91-{{JWhWi@XxY+zAW&+uzj8q__O-?K!N|5=L^@zRsFi(@3>T@3k1G`$Ja!G-@)T? zhQK%Se0QO^A8378?N^k0{;b%m)8aUO&-5* z3;bK$?`H-6V5yQP=ik*)+rxKwJ{l+R-?5)LU*MFf zzMiiiqXPd|_541#WVIDFXjC z`^gIh{-a5X@1+7SSTLs?AT zKh5#Uy#oKQixr>G2)xFj@P`F{V!Xni6!@DQ2Obgl4vwRKBJdY@UVB;KOD792;X;9zvVW@-_?_%0!vcTk zD#gE1;A^?xI|csAd5Zp4f$R0dL4oV`eq7+Xz4r@TxA*G;*X?~);JUp(68L32Z@w(> zZ*W}n8-eeiq}uh4!1a4cIr~+?{;c|P4D@X<3A|Lp=_ z&wk@y1^z70N4o^Re5vAdkH8JSe)*)p5BL@R7Z}Ikz^;=rzAEV7;qmyazzcXj{jR{@ z#tgYm$IF#68L|yKe<8R4VTAnQ&x0DI|b2+N~GJ*f=WeUGR;7@uKezU;)vlRX@ zf&Z2L;ll!dhU2&I3Vev?i&q7H74tDZt?JS3x}WWTtiXGD++8H_A9FlhE%1p>#kXDH znM{9=z&A1dqXLhzUHw?#N4S4a3j9j8|F;=;fEZ5re-;}E+o;d*5f1tA|Hd4Z9xw2h zxZarpzm@&%B7q;^cx)Ntx?VlMtP%9O-Zp{jdhZbUrR+C`1phhQt_K9Y=Kq+$ALRM^ zu)uY@o)`G9d7K_+T(|3Ie7*cfL9gr0{A{Y8b-fn|{4307F5{a2EsR$QddQ$OzL)*U!-Bq&>7N($LwcQ7(Elfo-#-ZYU$7rAKbNYX!(}QxM<$ zTPE-?al2MBuJv|TrsA_s(Cd0{61c8+zrbJcC_WDe{-;cZKP~7rpZ^fJuJbM@K5n%vY2tre;)I%6ZD$ThXk(c-7WC{UaI8y zcfo(DOW|J@^qSAp0{>6;!>0v)39ln%+@IRs8g5rMMI_MD*Cd|nW^t~dVyRZiQ(1yfYI zm~pM2dlYQU7WA6WB7v8&pYIU(eKQrKUdAlKL>DdCmn$vulXJEa^=N85}%(d_@G0xp);l~+gcV^)Q+>abCSooEU zvsqYp8{^f?Ps`KGxRzJr+ZkUa={ zjBghBFB#t=@ZU1tC-5_j?-2M|#&-%l*QtQJ1YW}Uy#k-a_@@|0whR&CVH`0#zEt3P ze61C@9@kq1uKmdYfonf@P~h6H9v8Uw=QL0tPs^$25fAH0<9hyDDsVk-t`)eR$F~Yx z#{&lhuH%Y>0@v}(ae?bNN-I~(spC2iD_!F{o?I$$9p4(|J)1Wq8rQ)w(XEbc`m8(F z-dLW9-JCGWn;R32M)|s)9;3XwQza-DPs`y9(DL@qrp9*2$5PF)b-k_8ct=Yol%?~= zb?drg8&k3yyBj-NW5_aDq&?md(?viIeTs0D(oLNkHpDtWq>j!+tbBQ>VNOq?v1vW0 zTRVEoySh8OV%>?&%s18+ZRu{@pa(A7!v{ThpdfaM_QRUbQa*9moibqDeVWX`Ztb~eZoh)+)SsxJu_8HXL9|>4*N*gul2VI zFsT!OjHTz{-Y~xZfI8~Eq{aCqUHu0yR+NvFsw38qb<6tK0Va6@WaJ*fy>i7WVM^#Gs2LMY~|9^A+r;xdAleF6*FJ1iy zxc)Ai{o^IFtbaFP$WzM+r?egap*ju;1J?EH;{hN`SN^8)iekDjY+X(t9~q(iy%QA$ zUk)l^m=+Vd{5Ndpi0kcHF0a%2sLSc}b8vz~M2Kk|V&mmniu{}t9MjyfJf`@to5U0#pBbai80OV3j+U20;=FmRc%5dLNPY{0}20mLx2 zp0COu6b(}-kh}N|Mr1^$&+x*p4PDhfX!?@D23wyPmXfm~wPL~?vjZ)+7g7f~|5EyuM;MR8r{qGEr zrgq)%tcC{(NT&axWGH56PD4jL;i-g}z!Q$$)Enzbcswa+u%kKN)R>4N8tP2Mn_?ad z0wn?J>+I-=H6@beQ&1am3T;nUXGc#gl>=~UiFa>6-2-i9yr)U9PDM3qM7{N1y8z4q zQB8$h6<=tqcYO*qa!{z98c=_#W|)IQ?W8DgIMx$O(E`<`(2-~@E!b#nS|BtCAsHye z>K@e!M(vD^hK}_eotr!npRdkS*B##wPsBII3{Oq0r>C(s1{``~-5X=ghKIW>-r3>l zR=u8rf!eVjQn2n=OK%UB4aeGJjnH#eK@C`?NM}_j^E^YD7A59$0zyBKvOU(^3bK*; zHG}SLrydj&49)N;MSD_8D23W;N3C0R*Ht!nV%^=H-3D}gV-qMKp4jY3fL$A&)eV*P zY9BE?)s(ZgDj)FADS}>@skNRpuA%CPkTH8<$sh~GvorU=;2Jiwa&Ah`6GT^c6oz0T&YWk>iyx6x0;fXy84=ET{sx6@vb)NA-?WOV86s+T*ezg zO9lkXiQXPhu(>^ET+;}n)z*8u-Ck^I%&_Hj#bDqt6B$FIP0-Bke_JmP8fc)4Np?dsN9%Q+Z}I>cYq9_u#V2=n5QS+95X7R z4582+NfeoPZ-D&fIJ(7ThBg~d2suQMgVAjHFznL@e2wcmRGXpWnxTU`J7#utcFaj& zx5wcc$pb?4cE@JX6au?~u8lxXBs`59VFWk6dxayHOJ9+u?*=VFNA`B~bj6zDE%8|Mxm$LQa_K746 z{S3G3^!#90dte&rMu!dS2sG%CQr2tHwLpKufEcM>n(ByQCl6t8m}&SaOO&+^ub1hp zTBTe)z3X~5_atH)1S{%{2Ye%0IcKNqa@8^>Aa~XU9SIf;t`+Bf>Qy-Rgd&v>IAB+c&Y)W8~U1;hb-ATPWT?w{LhK!M@@3o_)h>HT%Z5vMk8{ zyaj^%h?kXLVx6Tw`KNwU_44=X7q9uxwds3Enr5y(;iFvBp`gJ=qwh6o=wf}sM}G9l zLitv^m0oC_y|r9=LiS$&FK3}A#iSz{`Jzb<{i1bX6 zwl16)KMy8E({Rv|B#i~xKx40sgG&**oHWh4GStDX4i1`&T~3;!i!)5P4m4bDO1U_X zDHT}IyU3VXiVn1(_u~1+{BcX*)RjRN?{d?DX1_vLLE$ryMN{eMeiVmJix6}hCGHQy zk?g=#?AizC8AoA96FqXwsL00!cs1~7@1VVt_Ac6I(B7ndChfCm@1}h=?MKl*hxWO& z&!c@l?bSX1LOLH!`y$#G(|!!?OK3lq_Ty-;Zmg(f`U!-nCF@CaKAHAv5qS!oduU%q z`>C{7OT^RY`~upmn{G4cT-`vLMd!0=ez4cSZ-qr`g4O>2yKXVepMrhv1TAFx z;H1RJK#kB~GT$ymJRAPiMsX;bbCF{i42}OiYEz8}gG|(ju|@{UNB*STfpD@7)ZC9~ zO1F{Gt|`L~gp-t3YkM4};6VQItyQg>33XGeii`}DgIYD{Ksb%8_d9MphpdX@Et;dt z$Uti1_=p4HBuCQIXEo(4BjevRuXlazEdl2x3!8Vn2+@I_y%1A$7P*9qv|#-Rf|UI($MM z_Nv1t)nUInd|DmuQ-{y1!xz-yA$53I9loj#Uss1m)!}J%IHV3gREM9a!%x-WWp#K> z9e$?{XSZ_0S30f(EhqI)G03dUTOEZThGx?h-)#;&Rp(nBIOokYOgsz%OeQu1Zic~@ zxy|9I2aMvB%N9aP0>j2BK zHw4B@m&+GU!h+7Bc6y@Cn0^j6Wy9I*)@;gB*-%Q83u&|vbW0U!9D85VY{rdGk)|lU zG!*wa@+f3M2AZQ|FEuG|f@WekW*V;iNq{=(#Do}Snvs)pWsVCJlQG@EU)?nwj$p9^ zPBP0NJr{_x7C@=XaxTwVoD(c|Lf5(pC^IiN7nhYPC_BU9%D=KKE2k_YSgdG~$Eb4S zs_{^`%mJm#%o*c@#iJcXSxZZA0i(zJcg$?YJPnIL9?*;uK_72#PFb z{Xmb5DTXHIV#<#*mVeO@YqD z2NuZ9DF2H6OPf8E)fgThfqxTduZN?<;rL5_9v;wP!atl$vCIUZl+Edw;w*r65+(1b zX4=v0O*@#~pb7{uvz1(sa^*S9{4bi0p{va7KGV@U&&*3n6^@v4Izgzg-y3bfb;hW- z%2?&CZtzDV_2FP>xq-LyTVshRt&zvOjBqquW%z0#+gsldiTdh-KB7tH`@>fIRSUebl+kBB=r9WC3sW*brFx|Tg`>zHHx^W1EVIvd` z)z$}neju;3BT1K@@S13q zH(1>e_7g{?G=Bp$%3ECx%~;|0)pKn+uL|1aT}kAjV5q7VZ*wkBDP3zs>Y_D~<Rsjot#B4HG45m=P3!LG#!c7f{idT(SUaIS(f-0!5j zV8r15gw^bBkkS{PZ}fCEv|BgtBk(*WDa7Z6vbs|$>*pm;=Nll%Dzr(`^D3|f@3LyY zQPtbs5$|cE=E8kV^}GPxP4ITNCUvPhQyF3~7&2PgI~x-qOc)xVRgQY@i8VEMZfJ^v zsn=V#yW8PDj)!(BwiyihYHM&Ppb(*^-VYeBhDJy^*#fXUtjC1t>zvNhG47* zD?z7`h<7=3f;Fzgk=o_D(cx+_WbxLy)^$V3zq*cWK3eAuLkGgWb{iig4b?`yp~y9W zvz6ljj~F7&OKz$gIPwKtWpFzN#AHuH3`bA#fQ~6drZ3{9gKTR)<3*RA0R&YSnJz z6m9@UL45k)n%eM6?4O2E1e6u53PSDBtJVVx$pH=}SYpx*TeQF4M{Wm-CHtr{;zLJf ze`q3^8IHgZP9}YI$^Inmt090sQTY{LC}g!csj@J7q+k?D@X-uky^W>USHBAE79Z^J zR#rk=BH)+64(qDH26R`eCq9yLToVC*q34ujJ>XxgDnKnb3*d7dIF+Pi;lN0a0d&ju z(Fo3^+K&?fs43++51wDNP{=l^@km3htenK!R|L3xE|&W1#9N9>B$SO-k(O^|HtZfd*Y=0ywV zEL`B3)9RVi(%7@Pqp7XCv!k=OXHIX&rg%s59C#GJJ=O!6aMQhM{T#SknSjUQI=kU% zcOb-4Dx;~rv8PRE<6|LnTAEsHX=tAEN6AK`Mc_SJutaYJVu_xvD9obtFb7SdNXel@ z#4={~*XYnvLJvJ|L;ia70wNq@PX&%4=|FngI=d4Tb0jMY_*NOss~X#TW4iAl41+?| z)wMo&9;z~`LKihSa9p6lqW`jqWm!fr1fyDazv^x3oQ6mp_dRtZOh}3gO+=OhrNFE< z8itwP8s<28g`+r8;(k7e0dG2>15365+$z`-*NPKU2%-cXizKb~ntE{VI!nhJO4;EC zU=RXT1?#PXFt_NLAOz78Jmh6}u{L621x^JVGLT>d27w~@iC_)7EQnNL5|7%#R!h?A z2u3+HO0Y2vq$w<~be%E}CyhP~K@&t15D7r1Sr%cNEU5()X)7J^z^M-RYPP4 z<4g+zev_34Qg>mbq9VmeGE60(PO~RZ=+XK$bygp#u-Y=+N(i5OZ2f~VjMt|^NGps@ z_DeWIe&Ol{QX7THAqdv2AZVEv7^pDOi^12`$porinM_cqu>^9ps4B zBZW{8g_baXK_Cj=e|fszLK~?K;Uz`{B968%b(h7pgbr_V#qoCEqj`Lc+OS@GRC`u*|Mrc)M$EPj?e0_~G@YcO~W`<#XXN zqW0eA*xd5+6o)3r1krp~@>Vn6HdJ=FBwMIAew89xM#180fLfBaD^Ihhd*{}{CeCy?z ze$KpJO3vFde|~wzf>{i!_a$&q4wl0(IKbtWgSg0{Z&>K(Rvfp44ad!ej)}Qh?p?5& zG6`t#A2(Wa^XC`-i_@2v83F>pFmDNF!bXdJI)8aG|9X`@V)>77{z&EbzDxOUzDxO+ z-lhCI=P1uv!w$IElwth-?63>~TzmsW=D|G#2~pZby)rz@HS7&P^*ocqhOb3IV8i>` zi0gD0UR%YZns3b`|_1zLgC?-AOczTE@vZ;Cw0k^rqLd z-(*~;X-psykRtsIE}--AJ~rZ4GOp?IE;QmHL67~6cudeQW4u?;*E9Z6L7(E*hOO|V zi5pU9D;e*PFwvy0tfBYRi=gC5)zu=MT1ya^N=D>7x$@M9D{wFgs;TbW%Snn&a&ZFF z_C;Eq&(W67wk7e>AbI(15ePx;mk*jIDL(sD&^-<}9I65ChcZ4&{8EAIajDB`dX0Zb z(ChKqIRf4z-&pnR|{4Gu&6}WnW#V}qJIKP@`oDjHr(!(&$ z2z&)L95&5Q>tQY9{E9Gm0@W`Y8COrBkh`J&`Y7Y-$&n=fX~qM5!~^=g$2q-P;6LDW zo4{Y;^vweQ1E+TgT>l2c9)X{Sh7H>T0-w*gmJ72{P9Nh(1${l^FABVo@e=~?VEl~0 zw=(YLBW7d0gPblExaKoc;QKheNZ?=LbU@&TIIZ8I)%6}@yiL&mg3~t({0&a;5cpf1 z-Xrioaryy)pXK!90?*{QvG za{7$GC!+Dfrk?Xl`hjxBOZlklUBT&@0&n5;B7tw=bU@&Da(cDEALMkKz@Oms%>sXp z(>nyNzfrkI;3ql#fWUvx>7xSA;<)%lflp@qgupLm{EWb>8CQ>7CiT3QaeS-^H?8Lb zoW^II?D&hEUL^1{oDK-w!?(;=3p~Jho4|K4ezU+2GQLCLXBgij@R{_44ESwdsUyIEeX=R&vAZ>hi+F+Nk^YZ+f8@Ewe6y=wlC zFuq#QzsPu-z}179hHdMLX9PZpU+_^+9w+U5A>*aoKU!}!jB7j6_>GJ&67)M54+#7Ki3P;<1l%v?pOz#n4!yIbHN=J`)w2WWZz!0p{H=yg9mB=FC% zoR10o5!S~K?0&?oV&tY`Jqd=mcz;~v5PB&Yc&sjPN+*m%_w@ku_* zSx)s7d=jr`e39UvVEw44-IMfpGF~a@*Rnn6>ng2>I~cDM^kZ1gRRaG5&-d30{4P$f z6ZjW7-6rtY*^hJx{4S+_BO!1-PHqwS6z<2Z0{<}g}HP(;5F4TIcWL&pH<0}~7 zBltu)y-(na*&aSC@X74=z98@r>-iCZFJ}Bvf&YyA>ze|5 zX9kzk^sQ`f`ubbrZ}Rvm6!Zm5KUU!TSkL-595tT=*E?0v|DM}BQ{ZMblTiM=r3S6%b+%53MtpAS-d@bA6eu1mkWDMhT z0zb+1J}7YYR+?daS>S6}KaUAqUpGA^@J}%PvjYDU*ZZ8n%UN$f6!_1%T|X1}ueo2e zo^*fR%Y5`V1vS2v_5Zryv!CtoHv<1F_wU;R&tZA=x{K!j7TcR%chPty+rP=WxQK40KH+}>FNSMRJD#$174&GeTDJcIRoxxhcm zzKfcx!&gmK9=i!N#dOTmB7n5t=F}*{5NpDzZLX9;Ql==@Yh&Le-`+CEGI4If(A8z z^%@GiP{Q(RJkI*b75HMtiv<2UkKa;(-_G`Sp1}W;<(Ve%R!+|rxc-J=g}}pH??Qn; z#QnHL;E%9AR}1{>91k=zuI+6t%fC&~huM#POwb=^yS-P?@8tA-0)K_&d`RHs+`oE0 z*Zs1U_5Zk_pUrysmcSRYoZl9>{{4vW3j77OpJM`lkn!gQu5WR_B=GyV-d_paWc}!M zMcppF-t}8SALVwP7I-Q5*PjKR#cAySK!}eJ1G))E%PrIIKJPG z+hvSv``OCl&?o3$X8FSc$M;ilTP^So1sfj{_;!}RS>R>NN6*{3yC(O=(T>I7WCtp|MzY5_TN(YnV|nO^M6&~SF)Yx-w@aG|CsggdqH2r`qy!y zrr*PKe--rlzL<;cOVdx|`7T@F+qhi?0zbg|FA@0vVSJ*%k8;143H&g(cZR_AeStXw z&tv`<3p~nxRbP+lcFpJhy-Lt8XFIPF_+MGi5yr8b^co#zT`%Z$9M&%IN4Z~m1YUuH z!FG$lKg#moF7N>BU#}1AcKw<4d8eSif!lkJzi&1AZEml=&!FYMi|LOD`X<)f4+O4$hruv@Ch)H+bs8@Tdo zjN5xZ<0wz5O&%TZX#MNwt)8;cBa3P-b6D^%R?x3zdED%ewfvW}-Hv7)yTQ3cd&h~ z7WKxs-t~e$lj*wzeTeDr5cE6Q-tH0jXPJJ#;G_HTD}ug}$NOV~eg^aTfuK)tfBmPx z^?jGu1Rrhde-iXMPSW@Hw4S+IqnP_a_ly4KDyxaEM+!AD9QC>6GnHwO58gkT!|CY) z4{&<6z_tF%1-^~b^9BAjPA?SruQ|O`;6*4fY<_j1cA=d5Ij9u^pUw36{3>p`UF!F6 z4C{GQjq7#)HHzG#4=^A7T%4w_XS_+!e~9r7jAN2r4^IJ9KVR;++yGKbBJ~f&t?4=0fszf`Qw1$cD*`SdyjRd zPSo?}skV+e$5poRLBGx7VSjvp=Qn0&c=QP$7sD}~{<_%l==<%cKkOr^zg2)qod9GU z#GBo)O=bV9Qp0JlhKzLe@A0YERTLBUH^66 zplUd%4s;ES^SLgsW9@WxW04AeAf=QY6V8_6wd9ixHe{A5-I~v~D;XiTMf7U2?)c;0c57$)iXv2ve zW88!OS1!QER{IYoE`akxCq@lCgLFGrIFNKqKZ?R)59B&ec`$RZ;gx|O9XdHG9R*d= zbSyA%EZ{g8a2yNlL`wq}xrNYz7oR};2n-w!4E&HpN4ZYbXvtEl8yw>V{Oq^TN(K)7 zplx*uEdqcyi}aIDsx2)py2` zxbEZ=kZL*7e+!hjvG_=T8<#w_FtBrX7bF5Z`?um@;CXGFP_}5W|N8*;oyqRa>Z95m zeN@!Z_Y`u--g4+vCv$BtJ{Kpy5*B;%)M73XKWB-twi2Vrx=)SXb;_};?E^+10$B%v#jC-h)q4s~NljWp`U!jnrO1?syINNy}X zRl=w3#ivH`X}oyXk^TVlJqf>r1;c3fT1cns;DYVBM4-C9@8G1s0Lc^>q{HCSih=%m zl;$biXBTY8UqRK0JNH=$XChajStkbow2IH{JL4|cjv)x1+!4nDXIyBK8HwvpUYjH> zcx>x7pelI!7?%y~d>kW_z~I+WM+_D`x^*j3LBH?ZiERoF93A*k0J_=c{!U^_?GPdO5J?$o77;7SM#0`2(v$N$;YuLYClQ zn;PZh&WCEQ9yT9-KyM7g8T%In14*vOu2wTPr%?MOm(pIr z_OHWGhQ=Z#HI^oG$aL#gUV^-Kp}3KUmP;Peq9NFn0Lh$6*@CS%>@g08@t^ z@oHS7aOp(ZS?2;n$J`yewnBxRIK1_CNMvvcnpwUA0J)^oaH40H`jf9g3Y-tRx*Ln( zL`^a2s-l6*y{@WE31P@SPTrej*RI*M7k^N8r&h9Pam_3KfqCuP`V@AS(OZzTrjz*I z90@+qkJBih;+Q_%{}H4vcyuS0O5cEEfu=*!%yS*w1z_p}xiBEfL~P|PLjis6?1B*i zBPC@l4dyy67S9t4%VbjNGMod?Fy%nq0zPXwLcZAQdvY5b5t-0AU?CY!m?$s+ut_C3 zA38oN05RPl(Loz6kxX>#PvAw1id;!$BgPK824J-_cQ;k9hSA`d(IW($x`>QLLF|FU zBWC702j0XW$@t^%nFeM9$pXXKtX-!v(7B%5i$GLeIB+H~(EFwi|DXlw1Kc-dfZKnt zH_IN9BqL9X)sgG*z(B)`JN$1P@xO^OAMxXugr4yqA6#19cP1;LT<%F+MpbCtfd5S$ z;HLH!%mV&57eBL!iev1_T|w}2yYUFaA*IdL56Z$_5^+lXeG;RMf{ z4>5hg_7WIEC-L{I&q0irKO+wQ#fJ*E{mVHj<2iXG4*w(B^q%U;`@pfN$qNoNdD(m_ zd+-~IZO)bFnH!4P%Le%JMa^|K*Mx!eW}3AQKuh(kweTcbrBXM#(?L@Fq2o@w%OXE( z^HHZ7-*176_gP?vW8GtIovWiJ z_o-SNn(8aSg`Ufza3O%qZ5H`X;t1DQBeKKGb)rx2Ym+16m~sm~dfC~tBhHyHoWQ+~*vR)b z+D={r7j!luQhU!*H%@FaxQ2^>{@?xG0*qAmdlUZymWF`GR+6kvEwUVA*pb!Kzx$Amuo5ZL$A!cb1Z{ z%A!dZ0u1_3!@Q5-EKK_pZNkE#2r?hXbaLi~)wN^LhZv=Oy#fX%tmeR8tmeRFT>wy^ z!(oL4BgMmYm^avuob&=_axo3!Wn>fRdy2UAa;&u%3=pnSA;&1_FNOpz*4X&i7!3M% z=|BWmX%sU&q%I!6Lrheh4ojwb8QEGq1}29CgS$x>Smi-B13#jNq%7`G(;$tZL%$j| z@Z-SZW4B!bTHO_xqtuC43{-CC4gv=IspY21#kFXfr%x?Z-zGQDp1sQ8u6ZxzG)@c*zyRpz2+Q)sL0$ik-VS_@v=O-d+er3q z7h<=+Q33a|2mUnhW?*3VvA55j9r*5!-7morYI_k5qPvdtp8yalGYTHtjrkzJn{Y@D zMOca1zEZ8kAe&)UmGr{zlAU!Lqk)6CBnlCIX2JFszk7+PEN|nkmktF-R;mvOzK% z=zsz8!zXvB9!=X}y4@r6Cufh)zLAs(6Q|YabI|d~d&{WDVPZIY@<-qa)J)cQ#t-v0f!_r1AKfQPh`-l32Wh;#>%6uW zW>CDp_0V6^ILOBVL5F^{8ahs=ko{&d`;0!_x!ZW>>{*KLzOe=P z1qNPtJMiG){>P923jYTY9`64k9-)^}m|@-)Y~5NB8HN56AEf~2fra&iy0b15S4ras z@17RCD{$z9$8qe?87JJ2{?n9MM+Xia`lV~up@Czwj_#nUxh7mW_z>)FyAAkf;a${O zrxIYOC>`*}_NFXfQ#;6M;LYjxLN@(9k?qoz4IF;D4W5dkDn`-<*gWXKIQbXYX_}q8 zQTgA(vK&+mP{;K>h23|ycf5!asUatE=}S?#3O@FrV)qu%!-S>hq_a7@S~^K_7sL}a0P(j(6CV8MF3Hsfe#qN!TodK0Au!phj4I<4x>S} zFhw!j&YdcfJ5*{@j}E>dcH2$adqA;;^e{yr^M7{$H`tGAepi=7Q5?7=oG6BM)GGj@ zQGk_L(`*_W#L$id3mOmFL10LCM9tC|lr709=#QwG#TJI)!j}rea9IJXd7ohwEx%~- zbS$NeIKzRk1zrXO|11IU^tlbZV<&!(k=lS3+KCJmb~ zmHrLq*N@o1%yY(vI1t}GY#UV3dOyZ(dWz0S2@72#Y2tl_P3K_Jcfw&^qAH7nyI&B_ zqLud@oFJDa)Do$>N6ih+?p}j4v((QzY>e4^Hc&g#Olg@t6q`OeQ5n@M* z?JhYLC!y>?7PO!)Z8?szPQjxY{%`7-%73)))}uzEY@`yP1mhGvmNV!-dTy<&#fpaG zuu?%!Vjl6I!P3B4-2=6cdoby~<7Wo^?`*yGL|y`}m0@M6?_k9sJgSkE$fC=YQ}6^& z+SONlelZP4ydivM@iQAU`)+;5fS?M8)u~y4#Sa$3`!OH?2Esh)SnJpGS>n|RgWJ(owme@}V0D384KKb(?W zC>#FcXD|H-!iMeB{{)C#Xih^%JmJBQ{dvN%n|fnC36ICHqrr~mcvE8{hG?iW5pRll zEC?P^2GrNt(E%TUN|sMSZNw?GJzelAi&!cL;M5ZD-T)x-t&GFBFH%{jqM9|L@J%DT z0L%eVO@&+)Uudj%eF`;lP^g_6P=Bgsn1e#?q$qDV2EXr~!ZwMHL~Ch*BvTx0S|C(? z)i8xI)W)ctvC+`6zN2%K2fys&se@mYk0;_AV}_?jeXj>N^u)S1#+nTecNu<|t6TMY z3I=M&en`Q(V=cWsST-DMkHM!&k_9zjl_H(tS0p|23}srBn9m9La2QD09&3g#RC>t# znnCxrQxA#>hGuw_qCF`kl#(p5Rnn@vuCl=s>+bICHlX7hn?M2a#AZ(d?Aq|qx0q-j zF+B9KAlgGB+}WFeuSR*Q8sqIKNOPnv@QM@8WcBfXsAxpo!K_%(D$Y=9LBlF`3nHa?d$fdDe9%+Kdo>X|&zb*%j-i zk9Ml&wRCoa1t{tLUTwXG>S&9nN?O&cByp{2gio=>I`H#Eo^|kXi1pYS$WOqxQ4RR6 z60lFInZ7S))ON>P;~gLaD6FHiIp)Fd8X1*PhEPyv5=G|S8z8?qj&3oTq0Pn~u8lxXBs`59VFcqh3g4x|k;|p8NYks2 z`a;utx?)Z7mUyiB+!dXpT)K)hIepSZ`LTJHZbctz+Kx`u|L|EYFef`XxM(tZPgff_ z>|{<`XP2j`6Fw0Y>-KDncdCM_C!}3SYt{WF>4w{NdVVmhJur=QL;W4CXj7dXL@4=L zbS==IFd#;%m!>*m*vUf}942g%pRz<*>xgt#t&&eq@4BANJ&D)`!HPQL0pCbg&e`d@ zT(yh|$endTM}h@|YXwgTUt&hj0pl_hsch&`#_)j8(vPj#%)`pEsaR&|_7M)lJFOaZ z=5XDK9LX)Mk~VdAuh$bh`k0O2AGZg?>p z&*6g{A}bXVka1~agrfug-|O{*t(bNCUd!Y4L%Qv~mdERd;8`Mulhkbk9_< zXZUPr`(>VL_nlKgr?!mj9>!OVyzCe{y`{ZxGnGQhNf<$BQ)o^oND&Z+2*4l0M<%WRX5k zq^F3qN2JR{da6jDFVfRQ`T~)jF48kZdZtKQ7q*Ol85&?34w@z@Pd3mPe_@hEz9J-Q zr)QEEa`K%t<>qIogIgUOG%x2nX}X@BVdA&h^WBtEg@?x1LSc1&*Z6>Sez)!X-)uDZ zOi0q)J26>y&-nFL*^f_5o*$Ti=NGz5|F4z(@Z@Cn*Cr*;zf*?iIr!C#d?j}-o|9~@ zsm17V={#dp(U0Lgce>6re>4sSp((mBGslg;LqhRPW??Q;a-yUJe{j+b?PnE{8nUpC z0r<~G9#f2*kHPsxR8iKLQk+)Q`S|f(>-@aZ0Gv$F>ye*JW z9|mw&g!Ocb%DiMDXob=^1@-xUa=DX=Y&3!R@o;w6dDwut777ECT zh1uCqnQCtKrIb+3&0a(a)!gjGl<+79mr+7BD*JLus77Tkp@eEw_7#*+jmln13Du}< zFD2>}w`G)2EzGVQ+X`~7RXJ5-+99Eun;jsjyHrk)5($-9k%MZzStV+U&?>g7M5tgD zB-F1lX4krJ0&aaO=jwvnA+bXx*5n-qvRx{1-MB%>*`pHIkKYZ611fO?iSvL;d?*{o z&m$@k9d#)v@o|+{OR^nQiFNLO2L|6(COax?JU%Be2MQY57v_^k%~=QeIS7;8qg2$7 z0A35{isoOevt4jTgkR8v#YPTxZ7Blfi4Df0oGf=83?!;QC)?K7Iio0{-WAWup@dtJ z2p+-Q?Xi9ig&X`>E8#7g+qyVLd6yL9kmtn0k_kYiTAp|57|c;E&s#(}s^xi$OPV1^wLEVL<*1hDT~UIZ#~N98 z0w4Uj-bv`3PMS)dyenN_L{Ts^>wee;fP&o@iT3Tx{OfiDHn}t2Y+OHT5u7T?@^8q- zLR(4Z{0~t=eFY;wI_d_X+BO+Jrf#gw#?sqW_4mOkRS!Q$OX|pPbYg{bf!yc{JB<9M zLi`0&#WO}cIngo-rBiyyZ_U0I^{U9)h^%z-#>Q?Vo{PmNQABVf;myF6lItlM)5#6Q zuT3XADA^84BMYUh1vaFHc`Rs`3x7IS%?tV6guk!OC-Rx}eAi*%wsgH^OBuP{2le2kq&pKf^`m8MHTP zk8kWkOK9(=J^D)cxklRO&_0*;d9=rg3u>W#A?-)gzKHh4v>!uz91CDhv>!+NQreHF zJ=!V^ecDf={bbtX6HYKA(%wV+GTKk2z50>hX>@)8?QuQ^Yo+~6+RviB`uWKV>HH$v z-9~PwMH_aMQierqwYbMI8J3~` z@rI*XHV5jamK7PfD2Hm+t9ah7dAf{Tq*gp1ag4m z!!yzcB8|~A9VkRnuA~^VGq26(&%fNh6-EQZZtAd09fs85E_JwD9d@h3J?iiYb=a#8 zpHzqa>hNiGxKABEuMS^OhlkYRVRiVbI(%In9#w~@)!~pj{7@Z!q7FY*hnLmiHFfx% zI-K3g4PWWl1X@luoYuo;jlR`UcrP@28n*W~2cD|)tq$}MGnJ#bA7HY)83rwzjo#*P zbOAOWOO4*{$R`4;uPvPxPtHFLWWzd@CqN_XCy#)H z%h*ZId@S=*q@pN=gd6uCRLk!WZGgHnPQ#gz^CEC4MUcvtI34*YLJ6c46_P43$6P^d zFTpJ2pMgT#Dj2hrDrmrbT*pv55`cK;&vcM_ZbE{C5T$0&cW_8YQ&2}9;AhOZ1G2}e z^O<)i&u8tYb83oXHr4bTGAc(Q9>Df|2U#K?#aB_56XkD_5-&J19z`Pjjz|VYn~G=- z5f#JOPD``^<#J3Xq6>g%tm@avR=?)YRxMkJ9Fi>~=3_1-t*yr_(i*8Isg;rz2Ql7( z1Q=(NVT?5{!Ai&b^FEI_+KSp?z+*F=2|J3P1_J!g_%`f}oUcLe@z)n#}+ccbf4)Vp)2 zj>fN}-9>}kIn<`o8(gE%LYzbG>Id$tT$t3`MvwzH$KGSQx+)hfV!4JMx=nEixZGI8 zHS{EW~KVZ)V+?!q;6oGUY2MGW+e?n-nU4i_!E zxQ1SARSkMMr9oe^bU7WCzo|hlJ0~gCeY1ztv(UI)Lyz>R2L4hv@TdihRwcgAz^|ON zh-3BdubnLAu^uJFXHtZCl`g1JtFLMyKI5FAw7OS)3D5C4*?wx>eNH!y43LeJzSR_zB)Y|cIKf< zl5?lx9nszT63bApffpHQ(A}twt-)y-n{ffKG!}4A!iPXD!|H(hCe+9U&Pl4#Y*-7N z!mt+V3bh?wD(q;H7C_t4DF?PhZ(hreieTx5>OAG((fJTw4#E@hj@inX4{RA7H-6(_ zYx&xi(JfuZZyj!&!N6&3Q7ZYJgU##c7BaUtb^0I^{N9m|v!H9}*p}(Yek#Gl@2>wNcU~}yKsuuhu2Mqx2KwolPfCl6oQV#Sb$2@kR)T);p zi_v_XLjg|uRFa+A|8-FG=NxLLR=liQ0p3>0vN=T-{ly{2-bdhu7V+EcAnVN-`u@*v zQHuGnBNrEoGKSvN$VVJ`xQ3K5bX+61I`WW1#?Xrz+2Y7g=Ywxc4{uEm-<}@c=EzG8 zF`;|6JF?L{GKP+63AQ`P^fQKj`tw_i99(dt-iV}V;BL!wFNVcr(m=%FQR=_GtgE@# zh&blsTn+w>bG;akfclkoRw=V`4z1PcB9uex{~DqHl_|Ba0!rK*dwX>4D;*`O_I9dn zrK3!B?^-qJ)bbgYsRHZ8&9V2SE?Z#hJL>(>4w?{b-BRSBl|Nf&7CUl9XO3~?s?G#e z8Z)qtUAV*TkJL!4^nSR*30G*4$M*8j&((L!9Cx{~<1>a{`S~rE(yVkh2{A5i{2NV{ z8AFe2(%lRkw18sOiQm@1JxOt)1EJ!3Sz3@y0ee{3qZ;_Qo1(j+Z-VqwvCKB)skf{6 z#Ig4k-GXi8HXs0@_H3J}^xp=Tld#=jFTC2amQ`@SlgMvK4i_a)G~XI63Rs(O=@)d+ zSfE-614U)8W8ft%?rM9D=Ud|T>l#;UaaHTWcJetE`7@e4tjS5-@C@BL>eyvWZ>U8~ z?AUqdam$vC<6%GrmrYfv)hbnvI(81#tJG!ekyI*((=$md~TA)PT{=!|oW zT&%)y%rsp2lVIh{nFlAAyg-ODC^#2bjxrH1b6jrm%qcK(%G}5{cRF#;(CeGvXWT&uf!G=LeWf&K;s5xlMGsY|BF0eqd00mxR2WO1G!@6qdyfZ3He@s1>;X%PGoufWn7`6bGwWO7Ft5Ho%PLwUST@jEoL^H zI#-zEfTwG&IRy{ygi5-Lz$s$-PO|{3+-K&tnPXR&4tL*GW}dsu9Jj*Ee%o}cnP-l9 z4$v#+IV+0Hf)l3mfH~1Q1B4qgv-X*V6=uGBn;AeBE6n+LXfemHF(<;A^Cq(xfrOc{ z+niWo<_v*A+sxu>GXr>tbWVkt;o6k&nVxB&At?1+<|~<-%nXnuzs;Po!Ytioj(XC} z-UuRHf}*%zb$`#y{ggT8i>C8SP&U_n)ST$rwA#!VLgv=qJ8Z%zT?v2U4f_uXbDSU*Tp0)p)V?Y5euZZqARp>B_vQEle9 z*O=Lxux{*yyw}a_uc8qaAAn)H&m7}E-<$^x$bxg#wfXK|?8DJ;m}nhxAvN}ZS<-8c z-)N3oZH{ln{usO3ENwN%4Vk&U&`KCB&htymOZJ~Yp1 z15$<8nlpeo_G|ujBq;z81_Y~%mB-*j$h#0ICj!F^S0Si*tgCx9blpQ{E_7ePU09Nf zjB#%=Cu7SYqv%>}dJ&X{Lna*ZUN!SKV{IV9g=Y2z%1x~SH+8dF=$twZR8YRgoZ1V$ zPbLLLz$hkyQ50=6o!iJ6gF6K`<$ldP?@LIP<9-CVy<(2qZ)WT_UEhWA*k|UfFwIxZ zEY!gPvlQn6*9x=1mE(TPyl{oNxW&v|ZO&d}&Ihs(r2F7xUZ)7)lG1Pgs0 zM!{&5!9CUlC8K+HfkVW@6A;M5!8xtaoQf4B%tAbXdYmqpfU;jrHfodmc@%Usnp43m zW-*L|7tG?-a2SFE4B`E~rnA?a?wnn0I-fA7IL|LO&);QE+0XlFbPjvZezRy7k~*B_ z#qPLs7WnQ{X6C0zPr2L8u?gr1u}o}i3|YtuUFD7n@_i7F*4{Ythiyib_BjE?fcZ$1gEww1PWrokX>unSuJWU1uB&0SIrSBD`VuI6K@sxEbU*C8 zptyqn&5WsF_E)e$W81SpY35yK?yF`FIO^}36G82(F)qpJH^EU}3A#3Snd6@~CxM4+ zF)wgsgNrT#X+fI2m1f39Gn?mb92A?Nx$al@Ck?0#{7V`Gn&F&YY-WRjfQOy}@|@d- zKo7;Hqt$&K)CuC2eHJA%-4Bz4AG;m<{=)5M`99MJv*bQ=e!?7I4%Tob%rBrU_@_zl zA+y50i>yZZ5AJgI7(C|D?@anMObg%xX?Dn6iAGui7DjzzP8u>x66S=eR7GMj&eY?tAF-8l=4ME#q^Q=wzP<+*ZpL1c4tIT#T{fh*1N;C(=x(G?g56+k^J&@Gzg zY%^minZXtA>p|bWW)(yez#y}YLP7`*OVHu$!#Q{KMi{><%=51_3y}gsF3ehC=D>6Y zS-Z?>y$EFPg1vLKnG1&u@O`832owAj@aZatBkcD^8}Nn5sJF^k<*jb;M?!>y@7Ney*7Q^3HXiVVmE*L@hMS_SQe|z9+ zBO0v5+Sf-D2K^>N6kq@D?SU$NVfa~r?)F%R0S`X51Xw4}#Z z{y_M|hUjK|>CWe^LwTb-f$&0STn8-qePMJraEYz(bEk|0`8%Pnq_{dG~f*_hdR3n zj6+UcZ-Rf_0ysBqjJC8lwo*upj%UIzpY1>{EY(42{@m7q!d zK@#su(j=A$1w&P}QC}^X#fCY_D~<8?djU(T?_b2loClzc-Bf^VWHn1*?Pg zYp|!I-iG=>Z8&%>w5q8ys@{4969ILT_*8w^U+rCEU`f;r^p39j=ydwcnkX>9;fBVF^@0RFT~^UxOvOE}$zJ}#A3S#i=Zqf)MXdh}w)O#Z< zfp-;@1rtSUgy9ATh{Sa?G=dR>Z4usH1}-oR=L6-2PB2xl2N+82armJUkYZUkywutR zmSXsW@Jl1X%4i*M4z5-`;qyWr)Zpa1uh?|M{(5Y(qkMHia2UNE@DgguWIP}RbR>6qyE(7&e^>%l}d)j;;E&M)4tNP6udL!N2-D-6%x|;47bvnKq3}XOW zOd~&3Z;<OJD5IjONs_SDm{p(~0%4gzf9 zw>oH-GQiOa$O1NkIxs;7sW^bKP;Fr&R2!`id#kEIF9~1>zl~uNs@|uDH8{>5qb1%R z!x!-lFroTdUu`uHgJ1}JJ#t@*hGC*HL73e z{cU(>yC()F(+~t(3@Qm>1jBD0k)H7-?`Wbk3U6y0ExjGk(aor4ZzysNNP%{t%?&+Q z1e_C4K=(jX5~zP{A5Ds2{c2*2qVA!2IB6M8z1`i|vGB$}dUh!C){%Ap&TXbE&0d_BadRFrmJu z&afuZ%4;B4K&yooaA$YL67>5rJsfg?JL*aX9WaCvmi;8<4L5+eNdo{E0X#{9U1t@VegZ23a~l2-0Xh!5 z7IaVh>wOdjKy#AgxH96a6TbkJ%nV0h?nBAZlLaNEYzbfmh(s zPWDfp60E>bQ-L){czvOe5%Slgu2UmH)e&If7`EZGARG)0mqr+8=xbrzgfXNDMp0F2 zKpW&3F`hy*Qa+LF2qUTGF)Na?j0{P2BROoL04v!nudjX;j9^kM`~E024@Nh1bv?ux zRbWvx3ZsU%vJ$#80$$EnTT@pJ-pPQ8KZ>ovqA;q^SK%z6<_rXtdBHCZ;p7;_n2~je zfl|cQTh~M&RtWojwX6IP(m@c7@dCsOtLuW{HE29>(1>nJ7yLFF_$ioj$!np5iGkTC zH3fF3qGuISk-mBwH>!X#g%G2eF8E=o&Gnr$OU5{Sg%~0^Lt*4;pI{*%srJ{vKmdbF z`S~vn-XSX5u%Q>6J;ZR(Q&cl`RC1)kOEifx9$05?k4J5;9%aKg~+Wow{gqcAAw zXGNkts0NUd=3%92G63`=|F5$%f$yrg_V|UM;MQVAKnoJ3YS{iEfDmPQ2?5yyBm_~= z><|=^m<56&1{IB4p{`W11zQTO)S`j~MMbbm)w+R-iWRk0TtTfZR$AXVGr#lyPk!Y8 z`rexl;r{1)&pr3dndQ#Ry?3tmtn&+pXXoXKBU}?Uw|uT%P>{*ellIkC>ew7{e~oL3 z&|z{tiug5BOHIpdPUvh}dQIKpd*+iSyNiB}c+_3;E2SQ}k_k)ndYmZrxf3Q%3Zi*( zh4GGey?oVGD2;1bUsvD~T{OKkx*cc9X4ah9C8gR=^-J<4l#kHfnyaaG3#!Y#Ui77M z+;!hM0d~pdOAEEOK)!P80CA=)s8$&j&Xa+|obp0kqf6pFO3Ta%WAgJ|E)?WXnW&XT ztB+hpq^7wuS60b&xXkHxy(D$9Ywe|PTdu3kFSBOP-^?s8O9JlFOAb7jDjJ-#q!ybM)z^gJrJAT=jrP-;d-Y(T7UYM;4v^_AsA zXO&mVaI{pS#WkfBLmM&&_8B-Jwa={7J~N9|T}4e*WmSD`pZd!Avn$K`I1kjyPAPb$ zm-LbGcAZ>zt7`hlC`bE`wxd*n-(}SvoU_OIzxDEiRcZH?(@`vPt5#?EHzj zlH@`eM7aX)#!%9<$tB6v-%{zUl+KfmMZAxw#mQanL|*#Esud$;=@{81UVFKgSAMu{ z7b)wFh%6shad?7Km(R^VXBkkCFlXKGY7wRlc_ye}p*5~5@L_=!2$(ij!`akf=I zO{Z_gv;mVV-0Uh@Xh%obW>!J&xZH{7=Kh4gb5lAq-b3DdN5nI|2Ck%nv(F<%yz@`KO3 zLLKDj|NSCoc4BQtKPZt4K*BlFSCgLq%+fhkuAA$|xq03c zDe^j(<64Y_#=HVi7*qjwQ7NotAld|7KYoU7L4 zMTJ#!%B&qr^iK0+%3-FcsB_(jYFVIkc7t!T>!kIWCFMNcd+>d1e~pqZORi*Uajmqx zb%nZGm>ZW$FEanUF;j9zYm+!~a>1BMdVzLRHaayYHC#romsQECpi;B7&w>_Mx*cw; z?-taHL+KP~r_)d9P%v;ToO1r8coBAUI*IZ#Ld>Z}y_;R?b39MGSNU=U zACsN$=FJjaIqj{To1Nq5cjEI^iDH_UFBcXmg9WY#xXH9!nfi#2_=jgpr=qTAL7{fM zYU00YBPm?*k%phdk(n(m%(@b!xDvg$AZKKsYa3;(n5(132{IC!s=Wf~g-JD%?wF3F zr1y@NF>$C~OQb19pGL1kt~C|kyMe4VJo)EKF`f{gxY*3Ww{(x%R?M z-z7XgVao7vqBfXdn&3u!=V}}3+v{efU3>6_+VxPIwBl%W4q9^Q9hFuu&_ZS-a7mr4 z{5n_VXV;cV|IZv0p8&8igp7w}nnD_kuuteaKkj0T;;fx_J*yYrC0a;&iPJLN|h*J6Se-NMBf_SqWj1L`TEl5`%r7t2sT@J=75?ePo7f@SQCaYk&A2szdeWmTb zPGkx3xs=$Y{oq7Q>!!r8k-oP(daggtm38?E|LakbeYz=?9@T7jKJl5{D5zDH;)Ft( z1Cd{nKCM-vOCoAN%9I}JdI0W6+3YI6mD1>bIKxz2W+|oZtg001I|K4VlO&sHR8G!0 zsc8izvPf<{h9G@1>RmKrQNMn%z5{vy>l1hKoUi=pYXSNikBnUOxx=l>@SM9}j6>qB zF3XErHMDQ_!(-dFTPBYc>iS-`#+Q4LdF1!nU)wt8xFcI{6bZj?h{$Mg&sN+1lpd{A zK#!f__F}~w+h67mcl#G&zk3GU_Fs_LzXJQ+Q|Y!pWnx_a7VLMAyxabHiR1TRzk8_P z_NRQFV)h-ve)pz9eE-lkw%;$l5k>AT2HW3yf;&MMIo2<35k>AD3)`P^L)^X@`iQ0k z_ZCWgf19?ZetDw8ufTryDv<3@k@tq+-!0g`TDS52E8^$hgZ=IuuK50* zN7(U)u;0D17T>=ouHP^26GiU5y7>Opas5N^w5EHJFuuPku73vhyLTMp`{%}wUx@uX znx+22A?MuO{?Yu7~UfP@QNpZEKIn!8*t1T^Y_oQpH9s2xgEB^wz z<3;ePyq(~<#jC;lg6~Dz?ah;6;Ekx5egT#!$_00oR(@y6pN4YzbLZ8HEny|})ynTy zL3-UwyTYyo&yuYM<3E+(D&MG3g7J0oTlpqO@c^&<-U#mUOn$rPcV)ZH@ix&U*=jJp zQ+~G+KNl&KppVvT=qBk@-r%Egi~lTf<(CuBck(IGF5(|Uz7gEc`wwvQuW?<#LiMkJ zJlrj-r+B`S^mGMZPdp8LD{*ZLRsT!i?m1}rt;^oDl5({khL}B5A-|XOlz|^0UI#A9 zTrfS0!P^u633wN9OYgmo9}#VZf(|&(X2_>P-t<2WZspSWE8tlq|2Fs};-5O6679zM z^jf6hUyv^%d0p&D{aH<1S0U5#xz`Q%%CdI!; zmjL*c;-7GDfxDN`Tj1>vW8=i0<0ZWo>{lMR#ciu?tjfzJ*#+Y>!BfF|V0(?@M?_if zv3&n7g6_H%ypj05;9H45Ap8fC0~TB#K_c6PAD*fxdMpXorSDpje>DkzI|=_>xY}cO zxIT&4b0~>?ic|!ZKY%3kK|(r#ca`HbboZO67kC!9y(u?LcuV$=gZy&YYOvSx3c+6o zcYPDtf2qV<(z7@TzcmS8orM2B34bmL|8o-lg>d!T3+{c7#9NvvQt(=`zf%%^MiSmv zxa#kK2FBhX9hyXb1mrJlpdHm6{X7`~En^F&^ z%)+~*GO3<;f+DKz6#_ZfG9M=->RwpIAn}mQRrpS5gzp=o^pJ#?Fr4*NA1h z6PL*J(X- zOgz5hXYG~gnfL~X%n*hT0yVq4YI?#MQpaSLMrT0$LsF*M*)I39^nSUNfZ+M!!*4Pj z{z$Pus`(>AE!=rG2!CcnoY`L-dTkccZL#kqq5r` zHfz3HW}jsCQV&yMXNj9kZLY|92=~TydP=H>ey#*}A>I8r-2Bty63?;f6G<|kq_=!@ zhh}5q`4M^sx%rXq-W5Gt)7&O~A|QTD;vq#sPLHzi89R-uE!ue5!$+6{k|tR$7tv7p zlaJTCpuaUJA0~gs^|f{l+TD^SJz9tB`$Y;R7~h9}X@$pe{tb9Fxa!wFnCZWY)|MMhzwg>W|p1lDd9O(HZiJtEQo)^d;<=(OP&*XrspEt;#hK7KL_TLt8m4C`fN70smtNcRnuZUaw(-G~o*<FGT^L zBKs^K7bMZMED66a3Ex57>hl3JUhV^0yxTWiPFBVM+y>E#T!z_!Y!wKz=R$)Gf#i+9NZj{!G|^Cb-&jq5PTs6#>_= zlJUBL7Y6($(!T}z?w68&!k@+E=%mjMsU!<5bL0zn@A6_%R>1Wb^FtwV zv;X!ad~*{147lnJ?f)p?q5U280R#zbe;;tR|LlNkJ2MsaIy=yFfp9C&g@L@D!^+A0 zB>e6q{88dou68Ejp9DPge-GSGuySjDo{)r32WNj)2lAo*g@JtN=U)drtar}_Jgj$% zyNRLPwlE}{wc&Vtg^DYhas7;oxje-2EK>oQvUek34&bu>^56fHkQ$bu*{O190BRb6g z+X5cye>dPNZ+7}sffM<@5cYRF-5X} z_2`hWbxS!iOi}#Q_h~+Zb@wZ~1k9 zz(e`R!BsZ&f5)_houT|WN%-_6{AO^~ANqeoz-P)n%a>OJ9@eh`J-j`tCv1na!L_^{ zA%E5mPY&d>gq!}tfQNeKkREHF7Y6d7o*M!l>baBjSi8L@kPr1d7RYPbR-nG@3FI#h z?EgB6{82qcNP_CPME)$jXM$UOH2vcO`OwdcN#5Frok@5*J*fmWTm5eV-QhULu);6L zEJ7yV8wX@!YkWB3qlr&L+_olP30^_+*C5_N{4T_sh_6R{Iq|0vUrXHD;Z4N9M0^MF zc51MM-F_4Iga3$N6zwDKKkOGp2Z@h`9@A%jC<3?n1LO7_hCUyu!ML?=nZ)l!d^GV* zh)*N_0^$|K|AKe}@xLS9MBINwQtlfNKSc|$gtf%`fty{rTgzb%_zsev0=}DgG59{> zmEZ@7H-h^wU?%)|Be?$>Yl54eH0)P(YUj@o&m{gJ;-iT_iTE_)FCkt*{4K;Ah<}QB z6Y(z*UrziR#Mcu44)IOIkJO8XgdM~?fbS!I3iv_dy}{dIYknJucxU2Sh^Gkzm7X3y2&O(eezaeLm-LkIpQldvAqL(VTRX4a_e~={6Y)&qix3}8d@177h~I~J1@T7^Zy^3h z#G8okLVP*#j}Tu={0qc)5O0f%+iv1r!S@lj=j{#>9}ju|ZTW0P^_VXcoTR7@vY!Z#1DcmC!W^U>t9Q}2z(RqrQkb={}OyR zarccjImJHWJ0X9N_-EklV6XYPeLHVwXX2UQX~gZmxcg?b9BO)+Aa8y(z8-uU>Ddil zLENv_F86tfryk|)Y$84yd^z!1;A@FDfo~%I0Qe5#&x7wK{vr52;&xyBAn`6od;8lV zAIv`k!8;S50B+^T5)r(ZpARPb2;$cm?sdz#E7k1aBgKBJM*kC!Pk5Y<6!b zWOx_2|8d*a@%}=l;r=CVPdPpykhgxcnxP!G;i8ivqyE7q)RCUxD&G&kbz?Rt*Ylp< zK`FkyCtKt8yzdCNH^I+_A>)XzQUfI9`AuBUc-)sdpLjaj$0Fj_<36bM>&>3M;I$-w z*|8p6Njx2nypi~`$frAr_r`soUl6x)_B-Nt!`Y7#e*}7-A>O;Q2Rn(kg8T=>-$e$0 zN&Hyc=lD1Ajwn$66X%Ki%2o$T@SiVF@E;*x{O8CMd?d58p`2_d{txJ}afGF}9_2^hN77*2zEtua z@trClVL$Q7XixNgBn_sg68^VuI~m^yJsoj=ibJ!x^6%^{kH`Z>0N|;ypiNDK)tZ>i=}rJ+8=$dDb!zve0-4j zYmk3}_)k$Do+m!vtBu|u-U<3YAbtpb_=@-tlz%rdCOXajf1*4ehwG2=3!vv@;)_tf z&Lo}=`v(xW{z*1*8*fY`-URg~}u0LkydiZk*$#+J5Urzj1=)a%%Rj9v@5)s1@QmJ#4Aw0Qs7tf&l+!L^aJ9hs9&cNKMH=f=f+LXEx5i+ zB6&;K4C42oT+JqK?aMsk55u0TiPxZ@FC(t+|7o~~_*&%GeZqNXK>Smfq{6y&KLHsl1V>)qr?)EI^sPBV`+x%)aahty#MO>CLabW`SeAt;! z{0i{%iSLJ>3yE(){+1K30l$Q}e8b9xONrlw`aYld-6(HYFt>U^d=>ch#M>iXOPQlQ z+)lg-`Fl63yAePk-9zZQ{@3y7oTt!6>&M5x*JvyPx=<(XM_?d>-uimiQfLA6nr!tM41o z{m=g8MSI(gcoxokI`LOvcQ4}a!2cPJ^x1j{)OaI;pdNuFGacz5O0g} z@OS30{}Azs@N;XF7qh1b{g!sbt)Klp;yK6{dq2zc*nOOnNq!gXNhNOUmYhNSbEK;` z@eQcI{fMI)MK-UdyZg)E*SKB`Bl*qn{|Mrzq1_lud<*J@|G0c&T-+OWP9^zgkdHHn zw}YQch-V{TDu};@a&GUb>26KeoygZ!kXQGj>ma|P=r^RNKkDOV;(v!fpCDcZd;UOt zKJ0&v_%76omx;d!`(GzM4931q`~kE}?-So**E`|`$d~=ZcOZYiCT`{FTjJk?e_ElR zqPx}4-=O_$OZ+wX=Q!e5fuBHp63XF8#D}B2bt66!_MA?<7xJqY@gtGm4C2*@4(9V>Tyv>7LLfqzMt|NXT^5u4LvvVuT!$Tzh zH1g|7l6Ma)N&E3E$)~A839kq8XL;oQ|AORgU7=R+x23lTerrp7KXe^O{37`O1mate z?KDZ-NgZUWt4kO1w4vpF{i=ln1+iW&U{hY2L}1rK=M_vzlr#h(7%-U0<>dy5Fd^H#y!L@ zfd79%57ibuc4j}BK|P^IgI!}Fy0wS{3hhrc;fb)P(JYw(f^-L{1D1v1-KTQ zK`y8Kf0vT{7TA9!@x?giM&c>(gUz#AzMP8oWFyJH4L@%OS9>x8d!8qGdvDy{-#7hF zp&Y(P@;`>3_Yv<7|9npTVfg20)ML|sE6Q6ZaJBR7z|K^XzYyu|6Ud(v$PXm>B5OYb z`N4tw43d8Zex4o3Bdgp|H6-5={<)Imvv7_klAo^$mvB4DH##b7HIw{*;pC5!{3ggh zMe>6Yf0^WWK>kgVzXJLAVIZ$An*@1V1km#9e)#`5r;_{x*`o z2I*Zz@^*jrHzaTAv~h{~b0zd|C3#(sQ^TJ~|9X$3*GT?)RVd+olHcm6JOhU7t@(2) z+R5*On>{ZtL9CKJ?qXh4Js} z4+&FAPaEhj0yleX9n|?GZ}wbAJR5qJ6Mr23`Bk7_n~asHkJj%qJ8yuUPmrDuQ2t*g zuIsjHcq`Da{w(e8aP%d~oBgfPAGhxSFl)`ChL+>PhnN<9wNcyr#Dr z>CGnjHy}Te*{&pcD<{i{55{<86>;;=gT#v^y_vJw|en+;>Tzq)qsAk z`N7szw&zpKZ{~+HtzRsM_Lo1)-$BI9&QZkE^+Xa1g7d21CV^i>^0w~M9Fot1d_Bp( zi28Ch$)`g8CX%=MW%t`vOzr6l`CpKHZ(MgD2=uEf?fUo#$yv(Hrn$eI*Sn!R7{JAt-sv`-15=#%bwRZZslzV$y>dfK)e$5=tAOVe--geT+bGO zo1M0v`7)BX^0t!rc$DKm5wC-PJ}3ST+N%3c^>hL;GZSL?YXksh}(611M$nW@Je_b-280o&%a9YX6FaQ?fI31 z#0znKIT{@*^UpY(w+r!kXqS3|t34`uK#i2ppX85)AF@e)ualN{`AOdD?=+Hk6+w|G{A$>LEy;I*{Le_d?3o-)m+aa@-^{8Xy4jk z9U=3-m4^<*x1#(HApUE#Bg4S0oY;2|3P|4UDIvEf0{iVi5J8F*~HENdBmr}52eH{U3J7Q zT}y~tdA@^q2KobQiQDz~0dPyNJ@3AQpd#)utwm#!h(sKai{8uDze%nAihU?UJ z;uUC5c98zZz4_5QByajZBW~@?x5OJ!uaCldP?p|x@J}b=_hA02A94NOh=#%7=1))M zJvfpdkL!Z1TV>~+h5q?XByZQ>I|BXMRN42c;3oH8Lti_oY%#2j_j7F5Y51Y%9Uyvy6w{K{`!dDil2>p|Q{+@4!rPu$+u+DQCF z^h+Nh-VOW-;V0{ypNg;GcqP zv4<-iNd;FH@+{(yBVI(@+Ve)@cD-0h+^%a|iQDybFLCQv*mc|NwEj;j>alU_cV!W` z{$UYu>(4h5xADkI;x^9OO5DbYdx_gTfH~Lfw0V+LINi9-|CpbQ+dNwl$=m#4BXOJO zjAFG5=GGOL$hNM=Z!7FqP5GSSSY3HTT@-U)1c{Z@)<&_KDj#us^=C|e361&hooK8$ z=01BY-^ZOE9J#q#;%S@P}XkjWRK%k2=c!+t7uU$l;uR?VF& zUqXsvl~wX}BKh=fANP$M#O2e{vFe&C`94YA0_ZKTD4Z#uRI&yY<>&vqNtFXN3+=jT zdb052q+Uk+7TFz#+AY>gepa0LAANu3w^MfWfMeNDa2Do3@IUp^G!yjG8m zr`iu}^?I#34?7+g@^xfzDvq;FhWtRE+x-#KGW}N1 zujl6Tmk48>dc^I8`oFxtMj6Ah^&-Pej~h~||I2)u-^BlCS?y=FWdDJ0{ULU|+OJ(r zw*PuztW%GigYyrh{Abx~M7E{#ryf!*GGBr8>-lx+m(PE@Fx6>x%1;;WMF(g)#{b6c z{I*>wJ6byaU)T8~E=%HnJAQqVsYM_*4_b*8FGqUHPFp`S=|;-q!6hc|LxR>}V-HG zvHmaf)7mkVpu?-P?l#dP%)|It!tWN>VRlQ$A86$b|HK5bMRMZw FzX7RypN0Sc literal 0 HcmV?d00001 diff --git a/omc/plat/haepub/obj/hae_function.o b/omc/plat/haepub/obj/hae_function.o new file mode 100644 index 0000000000000000000000000000000000000000..dfbacd6573e917a0f26d64a72887e9f161526b7c GIT binary patch literal 153584 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

%|Ymv0nU19QJ>Q)05>7`@b7; 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 Nwe^2zGdI=s{~MhEvWx%# literal 0 HcmV?d00001 diff --git a/omc/plat/haepub/obj/hae_sync.o b/omc/plat/haepub/obj/hae_sync.o new file mode 100644 index 0000000000000000000000000000000000000000..acd97c491f3d4b387210b074e216ca9063be144e GIT binary patch literal 67872 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 literal 0 HcmV?d00001 diff --git a/omc/plat/haepub/src/.copyarea.db b/omc/plat/haepub/src/.copyarea.db new file mode 100644 index 0000000..45c0938 --- /dev/null +++ b/omc/plat/haepub/src/.copyarea.db @@ -0,0 +1,8 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\haepub\src +2 +4 +b:hae_param.c|1|11d70a3efca|356|8538136a|d189676dbfa411dc8515001c23e19543|0 +7:include|2|0|0|0|d2b967a5bfa411dc8515001c23e19543|0 +a:hae_sync.c|1|11d8a87d154|626f|45494e00|4194c285afc111dd8a82001c23e19543|0 +e:hae_function.c|1|11d70a3ef9c|26c6|f9a0cde9|d0e96751bfa411dc8515001c23e19543|0 diff --git a/omc/plat/haepub/src/hae_function.c b/omc/plat/haepub/src/hae_function.c new file mode 100644 index 0000000..e39fbf6 --- /dev/null +++ b/omc/plat/haepub/src/hae_function.c @@ -0,0 +1,344 @@ +/* HAE public function c file */ +/* Written by Liu Zhiguo V1.0 */ +/* Time: 2003-07-31 */ +/* -------------------------- */ + +#include "./include/hae_include.h" + +/* +++++++++++++++++++++++++++++++++++++++++++++++++ */ +/* transfer IMSI format from normal to anti sequence */ +/* 0460022157127001 --> 64002251177200f1 */ +/* +++++++++++++++++++++++++++++++++++++++++++++++++ */ +void hae_imsi_ntoa(u8 *anti_imsi,u8 *normal_imsi) +{ + u8 ii; + u8 aa,bb=0; + + for (ii = 1;ii <= IMSI_LEN*2;ii++) + { + if ((ii % 2) == 1) + bb = normal_imsi[ii/2] & 0x0f; + else + { + if (ii == IMSI_LEN * 2) + aa = 0x0f0; + else + aa = normal_imsi[ii/2] & 0x0f0; + anti_imsi[ii/2-1] = aa | bb; + } + } +} + +/* +++++++++++++++++++++++++++++++++++++++++++++++++ */ +/* transfer IMSI format from anti to normal sequence */ +/* 64002251177200f1 --> 0460022157127001 */ +/* +++++++++++++++++++++++++++++++++++++++++++++++++ */ +void hae_imsi_aton(u8 *normal_imsi,u8 *anti_imsi) +{ // the IMSI must 15 digits + u8 ii; + u8 aa,bb=0; + + normal_imsi[0] = 0; + for (ii = 0;ii < IMSI_LEN*2;ii++) + { + if ((ii % 2) == 1) + { + aa = anti_imsi[ii/2] & 0x0f; + normal_imsi[ii/2] |= aa; + } + else + { + if (ii/2 != IMSI_LEN -1) + { + bb = anti_imsi[ii/2] & 0x0f0; + normal_imsi[ii/2+1] = bb; + } + } + } +} + +/* +++++++++++++++++++++++++++++++++++++++++++++++++ */ +/* transfer IMSI format from normal to ascii string */ +/* 0460022157127001 --> "460022157127001" */ +/* +++++++++++++++++++++++++++++++++++++++++++++++++ */ +void hae_imsi_ntos(u8 *str_imsi,u8 *normal_imsi) +{ + u8 len; + u8 ii,jj; + + str_imsi[0] = (normal_imsi[0] & 0x0f) + '0'; + len = 1; + for (ii = 1;ii < IMSI_LEN;ii ++) + { + jj = (normal_imsi[ii] >> 4) & 0x0f; + str_imsi[len++] = jj + '0'; + jj = normal_imsi[ii] & 0x0f; + str_imsi[len++] = jj + '0'; + } + str_imsi[len] = '\0'; +} + +/* +++++++++++++++++++++++++++++++++++++++++++++++++ */ +/* transfer IMSI format from ascii string to normal */ +/* "460022157127001" --> 0460022157127001 */ +/* +++++++++++++++++++++++++++++++++++++++++++++++++ */ +void hae_imsi_ston(u8 *normal_imsi,u8 *str_imsi) +{ + if (strlen(str_imsi) != IMSI_LEN*2-1) + return; + normal_imsi[0] = str_imsi[0] - '0'; + AsciiToBcd(normal_imsi+1,str_imsi+1,IMSI_LEN*2-2); +} + +/* +++++++++++++++++++++++++++++++++++++++++++++++++ */ +/* transfer ISDN format from normal to anti sequence */ +/* 918675557127001EEE --> 08916857551700E1 */ +/* +++++++++++++++++++++++++++++++++++++++++++++++++ */ +void hae_isdn_ntoa(u8 *anti_isdn,u8 *normal_isdn) +{ + u8 ii; + u8 aa=0,bb=0; + u8 len; + + anti_isdn[1] = normal_isdn[0]; // nature of address and numbering plan indicator + len = 1; + for (ii = 1;ii < ISDN_LEN;ii ++) + { + if ((normal_isdn[ii] == 0xee) || (normal_isdn[ii] == 0xff)) + break; + else + { + aa = (normal_isdn[ii] & 0x0f0) >> 4; + bb = normal_isdn[ii] & 0x0f; + if (bb > 0x0c) + bb = 0x0f; + anti_isdn[ii+1] = (bb << 4) + aa; + len ++; + } + } + anti_isdn[0] = len; +} + +/* +++++++++++++++++++++++++++++++++++++++++++++++++ */ +/* transfer ISDN format from anti to normal sequence */ +/* 08916857551700E1 --> 918675557127001EEE */ +/* +++++++++++++++++++++++++++++++++++++++++++++++++ */ +void hae_isdn_aton(u8 *normal_isdn,u8 *anti_isdn) +{ + u8 ii; + u8 aa=0,bb=0; + u8 isdn_len; + + isdn_len = anti_isdn[0]; + if (isdn_len > ISDN_LEN) + isdn_len = ISDN_LEN; + normal_isdn[0] = anti_isdn[1]; + for (ii = 1;ii < isdn_len;ii ++) + { + if ((anti_isdn[ii+1] & 0x0f) >= 0x0e) + break; + aa = (anti_isdn[ii+1] & 0x0f0) >> 4; + if (aa > 0x0c) + aa = 0x0e; + bb = anti_isdn[ii+1] & 0x0f; + normal_isdn[ii] = (bb << 4) + aa; + } + for (;ii < ISDN_LEN;ii ++) + normal_isdn[ii] = 0x0ee; +} + +/* +++++++++++++++++++++++++++++++++++++++++++++++++ */ +/* transfer ISDN format from normal to ascii string */ +/* 918675557127001EEE --> "8675557127001" */ +/* +++++++++++++++++++++++++++++++++++++++++++++++++ */ +void hae_isdn_ntos(u8 *str_isdn,u8 *normal_isdn) +{ + u8 len = 0; + u8 ii,jj; + + for (ii = 1;ii < ISDN_LEN;ii ++) + { + jj = (normal_isdn[ii] >> 4) & 0x0f; + if (jj > 0x0c) + break; + str_isdn[len++] = jj + '0'; + jj = normal_isdn[ii] & 0x0f; + if (jj > 0x0c) + break; + str_isdn[len++] = jj + '0'; + } + str_isdn[len] = '\0'; +} + +/* +++++++++++++++++++++++++++++++++++++++++++++++++ */ +/* transfer ISDN format from ascii string to normal */ +/* "8675557127001" --> 918675557127001EEE */ +/* return value: 0--string has error; 1--success */ +/* +++++++++++++++++++++++++++++++++++++++++++++++++ */ +u8 hae_isdn_ston(u8 *normal_isdn,u8 *str_isdn) +{ + u8 ii; + u8 len; + + len = strlen(str_isdn); + if (len > ISDN_LEN*2-2) + return 0; + if ((len % 2) == 1) // odd number + { + AsciiToBcd(normal_isdn+1,str_isdn,len-1); + ii = len/2 + 1; + normal_isdn[ii] = (str_isdn[len-1] - '0') << 4; + normal_isdn[ii] |= 0x0E; + } + else + { + AsciiToBcd(normal_isdn+1,str_isdn,len); + ii = len/2; + } + memset(normal_isdn+ii+1,0xEE,ISDN_LEN-ii-1); + normal_isdn[0] = 0x91; // default value + return 1; +} + +/* +++++++++++++++++++++++++++++++++++++++++++++++++ */ +/* extract MAP primitive parameter */ +/* return value: 0--extract fail; 1--extract success */ +/* +++++++++++++++++++++++++++++++++++++++++++++++++ */ +u8 hae_extract_param(struct MapOprSrv_struct *srv_ptr,struct MapOprData_struct *data_ptr) +{ + srv_ptr->port_id = data_ptr->port_id; + srv_ptr->dialogue_id = data_ptr->dialogue_id; + srv_ptr->invoke_id = data_ptr->invoke_id; + srv_ptr->message_type = data_ptr->message_type; + srv_ptr->message_flag = data_ptr->message_flag; + if (!(data_ptr->param_flag & 0x20)) // has not parameter + return 0; + return extract_mapparam(srv_ptr,data_ptr->message_type,data_ptr->message_flag,data_ptr->param_len,data_ptr->param); +} + +/* +++++++++++++++++++++++++++++++++++++++++++++ */ +/* build MAP primitive parameter */ +/* return value: 0--build fail; 1--build success */ +/* +++++++++++++++++++++++++++++++++++++++++++++ */ +u8 hae_build_param(struct MapOprData_struct *data_ptr,struct MapOprSrv_struct *srv_ptr) +{ + u32 len; + u8 buf[4096]; + + data_ptr->port_id = srv_ptr->port_id; + data_ptr->dialogue_id = srv_ptr->dialogue_id; + data_ptr->invoke_id = srv_ptr->invoke_id; + data_ptr->message_type = srv_ptr->message_type; + data_ptr->message_flag = srv_ptr->message_flag; + data_ptr->param_flag = 0x1f; + len = build_mapparam(srv_ptr,buf); + if (len == 0 || len > MAX_MAPPOPR_LEN) + return 0; + data_ptr->param_len = len; + memcpy(data_ptr->param,buf,len); + data_ptr->param_flag |= 0x20; + return 1; +} + +u8 hae_build_param_v2(struct MapOprData_struct *data_ptr,struct MapOprSrv_struct *srv_ptr, u8 linked_id) +{ + u32 len; + u8 buf[4096]; + + data_ptr->port_id = srv_ptr->port_id; + data_ptr->dialogue_id = srv_ptr->dialogue_id; + data_ptr->invoke_id = srv_ptr->invoke_id; + data_ptr->message_type = srv_ptr->message_type; + data_ptr->message_flag = srv_ptr->message_flag; + data_ptr->linked_id = linked_id; + data_ptr->param_flag = 0x11f; + len = build_mapparam(srv_ptr,buf); + if (len == 0 || len > MAX_MAPPOPR_LEN) + return 0; + data_ptr->param_len = len; + memcpy(data_ptr->param,buf,len); + data_ptr->param_flag |= 0x20; + return 1; +} + +/* ++++++++++++++++++++++++++++++++++++++++++ */ +/* check if can send MAP common primitive */ +/* return value: 0--can not send; 1--can send */ +/* ++++++++++++++++++++++++++++++++++++++++++ */ +u8 hae_check_sendcom(u32 did) +{ + return map_check_sendcom(did); +} + +/* ++++++++++++++++++++++++++++++++++++++++++ */ +/* check if can send MAP operation primitive */ +/* return value: 0--can not send; 1--can send */ +/* ++++++++++++++++++++++++++++++++++++++++++ */ +u8 hae_check_sendopr(u32 did) +{ + return map_check_sendopr(did); +} + +/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ +/* get open from MAP provider */ +/* return value: 0--get fail; 1--get success */ +/* data_flow stores the message flow received from MAP provider */ +/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ +u8 hae_get_open(u8 *data_flow,struct MapComSrv_struct *com_ptr,u8 ssn) +{ + if (!map_get_open(data_flow,ssn)) + return 0; + if (!map_com_ftos(com_ptr,data_flow)) + return 0; + return 1; +} + +/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ +/* get common primitive from MAP provider */ +/* return value: 0--get fail; 1--get success */ +/* data_flow stores the message flow received from MAP provider */ +/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ +u8 hae_get_comdata(u8 *data_flow,struct MapComSrv_struct *com_ptr,u32 did) +{ + if (!map_get_comdata(data_flow,did)) + return 0; + if (!map_com_ftos(com_ptr,data_flow)) + return 0; + return 1; +} + +/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ +/* send common primitive to MAP provider */ +/* return value: 0--send fail; 1--send success */ +/* data_flow stores the message flow send to MAP provider */ +/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ +u8 hae_send_comdata(u8 *data_flow,struct MapComSrv_struct *com_ptr,u8 DelimiterFlag) +{ + map_com_stof(com_ptr,data_flow,DelimiterFlag); + return map_send_comdata(data_flow); +} + +/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ +/* get operation primitive from MAP provider */ +/* return value: 0--get fail; 1--get success */ +/* data_flow stores the message flow get from MAP provider */ +/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ +u8 hae_get_oprdata(u8 *data_flow,struct MapOprData_struct *opr_ptr,u32 did) +{ + if (!map_get_oprdata(data_flow,did)) + return 0; + if (!map_opr_ftos(opr_ptr,data_flow)) + return 0; + return 1; +} + +/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ +/* send operation primitive to MAP provider */ +/* return value: 0--send fail; 1--send success */ +/* data_flow stores the message flow send to MAP provider */ +/* ++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ +u8 hae_send_oprdata(u8 *data_flow,struct MapOprData_struct *opr_ptr,u8 DelimiterFlag) +{ + map_opr_stof(opr_ptr,data_flow,DelimiterFlag); + return map_send_oprdata(data_flow); +} diff --git a/omc/plat/haepub/src/hae_param.c b/omc/plat/haepub/src/hae_param.c new file mode 100644 index 0000000..51719ff --- /dev/null +++ b/omc/plat/haepub/src/hae_param.c @@ -0,0 +1,51 @@ +/* HAE system parameter c file */ +/* Written by Liu Zhiguo V1.0 */ +/* Time: 2003-07-31 */ +/* ---------------------------- */ + +#include "./include/hae_include.h" + +static u32 hae_localip; // local ip address +static u32 hae_peerip; // peer ip address +static u32 hae_primomcip; // primary omc ip address +static u32 hae_secdomcip; // secondary omc ip address + +void hae_set_localip(u32 local_ip) +{ + hae_localip = local_ip; +} + +u32 hae_get_localip(void) +{ + return hae_localip; +} + +void hae_set_peerip(u32 peer_ip) +{ + hae_peerip = peer_ip; +} + +u32 hae_get_peerip(void) +{ + return hae_peerip; +} + +void hae_set_primomcip(u32 primomc_ip) +{ + hae_primomcip = primomc_ip; +} + +u32 hae_get_primomcip(void) +{ + return hae_primomcip; +} + +void hae_set_secdomcip(u32 secdomc_ip) +{ + hae_secdomcip = secdomc_ip; +} + +u32 hae_get_secdomcip(void) +{ + return hae_secdomcip; +} diff --git a/omc/plat/haepub/src/hae_sync.c b/omc/plat/haepub/src/hae_sync.c new file mode 100644 index 0000000..142f3fe --- /dev/null +++ b/omc/plat/haepub/src/hae_sync.c @@ -0,0 +1,895 @@ +/* HAE sync function c file */ +/* Written by Liu Zhiguo V1.0 */ +/* Time: 2003-08-08 */ +/* -------------------------- */ + +#include "./include/hae_include.h" + +#define PERIOD_SYNC_TIMEOUT 64 //16 +#define READ_ITEMS_PER_CYCLE 8 //The max readed items per cylce,must<32 +#define MAX_WAIT_TIMEOUT (READ_ITEMS_PER_CYCLE*3) +#define MAX_RAM_INIT_RETRY 4 + +const u32 HLR_OID_PREFIX[11] = {1,3,6,1,4,1,1373,2,3,3,3}; +const u32 AUC_OID_PREFIX[11] = {1,3,6,1,4,1,1373,2,3,3,4}; +const u32 EIR_OID_PREFIX[11] = {1,3,6,1,4,1,1373,2,3,3,8}; +static u32 HLR_RAM_OID_PREFIX[13]={1,3,6,1,4,1,1373,2,3,3,3,2,7}; +static u32 AUC_RAM_OID_PREFIX[13]={1,3,6,1,4,1,1373,2,3,3,4,2,7}; +static u32 EIR_RAM_OID_PREFIX[13]={1,3,6,1,4,1,1373,2,3,3,8,2,7}; + +static u32 conf_oid[HAE_SYNC_MOD_NUM]={2,2,2}; +static u32 sync_ram_oid[HAE_SYNC_MOD_NUM]={7,7,7}; + +static u32 ramdata_pack_num[HAE_SYNC_MOD_NUM]={0,0,0}; //The Max packets of the Module +static void *ramshm_ptr[HAE_SYNC_MOD_NUM]={NULL,NULL,NULL}; //Restored the pointer of the subs shm. +static u8 master_flag[HAE_SYNC_MOD_NUM]={0,0,0}; //0/1=slave/master +static u8 switch_flag[HAE_SYNC_MOD_NUM]={0,0,0}; +static u8 period_flag[HAE_SYNC_MOD_NUM]={1,1,1}; +static int sent_pack_no[HAE_SYNC_MOD_NUM]={0,0,0}; +static int no_prd_sync[HAE_SYNC_MOD_NUM]={0,0,0}; // number of period sync +static u8 oid_prefix_len[HAE_SYNC_MOD_NUM]={0,0,0}; +static u32 read_start[HAE_SYNC_MOD_NUM]={0,0,0}; +static u32 recv_stand[HAE_SYNC_MOD_NUM]={0,0,0}; +static u32 recv_flag[HAE_SYNC_MOD_NUM]={0,0,0}; + +static u8 hae_data_ver[HAE_SYNC_MOD_NUM][3]={{0,0,0},{0,0,0},{0,0,0}}; + + +extern int hlr_realsync_proc(); +extern void hlr_send_psync_proc(); +extern void hlr_set_mastermode(); +extern void hlr_set_slavermode(); +extern int hlr_recv_psync_proc(u8 oid_len, u32 * oid, u8 * sync_data, u32 data_len, snmp_addr * addr_ptr); +extern void hlr_upgrade_subs_n_1(void *ptr, void *r_ptr, int file_size); +extern void hlr_upgrade_subs_n_2(void *ptr, void *r_ptr, int file_size); +extern int AucSyncNowMsgProc(BYTE OIDLen,DWORD *OID,BYTE *Pdata,u_short DataLen); +extern int EirSyncNowMsgProc(BYTE OIDLen,DWORD *OID,BYTE *Pdata,u_short DataLen); + +int get_weekday(char *wday_buf) +{ + struct tm *t,tt; + long curr_date; + + t=&tt; + curr_date=time((long *)0); + t=localtime(&curr_date); + if( t == NULL ) + { + assert(0 && "syscall: Locatime fail"); + exit(0); + } + sprintf(wday_buf,"%02d", t->tm_wday); + wday_buf[2]=0; + return t->tm_wday; +} + +void hae_init_sync(u8 fun_mod,u8 oid_len,u32 max_mem,u8 *data_ptr,void *shm_ptr) +{ + u8 i=0; + + oid_prefix_len[fun_mod] = oid_len; + + if((max_mem % HAE_PER_PACK_LEN)) + ramdata_pack_num[fun_mod] = max_mem/HAE_PER_PACK_LEN+1; + else + ramdata_pack_num[fun_mod] = max_mem/HAE_PER_PACK_LEN; + memcpy(&hae_data_ver[fun_mod],data_ptr,3); + for (i = 0;i < READ_ITEMS_PER_CYCLE;i ++) + recv_stand[fun_mod] |= (0x01<= 3) ? 1 : 0; +} + +int hae_set_period_flag(u8 fun_mod, u8 flag) +{ + if(fun_mod < HAE_SYNC_MOD_NUM) + { + period_flag[fun_mod] = flag & 0x01; + return 1; + } + return 0; +} + +/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ +/* Receive real time sync and periodic sync */ +/* Real time sync proc must be implemented by application */ +/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ +void hae_sync_msg_proc(u8 fun_mod) // hae sync message process +{ + int periodic_flag[HAE_SYNC_MOD_NUM]={0,0,0}; + void *ptr; + int i; + int instance=0,data_type; + snmp_pdu snmp_buf; + snmp_addr snmp_add; + var_list *varptr=NULL; + u32 master_ip = hae_get_localip(); + + switch(fun_mod) + { + case HLR_SYNC_MOD: + snmp_add.local_port = HLR_SYNC_UDPPORT; + break; + case AUC_SYNC_MOD: + snmp_add.local_port = AUC_SYNC_UDPPORT; + break; + case EIR_SYNC_MOD: + snmp_add.local_port = EIR_SYNC_UDPPORT; + break; + default: + return; + } + for(i = 0;i < ramdata_pack_num[fun_mod];i ++) + { + if (!snmp_receive(&snmp_buf,&snmp_add)) + break; + varptr = &snmp_buf.var[0]; + data_type = varptr->oid[12]; + switch(data_type) + { + case 2: + switch(varptr->oid[10]) + { + case 3://real sync message for HLR + hlr_realsync_proc(varptr->oidlen,varptr->oid,varptr->msg,varptr->msglen,&snmp_add); + break; + case 4://Auc real sync message + #ifdef _MODIFY_AUC + AucSyncNowMsgProc(varptr->oidlen,varptr->oid,varptr->msg,varptr->msglen); + #endif + break; + case 8://Eir real sync message + #ifdef _MODIFY_EIR + EirSyncNowMsgProc(varptr->oidlen,varptr->oid,varptr->msg,varptr->msglen); + #endif + break; + } + break; +/* case 3: //real sync message for AUC/EIR + switch(fun_mod) + { + case AUC_SYNC_MOD: //Auc real sync message + #ifdef _MODIFY_AUC + AucSyncNowMsgProc(varptr->oidlen,varptr->oid,varptr->msg,varptr->msglen); + #endif + break; + case EIR_SYNC_MOD: //Eir real sync message + #ifdef _MODIFY_EIR + EirSyncNowMsgProc(varptr->oidlen,varptr->oid,varptr->msg,varptr->msglen); + #endif + break; + } + break; + case 6: //real sync message for HLR + hlr_realsync_proc(varptr->oidlen,varptr->oid,varptr->msg,varptr->msglen,&snmp_add); + break;*/ + case 7 ://periodic sync message AUC EIR + if( fun_mod != HLR_SYNC_MOD ) + { + /* + master_ip = snmp_add.remote_ip; + periodic_flag[fun_mod] = 1; + instance = varptr->oid[13]; + if(instance >= ramdata_pack_num[fun_mod]) + continue; + if (varptr->msglen != HAE_PER_PACK_LEN) + continue; + + ptr = (void *) ramshm_ptr[fun_mod]; + memcpy(ptr+instance*HAE_PER_PACK_LEN,varptr->msg,HAE_PER_PACK_LEN); + */ + } + break; + case 9: //periodic sync message HLR + if( fun_mod == HLR_SYNC_MOD ) + { + master_ip = snmp_add.remote_ip; + periodic_flag[fun_mod] = 1; + //printf( "hlr recv periodic sync\n"); + hlr_recv_psync_proc(varptr->oidlen,varptr->oid,varptr->msg,varptr->msglen,&snmp_add); + } + break; + } + } + + if (periodic_flag[fun_mod]) + { + if (master_flag[fun_mod] && master_ip < hae_get_localip()) + { + master_flag[fun_mod] = 0; + if( fun_mod == HLR_SYNC_MOD ) + { + //printf( "hlr set to slaver\n"); + hlr_set_slavermode(); + } + } + no_prd_sync[fun_mod] = 0; + } + else if(no_prd_sync[fun_mod]++ > PERIOD_SYNC_TIMEOUT) + { + master_flag[fun_mod] = 1; + if( fun_mod == HLR_SYNC_MOD ) + { + //printf( "hlr set to master\n"); + hlr_set_mastermode(); + } + } +} + +/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ +/* Called by every applicatoin */ +/* Receive sync message(real and periodic), and */ +/* send periodic sync message if it acts as master server */ +/* +++++++++++++++++++++++++++++++++++++++++++++++++++++++ */ +void hae_syncdata_proc(u8 fun_mod) +{ + void *ptr; + snmp_pdu snmp_buf; + snmp_addr snmp_add; + var_list *varlist = NULL; + + //printf("psync proc\r\n"); + hae_sync_msg_proc(fun_mod); //receive sync message + if(!master_flag[fun_mod]) + return; + if((switch_flag[fun_mod]++) & 0x01) + return; + if(!period_flag[fun_mod]) + return; + //send periodic sync message + snmp_buf.pdu_type = 0x07; //trap + snmp_buf.var_num = 0x01; + varlist = snmp_buf.var; + varlist->oidlen = oid_prefix_len[fun_mod]+2+1; + varlist->vartype = 0x04; + switch(fun_mod) + { + case HLR_SYNC_MOD: + snmp_add.remote_port = HLR_SYNC_UDPPORT; + snmp_add.local_port = HLR_SYNC_UDPPORT; + memcpy(&varlist->oid,HLR_OID_PREFIX,oid_prefix_len[fun_mod]*sizeof(u32)); + break; + case AUC_SYNC_MOD: + snmp_add.remote_port = AUC_SYNC_UDPPORT; + snmp_add.local_port = AUC_SYNC_UDPPORT; + memcpy(&varlist->oid,AUC_OID_PREFIX,oid_prefix_len[fun_mod]*sizeof(u32)); + break; + case EIR_SYNC_MOD: + snmp_add.remote_port = EIR_SYNC_UDPPORT; + snmp_add.local_port = EIR_SYNC_UDPPORT; + memcpy(&varlist->oid,EIR_OID_PREFIX,oid_prefix_len[fun_mod]*sizeof(u32)); + break; + } + if( fun_mod == HLR_SYNC_MOD ) + { + hlr_send_psync_proc(); + //printf( "hlr send periodic sync\n"); + return ; + } + + snmp_add.remote_ip = hae_get_peerip(); + snmp_add.local_ip = hae_get_localip(); + snmp_add.broadcast = 0x00; + varlist->oid[oid_prefix_len[fun_mod]] = conf_oid[fun_mod]; //configuration + varlist->oid[oid_prefix_len[fun_mod]+1] = sync_ram_oid[fun_mod]; //sync ram + varlist->oid[13] = sent_pack_no[fun_mod]; //account_db + varlist->msglen = HAE_PER_PACK_LEN;//single packet,unit:KB + ptr = (void *)ramshm_ptr[fun_mod]; + memcpy(varlist->msg,ptr+sent_pack_no[fun_mod]*HAE_PER_PACK_LEN,HAE_PER_PACK_LEN); + snmp_send(&snmp_buf,&snmp_add); + sent_pack_no[fun_mod] ++; + sent_pack_no[fun_mod] %= ramdata_pack_num[fun_mod]; +} + +int cmp_data_ver(u8 fun_mod,u8 *src_ptr) +{ + if(!memcmp(hae_data_ver[fun_mod],src_ptr,3)) + return 1; + return 0; +} + +/* The procedure is called back when peer data comes in SNMP GET RESP */ +int hae_load_from_peer_resp(u8 fun_mod,snmp_pdu *pdu,snmp_addr *addr) +{ + //static int LastInstance[HAE_SYNC_MOD_NUM]={0,0,0}; + int instance=0,tmp_val=0; + void *ptr; + + /* + if(LastInstance[fun_mod] && (LastInstance[fun_mod]+1) != (instance)){ + return 0; + } + LastInstance[fun_mod]=instance; + */ + if (pdu->var[0].oid[12] != 7) // do not ram data + return 0; + instance = pdu->var[0].oid[13]; //for init + if (instance >= ramdata_pack_num[fun_mod]) + return 0; + if (pdu->var[0].msglen != HAE_PER_PACK_LEN) + return 0; + tmp_val = instance - read_start[fun_mod]; + if (0 <= tmp_val && READ_ITEMS_PER_CYCLE > tmp_val) + recv_flag[fun_mod] |= (0x01 << tmp_val); + else + return 0; + ptr = (void *)ramshm_ptr[fun_mod]; + memcpy(ptr+instance*HAE_PER_PACK_LEN,pdu->var[0].msg,HAE_PER_PACK_LEN); + if (0 == instance) + {//check data version + if (!cmp_data_ver(fun_mod,(u8 *)ptr)) + { + memset((u8 *)ptr,0,HAE_PER_PACK_LEN); + return 0; // load fail + } + } + return 1; +} + +/* Use SNMP GET to load user data from peer server, and wait response */ +int hae_load_from_peer(u8 fun_mod) +{//calling during init procedure + snmp_pdu snmp_buf; + snmp_addr snmp_add; + var_list *varlist = NULL; + static int read_pack_no[HAE_SYNC_MOD_NUM]={0,0,0}; + static int read_state[HAE_SYNC_MOD_NUM]={0,0,0}; + static int try_times[HAE_SYNC_MOD_NUM]={0,0,0}; + static int reread_times[HAE_SYNC_MOD_NUM]={0,0,0}; + static u8 max_read_item[HAE_SYNC_MOD_NUM]={0,0,0}; +// int retval = _LOADING_DATA; + int i=0,oid_len=0; + + switch(read_state[fun_mod]) + { + case 0: //send request + if (read_pack_no[fun_mod] >= ramdata_pack_num[fun_mod]) + { //init over + read_state[fun_mod] = 0; + try_times[fun_mod] = 0; + reread_times[fun_mod] = 0; + read_pack_no[fun_mod] = 0; + return 2; // load success + } + snmp_buf.pdu_type = 0; // snmp get + snmp_buf.var_num = 0x01; +// snmp_add.remote_ip = PeerIp[fun_mod]; + snmp_add.remote_ip = hae_get_peerip(); + snmp_add.remote_port = HAE_AGENT_UDPPORT; + snmp_add.local_ip = hae_get_localip(); + snmp_add.local_port = HAE_AGENT_UDPPORT; + snmp_add.broadcast = 0x00; + varlist = &snmp_buf.var[0]; + switch(fun_mod) + { + case HLR_SYNC_MOD: + oid_len = sizeof(HLR_RAM_OID_PREFIX)/sizeof(u32); + memcpy(&varlist->oid,HLR_RAM_OID_PREFIX,oid_len*4); + break; + case AUC_SYNC_MOD: + oid_len=sizeof(AUC_RAM_OID_PREFIX)/sizeof(u32); + memcpy(&varlist->oid,AUC_RAM_OID_PREFIX,oid_len*4); + break; + case EIR_SYNC_MOD: + oid_len=sizeof(EIR_RAM_OID_PREFIX)/sizeof(u32); + memcpy(&varlist->oid,EIR_RAM_OID_PREFIX,oid_len*4); + break; + } + varlist->oidlen = oid_len+1; + varlist->vartype = 0x04; + varlist->msglen = 0; + if (ramdata_pack_num[fun_mod] >= (read_pack_no[fun_mod]+READ_ITEMS_PER_CYCLE)) + max_read_item[fun_mod] = READ_ITEMS_PER_CYCLE; + else + max_read_item[fun_mod] = ramdata_pack_num[fun_mod]-read_pack_no[fun_mod]; + read_start[fun_mod] = read_pack_no[fun_mod]; + for (i = 0;i < max_read_item[fun_mod];i ++) + { + recv_stand[fun_mod] |= (0x01<oid[oid_len] = read_pack_no[fun_mod] + i; + snmp_send(&snmp_buf,&snmp_add); + } + read_state[fun_mod] = 1; + try_times[fun_mod] = 0; + recv_flag[fun_mod] = 0; + break; + case 1: //wait response + if(recv_flag[fun_mod] == recv_stand[fun_mod]) + { + try_times[fun_mod] = 0; + read_state[fun_mod] = 0; + reread_times[fun_mod] = 0; + recv_flag[fun_mod] = 0; + recv_stand[fun_mod] = 0; + read_pack_no[fun_mod] += max_read_item[fun_mod]; + } + else if (try_times[fun_mod]++ >= MAX_WAIT_TIMEOUT*5) + { + read_state[fun_mod] = 0; + try_times[fun_mod] = 0; +// recv_flag[fun_mod] = 0; +// recv_stand[fun_mod] = 0; + if(reread_times[fun_mod]++ >= MAX_RAM_INIT_RETRY) + { + reread_times[fun_mod] = 0; + read_pack_no[fun_mod] = 0; + printf("Load data form peer timeout\n"); + return 0; + } + } + break; + default: + read_state[fun_mod] = 0; + break; + } + return 1; // load data +} + +/* The procedure is called when peer server request loading data */ +int hae_peerdata_resp(u8 fun_mod,u8 oidLen,u32 *oid,u8 *pdata,u8 *vartype) +{ // Response the Peer's reading request + u32 instance; + void *ptr; + + //instance = oid[13]; + instance = oid[oidLen-1]; + *vartype = 0x04; + if (instance >= ramdata_pack_num[fun_mod]) + return 0; + ptr = (void *)ramshm_ptr[fun_mod]; + memcpy(pdata,ptr+instance*HAE_PER_PACK_LEN,HAE_PER_PACK_LEN); + return HAE_PER_PACK_LEN; +} + +int hae_load_from_local(u8 fun_mod,char *file_name) +{ + int i; + FILE *fp=NULL; + void *r_ptr; + void *ptr=(void *)ramshm_ptr[fun_mod]; + struct stat fileinfo; + + + if((fp = fopen(file_name, "r")) == NULL) + return 0; + if(fun_mod == HLR_SYNC_MOD) + { + stat(file_name, &fileinfo); + r_ptr = malloc(fileinfo.st_size); + if( r_ptr == NULL ) + { + assert(0 && "syscall: malloc fail"); + exit(0); + } + fread(r_ptr, fileinfo.st_size, 1, fp); +// if((hae_data_ver[HLR_SYNC_MOD][0] == ((u8 *)r_ptr)[0]) &&(hae_data_ver[HLR_SYNC_MOD][1] == ((u8 *)r_ptr)[1])) +// { +// if(fileinfo.st_size <= ramdata_pack_num[HLR_SYNC_MOD]*HAE_PER_PACK_LEN) +// memcpy(ptr, r_ptr, fileinfo.st_size); +// else +// memcpy(ptr, r_ptr, ramdata_pack_num[HLR_SYNC_MOD]*HAE_PER_PACK_LEN); +// } +// if((hae_data_ver[HLR_SYNC_MOD][0] == ((u8 *)r_ptr)[0]) &&(hae_data_ver[HLR_SYNC_MOD][1] == ((u8 *)r_ptr)[1])) +// if(hae_data_ver[HLR_SYNC_MOD][1] == ((u8 *)r_ptr)[1]) +// { + if(fileinfo.st_size <= ramdata_pack_num[HLR_SYNC_MOD]*HAE_PER_PACK_LEN) + memcpy(ptr+1024, r_ptr+1024, fileinfo.st_size-1024); + else + memcpy(ptr+1024, r_ptr+1024, ramdata_pack_num[HLR_SYNC_MOD]*HAE_PER_PACK_LEN-1024); +// } +// else if(hae_data_ver[HLR_SYNC_MOD][0] == ((u8 *)r_ptr)[0]) +// { +// switch(hae_data_ver[HLR_SYNC_MOD][1] - ((u8 *)r_ptr)[1]) +// { +// case 1: +// hlr_upgrade_subs_n_1(ptr, r_ptr, fileinfo.st_size); +// break; +// case 2: +// hlr_upgrade_subs_n_2(ptr, r_ptr, fileinfo.st_size); +// break; +// default: +// printf("Failed to upgrade subscriber data\n"); +// break; +// } +// } + free(r_ptr); + } + else + { + for (i = 0;i < ramdata_pack_num[fun_mod];i ++) + { + fread(ptr+i*HAE_PER_PACK_LEN,HAE_PER_PACK_LEN,1,fp); + // if(i == 0) + // {//check data version + // if(!cmp_data_ver(fun_mod,(u8 *)ptr)) + // { + // memset((u8 *)ptr,0,HAE_PER_PACK_LEN); + // fclose(fp); + // return 0; + // } + // } + } + } + fclose(fp); + return 2; // load success +} + +void hae_tftp_read_req(u16 portno,char *filename) +{ + int filename_len; + char readmode[20] = "octetoblksizeo1024"; + _msg_list ipmsg; + + filename_len = strlen(filename); + ipmsg.msgSrcPort = portno; + ipmsg.msgSrcIP = hae_get_localip(); + ipmsg.msgDstPort = 69; //TFTP_PORT; + ipmsg.msgDstIP = hae_get_primomcip(); + ipmsg.msgBroadcast = 0x00; + ipmsg.msgContent[0] = 0; + ipmsg.msgContent[1] = 1; //read request + memcpy(ipmsg.msgContent+2,filename,filename_len); + memcpy(ipmsg.msgContent+filename_len+3,readmode,18); + ipmsg.msgContent[filename_len+2] = 0; + ipmsg.msgContent[filename_len+8] = 0; + ipmsg.msgContent[filename_len+16] = 0; + ipmsg.msgContent[filename_len+21] = 0; + ipmsg.msgLength = filename_len+22; + iptrPutMessage(ipmsg); +} + +int hae_tftp_read_data(u8 fun_mod,u16 portno,u8 *databuf) +{ + static int readblocknum[HAE_SYNC_MOD_NUM] = {0}; + static int proc_len[HAE_SYNC_MOD_NUM] = {0}; + static int try_timer[HAE_SYNC_MOD_NUM] = {0}; + static int try_times[HAE_SYNC_MOD_NUM] = {0}; + static int tftp_read_port = 69; // TFTP port for OMC response + int ackblocknum; + int retval=0; + _msg_list ipmsg,ipack; + + if (iptrGetMessage(&ipmsg,portno)) + { + try_timer[fun_mod] = 0; + try_times[fun_mod] = 0; + switch (ipmsg.msgContent[1]) + { + case 3: // response + ackblocknum = ipmsg.msgContent[2]*256+ipmsg.msgContent[3]; + proc_len[fun_mod] += ipmsg.msgLength - 4; + if(ackblocknum == readblocknum[fun_mod]+1) + readblocknum[fun_mod] = ackblocknum; + else if(ackblocknum == 0) + { + if(readblocknum[fun_mod] == 0xffff) + readblocknum[fun_mod] = 0; + } + memcpy(databuf,ipmsg.msgContent,ipmsg.msgLength); //length + retval = ipmsg.msgLength; + // read next package + ipack.msgLength = 4; + ipack.msgContent[0] = 0x00; + ipack.msgContent[1] = 0x04; + ipack.msgContent[2] = ackblocknum >> 8; + ipack.msgContent[3] = ackblocknum; + ipack.msgSrcIP = hae_get_localip(); + ipack.msgSrcPort = TFTP_SRVC_PORT; + ipack.msgDstPort = ipmsg.msgSrcPort; + ipack.msgDstIP = hae_get_primomcip(); + iptrPutMessage(ipack); + tftp_read_port = ipmsg.msgSrcPort; + break; + case 6: // the first package response + proc_len[fun_mod] = 0; + readblocknum[fun_mod] = 0; + ipack.msgLength = 4; + ipack.msgContent[0] = 0x00; + ipack.msgContent[1] = 0x04; + ipack.msgContent[2] = readblocknum[fun_mod]>>8; + ipack.msgContent[3] = readblocknum[fun_mod]; + ipack.msgSrcIP = hae_get_localip(); + ipack.msgSrcPort = TFTP_SRVC_PORT; + ipack.msgDstPort = ipmsg.msgSrcPort; + ipack.msgDstIP = hae_get_primomcip(); + iptrPutMessage(ipack); + tftp_read_port = ipmsg.msgSrcPort; + break; + default: + printf("Error!\n"); + break; + } + } + else // do not receive response package + { + if (try_timer[fun_mod]++ > MAX_RAM_INIT_RETRY) + { + try_timer[fun_mod] = 0; + if (try_times[fun_mod]++ > MAX_RAM_INIT_RETRY) + return -1; + if (tftp_read_port == 69) // the request package is not response + return -1; + // resend the unreceived package + ipack.msgLength = 4; + ipack.msgContent[0] = 0x00; + ipack.msgContent[1] = 0x04; + ipack.msgContent[2] = readblocknum[fun_mod]>>8; + ipack.msgContent[3] = readblocknum[fun_mod]; + ipack.msgSrcIP = hae_get_localip(); + ipack.msgSrcPort = TFTP_SRVC_PORT; + ipack.msgDstPort = tftp_read_port; + ipack.msgDstIP = hae_get_primomcip(); + iptrPutMessage(ipack); + } + } + return retval; +} + +int hae_load_from_omc(u8 fun_mod) +{ + static int tftp_state[HAE_SYNC_MOD_NUM] = {0}; + void *ptr; + int blocknum = 0,length = 0; + char filename[18] = {0}; + u8 databuf[1024] = {0}; + u8 wday = 0,tmp_buf[3] = {0}; + + switch(tftp_state[fun_mod]) + { + case 0: + wday = (get_weekday(tmp_buf)+7-1) % 7; + switch(fun_mod) + { + case HLR_SYNC_MOD: + sprintf(filename,"hlr_backup%02d.dat",wday); + break; + case AUC_SYNC_MOD: + sprintf(filename,"auc_backup%02d.dat",wday); + break; + case EIR_SYNC_MOD: + sprintf(filename,"eir_backup%02d.dat",wday); + break; + } + hae_tftp_read_req(TFTP_SRVC_PORT,filename); + tftp_state[fun_mod] = 1; + break; + case 1: + length = hae_tftp_read_data(fun_mod,TFTP_SRVC_PORT,databuf); + if (length == -1) + { + printf("read from omc timeout\n"); + return 0; // load fail + } + else if(length >= 4) + { + blocknum = databuf[2] * 256 + databuf[3]; +// if(blocknum>=ramdata_pack_num[fun_mod]) +// continue; + ptr = (void *)ramshm_ptr[fun_mod]; + memcpy(ptr+(blocknum-1)*HAE_PER_PACK_LEN,databuf+4,length-4); //length is variable +// if (blocknum == 1) +// {//check data version +// if(!cmp_data_ver(fun_mod,(u8 *)ptr)) +// { +// memset((u8 *)ptr,0,HAE_PER_PACK_LEN); +// return 0; +// } +// } + if (blocknum == ramdata_pack_num[fun_mod]) + return 2; // load succcess + } + break; + default: + break; + } + return 1; // just load data +} + +int hae_tftp_write_req(int portno,char *filename) +{ + int retval=1,filename_len; + char writemode[20]="octetoblksizeo1024"; + _msg_list ipmsg; + + filename_len = strlen(filename); + + ipmsg.msgSrcPort = portno; + ipmsg.msgSrcIP = hae_get_localip(); + ipmsg.msgDstPort = 69; //TFTP_PORT; + ipmsg.msgDstIP = hae_get_primomcip(); + ipmsg.msgBroadcast = 0x00; + ipmsg.msgContent[0] = 0; + ipmsg.msgContent[1] = 2; //write request + memcpy(&ipmsg.msgContent[2],filename,filename_len); + memcpy(&ipmsg.msgContent[filename_len+3],writemode,18); + ipmsg.msgContent[filename_len+2] = 0; + ipmsg.msgContent[filename_len+8] = 0; + ipmsg.msgContent[filename_len+16] = 0; + ipmsg.msgContent[filename_len+21] = 0; + ipmsg.msgLength = filename_len+22; + iptrPutMessage(ipmsg); + return retval; +} + +int hae_tftp_write_data(u8 fun_mod) +{ + int retval = 0; + static int blocknum[HAE_SYNC_MOD_NUM]={1,1,1}; + static int ackblocknum[HAE_SYNC_MOD_NUM]={0,0,0}; + static int try_times[HAE_SYNC_MOD_NUM]={0,0,0}; + static int resend_times[HAE_SYNC_MOD_NUM]={0,0,0}; + _msg_list ipmsg,ipsend; + void *ptr = (void *)ramshm_ptr[fun_mod]; + + + if(iptrGetMessage(&ipmsg,TFTP_SRVC_PORT)) + { + if(ipmsg.msgContent[1] == 4) + { + ackblocknum[fun_mod] = ipmsg.msgContent[2]*256+ipmsg.msgContent[3]; + //printf("ack:%d, real:%d\n",ackblocknum[fun_mod],blocknum[fun_mod]); + if (ackblocknum[fun_mod] == blocknum[fun_mod]) + { + if (blocknum[fun_mod]++ >= ramdata_pack_num[fun_mod]) + { + blocknum[fun_mod] = 0; + ackblocknum[fun_mod] = 0; + try_times[fun_mod] = 0; + resend_times[fun_mod] = 0; + return 1; + } + } + } + else if (ipmsg.msgContent[1] == 5) + return -2; + else if (ipmsg.msgContent[1] == 6) + blocknum[fun_mod] = 1; + + ipsend.msgSrcIP = hae_get_localip(); + ipsend.msgSrcPort = TFTP_SRVC_PORT; + ipsend.msgDstPort = ipmsg.msgSrcPort; + ipsend.msgDstIP = ipmsg.msgSrcIP; + ipsend.msgLength = 4 + 1024; + ipsend.msgContent[0] = 0x00; + ipsend.msgContent[1] = 0x03; + ipsend.msgContent[2] = blocknum[fun_mod]>>8; + ipsend.msgContent[3] = blocknum[fun_mod]; + memcpy(&ipsend.msgContent[4],ptr+(blocknum[fun_mod]-1)*HAE_PER_PACK_LEN,HAE_PER_PACK_LEN); + iptrPutMessage(ipsend); + resend_times[fun_mod] = 0; + } + else if(try_times[fun_mod]++ > MAX_WAIT_TIMEOUT) + { + + try_times[fun_mod]=0; + + if(resend_times[fun_mod]++ >= MAX_RAM_INIT_RETRY) + { + resend_times[fun_mod] = 0; + blocknum[fun_mod] = 0; + ackblocknum[fun_mod] = 0; + retval = -1; + } + else if( blocknum[fun_mod] ) + { + ipsend.msgSrcIP = hae_get_localip(); + ipsend.msgSrcPort = TFTP_SRVC_PORT; + ipsend.msgDstPort = ipmsg.msgSrcPort; + ipsend.msgDstIP = ipmsg.msgSrcIP; + ipsend.msgLength = 4 + 1024; + ipsend.msgContent[0] = 0x00; + ipsend.msgContent[1] = 0x03; + ipsend.msgContent[2] = blocknum[fun_mod]>>8; + ipsend.msgContent[3] = blocknum[fun_mod]; + memcpy(&ipsend.msgContent[4],ptr+(blocknum[fun_mod]-1)*HAE_PER_PACK_LEN,HAE_PER_PACK_LEN); + iptrPutMessage(ipsend); + } + } + return retval; +} + +int hae_back_to_omc(u8 fun_mod) +{ + int retval = 0; + static int back_state[HAE_SYNC_MOD_NUM]={0}; + char filename[32]; + u8 tmp_buf[3]={0}; + + switch(fun_mod) + { + case HLR_SYNC_MOD: + sprintf(filename,"hlr_backup%02d.dat",get_weekday(tmp_buf)); + break; + case AUC_SYNC_MOD: + sprintf(filename,"auc_backup%02d.dat",get_weekday(tmp_buf)); + break; + case EIR_SYNC_MOD: + sprintf(filename,"eir_backup%02d.dat",get_weekday(tmp_buf)); + break; + } + switch(back_state[fun_mod]) + { + case 0: + if(hae_tftp_write_req(TFTP_SRVC_PORT,filename)) + back_state[fun_mod] = 1; + break; + case 1: + if((retval = hae_tftp_write_data(fun_mod))) + back_state[fun_mod] = 0; + break; + default: + break; + } + return retval; +} + + +int hae_get_syncpercent( u8 fun_mod , u8 oidLen, u32 *oid ) +{ + int instance=0; + int last_instance = ramdata_pack_num[fun_mod] - ramdata_pack_num[fun_mod]%READ_ITEMS_PER_CYCLE; + + if ( oidLen != 13 && oid[12] != 7) // do not ram data + return -1; + + instance = oid[oidLen-1]; + + if (instance >= ramdata_pack_num[fun_mod] || !last_instance) + return -1; + + instance = (instance*10000/last_instance) ; + instance = (instance > 9999) ? 0 : instance; + + return instance; +} + + + + diff --git a/omc/plat/haepub/src/include/.copyarea.db b/omc/plat/haepub/src/include/.copyarea.db new file mode 100644 index 0000000..f43d1e1 --- /dev/null +++ b/omc/plat/haepub/src/include/.copyarea.db @@ -0,0 +1,6 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\haepub\src\include +2 +2 +d:hae_include.h|1|11d70a3f0e4|45d|afa24a77|d34967c1bfa411dc8515001c23e19543|0 +e:hae_function.h|1|11d70a3f112|8e1|e1e411e0|d3e967ddbfa411dc8515001c23e19543|0 diff --git a/omc/plat/haepub/src/include/hae_function.h b/omc/plat/haepub/src/include/hae_function.h new file mode 100644 index 0000000..b6e85c0 --- /dev/null +++ b/omc/plat/haepub/src/include/hae_function.h @@ -0,0 +1,51 @@ +/* HAE public function head file */ +/* Written by Liu Zhiguo V1.0 */ +/* Time: 2003-07-31 */ +/* -------------------------- */ + +#ifndef _HAE_FUNCTION +#define _HAE_FUNCTION + +void hae_imsi_ntoa(u8 *anti_imsi,u8 *normal_imsi); +void hae_imsi_aton(u8 *normal_imsi,u8 *anti_imsi); +void hae_imsi_ntos(u8 *str_imsi,u8 *normal_imsi); +void hae_imsi_ston(u8 *normal_imsi,u8 *str_imsi); +void hae_isdn_ntoa(u8 *anti_isdn,u8 *normal_isdn); +void hae_isdn_aton(u8 *normal_isdn,u8 *anti_isdn); +void hae_isdn_ntos(u8 *str_isdn,u8 *normal_isdn); +u8 hae_isdn_ston(u8 *normal_isdn,u8 *str_isdn); +u8 hae_extract_param(struct MapOprSrv_struct *srv_ptr,struct MapOprData_struct *data_ptr); +u8 hae_build_param(struct MapOprData_struct *data_ptr,struct MapOprSrv_struct *srv_ptr); +u8 hae_build_param_v2(struct MapOprData_struct *data_ptr,struct MapOprSrv_struct *srv_ptr, u8 linked_id); +u8 hae_check_sendcom(u32 did); +u8 hae_check_sendopr(u32 did); +u8 hae_get_open(u8 *data_flow,struct MapComSrv_struct *com_ptr,u8 ssn); +u8 hae_get_comdata(u8 *data_flow,struct MapComSrv_struct *com_ptr,u32 did); +u8 hae_send_comdata(u8 *data_flow,struct MapComSrv_struct *com_ptr,u8 DelimiterFlag); +u8 hae_get_oprdata(u8 *data_flow,struct MapOprData_struct *opr_ptr,u32 did); +u8 hae_send_oprdata(u8 *data_flow,struct MapOprData_struct *opr_ptr,u8 DelimiterFlag); + +void hae_set_localip(u32 local_ip); +u32 hae_get_localip(void); +void hae_set_peerip(u32 peer_ip); +u32 hae_get_peerip(void); +void hae_set_primomcip(u32 primomc_ip); +u32 hae_get_primomcip(void); +void hae_set_secdomcip(u32 secdomc_ip); +u32 hae_get_secdomcip(void); + +void hae_init_sync(u8 fun_mod,u8 oid_len,u32 max_mem,u8 *data_ptr,void *shm_ptr); +int hae_set_master_flag(u8 fun_mod,u8 MasterFlag); +int hae_get_master_flag(u8 fun_mod); +int hae_inspect_master(u8 fun_mod); +int hae_set_period_flag(u8 fun_mod, u8 flag); +void hae_syncdata_proc(u8 fun_mod); +int hae_load_from_peer_resp(u8 fun_mod,snmp_pdu *pdu,snmp_addr *addr); +int hae_load_from_peer(u8 fun_mod); +int hae_peerdata_resp(u8 fun_mod,u8 oidLen,u32 *oid,u8 *pdata,u8 *vartype); +int hae_load_from_local(u8 fun_mod,char *file_name); +int hae_load_from_omc(u8 fun_mod); +int hae_back_to_omc(u8 fun_mod); +int hae_get_syncpercent( u8 fun_mod , u8 oidLen, u32 *oid ); + +#endif diff --git a/omc/plat/haepub/src/include/hae_include.h b/omc/plat/haepub/src/include/hae_include.h new file mode 100644 index 0000000..6d6bc28 --- /dev/null +++ b/omc/plat/haepub/src/include/hae_include.h @@ -0,0 +1,37 @@ +/* Define used head file */ +/* Written by Liu Zhiguo V1.0 */ +/* Time: 2003-07-31 */ +/* ------------------------- */ + +#ifndef _HAE_INCLUDE +#define _HAE_INCLUDE + +#include "../../../../plat/public/src/include/pub_include.h" +#include "../../../../plat/snmp/src/include/snmp.h" +#include "../../../../plat/sccp/src/include/sccp.h" +#include "../../../../plat/tcap/src/include/tcap_public.h" +#include "../../../../plat/tcap/src/include/tcap_proc.h" +#include "../../../../plat/xapp/src/mapp/map_code.h" +#include "../../../../plat/xapp/src/mapp/map_acn.h" +#include "../../../../plat/xapp/src/ixap.h" +#include "../../../../plat/xapp/src/mapp/map_public.h" +#include "../../../../plat/xapp/src/conv_prefix.h" +#include "hae_function.h" + +#define HAE_AGENT_UDPPORT 4957 // agent udp port +#define HLR_SYNC_UDPPORT 4970 // UDP port for HLR sync process +#define AUC_SYNC_UDPPORT 4972 +#define EIR_SYNC_UDPPORT 4969 +#define TFTP_SRVC_PORT 4968 + +#define HAE_PER_PACK_LEN 1024 // one package length + +typedef enum HAE_SYNC_MOD_ENUM +{ + HLR_SYNC_MOD = 0, + AUC_SYNC_MOD, + EIR_SYNC_MOD, + HAE_SYNC_MOD_NUM, +} HAE_SYNC_MOD_ENUM; + +#endif diff --git a/omc/plat/iptrans/.copyarea.db b/omc/plat/iptrans/.copyarea.db new file mode 100644 index 0000000..0f6d2ed --- /dev/null +++ b/omc/plat/iptrans/.copyarea.db @@ -0,0 +1,9 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\iptrans +2 +5 +3:doc|2|0|0|0|d5b9670cbfa411dc851a001c23e19543|0 +2:ut|2|0|0|0|e53969e4bfa411dc851a001c23e19543|0 +3:src|2|0|0|0|d6e96760bfa411dc851a001c23e19543|0 +8:Makefile|1|11d70a3f1ce|b34|6c55c172|d6496744bfa411dc851a001c23e19543|0 +3:lib|2|0|0|0|d6496728bfa411dc851a001c23e19543|0 diff --git a/omc/plat/iptrans/Makefile b/omc/plat/iptrans/Makefile new file mode 100644 index 0000000..8f49e05 --- /dev/null +++ b/omc/plat/iptrans/Makefile @@ -0,0 +1,98 @@ + +##----------------------------------------------------------## +## ## +## Universal Makefile for module template : V1.6.3 ## +## ## +## Created : Wei Liu 07/04/11 ## +## Revision: [Last]Wei Liu 07/07/07 ## +## ## +##----------------------------------------------------------## + +##---------------------------------------------------------------------## +##-------------------------------------- +## +## Project correlation(Customer define) +## +##-------------------------------------- + +## MODULE= [Module Name] +## TYPE = app/plat => Module Type + +## DBUG_FLAGS_ADD = [Module Define Gcc Flags for Debug ] +## DBUG_FLAGS_ADD = [Module Define Gcc Flags for Release] + +## BUILD = lib/exef => Output file format +## CFG = debug/release => Build Configuration + +## SRC_PATH = [Source file path] +## INC_PATH = [Include file path] +## APP_PATH = [App Module path] +## PLT_PATH = [Plat Module path] + +## PLT_LIB = [Needed plat lib for Link] => just for test or wxc2main +## APP_LIB = [Needed app lib for Link] => just for test or wxc2main +## LIB_ADD = [Needed Extend lib for Link] => just for test or wxc2main + +## PLT_LIB e.g. = haepub fsm mng proto kernel aif mgc mgcp sip rtp \ +## 8ecp bicc smpp xapp tcap mtp3 m2ua \ +## snmp iptrans debug sccp public +## +## APP_LIB e.g. = msc vlr ssf hlr ae pps mnp smsc vms aas +## LIB_ADD e.g. = -liba3a8 -lm + +## OBJ_ADD = [Extend third party object files needed] +## TEST_OBJ_PATH = [module object files Path for test ] => just for test +##---------------------------------------------------------------------## + +MODULE = iptrans +TYPE = plat + +DBUG_FLAGS_ADD = +RELS_FLAGS_ADD = + +##Default commonly as below + +BUILD = lib +CFG = debug + + +PLT_LIB = + +APP_LIB = +LIB_ADD = + +SRC_PATH = ./src +INC_PATH = ./src/include +PLT_PATH = ../../plat +APP_PATH = ../../mss + +OBJ_ADD = +TEST_OBJ_PATH = + +PREPROC_CMD = +POSTPROC_CMD = + +##---------------------------------------------------------------------## +##-------------------------------------- +## +## Make configuration(Customer define) +## +##-------------------------------------- + +## CCFLAG_SWITCH = on/off => gcc flag show on/off +## COVER_NEED = yes/no => PTF cover report needed +## COVER_REPORT_PATH = [path ] => PTF cover report path + +CCFLAG_SWITCH = off +COVER_NEED = no +COVER_REPORT_PATH = ./output + +##---------------------------------------------------------------------## + + +##-------------------------------------- +## +## include makefile.rules (Do not change) +## +##-------------------------------------- +include Makefile.rules diff --git a/omc/plat/iptrans/doc/iptrans_bak b/omc/plat/iptrans/doc/iptrans_bak new file mode 100644 index 0000000000000000000000000000000000000000..aa66d9173de6e9d82eb201c5de95bc7140bd1984 GIT binary patch literal 483915 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 z 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

oiD#~v2(Ln@MnAv7vAUbAmZ8;i{~Mo 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

W!jjU5(HYLN|^%zW-~%q&`6JR`GY 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ⅇWv!OG|bg{N2PG*09? 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%0DRLZ7PE7$8|G`Sjqs` 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 literal 0 HcmV?d00001 diff --git a/omc/plat/iptrans/iptrans_bak b/omc/plat/iptrans/iptrans_bak new file mode 100644 index 0000000000000000000000000000000000000000..aa66d9173de6e9d82eb201c5de95bc7140bd1984 GIT binary patch literal 483915 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 z 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

oiD#~v2(Ln@MnAv7vAUbAmZ8;i{~Mo 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 z zuX^HvFCxPi5Qv#b23T_VIli-1JjNuZ;V`(^RLC)ew>E3Dx^emaaFgWV2gpzB z=6S90am1MP3wMe1PYl>sFo3j@7a1m2b(am)V!kU-4< zfAOCJUR)N0mHeKP{~1ivqyi+qq-@f^RKJ_coQS+n5s6jZ0!^F;`6(5@`i&&`wXy(< z@6Nzf`qvuog))<5_M}(Z7d8iC{x89RBx6OKf(~zSYB_?j+!kFFFzMfXzzAazAYx_G z40{o9KO}2(EPbR+X@5A^t_6K)mnkP?utXPD^gOHLJuQ`E(;+?IGE*q98Y8sefpQ(? ze2z^iThz;>7dZUdlt_@+?ny7SB*&|&&my6+P@YVBk^Q;&?L-HF4@$IDKX~&uz)_jX zoX`wssnRu;1wOzI563JSrS(FQGuZXFZ>E>plr+s{R@){D4pWyL4IoS_gwj~m*)|1j z6UUoFk5$g&9Gj8^YuZ}5U6Wqz@aIaZ+6Am}xbv*zgS0@Cu66kH?Saz1kG0xVFAT%M z&}4e83v{tfL1~4aV$yY%MT%8jVpD4RLtAtMw!_o)c9{761!@+*BG!}$YX+I*1YpTD zfsZmH+%$y>jFiNrkFx=8v?ObDqYpBPLvc?827K2-=cr#;zplq;=V`@5bnyhk zD5lsrWNs&^=7IGO8lJL~qqUTVu7*wSpxG2fCIgH+o143FPuWgYRAB&JvxDhO({wQP zhczIS-cEPQt{^zKGj@iCDMSC$xGl6}WM?XNIFrIy?i30;TXPtR!00NO0O_Bj^p7@P zZVBz7WWq>VOSjAN45-@;vM|OCl_PHPg9oulHHtO^>`9VPf758}z;SKeo-Abaca6Cn zGHFjys29wu%eB95+bz?ngZl~6s-!*kdM<5sP!8>OOP~5%{h$aNI%9EA(b#R8l!fK&qnfML=<_CvL2JS|oy_mtV z{W!J z^)0F-vbJvrSrIYT$?UtaPKkOsNZ9Pw_WR92QkIm}!uS&$mr_>Q6igh=vX_!n$6H?Q^ZP&j;I3+wp!HTIa$|KQ6eqZNP1Pc# zCs~!!PycQw>qC1L93+=^`+&CFA%8==jrp9;j_30V7VDVV2N&$ORZhtE319GouTV~; zaemun1#=U8dqJZu9QZ7Q{hmO;M)myR>I z8VGpJNyzVelaZUqdPQVfhf*AXF$k_>Od6?D^rQGxW0*HNHX(Bz}hx?VI2|IF~xk6sXpQF%OQO4L@pZSKZ9Z?Nhs#@doFjm+$IYa-Idl;2)0dp1WDQ{F&#kGql1_U)h=kRWpiA61b&>!3SQB5EXAW^~$$I4DAlEFCTv>D*)b3*o23&}vkl?0YO21*Zgu`` z0!t^~7L&~zjKJ9Bv+XWGQ#EX-VjD0*bcH=u7PZk0Bpoge9t#>Z4h4|uclh9py;FQi z`Geo~gFljAvQB0HEv5=oXEi6i_O6&LAoZg~@I@Mtrkq!5>=s|xz(nf4;|Em}#P-wOBuu#Xs93Ym{F9wuzUsx?3H%-Hd-DKXnbhLsMtUL!a@3HQCfp4^y9@Aw$^L zgwJpZ_vpxbrV9;T%o&e-*P>4l!(QO+XT^`n{{ikyWHIq~9IZd+;y4{B1ly`@#21tLMN#?!8V;@z*nc|eR1cC=zZ%gk$$Zt9V+>GgxYcPNbG{q3afDz~ zHRl^4)KVQOkdM3YZCNEGM0Ghac*0kG0wXHl0>X%%|3Hvk7?&C(nMeG<4}KVtx*+Z< zPfl&3t`j`z7NSO}`Y09F0Pu=?{PeQ zO4JduAsE{t2{H9w!X1ws4&e(&5^5E0!SUvlu^keMA@2X7ADo9!VJF!c*G{s_9C9n; zVO+{Sjbty7c#Jdhc|Z69(v}rf0$3JF95~Jd1exEESJiUBQ-DXOBLHxRt6!il{t{&lIF<0#?15=uj0^4lySYwxJfgv&(F9%$~fF?vGoN^-Rm!|h7CNt;l-?v3$u=h2{E`j z;gitue3Hx3s8^O5mn%)A$A8TaE{kZo%+b_Knq=YBUKY|tJtjnjOd(2`5=KOW8h;4# zqrQsQxSTm@+b?7?uNPkTgNKoy%H1`N{FZ7pRA;Ys1awLVIL+AI4xv3FWcfOWI88## zF!p+f=oSR@j*mM8lx^MOu{RWOg`2v^)GvZMP6P1PaC-yy4ZEoRJzXHj#Yo&EKkgQuSH0;6TcT9o&rkLJFjbvig&=fmzW-)xyRm(!DFz8?xlHYrpWy-% zQxw7yiM$~$=|G6!MNEQRt;>5u&X!9MrozL~k0T{5(=Zpc1wD?j!xP%uv{ggAjXfZd zonXq+=79;OAM5|-&T6-vVMjXDU0AUGG(0bXl*oFkmA^PDz$sIN9SkcdfCo_{9yA1N zv!h8Y^?WX&uwBn*(c-b;(9yGgZbj}W^&3gQE*w?LxFd0P!B3$H#$y$Ek-~+&gWGT{k~<{F1&qy=o@ilr zsV4ixqwt7~@!MnB3E^Bku~-&oXABJ69^@dV>v+q|bZ2_1blwT@!9wfVhtCP74=_Si zdem0*BJjNVdJ<)BLwy^DMx5@D?-mAIx@diR!-#*p(i>tWYI*(3LukweUXId(iaua z8so!^+_2PwjnaZ;_aITc1Fv(zQH&(tY~+TG>o&p~i#BWI+*H}fr!~rgrN=_FAox6~ zle6V9fx-+53|riU8OCrcN0J<7X7EszJ$x9j2vLEmpYA#zu}Er<;2{?HJOQztCIVyZ zTuIMP8*u$(o}#Dcz6xnqu#q8t8m(-)dmqxS{G)PoB{>SDPPJEYxd1`u5q%@@{WNv^TOUa1FwLl*T9G z{?ROyGc*7ixx@ighXI}$Ar>J%{$3U#y0Q`Dl?``ALn38U@y2oJj^$p_ zh>f}du?zkSc!m?vDD|#ML}83~?dRZ$Eo$QQ(A91R$2lVt6hJaabaE2@qzvqKgf}}9 z7heig0j*FtB&zGuguB_1xQsE8s3|yuAz%op%|0}37` zYwpHPJlLN3i{fD(N)31X9>Mr{1NVi?3K|kE+D{d1B4O1PI0%(!YHu*fZ3-17 z*yEVwb_I)Z&>VS|CeJT!-Q3-wWlml|oC$8j->7m*a3mg^4W-FT7_!ghcqvPu2<*iO z$CH<3ahrI`S+SRAv3O2OjB6#Y$l_YIYp^S`D6Ts6;AHlHf)>q!#^zu*D0wycs;Ktf zK9lUvfx)}vHRwE@Kc3;k)%E1HERn{50UMM)+sFesqKXERY@>g>vQIVvLX74fI}P0PgPf>75@Obo&xR z?DH1m|KU-?OKkg0^9`*8iyU#0QfxSg*)~v*xgAeeX zml!1LBx(@8gkP1E_^Vv6f^pUDPqF0U=9H@a|oEN1Z>O_Fh>b! zDwRRQ9;$&`%;1q|w?YGNV&EAV?u9e!9dMt@W`7dHN%?WqM!$WS2<2kTNu8{GlpM<| zC%be@8(VPZhSH4g48>(l59TA^x*VX7e%n(mbGaSv8_bC-J*_fG9~xxL4}awc7lW*SvGZ%~YW!d6`Zhpz{-;`8^OQIk zUfbHti@&j(o&nF)zdq3Fp*JLmN*|Ej;gQ<3gU+ZeETIn=>q9npeJG7 z1+TQkCqFI-FQ}*Y6oq`)oMqqV&t-mv74T9~b5F&?a9afuXQhmI-w(!MVp0??@{}?P zWV?74W0lI~(0;!NGy)Hp`7uhi`QVzRu)L;G@n7nX@r(Rt8$>W6dJ1YafFT!2`zaE0U4>Z5Ct)XjbRT}*WA7mN)Ha~SymEh z?tT){Gt94ho7odOEwX$TPcL7+$R9aK5EVgOa#w^h<~xU%dGzI=s7y$4{bFRyeQMWDOd;Fhn=E4t>$L1_Wznz14<&3 z-J&>Vt?V5JsmYuAikGv|eE>XTS~?`b2>EJZ&;~ zGel>N`b)9NAQSxJSrm{wlM91KF<#;g9wjP;qb7V&zJ6IaL(tG zzssdJWpXSv6kU8V{1OMDYl!CaMUkb3qRSW)Of<ZTjaUMW#9gcn+K;FKL!8xGa%d)ual2pm%S!}o@RdPiZ=a!^OuFRrzNvh;3 zo?F&D-I7$v)o(>8E=iU2=fGH!D!Jy1V5UaVC8?5YrIbQvxFl7wJByPgsgmo?L$#Yk zCyI%XT#_m|JHVGNNtIm4+F|eKP{{atvWQDkVx^nB8qBfhqrI#`3@N`3sTTO3!rvkH z;EzqWpbwTmu)Kp=No174lnu$T3Nd74kM`AhRw0IrQfz1yV#sJ(31^3^7X^omVd?{{ zLJXd^)-SBtwIbr_y&PPs}MsD zQMeezCbb1Vi&@}LW~h*W)ohbPCKH!@5`Q9bJIW+~0GLCv4Ce_`)&*tm3{3S*K`Ljl zBsE)95H<}l93hJ(sX4cz8sxfKXeA5U|7*ifkLcLVIgL^|CVbT##5WDP#u#2BQg2t#$cndy<^ zIBVX{cYkpwax+^Pr4mHS5=?rF#u-iwq@QVfRU-qKE5)P0?hH!0m4W=KH*b$S4|nJD zRK@=c_>RsF+<@z9#tk66VUTWP=6==N@Zo9?eQ+ll7x3ZNu72;`9yiJH$d6?ek(zFX zvRvuT6~Gj6cJe!brRi?o)$Htr)d*ZD>(OEv*iLBV<10Y*h9z~uWVt5Yw?@hzxPXe> zrpUrTIzq8PlHRT?C^kcxUHbHC$hg2~ngu?+lHUe`A3`L~L;M(U)Gl_J;fG-9_U~VG z4+dUz5870i2V8Uy+L?|lzs0E%#uDOHXZRnBWXX%emzqoLPY79LP0#VSZ)X z5mfqeAWlSh;bplgn~SO75H!qJe-rE~zX%_}*;OEu-I|lW;2ee#p>;MKf^%m|knAP* z;5?;iUzgm2^VM&km)wI3)HCOjdvKxhW56Z%;38#Q?j`r&VhuW}oLX~miH3--wg;E4 z6w0$#+k?wk_4!xZgUb~+;A(qt#Rf!nSKFCRBys32=*3zWF2Z<64`3EV;6ym&4JBiP zE6MU_l_If^b!&u{&sHS;eC9X zS$cX(aEr>ztzqIT*J0Dnr5dbRYl7R=XJb&a!UT7)700S>wgD_G1$R=X0OSR00sR}Z z0aOSG4cP>DeJF@M#YAXl7u?Nif~|}VTBgr3@mSTH8-f*!P4GG93nMotnj5)+%p?V48IjIBEIInWq*4Rd_jwTUs&|IdK28Qy~+Y9-vcZk z?YOU9YJvx~uulg{`9n(i)1^ZB7nSn!2WKlHH?!bN(?G}YMjWt-h~a3Xd)eO`7kpVs z`S*yF6HM@xkd$?`CU{hR^ui%|Rovw+55ehWAmd`+4C-U2DW zlUjgZFVF%!r3Lu)aw)*mT7dgjm}D=K$o4jPJuGBzmg3;+kD@$@7hQRB%nz95!MC+6 z-wDgYQ?g%j zr{D9+8a2KUyr9}ezVU_NMTVjAh4S;+0Dq+5-By|Q68oQh*jxx+R*!w!TnK)wp8K%5 z5WJ%453soqyvpM3%jQDxnnuXCxe&a5tc1_Exe)B(GaBcd?O;*xhX6ZseBw6vFCEQb{jRyE5x3dp&9UH*+BQ68Y+mHxPgf$*#Hezl9NPO3 za|uE4SJ>d_F~Q$L-L09%JxuTcNv7uEtyqnF`m1Y}WEQSP$Nk~kNa%naOo#{fG#4@B zU={|}7OO=EMT_bicvh3bDTfZ8iVl)i3AN_Hfk^~~b~=(ipl_Hz65JtRrabW92+ zI!dZTN=AH%&E#MQ+7UOhcRa*_UNNKTN=h)vYNs1hB&H9+WXtqHu}MCJ4~o5z7*moY z&tQr@5`G7)q+JO&SaV*5Hw)!?2)%`WaWLJEke+!)NSX3zrq%A;A0b`+Eb-;cuUOU` zU3F8kW;?G7oL6K3Cz#`WE~H4SWum<)2oAMh2c08_9%#(FD9GqoaHQ3WnQLP}Knp9D zgRI(yoFL6}T$$#YmNu&St`M~&c9FeDIq=xxJPRqo0*7B)EU9UeUua1JETm+Sp@o!S zksU97IB?F7h~enojszUZM442>7&D3`32JORm_K?Jj)LoCXI~alf~8hDzRYnPrHw44 z1S=d1&$h*R7E*#$&f^?goNFN^SncrVTCKP>4nEJ0SW6MBb@2Iigs3gYS{+O;w2nuV zueC1F#kSa4MG5LGi$SX>#oCKyt)c|=_Gt0L!KWm@B6gGrJ75*%L}1A%fsZl=4rGT3 zjEgvwC zRoxl-@SK@?Z4JG~yGSmvHka6)OJLj=k)s+>?H(&*zs<$&8psSSa?o!70&X0@htD(H zPj8&zo>`YiMaKqRwpfrj3T=YZBA&1Z*4EhV7*J8%-j26ex3~7VZ#)CT0%Hn><6?bDLtd@j8)7UgdQu~ZYB_-B>^DZsb zvku;~Q^|VHk=0U3F_3))X&d&t9vdPq%A1O>=99o%IL2NOBMDb{@n9FpkPC6J2GDvs z?t#V_!|PvAiI5m^>_st|hV^#=0b_AZP>$PaK+Rqp6OEXa{|ur;LwAv>DyqmUw~8|* z*WMbl%=Rw0&mrq^KtdVZj9bLF#I%;cwwnh;=h~zFVT_S}9mInlIo3VzDBD2Rg}}y2 zoNx$%rb>>^dQ$X-n9T6|U)?E4t_<22U7jt1!WFa_vj*QPaZecOycD}1RSU})J5i%^ zQLhzqDx;EhmivmHLkVD%RGT)nB7IX0rIp$GP9!O{$_al2#<36oc_QpyseB&amE4w*p z(1>{OJX|H~=RY03r4on8>e&7KG_K9{yE}}jx@KUpaZQ^RQgCDO+=OLuKYnmLI0;3b z&`Mg*NpPbYr;^6X3o+*oQ(F2md!Q?Y(r z#6}!d>)3*GC?pE^U2BDbMTfJopL4 zgnKpi#z5P|`f;4V0KAtA;QjstZU+ODMcw{jLZ1efd2oMyWp6Xg&WSkR6ezA~Y#U>I z#-+Dq?6J^PBCrLGA%o8NX6N0i1-!*YKDDxu7BOJ~6Bf?9J5krS1}qEMVv_UlK_Z36 zaZ|NDTS(XP)YiqAq-EK@TN4k8uwFV&H5NNMsg;VZX*@U- zu_}2j4%d~FTB=^w%5@IdW-7#bgVQm=U@EM}zK~?>VXNaoBU5lohGgf9$;+`z73;ro z*I41_kCIFPa3|A!$x+tEb`t_!m7;a?f|$%6?90i2=W1>L<(($E0Kvdb2$Es$$=2*>p=Tjp*HO% zG<42=jSVp^+H7BUiL~iJ{gXm%wr`%L%{YS3WEuAqD)+m_UQYu4vrxrtyP5cPlD=rk zvK6Z{n_>*K*!Sc&XxHWevFMl)zC(hT>UrSvoxh5akeQ1;=R0F`#T zx#<64?#tt=F0Q`kch_I;{gGTq2s>nh1Z0tbsDJ{7wXz9OQE5X+LV|=OW&s2QTu%m1e^EIbc<#(68$zV&G zlhfpjf5Q7#%1L zzfx$74zv#jTHMM&i~F+^%3hBHRh0{G)8db{sA0s&cIt6~Dvh}m|2{Ubu#`te-1>z# zKG14drd2+{^0QoPbYh^^!_T&=>?Q>&%G$CXGT?%%%J_(A7+kILbFpj69%k&mwrq`~ z`$Js!9~Jk%#HUG*vUpp}n8Lca|08^5XH!~#3{<84>{y&Cd2<{fwMQ+V=Y))hp~w#f zd|Y?jFNA|Ygw(@({H-_}w+hb}WPZ+t&l3+=slt4eZ$Ex_`! zXDQf;HdtHAHNC!*sJI!EXZgHI{f>h{6T#TQ_`bC*7r$>m3KrL2NW9Lx-2$9qnB0%6 zWf2%~Xh_xlteU5;n$l03PxF{-*2evJ@o72hL@K=B1IAh}GFNTf2dpky!n-+Fy81h; zKxVV7yXwtxe-`Rby7}^goNm6NK&#|E+s#)NXzkj5T3euvvO^_aTR>9im?vnzJ-op7 zTde;gf@x*^h?uIA$AhOO%jO=wIBZha6-bjJJNY}~{)VtgU2BOdhu2yTZNI(N(y;yZ z+Jc-Wb-m^P3EQM@aADh|ZnUTuYm54!EzfdoP%c=j#dE<`Drgs6ZTtL91zJ06wW-`} z8EYKVx+U)4flsqNV`-p%s(vsLQkc_L-+KJkrn<#V_3P^9X02^|*Jnf`l*X+W!M1dj zbX~?)Ql+%Q>oO|lSSfc^=v>RK(!v5s z4%VA&+ z>=EsVw`VA;XzxQiOB+xeSUXFyZZxMRDa)-(RRI<)AxIAV0jtW(7gLHTCYcxVkV*H!2KDn&_;Xj*iyzl z4Bi7a$tv3ver&@>mt8_-{gaHUfz@R*IJ!NUv3IB@+ za|enXn!7Pm72g-}*2vI#_wNTvH)iYDeR6`t;&J9WY^|@>T?~gI^q|`?Ke}`~&jB6=& zvK2mCik0`6%Hr5!l|{FydT}r8T4|>jOQjL#Z}AO-|5x#z=I~Z>Ro*+TSUc}(ofe!{ ztQF!{O0ztzSexZ4t)DZBwf0&~)t1S~+}YHOi|4V}p)~I(7F9xeA6yyt7m%jZ>+Lq5 zQ6jfnA~9v*cFRJe>a;r@k+MC~t87U-*p2VDNxRFAVk39Kp0Wh%{~pWjCQ}uy&StM~ z(1c;COp?JhSI7OXkjXb3laOnFQA`?TzVPY!Jy$zc%h)1s2L~WA8`~Qv840QOZfbOuPI+S_N$^f1V9= zP>rPqY1MUc0`3CcrI>uVK#$tuX`65p=4QqV2C=(GdN-SrXQyOKNqj!uC4pisI>5T%x-vS*!r10A zI>^FcOBr2tVQ_sJU0B|gR=~%OX}mG+pNtP<1eR|H#}ErE@B~aQYo;P$Uxm_{g@@7y zQ)IurHST{zvB@gZy209AI&>Dzc7%DxV9E+N9rpntL51=PW$oWBgTwy)&VC?g6|$@b z=+y6u!P?nC@#pu&{c^bZb?SHdV5c}FwN9BGFjm1uRc)h}TlRcb+Lbofa#orP)Rx^$ z30^t)Fj+GD?Frf(t{kj-_B>lrF8tf=W#1AZy7=u}gk}DkB&D}&yDqt5G32Vj+ICl! z?O-jq;8A6C{fEJ$OPf2}dpgt?5JHbB`#yX7)q}NTtky>Eg5N5OQ#E{lFy%&@R-|BG zme7L#z{WL}eN1Y*tsGiPZ7TA7&0w93zrRfy-?f9a@wJw&>uGJ(q2s#2I&{3h6-F@k z9+V$34e0t>2Ayy%O|6jb4~BTGq>3NM{bi`A3UNAoe~7K9vTky`dkB|haU`(pev0Ip zAu43Fh(+Y`njxwiZrfo>uFR#wr;=$4^nCxakFscYeQt=>--lT8#B#7c z>53KZs*k>c$9SI%k#&dPXfF<%IJkJ<(22yJXDY3x7L>bx;uJRbKK0*wmqcSChe z`<)#sy{Ct&^lsRp(tFzCya64!>V^YyxkGj54Ura z<{GXnBDmmDWxN^FbHSsvq1R361KE}3^f1*4t972v2FZipPyxX(waM0$;#M!?^&6(G z>xCU!iTT4+DleQ+O2(|U6+*YGjhSz`ZB!K+MsE{sgB#?B>4?=rVPDu*Y!Re?7T*9yV-*rlt4(54oK zg|zcQjtO)j4fd@+J-4JS7_@PB>If+&i`e<6xPK&yspis>5joYrY=lzVpccpS5nAq6 zRdk2hV4D_h#Rx52hZ&ot6)*#rcjGS@!Kxs&XYrj3isQ_T9Ns!MgR|Qt8I%0yyI49w zGBuNKA7O1VrFDm+#p<}za%s&Z7wl0}24Y>0cejy>Cjz3q?`>AN=;}L1kO=@cX$kML zMcTv$q&0H)h>Rq8a+B8SJr>WCZ7PL(MyTq12p6a@B_$?P@|`BHBs)C9lnr19z0TY=d&l2t*2TJ!`n*L$1b-3gwW%4_?|V= zHtR93{Wb1i`ZuU4nRjg&>E>Og{KvUP*AX5D$w-d{f8?XMpTwxEo$Yd4T5+ykC1s5C z)|aluO$-V8d9;}F zx`T4623KLj3>oE-vCBS<`%^;Z){e^31Wlt<;Hxcj>qcpZvCO$(A9Ky4v_HdxNq%KF z4VGUWRCru(DJYM}S`y&#ja(kvb-$kX)+moG&NB(WE@X3$W3$X-1NxK2(x~nHZHH7F z!aJk10$bHE|MMtPiuPWJnWgdGwP|tf(E9*~v*%@|>f(cQghqGYk`hrZWaivR!as`) zt>@wP#U(kaWod~@s##mE3%2OU;)3h@MivJ;)`F%&jaeKUw5FGpsI9p`?CoVGT8NK! znDW)La`==rW3~TJE%C_aV}8Qt9jw~^z8$hEquyzjOarCi0%D50K$8w{c#gO)!8(EU zg`3s7JiSDR>fJka%yQv3cc?Y#!n%vaO~{RTK&94`}T(?n5yZsa|B`+s}x;Tsnj5GJs2eX0+@Ogj8S!1S?a1$ zY@)HHiWFWFF&M^`YKLf47F^I)s|&W4%H1$7*kP)6@6Av*cawUJ$_x2eo1gG!kQa$) z2-y&_O{LnJjw_R8n02K(P<5)xZZ1_V|G^GZRW%1CmjbQDaq28QQ03H`~&+9u?JwmffJDjhl!y<>~lZOTump^Vu}l;^o+9(jGDIN|># ztlgTjoME=6%nq|kdS00}=H)t^x?rt}a=y)r6-q9Gp|vh3)6RgIql}(mc-xpGixU2; z0~2;&+)$nces>g&p+8?(F*4N3TeuZa+^izo9*p-v1^Ih=Wy1d_c+{!G zKPp^}X|4aWg0(K*S6NZ}utKYSHZ9kGSsBk&JK|pzI#IlNhuRVUs?g=d8&La5{ht+N z1CQOEP`VOKELv{7k1Ea(&^uVQ=gn*%RcP~BSatv{L>FAlrOS_P=~k9~z{RJ3S6qUu zczTVU^pgr5TvxG^y1>!wq%N>pjZ7E(mabsA;2P}!F1S|L#9Xkk?Ax4pxZpZ9UtO@J zjC-=ZPb~|_nmm??{K%9`w@>42H`!(B6p95a?xij{a}n~YO5hs^wq|x#vQ`eRPxzzY zG}4;cRjD=e$`0*-Cst}rtY%G|RH=Pojn>3Tm3GQ*YvQCzt%=9ACQh!@ns~ggCQhl; znmGLg%KF=t+US}n+*2!6xa%lf7ighyUEtV#)^f`Onij^1s(Zf$&DlK}W5#KMCLSH| z5Z+B1_e@_=xePDGrFHsH71a(4Td*$SAIbuQ>Q4nqOHquvpH*q^{t)(3?>9o3SwzNL zI97%hVtBMO;co_(%3jvXg0Z3IgL{0e)o{=|;LiouXyf?CSX)qS`iG8Hh1a6C>f*77 zNl$piZoUb_n1^DHVac?XJ;K(xWUN)K+qCkQTGXAGpd6aRy$J27al$=0-*j%m-wp07 z*il7yuNs$Cf}_W22^O<5TwpmX!v)YGST+}2rAF{E(x z{;hFZ^2Ra|Vcj^LwtTijB~dp{CGnYE@~X28VjyJM*NoF`ng7^M!PJjaXGa^CwOydy zl$0+G#ULjt*c>|1ex4am3H_FwhIvI4Ki+3t}zaOvc zop(a1%w^r4)aS-i1l%E3N+VB&`}}w^67Bt9d)Y*idSSe_vk$guyL)lGR^;zckr+22 zTD%=VFTzWf%I}UZ<9&_Z%NF|;JIi=*APirL2`e(m!oVvw%~dt-|+1NB3WXqc^@i&Rxk*a zWs~QpQ|zYM3U~d9=Rkq%jQ@O!vfQFuX1}o5+I7SGms51ZJEp&v@5Pm<<%Ls)D{^$` z8wr19$kl?W%9ZumFPNIc)q<%xTX`2uRb9JEd01rgLI>V^SSSh(WIP~+{RmS@tM^|C ze<$d16GR<0h8{arD{8R-#9nrwWv2w@*W3C_DSb8C>gf`vI@65fU;~G!gEg3 zD5}Pf68=pPmrkFKoJOUMexl9q$Z6#gME^40Dt*QpPCl9QxL~&_X(t8S?IB>8Go92U!ZIrv5& zayfF~iuTkr;{5ifn12E)#ozFqMl|yD_Pf(` z+{f%=Pj<$JO*}#ZbAB4rzZFgTcUsc_wxkURI=EFf-UM9jjr%ijEKlCaNAl35* zCjB(5e|Emn2iVT1oy!GR>j*gd05w0b8CEs|j6OhnGImty1~3P>4;xl!$&EQcX9@RV z#)@gVUCggMfNVv3Ki*z;F2{!|i}nTV2Qc2)1GE*^)24KRwPj@-+g-2$TMKd3Vz{Hb zFUBsbx`a)-ZOe5~w=gj70Bc+8vb4S_&I6a;J_p!^1l;@uCc}F4WTG_6RBbwf60P6R zCrn$aa}Jccq%=Pqob>mHM0K^}>;qM%rcz4lf-#lpxd%G!AR^VEZ2XX;GUwXN9V&qD z9H_$Sp`=^@`*`f3Q7MRB{BW^o@^_GDmqs^59$Al*lXKhQ_Df7ByWK;RegjxmrjpZ@ zsa2+=`bgwe*H#V&w3X@1GYlQs|8`i< z-*|u}I%2j^4ldBjg1Z2Q{ToR}TDEql*Qbl3CYkXSNxyKIRS&OC zx9UOmU8+(2nx)SDX|f$s!Eacw?H7M=Y^VwAf|w^lqj)X|R*H{utgOYRK5Tg!H$!+K zA3wl1%keUHhEr9t*g1BF3Lz$YHTIdIYPVg7xA8Mn2(mup0vK)14~gM{nZ+DB&7b^-2r32DQug~78+Nt5j9_`c^z@608= z(~-6g2#%i)<|{ic7+^R2(U4{bPFv#S4UQz&;So=0#|vh76c)*B9Fz1P1}QzlcfLh# zDxaf%bitTP@j_dY7Og`Uv~}o$sKYl&RaBMC+#k@Ak<{wSr2lu8j8{zR)boBvQwE^> zZE5XsFc*oH6lq(=`>~a7m-6%z%M;uR8;${0?XV5)t++r>wo1M}!z0lz@D0N`@rwFx zE(E`3v+>LplJ)^&6>FiIT(qx>^fk+3pytIJHZzvE!ITv74>L$T+S`&ad0X*|t#3T< zzBJ_@lP&JP!hjE}^v^Rq^73p|(q906D#iSICu9fMuq*AItV-sV92d3|!gps7X{5JD zN5j9&P+fPobzJ^shTPcHd-rCO=daEhOCqM+d=uQPlP4^N@lR%WWaWDkl71J(BU?TH zoy`u`7(;HCW z9t%BjQqsSQ^&q3j>X}ZHO8(U|b=W{}y_ESk9*?su@Kszt69?Pz9xw9NX$$4?_m?@(<@jf#->3>ArQd75wylE}m zZkZD;f9FiKD>_a2A>U$2yE{7?>Y-I$o#_!xVRh0k9|2UjPROpOy%ORR7$o}2Ogn$8 zz)RCw39rml!`e6HZxgSm5_K59InyK7mAFZM88E8?`J+Rs3d99tm10x4ppP9EbOcy~ zVNY0f92EBgwr~)0DO%M^cx$E}aM*)e1)%=kvP7YIX4ip9uA!l-aAFt7QLzU2@0l`! zkW=1!zm0NWB&_e5%zz`yFzc``_sLA&>C44*-an3ZY#HmuGBx+zPLSi@7$rE(!xMOT zs4j0k5QN5>ZzkxGU^z~F%u$HL6NpT9UUssSnSgWD8$0w=VD)}jdE6yQ4`kAxXD3Zq z^KT;W_8G})i&!dcu5vy_E4Umw|h;N%$$K+ zs=X8Kj_r1#cMcLE{XHnwllV#NN{h9?OtQ~t4mjvR#NZu3KBGBluV*v|%(^m9BKeHw zB=?NwfZ4_M0_8KBi5QbGt_II&4wz%3_>ATx_l#!YDpodV$TONpA~Sog)XFR~$vvZ4 zRI)(P8a$)vpi9xyi)2>dpVK0Z z&?5Dny+FZ+{?#Vu)0yKNaJF+;=#p}^l>2n%z~RG@48`HonJ6UB*z;O<3%OEXEDN;q|u z)v(qPNJE}?fl3%9H_6$(2^%>$BSpzW;Ltk5-Re}ErM3{%6ua9Y+fH?bT$u-vOZGC! zPJ4_rHsTGu(mUy^mrZ%cvBr?`>KpF;nt15NPM6@7YhA~a8|3B4vfN{g+|PD_A*<_J zaWe?7U%_b1E{@oDJ^)kpEaAo`j4G{IaM@%T`vVzs9lAdI>Xt3MuNB!#Mzx|$O}O#L z;;=*8R*OFNDa)J{Pq`a!8!vuAc5~l-Inl=3Zet$rxyjFat4WpUWVvGfN9df23nu;s zZD%JujU+&H^|jYosfQJ3mkxGv(o9mHfD^9oBY|5i+2!Ky0vots8W%u^tBogG8T?Ty z2l-%c=qaI-Y|NW3Mt0tvY@vG`6!g`=IK@%97gScFUF$`-^W~ttTn`NP-V#x-@51c> z^%$=76#c0d=Pot?xm*F)*SXu_G|6c;$y=;Peg7GrWt;zW8=24UDUpJl$5hmMJi{iq zkOa`J<+?dVe5Q?h=T2~~Gb=sba+Zzw!QnUglf)Y=hUD26ybEnH@ABrXK^hKe;_kqe zQGC|xoU;>HNYBF`OgW9_*%`$>0$oQ2|z8CO~?$k+s1r0>b4B(Oj*5jWm>Gz@|9 z@gE|u8YcwzTJYNKmpE`ALdkf(O>sF}PiP1*?*%qy7uk`839Rp70?j3k3vJvr6aX$p z(Zzu8T4)FP!;C8z`U!QKtRSg$FS6R=JxW*LVlEobMVvx362Va-1ka|>WM3H?oomM5 zv&h~T#mP-)YCd0V;b)8fAiQZyhoHN}#&na4pu+>}&8UV;ZN%w}pphw&v{w*$nT@PC zk4)ewmThL2TlgLpMlxWP1h>I^SJ;Smq;caW5-t3d7W^UkRhH^>htyRz<~?Rmamj6N z-qkkZed%2+iu&u6vG3d1?O}147e|3C{NsC^l-qFt*?7Ax{0*u`>V*1rJXtCJscURI z`!J+r*ORZc5&z2NO%D)XXKkYr>i8vkd14J4Ox+^R7%`u+x&M>77x7s4a`Zyu-C*G# z2{}{_-*M@*g1XU0e#}U#!ke)|=Oz$0+4y&);`;`374ywD_TQ45s)d(;dbiSLh2C;D zg(XTs4_f2kwr#@Qr$Jm2W3~BhHsWGt5&i_z?H2q;lE<|#V%MTfcUX9aY6l9x3kwzK z_;>z7jn&UaV$9IqMx(j|M#0@SM-g*mMWGH|)MEBxD+9Tq%H{pBt<2A|gw&S+7=B_C z7)%JXQQ^4+K-z{nYCXoq3{=7FyTB1G0z9xR3#E_Sh+T}}P|3=+E33b> zaX(|6=v`YoPuP0yN8w4I)n4%%3qMbKg^Xa*ji0pe@2klqR~H)ZDO(Uj8*6bppFZHe zt*0%xc@ugGq0ev&5p_5;Zr-^Yv!*(_2@2DO75bvWLhjvOiW?BIw_^(uBGc92 zC-32}W-7?dL^{8}MYEK!Xp5HDt!!#-YUpl)LVS+rUV!W~wmpbX#-QhI$#${C09paP zV8OecjaY{UAo6~Z&qDx9NjLDre%mMQ}MQm4}|@zn_ASkC4sIdb9eP}Owr z=Ni+?w(0mR02A0@&QG?NAS4zGb1i z2z80oCi;^VvB6w+5>FPfRU7YZOS_YdY45OhqN=EOY&O5I_ttzvuD!8S~}0h>jDu`5J0k=~qZ(|lwZX=H;7i|G=|*z&PW zl41>8{j?4m?i0(yfIc`+mx{Uisf}CHr&bxK&$6_`C-Iq0a5crNNbSX7A_Tcv8?5gU zyR&I+Pjg)ZPM(T&@rBFE{-#-}ma;6CFP%z;c~#xqz81>HBDbaXMf zhhD~w*b-PGS+Q=$74>+HGU9h(B+IMng#QZue7m4goqGke7xxAu0TP>T%o7jCZ(hUgEIyNP?kVcS*86$4<2P@|)+zfW;6}5`X%==J zDdk<6F^4`I3UZ?#v*|ee9Txsul&GiOaQ{KofV|ZDR<{G5LM2hpoR?9$OW6E4i0DVxcZs+WHy-6K1NHeD^kxF06W${!vJa1vF z3)9Jh3hyg2-e`}~2BMPFkwCYh=#|QCumn|nV;qtoo0y$wRJzE1*^xq_Z-QRsRK&;7 zP}S;~&A#6mPZ`=_@ey>0DY8FcoLoB1YKB_3BG4wNcex`bpCq-=P6U>#Nsg-mCUMJp zvR`nPXP5T2K;bZo216%A5k|a#sYW#{e%f;wf_3zr?KnIS_F*;Q;ZTKZq~vS?IC|q+ zM6Se~XNA22#&~lbD;ct)Dt2v87aRhu^_^JVndjpBBi_6N?GZ6SKfLziJv`5tyK9sF z$M6#TU%rgnf!X-Fjotsn+qj5rUEg3LPh&61|M5H6c#*mXZ$#pRbZqnwu`U?p?~?>+(YAoTMYrthg>eNa^F~jWambgefDoNs+PcjqWX9IGu`AJQx*(|g1*chmrsKp<% z97V@m3XWoj9928dM2etqOl+>c2|JRk#&9SN+pwB+ z+Ef$SpGo_k)sDw51JML2CvU?a{=f?fcyS#M>8`>5d2i#7x3FnTZF>!-NC$dM!D=g+ zn)I)S?UU+3B(~WyvD~0NkINu6Ew$|eKg44M6Ys+J3^UM^G>2#+y=&4vD|pIyuI6q} z!-+KSWpIc~G186eo7Z;(Q1d!k4wlBDW$~mPvEwazzVglo-*IoYP$2f_@O>#PF=i3W zhgFKVF%8$&(fWH+x`(mLc)QOr3fgRfe`TYsnF|l3M{IffCH;M{Y@+Z|{oRso1KP#B;rJ|##fHgMSO-;-hofD2S9rUCpCo@VE$RP=WQEY>O30{; zF4yd_bZhI1rY>B!hO1(j4|f>?v;+VM?<$3?p&+l;3@!PCfb|A^T6;LezDBaOqlG>j zax!;4?9Dqo<{=j|_fPsSt6UjzyOV1h(jC&XZk?3qcFU5oYt#73u8j-G$(@?6gL1LI zabtLG98!RAYTF@w<2@#{N%zzPl74cOlft8xv{uEVCBl2GUo?r_k1AqmH;?P@)g)qn zuSvr{YJWGT+l1#|YBJpA_A2S40xbPM34PN3#dK_}3F*J(ir(6~NFI*y-cljYRvz9` zgaImH?)pubF=_1bf;-t*-mzR2NIUe>%d8W zX%BgxWu?CqK2MUN4-M#$%5%~F09KL|)+GrFEpusUYG^V=!d+ldtSJ)q`q^M(Au283 z23iUsP#0)5nd>Nc$L&1q2~>8;YR^GQ|E!SRak=b{+lyTnoyD$85)5dY$2C(I&N%kR zTlSYL`x7k6Rm%QE8(dBHC)vOnvhMveD^|DgAa!{-wq%dD+^H||A9rS1ae`xT#+7AY_QnjqG zO!_Q&tqpV(awiz15Ggj#PWm%QRa*Q- zVW~wAUu2nx^)Fx}yr_?=pt;zF*A%W7Rqn!#g~Fr@wpdAA;*pg|Z+oHG0%OImX)lX&h64R{E~Z~+ zWBN^qDf2gCLLY|>p=Ewa5fWMNAxZx)VVPg_T)PlXU$ppR{iQ@NT9i`emu;Y@XTZJH~Vvq;IH6`h!ZHWFisQErebqqDnPZbPeSe zi!c{VB?>BT<5~(ESukwvjoA7(ng1X`P^wm<#v2w9W=ZTn@zsO`hdP1-&}e#^j0XT{ za7(fld8j256rD;IhDV5-=dn!k_xKeyt63(~!i7k70!Ou6sgmNK<|h62kZPHustv6y zqC&S)F0&*>$`v-ySlDIl4hLz`Zs3BgZ1zZl*-V)-eEGUFv*d=CKW$VE1ooW z&QJP}k*;WlxsGmsY4CF`64kdo+oSQ=YB0?9m_%~(a-_nQwja>Y7jbd4xu0%-S{Dnz> zb4cX0Tp})LiJX>AjuCR;;BQ83tpB+hRJ|x|=gB@MKOhB)T{_zf+S!P> z-{PddlE|fu&pQ@Xt-fe`*YZM4!WWA2cA!-REv9;RkToj&mm(7(RSF*}NAtWKxmrN8 zMN=`)%V8yC)^Z8b_8L3k`-hgDtX+(6C)tz2eh`*jnz;*F?f8K$u9W?sPP)pK3!)qS zmIT?2EVV>bMgUSOUy}513aQ1TZpe{d8wyI^bK#^WXL@F=O`*)Ef;!;f$z@=WH~ zLa;NhaecSbArqrw9Fdo0hv5)O1$tnk*aNy@eL~0o|lyus~0YFkPp0eGgPmAg4y=F@kom?sG%k>2%% zSdSAY;iM=F8121rXCW>O$F?h%1iin#tGX||!6dgLB}vFi4hHGZDVn)WnA_=!%663u zrE)92Nt6t>`-pI`Eh>}?U{dMZEH~W)=Ch37xcRN?| zynCY_@sQT+l{iBf(!0me>o554u^3<~0{?wBbX=j9=YGpfr^$RN(XJdbO6i2DY7 z>Cvt{k2(BSB#$|f2!UT(0zF!~U)kWMLRke@qQAC48pNDsYN4HRV4QNAQNycUP) zLZW|gM72we5J;YIeNGty=djO2=YzkvhRF z@w&R^ww?y;F;kCCbe}pv6J^EP~%Le#33Z$F^azk~q4<#XZFW_45^x$rj0+COc|>B> zW#Ng0!=CeXS$HDzVp+j&V}3m6@@p~K{1iInzVf@LJB0-u`+G|YT-o2-QMB2}ogkCx zC&)wXmhKuoId!nmC+!=Lz^O#iZ<`~BtPWBN2+v2!ZHV;yLOz(|;Cqnr8l>8m^8veA z%;~L6>AK=<#nY04DCTIwR+GLOjoE`tYuh0)$PoukJtiaW*;*~@|DXfwTcrO@AD;LBb04K(;65h; zPOk?b{y6?vpovA#OyD6E9yf}fB}%;gFP&FgS2JgM z?cpotnM|TE(X&!E!X=6-Ev2@VJoA(oC@VMRu>^V|oV1Bz4f}~U_?i}Vn8Y9j1SYn$ zsk;X1DKUifQYkdhr44f$If@Pz6PLa45BO%GC#LJs4>fDANsH+?h&iB;($b>_=?u~j zXhaSX8ojLnEy$r7=m^knhiR&A(=SH8Q#^jVw4r9D!BR7mkzD;zIJiravQ28TQZZ?3 z4o;rT^7b|cWN50Q?hZtP-hP&nNxdj|7c_NKD7=|vjz`KwJ^E-ImlX7rk2hQMm_X&{ z9b!2Q+LnRe8Vz;e9qh*XPUxt)Y=5}gBcHYC&0|Z!RXwJ_k0H3UVP#Xdh#l@j(y7Mx za38HzmX;})5+>(Pz;Ag>I1At3nV7fC;dmo4W3~;f+)@kmNM4xeJNSlG!tyxRV$s_O zH%Ji~nK}l82@<3?6Z^3iReH0sX2UQ*$*`Ps+eFmNH3eT6a;9DZYQ|ER*3<&anS!11 zyYXFxGy{5)DDxS%eoX(7aTNjcEU7+xj`4mdd6+)F8pkZdJU7}r16B~jjmlrlq>ccF zr46XHCDlFk%W?0M==w_q3o&HyeMBsh?-D1X)H&JtFr-Mft0Wt^qQ^?+ko zxQ8^fD!+-LpJ~pPU`g%rDRm3y&6zuIh4Fr_=vz&}^WX@TLT-4L0zNX2oZMQ6Q;*;# z-N6{KL*C92;oFuYrTI2#VqJAxuxL34LmXNrVm#ElEq@Bxcvq9J${)wjUo^B@denOw zSfl*@RYQ$I&vJIRziDAMXygAo8$WJH-)8)GfSz%MR9IhnrsymnK5|t}9kdpdR^7^) zn&owime#JAQ@3Q^%9V2#K!a?vvPH#hsJTA0iE- z#2aR7X{f8EGEb}N*=@t5n#wJj+F?>p6*jnPDC=Uh4Xqxkbu&gw*4r>lT3V%zZX70x zs>;*KdSu&BSKP54OUlF5{bH=HpnECWb|J@_cyua`dHN3`o;4uD&@dBF5rmEQq+1Xh zk9K4Gg#V}PgoP$x?++91eohje$Aks2e?p8&B<$-3b#s=kT!h8MFD3OgOnp#x>R4{- zMYV_HmgNaZ5s%)?EgV0=@_fYn3$vt{H)}B(W@pl`Kz02OOe@UW{~NpNQpoH7+qsc4 zx7Xb0Yv)5e;3@N=PMfk?Q!++J|A!#RnRcswf z>Ti-x+sWT0rl-XO`_ix>9jTAFCxl33&^qkB0ik|jWyK^8mQub@a=}=ER71kXwial8 zxp0RGe&A@>8XN3Mm65`?@g>J$5+^7JIST!>&IWl}X>0mvrMd9xjMUl?L4%!U%E3_0 z-Lu976*Q1oDpzrnv|uEcXom3>lAP#B=1bMNV62~A8L-iQzEs{sOEFN2``Xx!0_{$d zZFIK@PPH7=;Jg6MGf7F(jri(9@;5s25OY(5CU&q`!Et!s-6rT(iZ^Spr_}_1vJ~d8 zZ(EO!`>>KA`rqI?D^2avLV7u*&>=f!TsYQGDZXrx`j*J68t!Q+;0_zn9k2D#l|4bAyHf0__mwIs zzK4&8TC}GAj(H3_G#e;VuE*lP1H~+z4=kPSra$I(+92ARYj~pSOV1;^Z>`7nl6_E+ zE-tNn5tak0*#%<#x>~so@`Wpe3F<5|I^|ZjaKg|pB3X&XMr+I1*nNkv2l4r{k*u;(pxybb%Fk zx3-B3EE%gfziY{CF~KdC*P0g0ZgDY=GD=*};%g^9=vs-p)*`X(%mppZ>n%=HPb#J5 zuW4Dz>vZl@9*M92M(m*o3xBUeC@kM=S#B&qyS?AFO|AO}Y)WXkEfzUl)Re&Qm1AN) z6W?RRE_(IZKI}}3Q+y!-89kn}47U_uM*h4_+(8BC0-*Nq9BLv4xMSJDNUW+2ne4{3~ z22~WbI*JsEZ2)+#&BC*!y|Zbh;we`=#L=%EdnSlSq*oTTT0|?L!Ujb?E`R|7Qx%Qj z@Q@6Y*X6j<>`1xG>_A0N)b02-hv*M*Y+8MOfW>d+G(DS~3!oI|SPJuwt8K>$c$1-i_tp^uxbamF5P)+qg*M*aZC2wWf(XkCI#GV$NcV7jnC&Q;RqwqwO3dOehTEEx+=6X=?(AJfwaAsB0`CX$SO-8lwa zk|L)X+-h$2IR-4SV(~Su`LfP2WC3zW_{m6J-Elp*rxV#`{1FTy+`eudgXfKh$TXv3 z)u?Gx8QI$pk+v}LSR%HHX)Q;Q`HL3gti!}sz>;sng1!r7zA!S;my^+5CTe&1mK(or z(K6il0rFgcj1IsSQgBcn>w|M?CR%9Wejj{oJ?_nk7TJhEA~tuf$Ni}qGtkClvSNfr zv5hFoiVz}$Y{X!Rz_P2wG}yw2hj2+g#DYr%EQj@!@-Q1wq3P=zHsCc>jT&yFs`~N> zt`QbK-p3|}&J8#jVWOkF17I~r%J=nok{|2d(NgbVflP%Q*TZJOI(E5kW-LFziniKB zD=lcIU)PSOjZv3f7)qjJvF1W_vw;rxL*rtJo{hjc!Ml)kUOv~a+tgjZwzVnDFwy&| z#LV}3cLNTh;|AU6ByX;;u)xP@8!UlGr+BpjSO{vC(oBzY-AMUjzYeDo8z-CSJa4%` zY83(|=Ud1sg-kKg1s1YeAyZ9sp@pnb$bKfe$ZHdp8X+cH)zL$3SzG+No;F;h)Ckl| zyrYF99B^RcBAaNh(c4oLCm||f6GZP#%jL8tdY?+#r0cq*l=rKgV`(@qP!kWzUK%(H z60v`wF(+bd*8$7TM&FN~OG4SugJZLyl_p=FH^B1O+#X({-QS~{Sp;?S6qI8@+e&og zb~rk9vyRD-x;KD%aB=YFjNE!$XoKyUbhS z9)fmP+bPeQk0C+oxKBYe1Dn56>9uC+^$bfDGevt(-9^5DNvsl2SiM65zh zJhv5;qck1AMxjDk^=QjQH`$GZU$0>$85O08j{YT6{lC<>(HS0uM;7pQ4;ty2ED(at z8a&GeRUb#sTaU#5g+7kYg$(o50pHwj%gJ3PwdwP%NuCXWkDVfsQ75szkG(TU_n4%g)k zVVy_xq+Q-fR&9h^aq=bz99xM@UbR3ES+;Dk$(zYi#~Ryl`mo9PvAj332~-*#()vw& z58!k&y1=n$br<%V7}y~#zn@10C|!^2ood zAuWHVY;?kq7T6&zf1dYSpyVazpGw+b@aCYBf4|BZ zh82gj{0FtMa!Bg|jzo;@I*;WJI~Ad9=y~sELkmoDH_6tFxg=uG;cvm)_~T`+ zLF14=Cb9w`s}4&h@ddqJv1dsha^d`pACO{$E{Bp=IWpl<21 zxo~f$D*eV98hW~oIaS3(tUX0(Qe%H30PwJsFEORYJtJZ4s9N6Hw8^CQ(QtrblUvMY z5TA&(FqLCK8Jj>@-skuec9dBruV0=q9Fb)7!ss*t;qSR{p~;(Qc>6d50Xnpsse_V(v#-IdAFQy18>|=a~1R=?#82Ue1P|t>Yfe7L#tZ zgHI0Jq&E@|rc);GHcL=AfTbGwFOa9($Vzf37FzT+0AB21{Pb}?Zs2t<=A=7WSPB@k zkmhdC?>b8W5x=7yQ$y0i7X6x&7}aetL^bj1JbVcV?xJcZlWoJ(J$b zY>{%$m-{6eO?unO07T1A$(TI;qRdpNkopAxJPGcl7K%;bBUogafSP*cgY-^cE>5Ho}p>?^~qfwWOC-SQU)lM zrsJT@P#tH9F;o8R?x=-fJLK64djYWajSbvC&w(L*&K_irmA|qZt&n)aR_K{LMwLLQ zBG5r5?^A?XByHxdF&9zB>2oRlf%C8;^bxx0_-{@y>0avd9!x30Ft;9 zpT2-CGhY6)JMIR-!;y$Yguo<|yb57?TDb3CC9^R7D_fbr{woL*C$E}HKfw;i`K_j< zVU+%js*$-S!YgvJkffg^sR3j1Eq=L1&cMz)Fl_uGr*6i?=^4_uZGs}cRjP$fB zp4AGjP!4`ibdmBZpPiBkq-#9KG|}=KJSPpk{UrUo!f*8Q=TLqxuvVkxKlCs}cH#+m zcYkR5MUA-G^Sj%-alcVtDbRdh(#Tsqzo|`T@Ai%x$m3bAO0k{%nb(%)342!^iO+!)`eQ>H)zyG%b$%}X;Xe+ z=Z{B7;uoUqJatOIq~BD;FQiQ#iHC|2W<8NJRw^7}<_}xomnLr=!u%xuOXw1|2&qh| zvGkt1S&fUZ$usN5lU1qo+y1)x?iO4!C-wM_tH(asne?BTi%U&%RSK(AQNDXL;LtEd zTB(0oBf-;)d{^o3X>qP9vK1ov1+z*2RpYKMvQ6f1Y%jO7LhAdk72NF-5g@^)p1F#+nk@Fo4hc4R1?$4%_$ ziX)@x8D5|*c&0ZCD9~jB+sOE^ubv=HA0*e{&^XV!At`;ZN1~DP<(k7?JBD)1vN4AR z+AcN9q-R_Bia-#{wU+5Q9@&YM*Y*MJMZYF}h54LD2BxJDx;jlRr*+w#m zrApU$y^z4*4xE?Lf$FRG9)I?DdcGHka#-MvflQ>}8{Jj0=|#e6w0xHrz<$Ba753iA z^b#9!q8G?bJ2kEAao>(fFSYQK1golmWfpd_XXPM0(4?1J_$l5H>EDNW+Eq_=>9F%K zy}~9s-3uCVy&*v>Jr*fieufw51zXyqu~K8wwce=`_esR$@mDCC0ufEV$-4+p3QfYZ z%+S3>W70=>n-O1_kCmEVLXM9l{G+9z`^Q)bF+_)?znV2q>G*Ek_rIy26TSQa&{_Vs z{t7cXT7D8#8}{q_bwrAu14TXxznE4U@vMX?A}xQ-kHFqQE)x9>!451O`3-(YV~<`l z>o;msGte~0_3-TlbQix#)q2dwB}yB4E!6SGU-yz&=NPnc!znMx@|!j5U_y-FLK2bk z;lAENXUBSfJrl*s_goXV5vqy(V-@}u;JCXP?Xm-RZgLIQZzb_q`8$ZALSqaJ6PO8z z+o*BxT@#1>htpXsvWR`MDPr;b_Hlru&q5TI4o$}Iqy}xr0yV1H@6uv{M0*32Izip8 zq&AssW%hg6Y-pfpLIrM8V9H-8!{LLzYz!Z_3zhy88=UsX3BC@^k;CR0f~k#aoXlEk^JkieIwh{!Wl zB%7Xzs7uI7W}GFpPY$W^mXs-Cs?3A|NMHCA{+xwiVJtH#|7gPZ)nq1r2t$)Kym8t33Ge+N_ScadO&=G~6TQ zh1gWd%ySlyrDJf^>S+{f%fw8LvNSh`rFoVmGGQ|FnVc-~(l6Wu4!x0Cut8u&zTT>p zS-1`1X!#xskS3g2L^J@_N@vP^gOZ4rzf}t@h}4XfN-QvW%uTsVIM3vrjWC5B8f4@) zbLdL|4SN@Hcu~h*Bnz{Gn-z*ZF3q0SgOj@xjTufcdjsF#h>rJiN63^IJIQ29(c3Yy zp3#H3DT5E;no-M&b5L>;3!nQ!q8q*m=XHT{L@O6+7z6kC=Rk~mwBUFHI0x23Sa<{O zH%KrZZKQ{;Ztj-bBsTB(h&$8scflM5X?0{R7a zL9vI%dOv(=>j;c|%0%1W!C0*K{g<|ylCikqP{`SP&u%7}V@|+PKHg>b5>orN@F4o`A;%`MiEM=6NJ@5x(a^s;o_*Q5hHbl69N5YR^GBOzDjdf#o&r zdCXqF18&zzP&RD$UP^`=U?^v|Mo=0l{0608xa?LfdLuoLdAVXgDa=2@W@ss6&k!{L z2a+Ob6c{)0$_%B~HzSs#2n1C8E9_?UVb94PNxjDNZ zQN^RHq*XxMc6HBb-B?2(Nj}wJJi0nJrX8{>&^&7pleY_3Yo3Vu);7PuRM=-uQU|po z28V?B%t^&w&zz)Yy+~oiqkQJ1!aZ}6n*F$D(PvJWgmE=^<|H-8M)8>wya&YFNoA3U zlZ%VK)NEMG#fu~f7@`%NW%NBP5(Kp6K#nhxNSs(*VrB;YY#d)CsSx8WD`WoAdhIA* zBuT_*>S>a!`~^0Nyi0N}lG935X~dNgwaJ6b2^JTb;3BKOK@k*k4Fb&ZbrL)$R@Z?O z8bQ%BnwYPXBw}0xuV81vYP|^t(oKL2e50g-!=ZGe5X?79D%@p;CMZrLGg9-75`wuX z90KKylA58$uxP?Gs#c3=xgJuDSY($sN;cv*4Sy}(2rXWpE#GB=p{s3jzEN@+e$x=L z`qI@~-?iqP_y)tz(ky(Vq+%r^kANEUSJAWpU3tM~4^pr-3Zhx2!o6UVDS1}&@&y|Q z<>s19DU%~RU$CiIxOQa=wvVJL;Tr?27VS0>qq4@~KxiuSF%)#n`{FRz=)ctd_kZav zqsjY!;wXzh*8`%_`%&Tldq-KU{7NMJ-#E%-A3z1M!HE>!xcCe+{lD~^#b%_@7Qupg z#$x9kPE{UmcZkI`%I;K{hDcj@z}afK27EE|Ae`+Ai(N_}eP28>_7&e(Ud1^qc@KtB zTpTz0E)9tDFmKGm2qgnlKM9EID?fC7>|9@oB5p2G*H>Z)Ytg#C5+hkV;`&NV5I9|5iE4q0>nkxc2Etjc zuUoPSIM-KX;{5=pr=okDhjxVB9M1KH-5f-~$yJW)D>}ftTHvuhIJE$Fb0~ao*B5qk zXv9}sU(ta!W^dP5wAe=M?fQxivJrc^zM_LIJlFLV9b&kGR%6cW0=u$!Yw2X1Ttwo8t;JJG#CSvFYHgAA3rEmKQ8~dykG)v{&KZ;*cZYT z9@01GKTxYYL-1lR_We*)B%UflFjl?5fsloUWGV{OjN(F6X zC3zB(XM3fB9IsT+NmQ(9yYwD(tr9?=S1RZx3iV1canVa5M(dRdzQ!vR9PbdTS1Q=b zY*}8ZVB22+P_Gn!QD!3FFELzy3cxgcBGh8je?0sf`y>3y2Z8lU1-r&u#_g0WIFX6i zEu2>>IEhw3wpS`RS(*AeuT*e~#(k|BnNo&6uT&taFP7t#3Pk(G%J=e01?MbAX6uzAp0E{SZIMx@JAuM0)qpUI zBmz#V+@q$DG7iqA^atL86oc@CUa26Tks6P9uS1Ndtq>9e%XYtES@s)Uxcxn8N@4VsT%@k#}Md`J@KdZmIl z6*0Y1B+h!03Wmi^alMoYl1&B*H^t#!MnczJoHKhe|cPjeO{^HJuS}Hd8LBCYMk>*1%G3c$?-}Be}6#` z=6I!o_cb5AQY24)rF&tro`^jQ0pu}PC@G9C?_`H_yi&mjdyrw!Etv5C4!V3~G;m(2 zU?$E*NtgMmS1LFNSC=v_$14>a?2+i#c%_0_HfArcR507Zv%ONm9FOdLtyd~I#CuTU z;FaPJwrHtt$l@7c6~7AcrdDf%+~pN-L8{a@HF%=u4A|Bqm1@?k>XAyd zkOVwZ#W$1cdd7X#5tTYt;a_z`rCLez>m5<4jT$G8s1}f6Nk!6=;pQW`_HzMA{|Qk% z!=FiIJEBruTAD0JRI1w*FxwH8>S0US%Mq2@q`+)PRBE%9JTQeMm)g<=!u?CI2)qYX z=*>=DT6_uNmuWH*ZpMNN+%KuinF@B5$=e@4!ge%D$8@-_h#_^w2b3kQk?3gP3skA^ zuRvmK*}~s~E%@VQh&jWb85%1Y@|f9yAX2eti5O)O!5X|G_`wB;OT;e0-{JS+k4!_q z4vC52`6mi~rM#GkLF)yKMG=$UyO;AbQaI7Tmz~ABDW@1|7Ss9YWScO2|R{RL#Zle$)<(c9~8FvSZ7AY?({s-gk zJX%77{SL~(r0ybNx@S9hKW^%74VIu_WYdkKCUp;k=?(A%JpeSbQ}-1gP2~5x7Rx4p zmSa*6xCSc_>})crA1lbm{wKb2X;ME?Kp+4~@}NR8J}Om`Jfwgk0Z5XcDr7JrW8)5%tW&>K@Bx~3ZO{5v)Z?!dIMWnTcBxD%GZiu zs%I>0xfYI~XDw)p$s*MO=wP9~$hts`68+u>%i!H$vZaNxMvc>53&54a>^T>l*P zwnL2AMbu7sFo8HLPlV?bcuPP};op!&%U)ATwdO4*89s^%FXpKE^biSm>Udq{G5ZZC z;l@#-XcKR~ccduM-Zdkgd-SMhs5ihW3Uf4Z;K0vFHx=}bxd=6idu74t9azg5byf}$ zEKPN;$BqJQi{SQK?|6^o9>w=MNv@Pw<86^?TrWJ1${)K47p~jdyN<^$U2g|-JdH2C zFQj}B-5pX6rUBNI8TGI8ap@A!L?|;xLpSR-9}v=>|Ip>r-}=#t^hYKu%?1rV#T4{ z2W+gc&yBfMEoLN^MxYbCQ@9v{cjWq~{gEskz{dMF)hK+JsKC-H*667mE%1OK03-F5 z?$gj;0J)kFaXrgQU_5%cB#~mAK^=|^!xuv?!(Y4Q}^c>tTyKVfZ9X<^qAwirM)cyDuCIKuLh9arDQ5f+Uc3BSb=%aQWyVgu#Z#b%UW7c3&bgDq<1 zcSywXJNobBl!Dm>2e(_yMU1wR~o96OgQJ7ndK@8LSo$*%camMf3T96Ob=tKzZ<%@4dK zqO>oww59o6kt2&M`(&{N&wGg~am0VC#7X$Li*YqyNc^c>;!ouge=3*wQ`y9SmqYyN zkoeeJLgH&N@^Y~FJVK&x;oAVh6>d|+7ZE0n_TIG<^FRCw2c=nNoHr5;YJJ;rJvjDI z$7&V5;YU4U*?9@BJOrl7bv*5W%htt&>NTv7yr{PR&1T$I;^=J0bFeP|2yF2{-WxB) zHHM)GhT9yr`wow~&O-Cd8*Y*NL_X3c)yf_f)%M>}!HcwAsN0PD&ur$=D}?tYQIB+= zxh(1bJ*2%jm-gb2HjP1Vaa63qUZK4-hxW1@+Aajzop?tm6dZJi&^{sRk?!Z0g(f5S*>rsz%54#FCL58$n%ccEVNSmg$_gYkJ zYo+~%9NK@(q3uGT{g-Uo;Xs#(c_iF?HLjQpi5JA2f))i>5OWQVmb_OG6H{J^53otK z!4<}`8=MPuo6&Phkx@E4H(23D=9r8SB)fYzZmJ~d<5;peG1VqUwaJ{AYO+`bL`9?6 ztBG;Ej`n`sWkz2fV(nSOEYu%{sPQa!)A~(N z*Z)$)MEck3aW&x-$Mc7|h(F9mObg>b`|wtMP-cu+=XGHf42_E{h_m_u+=21)0 zw`JBF8P}RVy29Egqb%SUV5HGe64$z4jXb!;tt2i}irzKUkvJ#jmBxMGjP|~V24F#D z7De+uT<7r0VqB)k8w@ZR7t21+RDFW5%y#-@^o7cZ^7-zg zxSNwQLW`huKM#cjfRy|5xLWx!C$`V6*kDajOkc(ygn3RmtZ$Si;{dBvZYH7e%Pa6` zgJ5)!)lN)aLgluWqO_)^gEd%jM-nRTMk~r_LPgnP#_wB!t8u${gGXH_rQDgMSXr{W z@LiA6RS3LG;PGhDy*R~KbvANQVK%|^-I^4ujmZZ*2Bl4b;Gt8V+dn?3#Wxk$Hi<^F zEqTRg+MH_!rF{X(=}&LFB!l4#u&Me$aqAwxGn3LHiTDwGUlMtJR~vUsd1r_N4i|1! zie%16(t`}kO+|ZFQbpH6N$MjF4g@W5Ao%c_u$xgHPw#GO<}Bjcq}Z4w^y1^V8E`6y z38ia7O49VMN&ZS|EoS}~bzcJC)OF>p_nwfhEXkW>8wdt$!0g_DG)*v&m4JYz4NZ}N z0AZ0#*b06&kR~*-v$RQ5o=np{GD({0f}FI?q$v`Rbf#_WES*Uc?4)U@OC+GlvU( z;w9}q0lXbR&zs0iYd$CGjgA_=Qu}`f=qPRdsdDTgFg6(YV&a#hv@R+L>+nW;t2z0y zD6hUIcu$WI%j8qoc%DR^#t_L6C)?}rWrrap46r?qN*Oi#NxL4w< zbp(3*bUA#~Naf;r0s!(U63Vy5j(X`~>1}x!G34V0=fwH~4@>XDr+_X*l80rz>0#+z z^dBON@UWyL6h|JG-pgead05ulJuH0>%$dpy6CRd3U>mEqdszB?WS2m76CgC2IKR|M_cnEBa5)Bc)ivH4X%d)5uc@Il} zfb8jL9C=vQOAkwbkZUY}J!%#0rpdR`UqMEHBqiU<`kZfN4otq4^*P^4e zBrtKZ9FY4~eteq4L7n2wg}Fv_PPTWVAI#w+@mbXalarno6S|%so z%04`kI-gT_iNhQ*kk&eWRAwE`U;nu8i!9_@Sx6pbgO2^QE&QI zmP}L;gH+^OX+p`jvZRI>B_hbTvVj)GtH>Ys8lB$ES44A0Q9Lo^CFrmVAe0lsM4{90a&?}1c`IJo6(GG6po<7f`XQm|srUy`#zcVO7J^A$ zfBlN(*9n~p+Q=0yE60fv8!0cZh%_oR(&CJ(@=@N_QQBlAaGZcxsycd5ol{vHaX3DF z%FQN%hy52kLHXpl5O+|&xHsh|IIuZ_JLt&XpZ}xooxaO{3C5Fi@AMs{cWIo*z0+rq zE2t(qlXvg*eSz{6xOe)#L_l)yyoCysSDU!MhX9SwFsIEGR0LF`d8f@AIRs9dKgI(U zQnVO9aM~QOhG9ZJWevj%9nZ^Z>N5Wmw}Io)3fu!y$RUPwym&$h_aDcd7*0{XV_Z`Az0Hy2{8p+^PrlqH*&VlMpVH?8}3R4>mi&+@LM{Xmc}yjb>KhnB?Tbo+6dP> zi*KcS+*G6^#$>%{!(A<)rf;Qt{99CK&bQJ%L3mQwF4}NU6eDQ$t#sE?W88nXHbDAT zy6wJ|?rD^W8X|ow-P8Zd0j6)Idxq03+8{34aL*KB@~x!Sx}4Nam|iKD&9~A$n_!-L zWY6J!A?!g26D#Fx7i@I}!X+q(hjGycUCc}I<_LIp$pQobWAsUD3App%piIC^z|9-K zLiqeXj;zqfk!_Pa(C*{Nwo^IeXy`dBE95PB4yA4e)DN9VAEQq)Z*LgC}sf-rSS(7j3BLBcV+pRiwXHy*FX zmwX(V#mAAwDTXMfz{inw6J?q{j-N*&s)Sd7n>T)i=V3mMO!_#o=f-pD7Cw&bd76Rt zn>W}Cg0Bqsabz!2Rps>3Xq*;R9vBt zBRffHhWj|O0Re}P<85dP8>CSk!N-xkDk4Voab&NF$Ps)T+0R7z1wM}K^}T51NIs72 z=OTmM$C3Tw9-iLr6w3!3ValJQ zz;_*W~R zze1*8^X3iq=0iM~_i~};mHXld!`|t1qZ9b0dZIO?B9I1M0 zFP~oA$FUa(@KCNCrr_iF18dmk47Mk4>xd;L^wwd zK}jT|saNbu<)^^F7?1N!-p7$$uTYmp^l@Y>m1lVz`8d*34mBkl zHSlp91eB1*!z1}PvKy4|BR+5)v?o=VJOAj?gpZ@PT4Jcu0kF145TxbW4Q;Ie<^3GB z8=r>=o%3_l)={Ct&v65uC^;u$x_N`@($>F&=2a|&%6&e9p|w(?;SP`5RskRG@QBv{gBVA4c+|FwIPUQH zA=F1*=4i*w8`M2*=QcpR#}Tz2!BWlY@Tlz(-Lg15YHhNom9#WzI*|(mlS(&*+C|9f z;iz?pKI5tlDqq_hK~3Jv%5fnJ=Er^7r^Iy^+NVV_=nwYo!ezzxil8Ef`92X+8Ls}& zJ|i2z&kShy3wn?Z_^cS}dlb>SgCh88y!eZ1)4KamxywlfxSZ5wmy>Yf{Q|U8Zy>=U z?WxMoP%FQ0_M1B*zj+}1kmm_r~RXV=G^AA9|=I-ZBF~KfY{vTv}Xmdz->N-h)8WtHVr%OcvJ@%vP$IVG2q2{X_R_aVAfZf||bmATekWozBl zvUU7Qm6B^Hhy6;GlErs%n0cj2$+Zt4TyUjI$r36iccn_nQo@V4QiXC;Bp*`j3Mn^@ z0uRIQ@b3^N)aN8^YH&&DEI{KHLBA{v+H(2Z+=eT>l-Z=Vz5RK-6lyL!=5SRY_d2Yn z9jj(Ma)2OEzmdtWLBL+Vty=7bIIvLwyKbwdtGYO-Nr0ZXwOUpr?krU1P|HVYuccra z9KSu+8aO06@FqHH!ju>Ajwm!^0*!)l8HtQA+c_rwAeR_s3OJ9h<6a0$xc-Imy!s+u z`GkBm;(dG9egx!?j5WJ1=T~`LyNrjOboa_qzV9`*ImTC$uAD2nc{AbRp-?&B`w3p` zG!JEM=PzxJ@tK9PwrqzfKSugQm=0^J$xOMG6esX;tmekQn@O!g_n$k)KawjNSI~Fx z*jp4T`1n8J6;AoW_nU?DB>VaH&2ZLmqu+kfP)3dZglu#*ycFg0u4>w6!{m~Kv`ykz zyHzyftq#Y;V)C$rO}u#z?)^~W99`6c)_=yEoTwGz-C%~qa}7728`lVAO>oc{7&KVPobc9^$L2vB@$1D>+|Ij3)HaI*huHC{)jqm+(p_-s3${-phwYFM(fa z`+k_O48|KB;yRqKiCSV*qkP^*{g%&`eoKh#_oJfUr-A-U#+W0E)^Jk!o&qD4 zJocY7vCo~to)kpmtl7Y6=1D;_K>rQ_c&e3HrNP_veK{Ti<44V!tARj{n4{zQ?D={J zX22eJQ_1k@cE{weqiwK`uIu1$Hu)DmCe*IBSMZJ~J|^OwC%-TU1+Ue^3qjyOBLGg& zCC2<0Vq7*=V+e6cl0)J9E22gILJ}Ejb4;EOYc2Oo*obS>9m>D*3aPSxe+_Stx)?-& z+xmH<-!f|yZ`Kr>7UPq*R__Yonq=j7B6?f(uB$(s3+)mZ_}x7|BK@~+CDP!n{hh$T zkz1=l4FbY9HpYFoI;MOMZL-Wf?!b#4PEn{$HUEOwP@!FQzr#wV)Ny%NHFiwh!SzZx zz|N^=yQd2EHSP$S=Ho7tWF!-uhab;S?ot#g)cH#|4WZ!ayx=>9APo*TLzZkpdJfFk z1%%$I2ts8u_;fU5zj8o$INq%YF8B2Vj%oV~s@(|wh^YhLR#bW9*LWLMuG)jL+F#x} zBX?D%a*z)S*veF)#KKe+2z~q3sk=mB-3nDgFHmqfNkp3V-$#UWWXpQ%NpmBeey&y+K|+cfk?!A+I}cy7W7B4kbQzKKC{3a2 z#PA6YTu#$;l;#B7b06~O_ApGYg4HV_r>7;rBvLZ1;y9s@H?j{*0h z$#A*^RCo+f5{e^_0r%xHiaZ8p%9W8W?#AS153Cm1gvY?O;Jh>K9s?d9?ebADc?|Hl zyv5(+mvQ7VFtfm8z*GFBC|Y<7kP<*7vE(n2Nw~+rZ;_nz2LcrH-c$OjEQ=bE z_ZaX5NIQ+jk;lMH=`r95HjvAv@ECA8$w)WT^c(P0kUz-#{OpNhKt@S1r1i*YfOfc*Z^@ zlat@TpYTjuWJzk~xDkuV`we);of28dZ(t@7Hu()`t7v&dC%NCiA{fkxkas034=x{9my_>BB>-aC2@Ik8=X29P|+y5`ZA?AOl0pE4m zFVMi80pE3S8qj@LgXbAQ|xKKBb%i|L+mV8SqEtZe1F+ zco`J|)wgNDA9d{-4uM(bhj^euimt{F4EV2D!_bFjtYMfq{$LH~4fqGBpVEMTke*Eg z{-YES27C?|27C^c2K)h}$Q$rIH-JiW4Kl6o-ujyW_Wm62`q_@rKIF|=-+g|C3LwRr z?ban$`8Xgxjs}zA+M9 zXnprxBqN4f-+kj`RDt!~S1sWd>$`7)QcpXJ{0m2XHHx_ZCU1TBO_GSrTi<t&@4ndzAK~HFcVE4d;$vjBzWW-KOL?PA>$`7`vXlez)^{9pPB@Z{bkBM# z6fYbh13gV|et{8lU&`9{(|t=iZjJ1~#gPv8WpXA^1Y~eZ>u}E(Kxd)ZomKul%5ynW z_${U#hf*>YZQ(x-cMGh}7PC9EnBCd9DI6(wvpcI6P}A(r#tVM}^GYK&fl4p9(uhqI z17$V4vs!A5`-rsx((KOcW_LD?5)ogMW_LFII~-t|-Pw$%c-Xwsh|LsXGP_f2T~6vI zF1?~uHnTgMO)$@|@sk^ug|J~GObn1SOE5zfVu~LH@i5Hp0fZ^Ol$a^K-(r#k@B|3Y zK{!|70Y_OE!soZLdkU@Wo^81iw%#P<*-qtfD?7bCI@f~tu(Er0P*dEvn8$XLkjG|a z_w1&k2*J|I?%AX8LCjm(J#AEku(DI)vX8+CD}+&LW%rC=W%uke3l7#*j9FCdxFe?3W@DRl+NPmAwn$ zVODmJw6c4idx_>J$|QY~=XsiNb}PH*1;Iv!TiHD?QdMPM>_4nlc8|@1LRe}gotBUsrzuZoBft?ZuH zMC1rocF)g5`2|*X&+8YVkt12zJwF#2>{fQqFJ|)eb}PH*mt+SXc9W3j*O&3cb}PH* zH=>ity z-E-O;$Nc`w;W zNjTnj!RPyj6)|V7Yvgft!=>3tWT8x*=2+gk;T za3lCop)pu6RhuzbfSl&r8u%Rznohl;b=2}22CZEH?Y3b-Ke+vds?+v9f)=`*RHn;G zjqvV(b@p|PC=9a|YbnY1%{Jr>vt|=4hFJl!7-j{)YM2!ei(ys(tcFj-o7-j_!_n8pxwCC!9O3$Z&${f$Ydj3U( zb2QTADE}?OZlIVcPHCuhPHyDm=%{E1+&M)Imd#M>tP{YTq1HK-%Hf9Ef3sHjt|LH& zJEu{#-Ug^@KTCBvrJ>e2(^l0iS(PI|shqP%A$|Fa__-ayfYX^X)H)kQN=HQg})H)Y$=P=V!>%8_>gbOUS&Lvb#&Qj}K zN{A7bTFOn4e1^kPOSx$nco>%2`w=GG=cF}iuru^3Ko`A^IBp*y9k4j=UqPC=Z=c5P z6j1Ds_qDM8039BA&yy>H}DD z&Z0_X0>^~WHh~v0p%w%ROT_pn(5Xz|qOQRviE!j2>)-;?Z zhM8zHO=itFdVofOzpYByB0%>Xa7^4>iI&m6ex10U1`7z<^QYgr*_U%|x?8mA&$3N- z+uC%u*(Pp;;@c4#@(IEwdG|CvTBYMYwEW6zuaGaZ_%!W$HRI5MapJK4z0?R?T{5n% z9T(Z$P6TV*cVJxGeuwfIQdww5*MVFI@8{Y}BSwJDbbgxya9;bsI9OxI^d8#@)rIm| zuF%xF{#wq=2>XaX+H+K%_LktSQ%v`#972vR%$7|58gYm=~v zz9PB|fH;jS!_EmD1+NHNVB=sO9uUvl#?ehLg92|LlIC2X&4GSkOSxOK>}Ou)sCT50uREq|p!6IP$v0;>;OcpS(@Bw2lGO{))E^f43$sIdA_5{e_M z54&7Ok=3WxZuRjzaKFeVtUh!DZ!OLE{0lXTd?ao_>Qh@_^(iVo zBZ?MQ9}-GM5=;IPnS@(?s$swspA?n)$htpDTThM1TYZWGq%8rQtUk5U z>QfZFNhGFoqAn*Xhii#2=(K221rZH0kkzL)XZ6W}$?8*^v-%WO5~(6JS$zmhR-YV@ zTYX+aRn#?8Bo|$jtse7?Xb89Z{0E+Ciz2#LExMQAb>JniW8aj?$?7u$MtTy_B=a`M zEibu}eY9xYSn@L%rIFRAHgEO0j&yU<>azzaNCJ>@Uae{MaZcPQ^3rKh6G~PeXALDs zcCz|-zJo->;du6Sj!AjTPSHb@UztR+Nt_7v4uF^ek+vRRh9_`2X`z`k{J7_xzZc1Q z0R<;L?;?(*D31G31VmUEL7mDi>m80y{n5>?!*qSW7NUK7Hn#2Fb|Drb_sP9zmNo&D zID&-;Ru%Jg?#@Yvk#OWQpFA0VyM=Sgk15sv>?=OrMU`lR`HGJvz~y;NNKS*F>pXxI z%-QW)N3S$=IJ+r~Es(?gSv>q1r7?Pd>#INu%HD!2@aSD2-CHQB<=r4u8N&8=gAmZ; z9^gsF0YGamtqh)-q5+dB5#EW5dnG)x1ZWySd*B2E$ZYD5 zI%$@}{T3c5nj;t5_G^|byBe?m{xiV7J+v%>1`my@_w&=wdmJvmA_^1lGT)865V+~y zRnGT@P+0JHoO3vFDpx?lSss4V25>=FP)7K8M91z{yjoAhRLGc8OANUOxGH5t&=SEb zsge<+c?7tUENQfakITV%@-Y%Tk%RYaXg6!VNJdN+>2XhrzDpK0PDV}3=iy~lOZY7R zy6qcw-%RfvbWKo}LfZ(tl^?Hr-2h)*SB*k1yn_-Hc*N-L*y(Uhl8C%Sq84v;nJPi^ z{q+7d^Y!(v>B^;im=~cqeK)-*Pv4F*XDf#}@m=L#*WR|_CcGI6a}8py!&R@m&SS3e z<8@a%ck?#|yBd@mcoP=;*AZPhTyvBy9B?galNskLALTVI^UHU)yRKHAENBLe>b#T!-sg30W^7^Bk_6-3n-;SA@Glvad0}e5W~zUap+MQc89!?>iv9 z?c(hRquB?FXMqaYCB%e^^g)Z16ADKmJkxSpjjZ!KOzls)Y!+RU|I8+}c1kD$} zgKdK9=e%SRrZ6V??hV@=YO#O>U3+4fcAGe?M8HP7K&D&phD%CUDq!PW{9UYjIyUTb zsAU2+k(VYwwQKjzji^3wm=E(b*Dl;hq6S51hA1S~8jU&B3Xx+LFGPSU1*p-5 z+h~A#T%x8{?d9dnb*3ZP%V#~PmCaDTxX zHjVg2!MqW_Xbi`JFya@D|1ob?)5VUW*&I$r{Gw(KP6l}+zWXoM3Z^-LaHw5EjFt;zk)oPU5a^ znteHR5|nCpf5HkaDYSn2D)G8LB>g;oOTUgErHo#u%YPi+F%X?C)=%F>u1#0(-GyuJ z@QSr@&mtY+-FoQQS1q7U*RE^mzB}J|s-BiA@j@5h1S%cYPnR%NuAr&wns%z7ggv851>-!wOX_SZ>BCVgk>GyL0+OUG|7xv9K#KX)b4jubu zim(serq&iYshdU4>6FT5{q)TynEN<>a(G?naKC5`EBP; zV7zouGw_mk|1BE07&l(J>4|X2yM&FXI{?56q~~+L(hqd8a3WU{`IX8;VljB5^)n`95&UK$U8;k z#9T&)|1N=+$vF_e6U%?Mz~8idF%JJdBI&F=Or-skNZSaG8s#|o^h(}`xvo8%KMr9N z!*MT>12Dsw{<2tmI*ns~tn~+%;FWpp5jw%(0o1%J5gjPA+w;)Vi z63kWLU2{|rj{Wx&_A7sg6!d}-GG6)(7nV^SYd*#;PBBC=1;$H%H&LcEUbaa4@zUQf2lKgJkSdi)>M;NFkMnU`TbNwh|7!qmqd1ltna6Lc@0jgPYlJ&Vt^-$7Q8~m!FcH+6&xktQ{yD1A>*Zq z4RN8He?Y*$p%nj`@Ha@KO2$hU-}mPburxWy>s_IhyUjy!#^u7(qqyF z2S)?^zxWYP|B~XuRs9ei1!jIp;tClrCAP&z-v8^9Jn^7LlV_c%z~TRmC>X{|H&ssK z#0MCwB^6GwW|;ElDDYi}JBu)VdHlQJB}5S_X+&TPbC>IzMWQ-j;T?{RY{OxOilkrjv>YKmh!Fz%(bI{)s-AM%Hfbjgh zWQYG>MO;r%lFaY+@=-k;6t&Q}{QhlT;4=`o_U&00-Mtehd;D*Ud@x?Rsd{QJpI$It z7CGMn0^F2~5^+paI@}JZ6LVpk@zVd!e;`BE50T*8psewl|1!ld*x!65h9WR!{F2Ca zfnUjiZc(VMv>|BSL0~Sb`WGlv35=B@#~$q8HuATo`xnZX5Bs@52)0L24*wzv|A?O# zypCQg@4sB3=D=8)2jZ?|q9=#{3gs0Zcbmga4@A+tlfcEB2E;^&^jS8i*i zSDg7*NcbJRRKWs1Bw?M3!~>s!4*zu$jw8Z+et%dIQ}r%09S&vsKOz&|qxj)eMz3i1 zU$0P?$XMwIE84Ifd$G-!?;MLO6&E*Jz*y;~ryOcZIBJR=?n*!jX*@jA5n=xg%AXML zOCsT;z~g9dg-h(Wy_M8JVy7E-;q{}NaEG+FN`O>sF2t*Ny`u$}6}t)V7!iWjK<*~I zV+F)lTmk;-y-0*gi+vOtCqh9-1=Z}WCYy>cNX8ZfcX=oB9hA3*Ak++V2j#65kY+L8 z9NtNyoK3t|hj+3F#vmg=Y3=Y%5#enP_hgim!%>r?g6i?sJ%wt=Z9tTQ2}s&5X}1|e z`m!v(Lmz;lLYzGqOM5)cc>_ zJ){UiB3kM&;g3r=wZ|55L`G2gwurA2uG}8jl5)fAlq5f4HK2q+kdGL{F2dfVb8gl_ z7zB6=Y$bP6GJXaN09?Sofd||8aY>G3erXGh8!=#Pg^HY{X`1*8S^B2dJvWQuKd<~0 zy`%D{{{i<6qmCL(mYuk~-Jv`{$@%F<=((U&GXeZ~;}>Y$sR_h&c%5J5w+Nul>Rr55 zUwT8d3YF8QzQ{=gJ@FpcJoqs&(CwC;;;7Z*TvI^}AjR)bs1f|2*kfF+fFqHdQXZqM zuo%+0GyxDzVAbM~;I~EU_2P8jcSPhSOa*@EM~3;SI{Cb<`lfCCqTcTk4(P~Jk&}cn z_k*a28Y@|L_3|BUOZZ_P|NV%;s}E>o0VF-TQcOz>>@)lr{*UTZPqxcGW@*%^QV$E$^TTQp@8gP@z%CxA0479wKcX2#YLdAX=HJgAkLg7$vXeQ;eFo1Y^ofp* zU=AuCJ1CRG4CAhX9fTG^PIx7bkuG&V*3Ska%uSW`6NF-Y^4L^>u ziPwp|h325L8cL4rWDbJPLn(#6xlEbD0$vS1-k2Vh4vk&vz0A7=6GNNq(2Bj@1z3@s zcx2*nREfh2h>QMEDtACp0$wj=LQDL){Fh+Qvz+n@2bB`wrK8QF^q|Z>YDs`{RG6Iu`sXFBu&TMayy;ok!v?MUsM_GL482ZgI z9I?&T*1ZqHAp*0LjvOqH=va|i?r_q{(*_N$-)v^F+02rW`&w%6YZ=Y*ayym+l(UdF zg1lU;uNC>kVhk&-07BV+jv#aLSm#xK)cM@P%rd*g%r1HC^j&19Z?8a^FOM?6eYO?b zQTG2og6!S<&zTSUZ{Z*~3x;9N5uo3W&0>Mgk~}s`O$sP8xmLO0S|-~WCD{(L$Z9|> zvJ#hwtCUTaNvmWm1wmS)Wlqci>>Djf5jR#gUe1q;WV?9MaduMA^P6fAyKD*(=J-6N zQg8x-me`4Tc9&;~H6zUhTw7r-6I9M5D#zp(lkIIWS9PYdIKy73S=US}IFF23RA)PKmj9QHCuT4i2H4&`_#uUE`f(puDrowoM${jCym!o2q!$29TEDa2(H zbB4>wms`P#&)5GFd;d%A{V%g;GYQ4Adi?hn^+L%iFDp^kE!@kKA5dEVitKI6ld;#{ zB_D#8Iq$dkusBb;G~gvBX>rzvG5;SJ>YQx&-b0;}C3F1Sq;O1OE)a-GP;8PMdSjgr zBu(Zd-7=H2mz$hDAUJ!_!kP!V`-oEXX9&>;>g1Z~91F)yA^(X=h5-g2ux#L&M>4%(l~Jy`452^05oK zph}Ec4vqjc@ll0XPYjvH8VwdPb7aySU_@qR;m{W>{NqHb;c`v}ID4T5{Xgt}^?`L3}asLd6C0Xrf>+k0c6K3Y$b-zgVSi*2k zycO$t>h$IN&KaiJ_hNIrOU$MBee}WF^igtN%e{~*&zy*r(Sk3Bmx3cK_|$O0&a8MX zWc~Ku`b{JjGJQK1O#GGR#u?Z$fdwmKK7vTgLXiQJ!3u^dcsv+bh3qIMBK54&$`-3E z?XXetXgk@`mYkE6m^x$aRD6-0ir>fhnCQ6x8q4>)kjm_6D5N*pwh<=1t;00!CI8~n z-riwTNR#ZCWEKlLtRsX%&4I(+ZlXxyw<99ON}lgeR6Eax-YgK)&Q9%KJGBp2I24F$ zW*`0&Va+5t$fx;PZRY)(cKL56vgA=jTXoBnFEQm3XfKG>jbW zg}No#U>|BJ6|;1VY>b?xcHzZ}-8_AbvlD)`oRpH%X&)+kM+7~=T8247T%-{^%>?ni zsN8EyLHXk;~q$JJC{f8h+n>>47)v(DS z2;1+6EC0<{)NndA39-~9SV)=FymC7&z8}`~|AtPjglCRNA!D+p$&c&=J2$iLwroOu zjh%>VNyg;LvAkr@)nj7htyE^CS+j9SVOhltLvYTZE z{O=_@lkTzUG065Z_|2HxMMLlM){2}iPI4M zOsTri5GYqFDLWSG;_U-u)ybRGa2}>(GN<=cYN2rk9U??oB9G8Q{ z*q9kCQjnEA3K@-cNNJ26c(nn}+Wm!Od*$CDOkzB^ppS5U!=Bw69S!=P-3_ffHg3~5 zZEm=!73Vvw5L=*u9CLW=w$_^(q8m3hw9dKY;@LQe5!=u<8_pg2-iEpLP4&%Yd3eJf zd>Xgo#10PWp<2A=7l)f$ckZaiQ3@X1v0)pYHU3NHN|xNV~M6{IE-)80|^$; z)!KkMC74Qwo7n=r{l*4%h_y88jhf!3`PFGklVH~BZ4qR?|L0HY9 z&4y;jrVX370~H)ImL8jr=n*x&?aNN4l`5?RMl>BsCFX1$Q0s!xV-dE1Kb%M#-#W|; z-m15GtG@A{wCX~~?)+rHsl()H=_!HNPj`Ba=Rd(Rx36_ki9}cK<1AQ!-27N1v#_9XW|74$W`S;(T+xI<)ZU>d9 z!8&=j)!GXAH^}=h!$#B|VZng`BxKn#j)q<2v*DmuSDt5@^U2;&Ur!(IgG!U%oTn0w zD4MSucI>f6o`(h4X!!z5-=*KQt##x13*Q0HIecw3zCVU@feoS4$+l*^XFkEkfEF?A z5=VmEO~S@(H6KCaqN9TUfceE75cK!p$PQhvfRLC4IDCR<_~A%yCZJ*>VK^le@t853 zvEk9=aRMrM9MZP#+}O5lw!H!3`g73+>Mx$)LWP%YNx4w}eSTQ(6 zJW`7}??uaKroP?-lKq)O>FbEAlPhl3JP#U8Es4au)>H=klhKblEr4HxUDop*&2zN9 zyV)Ru~w4b`jD1N7&Qp_I(d^>`m*eA)3en$Wp8(-OoPHo6*O*QVI2g6;alU2DYg4 zs?>#*Q5K^5T2LJeu{dwp@MiU~AxahIjS5nu9z>(EXjGK73=Iv1n__Wx=|fG2k|{&S zyiGMFbzS|85>We;O4g@Nt3crk)kT%+bwPD;5WnBWQni59;0hWl^8-|-{Jky^T{Co; z-Iz(ALNouMP79u5E$wWX==@-7_EaD18A|o=uGdo6lR!&Fbg+*l1|*o{_tazQ4iuY7 z$5~DE*fF5Jse&*QWetg#u3jt=kyINh)cGSKq9XC_y-C)NeqSC)vIe!WLR}c>Y2BL0 zq!ax>+{G2@j6fpM)JlLpuqp{?ejw2kXM;m5pzS~MDBBTX=|m)vWer0KwW+FUUmA3g zV0}?mGk{VT1%|XX)}|Go47c8rP69EFJWj{oAY$3`>Z0I~ww2XuV@`&*#dH>mMcFwv z7*(eP(rP_$XZ|@B6T#zb0Kj9cU!4_5#wD=Zn6p<0En5EdSf26tzJi6RkzMn%vsx9t zmFz4H>lE<`#@S&V(#Aff1Ap3%qgutu@Yb7IG=|xs16b$(TDW=ZGIoqDOf)8%LXG%s zT;9k!LyasMYFrU&>Q!e2G52EWJ{G3|89LnBj^SXvnwOo7u-*j!suu@=y#VWG-56+m z0FJRhg2m-CL?Qm1WwA7UdJwKvw+ADTochx0#$bdsqz|k06>C{6*$7-x{9i!bdQ^|U z{7|^5MQsX%n-0ZTZxqc~9iBr%Rx4}3EMQ%ca5$2}luPx8oAyOBgX$%Lme!csT*p&(1xV1~LOzzps04&a!c_Ad@~iqfke>m7QGrW)&1>ne`1n*PHt zq|=yLHJGdFHGxBix*uvi)~U{@V4Z-mPp}ru)ezE$jvb4Fc|_y=YBQ2O)WmASP30|5DAv zCdOL2w?;Dq14avYhdQkk$PKF(gB9@4T=N0J3wsVPZ%3O`AiK2sp@2HSgjFS4dpp$D zp!!7xccR745wEd)SYukfrAph!(43Qqh-0$NEe6x?1ve~*oWZ#0b@D$Ey=-!VRi@1E zCS(%ZvfnV0EI>dUW8a7ygVt@u;Y}%qnadPyDe{XfLgs>KdBi%6LN?um6%MN!Uz@Q< zpcR&{#ss5%1J-L=@&4nqlZ}b4U~`^}vdD4F6V{hvO=?4BR&A*2X^utJ89^?3lgqK{ z`2G2DAq9-#64wYaQ9)WeUPj(byuV%9$Mwzn<}Em&ED)HJR)D9xaATKfOjHVF3Bf}m zY5i{@76g<-(e11zt}Y*&8R$&heF((-feJPz^La3kS-~V0pYFuncNs%NzdtdwH)af^ zn(u7KRH`*Vk)b4e>CX%+ND|ksDa!AFM%B@Ceq_EU8Hr770S@yL?g;osr#I%YVfNHc zG&vlRl(u<0NCfdjBKQ0&dS9x<+OapmqJu>%-qO4!tTqNY#4!4>21eO^&qSMJtXA)1 z$=2?K<&l%mn2V{$O(^oc#rF#$A1ik3w3FZ7U+5;V0FCzI%qd!sD39y+znh>5e%|7S zN$pZt$-SPLzHSj%SkA8n$&V>lnyO6$82dz;(LZOx)T@K~;yLuIEnTX$u=-?-%|U5e(UH{98Yadm1yU0I3uP@YX`B}ZBK7~pAjHZ4B}d#A@x zo68_htM%9d1hjTqt9@9iQ36kg%;E#_3Cof?yYwMVr$l~+b*h4=K~|KdHk3hGLgny} z)&{i}-mev~TzXREkFZVS%T7uU`#~>U}31kxSfiGi0 z6+-4iiA22b8!teNVtqWdZWspTN+jCpkNn3$MknI<6HBHcj6g`_|D$--wUH)?fR=gu zX@+=E{F3H93GSLS)VeaQ^+9dyNxokLM5}o4PJLhYbYC{Zdd{KWQ-bJNPhTA6q}cDC z);icx&AW=lOvsDu8P=bMxD?JpHeyXOi#opolG;?rmgWyiP^Xrt)2i~I+*1&x=^6Iq z)7teY{sXK&O~nE4jn)?M6cBl1*dNseAQ)%VD+Bl#ztPqo)n=Vk*9KGA{(J<#L+z1x zxEJcWy+<_fvyo)jU?1yYJw}4{X4yG|)p88?^z{yf*F?hcNOFx9Y)gX@W-07kZ>n7n zC-uH;NY5g*J^+Dxa$rq@af+-9tU*s^2e1{Z3v{iCqsEIX*aD2+06V9Cq6(2SMPz6V zH^D>VcI{Q6Td8E zU?6%^hgejPf$C9Ez5h{NPleb}^tsd;YV)DQP)a`$M}t`{%EKRIr$;Qei-Yu#VBs`= zDT;$BN$9xVo&Vb#O2-L;3_a}6EH#Lzsq9=IvS5VHu|S+>rf7Wiw7R$giqpz&RC*Xm z5C)JQs7QR@cg=M))|e0D>Q&BoJ_K?uBX${3}#9O6R-#TDXy*vuwQ*m+lh^3@MJ8d zA18kBk${fPleR{ks%X>B>ezpruf*txC90E3sK^Hki;SYkX^K{NRx3V|WT!wBvxBGA zc>!#9gV?@q2+*z}6iS1mghD;kl9iRbJ;6{k#-oTMVJGy_0NUNB-K5S?w3?GNy=Mfl ztDv-$Ac$R25*&rC4q^YL&KSdt)Ic1nYjt6To?=NzC%tSSbWEpx0QmGJ6`1Iq$JEt< zAw1}8QeSEynqp_5=13=qJI>>L4_pxy;CCMO%tlJBgJvWU(bX%1#1iqTgI*mKmmExJ z#dmaOvFxzt^l(CtV9$?=R)qDv5e%E5M|x8rq404%9>Hu+61RvR(<8JizapsX2Ids> zyHhJ7hM_Je{;aD@1K6bUrz-;8nrD^fZ`(?29{cCIAR8L$W1X)KMbHFd5BwK9$G%sg z5J~gtR79o~~!2;?p)|bpO z-G~fhqN** z><5i+^`k58t7GTbaVQKhxdx6|KBx3s*0O~ReBx5ptm|Nsn)eMh(2v4SsWX8WDXyzz2#hq?#T0=EH0?v@I-(L1_d_fmCxEnNRE5PtcbqsV|r( zjr8dr(t<}IUa`5m@>ASkAH;l ze~N1?L_&;b2GT33BPT^)$uNoN5HqAhsV!3}U^9s9`9T>Xtxk09*88Hdniu zM87fY4s)!~+(upd#wXgepJ}Wfnq@g&xlt=S(#@X3B!C7R(+O19gHM9>>ml?d8jbd( zfesQ8SnaEzg`Yvgyz)V{$BA)0R3I(!pa5lrk5)P)Vu9U7qwEd|+u(CYJ~fchON zDzljpQ}luO!Vog3!i;)tfa#$K6%-4xLHxyc8QK%#C=RhG9z%_TP$MF}*0B^q?;xHa z45a$d98SkzB1jcO5%_EkePJVnHi*2&DI?1Jg>@(t=|Qh}Kf|%mY8J+JWHO*^LGHVn zgHbM8w>;QK_4iX7X>!!C?X>q|#&5A+W?6)O<00xE`T~PQYADnQrO`Ei#^TAY`W{WK z>(m(~U|dL%!I$^X{E4blgVe8x8l@(LV^|D;ZF)ot`43?LpXXWcHIGn}Kz40QwUP&E zLxTuv7+6yZt3&*8W;|wo?qmjiKrU|~6|I|CFFK(HgsM@DBKt5T)ab3DIW+M@A??{) zmukn=lZ5Xs47PfSOxFi&9Nr4?p&Q-A9&8oYccfV&N+i~>47|GanD)h6mTGT0S^bdq z$fzTS_Cga)yFgfAXp)nny9XcAt3v;aHLQk(F~#UnE29NU+jAt9Jd;ZP7SDj5A`4SL z6q3!50Fq}Imc+MDBZ^`ppgg3&--hJr_z=`k#cUl((Nu22V4GPZF@X&BudRJ?8vYui z$I!~_*|NSgY35l7+qZ#Kx3NFHcL0b>cgC^TF<2m)O&D7HL9LjT8(j&kRfo=DVb8{( z^QNUV8y`9cKD_@Z)VHgEkLb|6L#@lynN`_TB-MohsAey+F0e^j(jcd%?n*_M^@1#- z@l+@oK}D={8H>dl)8U4mFi~(hm{z!fOiWtQD(}-ewqOowj~rM9RXYTWP&}^Qr3C&D`y73p+KtZNTM1Ru*emwv_8v;^ePdyX@#{&o+LE zJ%fJ7SWC7w5&|QEnljYegMN3i+9;c?&aHr2kF}gyu^Jn(d%n#2P7j3N`V~qK#a?F9 zC?Aj#WuL|Vus$#p?Hh_1p~lc+c6kEDVvXv72kbDDqE^#Dro=zO%kY1ILNJF| zQ^8Gj{AZA*q*`dU|52^Do?>a{!RQ0W3j9E>i?K|1HlJ!ptExYYZthF45I9PZb`WSe z$SDXpJQw01YJ?d*(i5^kM+N-@{+}Z$UOWy9@I>b*tt}O$vqtfF^G8O?Tqe{SghmJ- z#QYJ+n>m^`f;A~@pRmT5sN{{$qw=_XOk>0P1lU9TM=(=jL4brl^s%NBTq=Ur>{38! zL)QR1@#H`@l>+EQCrsreE4Gv90w`8s}JJF)E++5X*$&KCC zBHLQHf_Qx1A2fcyS*oq zfpKa*i_mlGYPhQi%@s|l&@z;Ty+U+rDx~R9>l8l=bp>`IL8|w3XAFA)Y$`2Y97EJTKB-y{}NB~S{G0SQL z=Td42TT^hH7UFe4?aWHVq`K6r5iVh$V~DzrqMl~UQY3VOefF}39wUZHwjmJ1rW@MC zx{`U(MykFp5dIf!>lSSiJ8C4_v5PeHE@<`HKmSt-n*0SpUIGXxkm~Q&dx3bp>zl{* z@YC28Q`x~T))2#RY5SpNWIMEqwjs#T9j&}G$B6EL0TJi{K|uL43)I1LAsmQ5o;rj- z*hO!Nl7~b0@l*oqR9q`-18bz+Kdm#^d}B#kmJ2gzG_aPoXQ_y+w)LPkmX)VCm8A?U z=mGX|_As;raAHG#ZQfC|39H>h55YKGo>DKPQd7Vs{&3Z7UEn3QKMl4@Lz;@jzj-=2 zfPXqEKY`*V)_80PQqi6OcEfep4YPw0ijNP;l~CJv65RbDcp%dO#F9u0()!e6aBND% zVlP9!fCYE(99kPOvdI}QV#es|2LnTCuvdx42*mgrw4Dr)6EzPMIoO5;covLCjPw!c z%IsA{>}$@60)mgR7O2@MMs330ga&an+EuSMkHxBDHl}eER#xgsOW?b(cPG-?-lIqfm4%V*obeN4GMq%d z4M!C!0s;z6Tv6Wj>a?-w7;S_wK`~2bSEw^9`a!5v*>_R31-3 z0#+A8!hsE;tY_%))CxXK;EJI*7TE8zIRDZ19U)_IGgJ#h2DHG*=sRjNcE$lV8lAyj z2m-LSZ%Yb&W(%;M5NKIQXUig_%?Ssf+X5tD7~Sg1fO;wDL)*_*{Xz&(na8y)OSNjY zD)#G#6G>tlO(CuHNH?)g@Xck(SHVAm=>ceppo5n)ER8rK=L9B_@zuk`EFj<21_f5L zEJ`|I->M|m{}y(xE6Uf)bVAoQ9?@#fLg8@mVRD@y*2sT*AduE#oS^K0&t|y^2foe2p7{39nXIN{J4d}c#XYrJLEg5QJsifYR)UH{o zEx>NE0lFgZgP#NbpjrgtvD9<^N{rxYF+eaN+@V#}r<;%v#11?|5lVkn3;LQCeEDI_ z>z+hrC=rgpWrTdg+7npq8i&sC)cb=dA2tq1f1Q~jZEro8))7t;Yaz6vQ+$H_k*BT0 z0C5(3y;?sOlb&cOGKlWyr(4sh`DnV{h_6@L>IgEMDGI- zbh_9L><~CHWJVT^V6Nde(MgMIlBPL)YPvApW|y#s%1i=>_GH>Z$1$ok>R z^Oh~oYADQYfHj#u_6l0p`K@f^eP&(zt!(mtFi)_s>9YQj;Ew@k!|@x|_Nif*QO{~S z)eQ>Pnj<%Y%4rlDqw3{BGX4@rg<}jJFxMwl*v2NTYwcS!-&t)vjm{)?WKAwNwk9Jd zy_v*}|MLlUL^}*+T`vgmt!!5&`OBwu>`$N_hsvgbYa#)t~?Ih7)T0~gCIWgK9SMzngn_f-xg`mgK!-aw!2XVXfn&!CO9GMF{%1)}6sXgatgGvW3-Rh?btr%}&7@)oBp&<#z2Q$;zx)==iG!~W! zDuV27O#(Om1gF{+LJ$5)$j-F*O_h7*vUTM~p_(;%8V|nSP6(pM^neeoB zGaO8-)Ml8B(Jm?UWrr}f>@MgrLF#OvJ*>{Eq{IlNSqt?foA@qtL0`wyDRlrH;bQh_ z79)#y5UT16$@dd8pXPbP+Swf8z9$|e8VIM+g;U(>Zl2o2_z?^e~wUg8Y@pc+sVEPo%((VoDj5U1fXk=P@`cu zz;X^BirvlN%w)c;U|UF`MjD_7*4GCa94h({xImxw@ugaT)eo}X)ES-iw0E-0SYr}X zjvOjabe zyMa?!Yp~GB8oH1~^SuFoOK>HW(HIywgE)iz_!z1V!aH|={SPS7DK!$nS~+k!nPhud zJYjql>|t0!v`{2F^Humu|M%mA_TntTXHuu3D*Y-fdzPt1bM9-g)M@LK!!jR~Qw}q( zeMl>RFr{my;JxbgRq;PySm+D)W<4T_^)K*8C$j!>#MUELU30IyXX5fvasc|mZVnEh=?%= zWyV9RvxA0_A|8Vnh#&A_FKdEF6BMuQhx=)j>&GS!Q)GD+tu3@MB&tba_ZsgYr46(lj2 zZ)dL_iR#dHu)feaSiXATD8drjt~PD|Np0*|lpTU49mrEJtxzwkg!YLDZvcfu@WNz3 z#&Aeo>Bn|W`?$Ii9>?qsn3FT87hF`Pk`*i?;c|c-4mFBOZswItK!yzWg`qsdGQkWm zkjBOhqYHg4{e`~)bg*EXfe?ioCA?AlXq#4l5_M=xw`d=vQqNl;DT$CdNQL&wLN7zx zvJm^IKn`ovR<>ykyuc+}v`bN7cH{!7J;*BBD2qd@WhG{TLHG?77AVkEh^G(=j8O~q zHRK-E-WZGZh4g0rtcBaO8N5v^wrKOrPQor>NA>$E;tc3*fjOj&d`Jn4`t~V z?z!bz?USRPJw?dHe0*H|fj?YjR{P9;wMEhXI1089I!F*?J%i@wI4B*{1`H#KT_+sh zj7Ta%+Bc|3KLDSEea~vXXZs0oWuR|BKcwsXuxm{r4`y2xI1AQIqDjbgu&4AUwIX%0 z0#(8);t7cxSqNJpIIU^=5t8h#XaBbDJ3OX6qwB}PT3|Baye0d30-Pj~;x>n4cvPoV z<`U}bv#cYHAqZnB!H)kR{n?K7W;|P(Jxz-NS)nid+laLCTb0p|i+UnBdqhLi5@)l% zhXpbFxh%XXk3&$I8T=fc*c{?9SUG~3OkAA-r=ZH?U3n06V%Q#6bmqwf3SyGJr_p+& z?Oh626>NhbJqOvdoI@BUJ>?RHAkTw8z*4hQT|)`)SPLgYPPdSg7DAv$VWkN=2O z8BusWBv}H7))Mef#VQD4Usn7)Ou<}d37y)uRXE+W6pj*@GqXuajqK5A4}$9+PZky7TUTH&mq|#eCH2ftB^Y)>@lqB#EKGHWgFoA2$D|4vcUTt^rgeenDwT-0gH7qiS9|(lWvIv-7@+au z0axO4iRQaI+0S)783tkqXWTCUgg%go>Bormr&4r~ zFARqskTPU292PSmh|_q@2x>8G^~XYm40R)Tb(Uv?2PaNv22-?i@T|h~9P{~bufdk6 z4P&y|-aa_<0rzay!^c50^bE7@?8;v9Jn!!%Ppuc&(D96+pMViU&%jY|D5F2ZDmpOn zFt6ZmXh6|;W431_$++ID!$eLB>x4J+NkuV$Q^_f6*%Jv2LN?y8EM9$FE3+h z&Hsk3wXI@(EmCV`OBu{}Q%W((X|vJ*UzL~PHiH&N+0!ig%hX!11(+qK2Qq6| z!)oM2HQ))C!=L|UHieA!h5->0QyI#0EVZDMB+J0I1N{Rz%nwmA=p$0_+|fB0#+9qy z&=%A)FlQ=iT}3abD4d{XUmg^Ruy@ zM0@{%gW5Rp&);8@&Dy%@M7>)|hEdERTV_T!5Z)tecaE}ByWEovBbA_O*$IdgP zO*je@A9ReyR%02V?@#Gex_uB#cR{cp{sSQ>%NGYi4DDRi)Js7%G9IlCGr74-82 zPlaMBZ6}#$p2em)rCr;mUB>3?dp}192L1q50M4mK*=5*%V~FF7gsLdptTsc4$C*Ls zto;Z32YcfESvHHUfSm!Zu;dH^z`%!EuH^YTkD?e@ri7RSE^v1r$SQWu6 zSTgwobVnD45ehv577WNdo2itxuZhBN`1lnNF7{b(RfGQ^f&sPX_ z|KK>uLft9&W@G-G_k$MMKXaQ~&pma#rK!KCiyWtBRM8lw5m--+E)2xG6RltZfxd-@ zL13^!tJBJ0fI){@C`yy^vxn1%w$g47!uvosPD9gWBQM~@k?OeR{Kw%64ouk(X^nhd z&_Rcewrp=3egM!sxdQQEJG$2?Be-Yi@+SdawX@h;{gfTBp zN0Bf+x?s44_ddH}u6juj$9|e|?B}fUDHa;gI~w6?SOOCatll^}!c&q35pxUf;?w;9 zW_(JAeY&nfM^vpW1nWpUIr5{B?J^cdvo3XhfYM+Q1^>E#E)E4DjsL9Cx?pbWvY7E% zET=V*p6If4Dw>L>6S2fOb{Fm^&~84djXpbfD^jG5#yCr+)TzZ!8%>=9%ULFgjxHw; z)IbcX+P0{u^9S73?;TfC=!ZSqO7XFOpW?~EoT#;Fi?*jTQ7ldKgPAB?wbl958&=Z__v9hg+0+T2?<(d-2mP z9qb|QGyymjp}$uV&Ae&c%%StsGe-^4LJn#nP>~5D+aOl*z0l+yO*RdzfPmUHNS7=S z$jjOwETs~AqwR3HI>kb0KFb=1GK+CqAko?ifBrdTtfQr=gLo!7)zAZX6HHzVJl3t( zh;7!kQftC}@PfmS)((d#S$84qE-;SHSe%>|pnCQ{V|1Vl++#41h6V!!IFODXgFi%w ze03X0|1z(V8c+#=kkmTrd2CZy=tj99e-`CgIqPoDtp5W)BzlCZq?0~DChnWXWttVSYxT}iy9BDUh*fpH5@iUv~ zxc%&9?%+2Lf)Y!VxpSv`cdY`7s+6eyYCLVU$GS;gE;(z=>4(6Iiwxj{o5J~gy#r!g zmgJ{yT9D$n7NwIuWZfb2aZ?l*TJ+(6jgD)lussW7@oa(rL(~}R3u|NQb>c=K)v$K+ zmX>G}=KA=0c0~-6dm9;GUk34bIZ}mD5rea!9_zy- zZ5;a5Bj=#MP0>aMengj6z>R{^>dUD}N{opU!$~V!hMru81(m52L#h{J6~KX1)p5mz zj~mA#UgtJ^0Epry-vo39lzmVvX1ZAVHum|1R73W&SvqGE5~ z|NoqO=AIjZufFg1{k{v6=lMU+b9z6woC`5cJGkR=Ygz$sUUbow8!YfXCQ zW?h1tgLqc8%^Q7=n2LDaJM%9q=Ju(_(noJte2d;w@BBb|j=l@IUNVnwr;V$ z{GHPGGuzwOg~B5t;nV22vEi~2yky5vKAXQNNSK3ykIuBp9c(LJ@xkqOAi zc^589YkYL$UOjjHeHeGwqa(#8!?Vw0;Yej|?m~PaWA5TbH96eE!J8}6oL8elwDuNk zy;`^}HQJW{_&exQrOeCE<|}f+=a5h}?c3d8?PP^b+6LzOf9?9${N4BFIDEBU z^27avRj4vuzN`BK-gwSi=fCk~x~5uw0s(oQZcG}+&Gg{)bbc$syv&YQ*7E}q-kWDn zOB;R*3$WQ+_jrHazUmH^Jv2Y?2hVJ2gAL!scVChZK1i{o3FW<0tG5<&N3lchc zvvXdKUS=s?%);olbOmmzU-hQO-x`k(6@5K^`EzB<(wLay72G~MF5uh8 zcz_qrfS@D7gOUaQx`G|vz>;Fd_y_Q}6P6Wd5qo#QE_Umw9q{TX_IK9jbj5e~IG*Uf z%ka!(7fkJz>Ao{`$AX5gSXi}h$?tZ?@4tVgM{emcZd{jte=m9&%qXx5nS*x<@C_bB z4sVlVn;K7N4WEPg&!Qu+sKWC-IM=V$U}RuxZ}ab~%>UPR+H4sTR>=Ra>S`Fm@A}Y0 zv-tg?Mj`e1kM}*u5T*UV>K#{ZspS`Ob8;t;!jQ7K-r?T8PPt?K^fvUwX?_du0j zznV{IV$!0I89!cQs)MhL^~qt}!DpUwrH>VC=jX{ZX`` z?$~_6OC)F?r_5V5?^*17+>ITu^_c6Nj2FYoI-X?yu69u=to5Q(mf;C-tb59LYCXE+ z+|{i|?x4HjoeK_`AMw@V!PKEQ~nLi z3+_6X4@SP@>FSSX;#NN144sl&x`4sq4G|lF@k<=Q|AN#yEXbDTmVQ-JgT3$hcqfLD z+ka@Mo+7N2@2ASQVVGuHeuw3&x#aQ1<1bX{}3k&dtwViFfE0&s)WJrJp;S zZxSzQt-Ic{v|#(=W}H;J8V^$N>8bU2U85jZJ%9C;1?kxZdpxsxUfI$SGp)X7OM2`L zwF$jAxCN6^?!m$Y!`}$LU_N(!L7UkHQ>*7)QBa5H#h;m%c49GKLDYj%K2(DpX}ml&v9@-@>ZSM`!+hM5sqCB! z@OUzlxgO60Ur>;oU9k5v|8JWi-+oV^Wy^k-S?T|5w(m1#SEJ&e#OeH;Pw@aZzAdtP z)k*UAWcgcyzw=g=uE+DRC96yDJP&qzP!F-6ylC~()!*V_MC^i;UXk|%FH`@9C)?7K zk0V}eHeQrnjZH&*GX;%$^=iBaxdQF*fStbTwybXWS@UYXSb)}yG2>tJ_`2G*U0ZkS zyu5bvnt9J+`*bPBnZ;!LbQr$;qz&A>oZ0&I)_C|*AG2z~Cs?}U1~J~##dhcntR^-a z@)aJTA;iCeBzEtM@qF;t8(R0<361JHIA-GlEx7Dl-M-*EY_2^kH~>5vCo7TrI(G6r-8wYG#1PB8MQMxH=MH^)%E7qN9~07clBFojH_n^PW8#F z`AL^6^cgiX=_$I>^qN38H!qy?+$t-LSxg%EV$)kRk<#0R>o)5(YyBrb3 zcgGm%<%o)2w&oT_)!T)0;8Ge&*x6ob8FTQU$$`Gg?+gb zGiCi1dIt74Ch{4td$y6ITp zxPE$WADII0bTs*U z&{$603C!3071Uy^Xnj?A=d6CmPu35&{ zj*=bL;B^{~nA_>u3zj~MJ;uK1C-9Omy{lb}=k~tBhD6^s6f-=a2=tXKV3!$iBIg@#QAm9>bTh@NG=|c;D{# z{dkYB1Nss?lV<;vkdr@UOG~j*$hE$r6^2gqZQXSl7p1tdQ_^ZZ*6+x%-~8Y43SENl znHCk7snS)BZpF@5ogG{)c8ATW^C!!ys7!U-SP@TmS9PMgIO?CbF3M zW8H|f^ZInsDifr;R5CzdVO`_wF5gjY7_EnAJ-0yT5-6=J=3?t(HrSA?%; zoQ%&X|D%nI(eHdFq{pyJ_fT++|hnW{A@m2F7Xp{qwm*?NPzWm(iFI{=^#*#Q7- zeyasFr@p~AUoRAS!msAJ32>QTd2(GD1X}B1aB%CQ9c|*+ur(h5Z*ghKh~$^1Zq0{x ztc+v+i^|x!RT`6@rOUZReYl=E{-n}rZ_XpY;}j>Y;)1fvSDR1LE7I5U`FVL-yU)q3 z58_jF{Erc6|6O=@uP>@zzm79z%$SMK?RLjUknz42`?DT=q3mFMxo_9Sr4#311~vm9 zWx*Hl@vFrrFZ9uT{scFj@LGmm&!-`3-kgID75nbXt|-X(cn;jJ75uEZBY^{B5cywm zwenh>rQ0Yq3pKSPQ-q5LMhpk--&SAHdcgLDR(?6;eOr*f0D1csc-aM`~ckWq=*rq)&b*8`AW#YaO7L_<2%~p zFopviTlzuyJCK*PAa8q<(ucGl?+tlN{v;rG{n-p#VO%MH5b}~1rW{b3py?&FYm0=4=7Kc%4-&7Pms z=P@GI4bwpRkqhwQ;TGiOkn;c+YtOK0UvZ1lgU|(7`LG#<7cvKV@D%me-mdgbj=N)L z6nNHck2{rK(1KeVmp2wGJ+_6o9B_})hqoaA6XYpJZo^p$`BL;HHjXxbtbXzXN^d}+ zTfI$#)t|CN=}TJB+ca)is`Q>t8V4bbHVtaI(*JVeWaTe!MSk-NrH^*}vSGaSC=QZw z}EO}&gqXS{SnH+rp>ykcv9)OllOyAX4cL9&ni8?g*cZ#r}Sfv+~&_t z&nvywkq?y`VEQ!Hfv=%2aKf_TeD|`_0~~i&e&j1kAJu|92YGc1^0y&x-Ul+=&me!o zvA1cz?^UHIIdZqWc7F}|;^=G|&xHI$Ck?iaSU+EVQ|YFyl);dwKrooHLL zeyMkre%Y~i%lh^AP@Ycw*q*F^OWs#{u%ol`pCKRW$ZeViuT}aur(Fz~p)O?KXXA1C zI^=7!cv!a!)+@a07}hJ>rnc5^zJnjn#L=x1QX7s=0orPnE86+z)o@D*c}Zy*sX0e{Y5SgBIMi6j!F}dHBUIbYJ1P zvGUzMSNh8qz4o z-qCUI)+vU)d*4ERztfHocS)Pgs}~0r>b6cEvwhLsyF&`~k&eH|27NGfokkT#`e*Cc zaU%=wep2G7V6WT^0MJ|ys1zxbL4LOWWKxveU}#M-4{0(>P!pr z3G)l}TP@_*k+&7g_F;=uGljD=aNF5bn?+H(|wl~ z>d`I4v1wVMe$OVPUZ1d8_WyGdJJ@q&0&=cPl>eWtO zTlY4uH~d(r|K^12=EGpG2#?^0>9B5X*neqVq4&Ma{-X@rMS6%cRy8k|IbRp)R~`4( zUDdZm`Xfhf<81Tk*zb$2%y!zb^Q(NT(gSjl<`VyJMvt zhizEv3u5{jCtut$Ijbn9JMOS$p4u>H?-bKjPCK{q&7EUxN&s_U1ItJN5}lIey-a)riV7u*?1hfZ%j{i^2Ew-f!y6Qv3_;iFQ$)o?A>r? zLASn{&iYrse@y?^(b>E|<$##J#gW^*x9)y{{tZWO{*ytsQzPjKXR%|_jH=>FvB7%t^+K;F%fTfesH5lsjEVj0lQFz9Y@+}JX(Zr4Ho zo}+i;@z@bDeTJj6ejeR3rjK*-#+^Sh%nN(P^wCb9TfGhQu_I%8XUDxQ6S`el4!$mh*k2m7f9mzK(xZe)BOgeXC<{<3FHpOz-E|+dQ%EYWl@=x#P~tAAvmE zg8b0_Ez56){42-arhm?WSY&_8&GS13#`Gx1jg9j+kZ*G2&EvdbP)wii=xtcFgSQ^m zxkI91*>wI3@~a%bti1BrmgV0CsL&HqK8&?xw}91H+Ds z>Dm_D+z0t7PMNxHwjUAGmpX22dai9IxAER*WK2Ke*xPtp{kza-oqpfeZ|m>qv9ZXW ziFE0qc)sAkY65+M}9wpZRL6BeMj%sqkiQr=hGdKZ_Ul_6)}CC6DMnQ_MD`E>Ah9%bc;@v+F>nU(K%Qf!O+3iPLJEAqaOk7>dG%OO9r1^Koo$Miuh$h$$_ z=*XE540j>qm5$t&DRqUX#5AU|TcoWWN-`&bc5rc&3}e<0d#IyHf}{VvBsJ-z zZd+hpSlz#%yTlDA80Q$y3ANFF*1Gu=a(Dc3{W~qaWqNJ=euB<*XXOnOV>;o)!OCCU zio9gfmi;K>yL2n^A$74W_QPpE3-ado*C>At@;)uZXUF=Op4Ni=63E@UX5)WgLu`wE zWBOkY`TQ3A**+6(b2h&-kYDN4f9Chr>i(ywJqpUNhWt4v&#Zrm zb7Fd-Be!EnX^w#LmkZU)sL{`96r89T#l=Sa)B~jp@yfJ1hU>ikNQg#KFq{b7f5bJmjp?>d{B8Mtc01Zu`z_1Q z>dPL9>7=u_V(X&~@2aO_dM_uxY#u)V`Du=vZQQzP|8z|M-O*Y36OixZ#L>#%d?woO zwA2*R}F?^Ac)^U-w++hQ{MAvh+52D+L zUX1COUwKj(DL56wZ=HcBR#`JBDf7ETQJnq;V_x(SP z=~G)p{bK%5ci+aC-qpzmD}N61pB*{#hxX5W64QM4&z6zBe{A(_K8@-BIC{4)qWf<@ zkFFD1iZ|mhVIR-qBSTj^abVt1z5#N#9oc?}y3Lznc%>wapY`j&uVVT~$1f}2XLC#! zIeBBlIOuEaVK{P@S$x>&_>f^E279@NrgTk1s;U_0L3>TxV$`zJ zmZg5iPt?WJ4NZQcA(`?TGg&_l|AH5S;>oIPyfKwcXR5r$L^e?$uTH1xs=Q3PsxH;w z)nzh`UMAkxWN>r8SDj5wMxFiAz^1UF) zcwM^5_iQ?tL~3(QUOdiImg8}HbV4@mr|6S;09qmsvBWgp)EGyCYy4WTu`1ywyhe)i zIcjqY?;xT;8sdqns;p!sawN=~s?^kIIi<4MOx8vk@gE>*iWFt&K9ZD(jU=HVQIFEg zW@_TX;Xr5>BS}N9-pi(ZsWX7pbv4mgG^JRwemc`o<}qzdDB_LSmKoCB!yB^k%2Z9d z!K+V9jVF>xl%&_J=CB(0sj0p^_02@b%e)}V{IrjfqqlTklg;EBy`VT7ePq;@6{|Yo z*QQYOpp_^kvRMz$zs8Mex}gz)QCZy>Pi7jb5znSLYlN3*N~Y6s#zlflHRR%cePg^K zQr?fWh@O%2LBx1t zRc_1r%upqo5*os&OC_pJT&gpcV?#?Y~%Abg<>sK6-thLo4gWwY@x3gQ?} zaw!Qns0+5>Z2pvbQn`bQftcb!SW{2gYcl>*GTAD(O0Y^H5_}-mHVhP8zRK3K0_PKH zgE3j}Npym+A{|25Qi25J+YuRd+VZ|flko@bR6J%8q?3~XrL3ycS@fCIl*3W~Y&J1% z1agX6UK(Y$mN>i@R_Zq-c*DxquGYVM`lJ=V@X*8@SenjGE2LV!KK)RtOXn`!M zMhQ;*9e|OAKB4Cz2||i^HDzR3E{qrAppV;G>Xm1ch)58NEz=PRAz$a*dYtb~^3N&9IZh-q z^^KVZRuHCm>zznEo@>Z8rK-v}M%6KKxk}a+HU{=Q(qFXHH8ks=`RqTMU45g}HM+*Y zD}!7<)`_}AwjQk;ePtLsScVa2mt?FMX&bfDW&;YNl|)!xP0E)Rg>fm_Qa3LNz=vT> zJWL+Yv?+yVLnfbhThAX!|Nk;4B4cVW)+0zh?jDTuel~$#iBZYt5_<*|+o+7me>65v z268*6h}4KICJy2pSz#E7D!ND?^CjUWry8VVa;r^#ij~Ctj58XvR!pbzIT9AiAE{0M z=gN~!)n_ntNQClP;#8b4TG6@^$(1nOEu=W~VatS>dd`}QJ_GLu{NEdcna=&MQ&Nk; zW*WL1l#H8{E#mom8YpMtm}2t<3N!u4$ErG;N>!zsCYdRWaFP6^i|QsBaNd(F(UI7=^*@Cd1FbqTgYUP9&30_dN@{Rt{3oi ztJ!0+B8(dGNc`w8>1e~toi;w@@q7K{U2E5t_#oq#B0a?L@^tA*!iRAnKH2CM>8Xa- zq!$Pu+7e%A^on$r;WgGil%?3M-b4I=Xu=}m^$q|-Y^ZHdnlnXgD^7+#ZZyIa(jcsr5#igbI!YtjR;_2tHa z_#lz_iu4e}YtpZU57S2cjnOO8?+mX=AKN49FY)6d^A+inhS#LO>>0Hs{#9hYB5k!7 z^}Z(UTpYC}-bG}-BHhjKn)IqJQCs4xMdmBgYYneSr|uiIC7vcS)L+mu4X;U8qmy;> zjChU6d`0?};WgJU$b3b* zyWutI?xj&%;ypy>E7H9TuSri6J}hJ6xX~-pgyA*mb;5_X#Mc|WBE8Y@n)FxULtA36 zjPdf7P{ZripgRg5+7h=ndPUmN@S5~>;X_;EH;i79t}(nO?bj`u55)aN<}1>HhS#L? zgb)2Co^SMu^cKTw(rye55eP}G+ADUtb#^cllz z(mjVpZBZk)I+x?yL~h$8K1^i3B0b#jnzTyzFm1o(?*mY}{u2K~WWFMO$nf%}%|Dv? zOU$qMu?>+fF}x<-rP-W-cvq33e*oRx@S4Si|bhyMlv_()` zjjze;(3W@!e#~FeM+`4dpq(aRgto+S6Rsjn7+#ZJrlNU9{AZE*iu7{BYtr#MMs0~t z5*g+@pr;sKlRn%&YD@fx$b3b*%)Zv}dz6Puxpnz9K!+@S1ce7HDoh5DycXuSka*UX%V<9 zigdc+HR*+?M{S8O5}B_^FE+d;y=i9DmiT6o`HFPD;Wg=L7e#G}<08Xa1TLTd`0@M;Wg=tcSmiBUlN(GNMA9$ChfNt`V89NYjSbr0*_`+7iDfGGCFdHM}PMX+_kQ_-B#%iu6~*Ytql2iP{o>E;3({ zZZfNye9q2 zo>5!k%SGlZ(m96Lq$lnbwIv=eGGCFNY9bmHkzTjEI~!&(ot-te0AsL4@V;-f|8E7D^OuSvf=KWa<-mB@TW`nBOT z=`A-$ZHX6(408g|+YGNsKYJl+OZ>UW&{uHLGEw!{lW<}1>LhS#KHadXD) z&xpr~%vYophS#Krmqu-gOGM@?(lWzq(stdVw!}M%%vYox46jK~>>jlx9xpQV)u1OE zUX#8cd{}pgUo?6}`m*6QX}m|&U*ZWO^A%~O;Wg<4!iWA6|HJ4N=|hIsq}Lr0^_Td1 zk@<@BM#F2;Sv{k+#21UqSEQF3UXvc&D{4!8h{$|JdYIugsn6{iFU8djlxL zUM8vGHECbrLw||;iOg4|0}QW8&m9=`mw39!d_{V`;WcR&Y|^-O9Wy}>TMZHi(gMTF zZQ28c592_5kkM~(zi?JFTjGlYThdDnFK_L=Cw%BH@%u)vNIx*VCfyN{a^p*kshGr< zw4>oQ=~&@Ie~HH#y&|nJye7r)67iS#Gox3e7*ZI9CVdvg&cIg$B_^k0V8q=S%w zt}XFkk>Q>&=&^>^q<>LSTjF3(N0H7Ey{}21EsEL_KPNK80rX#n*Q9G>QCs22cdd zZHb4A%vYo%4X;TvZKAfsjUw|EY1Z(X^fBSX_!2*E^osOJ!)wy++eiH+?jbT?k@hsa zCjG1Mp})kp8@(dE)9{+~y0%e&iLVzK`bp3m4X;V>-63jAe4ogCMS8#CHR&(HhjAeO z)#w#zt9JAY^GVRpg%53s|7-M$^b5ml(#9R5aUecjWWFM8GQ1|eNcR3he~D+A{Xj)} ziQzS=*)t4niQh1KMY_iDnsj1^XdH+qi45~!(0apb(qDxS{Uzq>9@3|h8eWrLFMMcA ze1p*|(whvgNvH1=jRWy{BEx-C&>4o;q%R5|`b+$h(JRtd46jMY?i}@(c$~;E*8r_B zye55E_|RYCM~q&PE;GC)-KlfbU*erb<}1?9hS#L?g%ABDUSRZ!bfMuj=^?Ub8`=^d zYW8szX;;H*()GfJw!|BZUXgAzye2(ik7#^}PZXK2NKZ1nCVf!&&|l(*j9!sGYuqImw0=T`HFN0!)wyP!iWA64>5X0I@Iu*^flo_TjJM^UXiXgye1vGS2Pa9!$gMt zU(n%(*QECfANostpV2GQ`wg#2_brb4OT3@Rd_{VI;Wg=U;X{8tTo}rvU65kH5^eECN4X;UG z6h5>ie#z(+=_`iUq6!iToRHyFJly~*&J^l{-sTjD2- zUXea!cum@^Sy>Qw7n!d}k1)I@y-N7dU*fBcUXfmFcuhKA_|TSkfzd0{g@)Ip4+GRD>7e^_BXsHypJYS58}$9XZRf5M0U65nm~igdBzaTYkn*kE5y?2yKb?G3x|Hx}V`SX_fGyEpf`|6={v(HR-*=hqlD` z8NDLC-|(9BGvPy9;?Ip)+6p_;03eDbl+Q zuSrKpJqm4qE6)};%U|MqO#Um<`wXv1_mMma{UzSl`R zH@qf&O!&~2_;I6Gq)!@NlfEE)XiNN}(JRuI4X;VRXtvfP{!(O^Pl9eXye3^QYq`*0 z;teA673oI9YtoNpeHPjhZ!~K*Mfz{UYtoNo%@x`buQTf~MY_T8n)Jy|(Yj9jl*sT* z8R#>H*QASO%@z7fe2-a&Dbo84uSx4=9TnOVH<-1RB5gFhCjCJ8(3bc^qgSNs46jMg z+%+0s;G!gh3*$@t zgIV7x(w_{kN%xVpQD{rNugH8wy1(Hy>B!<}9EeAW%vYpi46jL(U81(cRU-2hX|>@s z>AZcTw#4&A<}1=$46jMwJ|JpK{EoDSqk9$F+=t9WL-gZLzl`sy( zl_JC36ST_k@-@&x74?_6NMybu)rQxk56jpQ`b+$X8BY}HGQ(@qYh*qc+7e$YGGCEi zZ+K05b1WJM;&~#&`T}%;;WgOye7R&`oYka_|K+qRHT<1UXzx}UQcL?YPHpR#xIb#^Bv;T zMCL2f35J)iZcGtA^p|+5(JRt346jLj8Jj~};+z?;73mbiYtkiBKSNvMhfSSTq&#_q z?Sgcn)T7Xr_*PT56zN|LuSvfbKD7O8+B^(3bc%lXgXV zyWutI8fmAYE%BSC?JCl@4X;UGm2`%-#IKpOE7CU%uSwsOb{g6ezh&C4B7Mj3nzVQG zeCXOVt=>;mdR_5ysG+r%!?#mX*+#Ex172S3+JC^X!+gB`-L{6S81$m`1$+-ZkBj#$Wk%L|42#pN1+Up9$%js*P9Uoz7Ie zwhAsS^13GdOtuNZ88R^mCA>`3r;`XS1JCfMtN3mFsl*32y5gm5d=LOi^EN3y?9fny zkDvq)$7t~l&^(rxQmtuaWi~b0TFM6w0*%DZDv(>2t-~wNzx&z^mZ%h{%~+YAr*wA! zOa}88b-eb$4}~UnLt)1iN-?m#PyysB#oup!{WU}XYGGFkyFjCf9KM#qnDb?)jG~eLi~04UpMz z86W;m#P1gyzds{>Sh+Pq#&D^(_BG(qfs1Sn?AE{z6Un@uc8H3&wRW3ew~78Ce$+F4 z)@~Yj#uWpTH(`#_6VNkb5}UtlxIQG-ZYu1i!fq2C1sCo3I~PA|*LbbcjfmVG9Fl{J zdB^Jl{H$H)A7Z-m8NqjvMH{B)(!h>+&y%oEM9lLh0YX>{) zhwI-80A?%0?FhS$uzLwS>j5viVVa-DkLjS@I@qmi!9UtQ@7QgG-A33wL5IOb8~$F$ z&-%A=uGTBtBmWKxj6jM5_H9sx&v4f+)%u;IlsEl$#@bxP0bL8~1mn@}ZUz)wR`&_8 z<*Az0Pk9qqh{0ub-vL{ms*MAXjzae76EgcO?M2M~^heYm*0fe$ zTkm751f~AJp!PgS`uANkeE||?&swCu4HFt%biXt3TGWRU$Xa2<#)H&eyDPM;h>3dx zt7Tz+4FtwH%9<^a`cc3;1A_=Y8H{%9CjuYwV@$K~|CVib`g;xU1o{HshF7&;DO?~Nvv&}qj0`S^Ee=TsoE74xy0qy6}zX!GM7wGRI zUa^g4Pr~>ZuIAbyJYm~Ha-ZQ^r6`~`6P6}CQf_I{-Pm(cyT&Y-~bbOfG&@Y${z zpJL!^&(rz((z}`cK;Yu@wS51V<#$RmeHz$)H=gx@b5;Ajc;Xze{Z2gbdBEL~UX!1l zGt|Mm0grI-e!ydZQ61rbXRnkFgNy$4X@-XZ zuS9&tz=rV|4Sb^G{zTwY9RE|m6C8aOxDnXq-!$MV$Noa#S_jVsu5<7LVEbKbrvF~r z2j8(K<_?6t82`tBr^CHX-*dp{IhZT>nU4Q&0?%^v>wzzJ@E5?BIQSRfOC7u|3aZ^h zVSm>F_%i5WCi%NJ@Pv=s>)Ap3KNNV=#`bxA8Sre!z8~Jlu@k_w=yUoP!0o!j{6aNR;et((xOJMt*X5ycL?KhZ-3lXo5$ZwOs zoxHZd{W@)z&(Ga~Cjfgd#U%dw1KW%BqYSth?rnWO3b@rL?eq0zIIse?<@YDx>9C(I z<=M%bK=(_uW;3aTK!L)xFc)Fus4?NSs-vHZ-{&7=dKJ>P|#DLed z>5xzV4!|pcIrC$DI|18o2Q$2VfbBPfi4O<9)d}xtVEgT0>W2Z};pk5SzT3f*fbVti znZOS?_%dMo&0+d?1Mo`d(bY@*xcg}5dtU1uy@#9OXMyc}w-vU3*EZ8{ZiZzh7R=x1 zUuSmI4n73f&aYeHkd%S5yoR9wI0r}vnBzL} z83E=@nfU4e&j|2c!1g?x_Q;PV)_tIVHozkT`~k2%N1gUx0WWak_cQP<4(1aXys(6m z@b@Ohc) z{s*|<>9zUrHdFr(%-2AezMp~D2JM0F+n6Pu_aO9iUkp6Raeo-FJrj=M_XD=yRwo_` zY`+aoTmfAC<5T(YPX!+8_%{i-5$geTg9xvUcP6ks!R$=;hX(p}z?+=<{a@g<@P9MPgZ_UHykjuG zBikf?su!1pR#<82j+D&evCh# zoLPtXnflk+I~~}b*F*PHf!Dx)HVek@eBiZCc$Wd&GpT5Q6|g7Io(_x%GJb6#x92d>zb?S*oceem zusz?B`ZD0pupZ?)leiD?*G_zg0^76Dsps9ajgEhDV0-Q`^**pSD=d$*fR%$U2Daw{ z(*8PNd-f^u?ZEczbK)h$!8x_WPXXKW=ZIefwr401zXx25@N9nY38muMwfXY>9+=l^ z{FtBHVN1oHF-rG40oyZbi4P`*d)vSC2DVo*n4!(^DZut@F1oL#e)|qGp0j)!fZI6r zeFiZ1bBzCOy-R@YnV)ojEpR`CU$WAa?_I$5Y+CA<0rOggAJg+vfO`aZJ+M8Oo%UY< zPj~vO?}6=EHq;klT(sxB6L$c%XG0So0Bp~2CGH7q&srcp7MNEJ`&-cQ!1nwZ>eImX z+#%u|u-)Hk?`>$_C*r3GmsFG5lu( ze0zZ34REW#ep7&Xe}ML_xP{h~&W|tcfEBPU|6PFXSxbyh7hro%4{=vu?YQp=Y|q!A zegH79$@nq6iU8LHI0bCa0jGTfusyGV_)K7XZXfZVf$dqm#5V);vi%$1@UdqWQ@;Xu zTPJ?60{`hArBiT2J)g?6=cy2X3T)4ECH@h(_f1M47}ytJVPMbUpuQt;8~AVg)4hOs z^~8_qEdzcrI18Ni{ekWI#Kgx3_NNEsQw_Ymq}AJ10M00B-O2w+6VQqhAkf&&FbWzXZ1D%MvSWJiNRd=f(%&b>c=u zTQfgqeclh)oB%$-$Qz-A4Ke@Wqn0FhVF5d;>Y}}1fKm(Omp9i^O-u@!+#I! z3)=Jkmp$W;{+|at|EY<2|Ncz-UFzhnGVN~!wr32|{&wnj?2sSt76VWFROv$`{5Iah zz`W)K04c*I%P<=g8J;4#1`7O@`#yf5ZUh_2uy@PSVH>VPM}-s;Z)KCD%t zJS{>0F9v?##<0H60p`VSgX}H%bMp$NkCyzvenX(=eHXH;@Tby=-z&hIg8gFVKi@{H za`c}A+jE;4KDXqzamI@_z!kyzobKBL+cUCgUkq%|W+pxy_}w9enooQa9|LU9<bz z__hBk`HCCyslZFoA8?<9m~X&MNBq1A+^a@^41DoCrH_>KqyGV}Jl32qM*C}l?fJ39 z3xMr;qQrLsPk-mOe188Ocs}q?&zSOg68OjkO7l(u?Oy@D@wUI_%Xb5?J*SWQ&w+Ve z6XZAF%$pB;Zu~I5ZGjJT=F6Rccl%uFFX4vn_o4mqcjf)>1*0=eAeq9j%djmW%uzxJT+=pd+-Uqhl zt}(oiflE-I?fCRHusv^!dS!0e$bD_P?*!c4u`dQ5^0tz*+-ZL(@U~8UI|BGtCw~S3 z+p}J2KN^^q89&gLfO|Rq*82JxFn&XTSLVX{btiO&SS z9P@EAJ|RDVd0m4a{aXlZ&rYQMJ%N65p#Nup?fCWzusuhW_HP5Pyg}(N#J-I@O?=?L zmF^Ybuc3be@wN3SW^U=_=M%dC+jH;e-~P??eFOYM5T7x?&p7^_0{jBf$F$IW4e(m% zy%N*EoDKZMTpfhpNxmNZ&A$uvpSZ6F`?=7MLI2Y`aDOB4&+p^;ngHJkY|s6q{ojEv z-K4ac|Dk>WuYADVpWu4%6<}U0cE;(W0B;P+|7+lVaCYw_qHp8<3cU8Vhw}NeJvO>Z z(7#~$CH>8w!1nxbhJOIC_t%H?bhKagM~4I3vx=$j4SXxc*AD{!hXKF!sM7dolce`# zV0*SV?Q4LKM*FhkTL##k3r_tMU|x27ngwjn$))~EV0*?o@vXqq?|3NRAKg#)!Tl)4 z_etRMpttFJ9oU}nO80Al?fJdLp8;P6ds~0L1-9oNQm=wrz{3y>^LuAtd*(Csdji|@ z+KCSWp8SB)8!*2iJ_?xkm#zOJfq5N(AN`91&vwG+)9OEMRQk{$Kc@kI>g-2c0Bp}_ zrT?>muXOTbA+S9IkNSIo=R<6C(g=|G^AF%TUl-|D zgYtPgu(#`p)xi7hh4U)|{b#_Rp?sbY|Jryz0NZn18D1gs$@@o`{#}T1S^o|K-ocp< z^Z|ZpaiRVK`?_>L3U~tQuXo@+5EEls_B?Rn_knp; z;>Ys;8rYsWO#RQm)8QYYC;n}NM{3UK6Vv+!;dKN)A9_I1?+$#&z?dAILiYy%f7dOR z-w!w(_ycGE@EG8qoc?w!@L5GM-4Xi;be{&^u2-SnF<76R1#Hifrv4&edoCsMRlxHR zpTUR_(|-%_`Uk`KEd}N^3O}az#Q1h_YryfA;2dk3Uw!}TWCKP_`bUe z^kLQH;C`T02c>(e&xZQcTE4D z25yV}98>>s|CRPj!t{L*xc^(=elxIw-qx2wdW`E7{1|?xVmv46==TGzcv9(jFn=op z9{XIO-WC%ShTj)hJNCnY*B8X}H9>os0Q}D-g*qAFCg5vtSNbMNUmNdS;0Mv(N<8D= zMZmM)DbnWz_E!TJ!+&q>_EKN&0)7Yc2bklQ>leR1ME$kl{gjo!yi9vU-%*VC1m`9* zz8?bfIut*q_uFFh=WzcL3V`*oRTsEDFD!2jY|rMV`%b{TZo-f5O9OmyfQQh%Gd~>* z+-`Zee{m|XJAGi7c5wJb;o%a6)J|FzO3%)`{;>U>_LXOa4~? zfBs{U{x;}OlEC&HYsM!FJQel`UhFRbKEv_va^Pp2^~X)XygtE?@wo^1EGN82f!jLc z#k0WnTx*8+7O=woPYgo{56|ZS&vfd?_rSaNE!6i1`Li9y(eIr8b64Q$PJFune~bN= z8zeq$yi(wPPJKBNcvc=<=_Wyj|?lQ-}6QJJ->$9rBza;R!aDQ`vCj#^0bA(LKS-^wWDt(+X`E?2K?ysT$ zgO2IH9=PASLS2S%i2nx6YchUx{|NAfy>QNXpnn{=<4uKnndmXT11HXj>4gD)5BLJq zcRL^a9GF)h{ODiNerR9Gr}O>YcEIbL_0t}}Lr`A^h&{%0U|zcg={XX3n;tRU4>HF0 zSl}fUICne1qk&I;vk+efHTp{6*-m|}1Lk$P%^%<^o&3Ed(DOM&#`k*QYoP~}`gI%d zd|*!*{2=h+s|)qlg(kemfCqa;dRUNOF9JW(FRbrx0`oc=Kl=Y);5A3Z^5e(%z=!T@ z&K_s_6cV=CsW0t;%cd0ScY^+8FW_$+eHk+X*Hie>|AD~s9}D}JKLMAm!1#{)Z1g`3 zJYrL!o*MXf2Jm)H|8XhZqdt1?>>}yE8h9oA+Z%qfz1;@f;R<`dx|4SwaHmm)`SJCi zz`WqS#OD>@mr#GY1oeF_@Q3iv=I|&B z5}(R_v zdT5c+cLTO(!qdOLz$+2os*NVUhXYR-j`oXv6qbJlaMQ9v{b&%MO5j^if9C|@*8^{I z^7Aa{Vl-TJLPvT@bfzt=`Vx!^)T?*6ASe= z!FuQ^V0S+CFW{4RE7G&HN#EPRypF<8+8=PgA!GH*%guftKl6E6$3i_E`yEXGp1_-( z_#XhQ-c|bLApSjoc`e3|{tX5G4)(S_p9cKUsWJU+V4nuAL4Qy#_SkO){=u=I2K*DS z?f)+T=5+#o^#7Uw-zNUySu^0`$Dh(qbT#F%40sUsGlz>ko~H}!ZGXN#z;-?N9q_r= z#q_~J{M5m4h^r@l46jpw*=-RY1ibExus=DH`ZrG1(?M7t1_AdO7t@ymGyg^cuXpS# zX^(3&e)KO3eDg73d7lm3i2FZD(YNs~1>Okvw!Pm#_g|v_MR_v3zXHF}J*K+__V)p2 zGBJH+P(L04Ua?D2zJFZ>>|?*#&PQGYo{soi|KA6GwKN=GJ_h!F26X%Z)HJv z1ze~&_wzae&xe0rqn7yX3;YT8M_?uQM~?zl&i$W}z-_T#u_5s9G~l~GjOp8g_Ff09 z9skb(-W}uJb%FgQz`SbkV}9NUe9rYse=QjIyMXz=A|UkJdbb0AgwV(^_d19!i%GFlUcvX$C=Gtac*yXV8v*h z?mVo#A|3}C6hX%g%&Yh=E>2aR+OY4Esmcq}3mt^BZ$G)EI(e zQ-1&QffYEQ+VQ_suTN*Z`Xo=IpO}$CzVz(d+P5siQuBAPh2@;pk94~>#tLuG4vPuqN@7kmH5v9mC zlz&CV_(+ZF)~%aIb5nm>G$}1D6O)FNpG-8u(^1L(Ro%)!2A1Ow%B?(;oRq>b@uLQM zD8VuDp@aM5EOqG0+59N-MwT7lKa|4_k82-;m)Cg|yLdvu$fg=%b0E8T5=Y$~77+}q zINtg^5=Xg9)bPqW;?>9l+EZCH6V%EO^zJ1m&ksJmA~VU$mHXMjr!+@{MrR%El4&=0O9JDQ8SwJq-r|MDdo6D)zTr8Y36EpK<)aY!V(wnjLlitwTr{Y(bP!bB?%h2I8q&$Upc@4U*BX=&=bBPkD?nY5 z!lrNXnF&Nq;u4Re%CQ7ZzZQ(s7)~GyL}(*k{MZqr2lO8iA3bD9`QVCpMgIXK26NPo zIu=XUDN>F)AD1fP`sNA(n?d78^&dHGpx0EJnG#Q--<}o}VY0d=PLKJ)jUal}7@?Z_ z^*eUNumJ<(WnD|WL?zmmD~QK21~+8Ti6#?1J{IEY(0GyK_+W=C?9Z;hY>;%$Xx{ZG zBUg=DEpdWdS1g||$>uP~m==;{&tMv>%v5rI3fYlDqhU|c)R={XYS)8oCgaD^-le6a zS(#bcIYWq#>3{6t_?XedMpejoTaG*!iNPyTlL|6MN^Q#2WLX?vMDc254pg71%3<^~ z-mrH=9Y7n1*NPv5(%Dqf7oX7JF(_4;s~M83 zt7GMCOjo%HsY_%0WHH$kdH5tsF3#>Q-jJz6Q}VMiEpi<>5yV)Pn3Rg+Qz|IiRD5!x zE|>Caaflka?*rp3*0G6=m)RjNPd5Di{XizQX8jOj|7-O=tjxGr$mQFUA z%tftgKp%yP(Jsbe3E}mSj^k$Q*R^?9{yh z$*PLX@kew=cq~LD%1_mx#RauD&M}5nJl>R;jONZfus^~I1S zy}g(avo?o|CN5i!n;ah(#A#q1##nq!$kf_NH|lQX(niXodp9;)aFJ-ps?4ZVa;g1dg!- zGY!@0np`#|^B)sV65VADCh452a~77!Vjj*CGhId4Ol9;#!%Nm?-7qnE$oiEj46BSy zmf^8(m)D~5oAxgipH*zw$T6eGRg}l8vEr!mg8nfqDQWMVD!JZsBu&*vB!0Fb**MJ= zp`SuBqV8(3fO2h^Bo4Re*RbAUzGDJ}#)SBmV`l7~Ff}4unh*JrsAg_Y* zVEa#Cy(mM|n4CYjDOr)}-`Hq+4vZ+N^kh3Gu}MjN;#!#5FP)t6*A$gxhw;nLF-Jw}U4wDxNrHZv z`67{Y^@v6=pqsd1Iub1Iq|2#gS&qwBK4T-jCPv;g`XM%rF<7G@<7{tkjJPD{V%Nzb znPZMa0b>LlinPYjs@cmhC)vv&f=$t37h`x;dNRjw)+^haU?4-@mL7pFAvxJPmhlpO zf3<03gH9MdZcy2P@fCxE;lj)^{47667L2CojNmDIXE#TJaf?$jP6*he#AW>Os_QbD zNO7V+XhKia=$RN{0cJ+xGGtodx(RIvdm1R1Om>=AKMf6Jikrcx*USMnQIl2Z;gT$+ zV6>VXjHV_o>{2-p8YD9$qAh)CWslF~>W7cjLM0!Q>*Y)1r>9b;+M z`$2*$l8xwE8!(|8Ser^tlICh6)s({8!tP!$FpRr0jM@3EjA$$ZFlFc|JZVBQMP=;G zWS|ipQ_3&(%2WOznfS@%KsHw}(g(vlYA_o>dRPM%`&-QKWW|R8can^el6H1H%=Ge9 zy-Zb@mC0HzD`f~Z%{bRomr6xCx%jZrNOl#b30T$0+LBcuQ(cva^vR6MxK!i7TG@9) zhsbHCpNW*EnFh#2qB@(3bQY*8N#8Lp^D2=E7}}B;+^5x7X6l^E!*Po%T+>m?v{yzi zJI%p*njK)KG1Y)Fa2pVJq8NP{_3hBf-9VH2CgglDVqj&F!OATDb3Q&q?ws(el8T2l9{R_XJwROQ017I z+6f9LKMAzZ=%P!O>dE?g))r1hM`p6Aawb$V0nMHboO^TC)pfb1+DLZgTU$`EO*YA5 zD!*Vb6U9c(^Q4I)0XZ%YFpEPPgZ9m`s7gnAC`4yauJL$|Lmqbr8zUK<&P4L1#H*O< z56skMP%N??Y^t#AP)cRUVAoOd)vjaAd`33o+$2f=kZNi~Z^Y6|%0!i0e#y|Pn^)bG zN=*s{C1wXDSddBI#tMMxb3TL84eXAbZOfn%a9GCr3p;1%4WwS6954atUsoqpehEtA!>=c6x?RiNZT`KXa&%4JN%o=7F4 zEnBWls70*$oU*fCj7!(ln%(CCnA?s^@nfGU+4&op!_<>mE%V4gLnAL)mzLpSU~NTa zC}s^C_aK2m3@uF-$AFKeH#n4xcLznO`*T{Z03o zbGpP5v&@h^BzVap8(3S8!K<2$D~xZcnfQd0o?zxJQ@C=3Gm@)b<~{ZZYy4U)!cdQb zF^w}4GxxwCDl(boDv@M$LA)ezD8zzI%ogj!~Q~s#@trUovD>5aN4$e#-PzyL% zN;1*xqP1B@#9A{VqBC#G*qvB*Fu`8_m=qSIm=JRQ>vR+0-5B-=UNr{AuoOyIfX!-+ znIlMsW-2Fgq9C8L4Mu0~c1j~sB*fV*&1=l5MCd{ai^8GA&O zUs!4oV1v8)7Ff6z<7~wA9L9}!h%l_m&dPW)NZ6LFXugIrC;DrphcbGtVmAc<83)&bIiO5e?Hp2Zey*`O;oqc{6>Ha_VkmyS& ztZ4`3a9_sk%V5TaS}zMM(?EkwZfAk&q0g?!V9sVnHl!GNRaYHU9A|r{mU~kTO}ydL zY}^k^B;W6{8D`A5ZkF@d$z-x*wBZy1Jq&LYnf*qSGg7_G>_UdMW^;vRLtRM_Ls_3l zH!jO98H$iiDelQsPvLaSEo#~2ktH%LBwsKJaXvOERcC6c**Og-lojL03=Xz0Ogg16 zLo4(uMq(cf_Z67b5t%7yj;zX@?=WrEEwnWsTVRn^I%JsA(+3l$9+sXkoG<7RrJ zJO7ZKUDkjGY_Pi?m?#EC$@MMR%;ZQIVUe<9Wh=*O0)H{B3KNKW=$Dq1)CYSaL2HPV zmup>LkNbFajUL8NZb!r`29A-*4p)6a?O@7Ki<|FjnAuW1j!$`;LB|`xZ7z1T^=Pr~ zlni}su!o6?D6@ME6b>$VEeUrDp84h1u|XE;-(7=i_Keh zdzo3%{~}6^Ks2Vf;fPL${Q-i({Ml5#u<+nWmf=CS%O&Rj)7H84rV#`|cz=Y1G#oE%}YdZ;D+ESs)i;@o^0FpwV;goBLExvo$R$SK0MC!5% z8x@AD_hA|AqICiYbU&Fn$-Q5zs*78HOtRJtXYsc>~%F2$Z8-w3-A z^B-V8c2Ytc)VD{P$2Gdf_D7H4#{~jUCPub5h>oN$?+ArIm?d%b(5=xsE~PqPjVZdp zJ-hi1$m!u!9mH3t{?MEnhg{!?4!FS4Pe>g;hyjq}(8-%kS zwM1QpX379N?<-d~^Nx$Z8|jVL;1NSwCLTU+S#q^YQiR-*qwXncj|v++*+#pF8evYy z!jHC3FKVU$3eDBc`Qt2Sv#W@YiL~){YI*r(u^9_6ImHTXtS+IYjm4a;QW1ja#Pvg}V#CpZX0X-i~%PJ!{kPO}V5ORupLwo;bJw2I7(=Uf#!69p?nCyS<8iPso(3 z=KbMlxX)@G^>?Aze4CNUG*7}1$GWR<)grt98U6{wOf z=}mbKP>_$x{D}IBI-agUd``WF6pqfdSxTCm%O_(ftz5P>6h%rXe!1IfFCuElI!CSU zD9V(ur9bBYb}rP(6oW-d)#T>t^z-Qnchc?_?P2-0`FS#buc&q)SniT)tRhkoA(5sT zmU)68@ou}7&G4|jo6B97#}h503k_GRV%0f~hB3%)0|Mj@KFkLf&c;habrB_TgxJ|X D)@F_p literal 0 HcmV?d00001 diff --git a/omc/plat/iptrans/lib/libiptrans.a b/omc/plat/iptrans/lib/libiptrans.a new file mode 100644 index 0000000000000000000000000000000000000000..ca2bd86c573ca2127a9608db69aef9ff3e702d53 GIT binary patch literal 220956 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

9xv4cwLah=(r8|Y)?M~q^-6_N9P7w`v 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Ν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 literal 0 HcmV?d00001 diff --git a/omc/plat/iptrans/obj/comfunc.o b/omc/plat/iptrans/obj/comfunc.o new file mode 100644 index 0000000000000000000000000000000000000000..9fd17b41024f9a771b16c8c384c88b14d0cf484e GIT binary patch literal 9320 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 ZJwz2Bdj4>kE2aNCj{miyDz$X|{{mI5zI^}y literal 0 HcmV?d00001 diff --git a/omc/plat/iptrans/obj/daemon.o b/omc/plat/iptrans/obj/daemon.o new file mode 100644 index 0000000000000000000000000000000000000000..877f990db35cf7ac69a4fe6bc19bdd289764ea90 GIT binary patch literal 6656 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 literal 0 HcmV?d00001 diff --git a/omc/plat/iptrans/obj/errorlog.o b/omc/plat/iptrans/obj/errorlog.o new file mode 100644 index 0000000000000000000000000000000000000000..4f683b3ccbafc6c5d8a27584c740d886772b0f65 GIT binary patch literal 12104 zcmdT~eQ;dWb-!OvFs zoO91vJzb>akLHi$&g{GA{_gLbd+xpG-gn=X_V;eP$!A$glBKRwGbKTldZ=SY?jf;9 zEm4crTjBS=vol^f7eDZNW4yBOVx|0cW#^mYHd4l>$}Qti*#35Wy!T?|#dzh^dBhK% zey*za;Ol1riC3OkGd(>WuN=LDvO~Kmn;3*_TV-sRvWZd1K0Q^6ggbg42zP8h81C5l zc(`NNk#L7Q748^16YeOV4R`E&GZh~XtX@NA$Ks&VHFauiE#yIfPK|Ygv=%ETdcotd z4N#0vjNOJ=Wvquvhmai~AJaa)6tA3k)(;xTabV7W0>pz*iI!9GD|JgHn|k&K-LXj@ zbP;}vy7GrPL*TtS|2)jo@68O!QYh{C9R(qE@fLXzN_>2R z6eh;bl3sP2IzU!cY0Eg#dGm@_o`dZ|Q}uQhpEyKC>rA}zYJ8#|Cn!$4-7yrYO;e?E zLJ;dr`jlFzs$sG*u0`1_f zT^CP3r)a;&t!-0eby2Nepp>nwAU4{9j}`dvrW4ezMrttguUWncGV*f^2z4Ka$L;WI zzz5U^iMAN!r9SltWHd-9%t!&kJ`Yf^Dm5y9fOMB=6aM7V7!ds0J-<&kZ-L7I`pB=P z0Xvf`L7P+}Lf~-gDIjS1(d8%yE}({1Y$Z7m00h)1BdYz<67-+FXM@X-_40zQUq9>SF-Y>&BsY@0f#jtmZzMTF@+OkkkbDivYf0Wr@&=NxCAo*>9+KlE z-$3$hB;QE#9VCBf@t=WfyGg#OqY%#T z5t5ySHsr@h-d!^V_!Pe;Qp@nMAzb!`fF%}U>O@EP}j5}+1f+XhGIWU)??oQHg4oE1C!r7zF(JD=<>1S`xm5# zN@~wlXfrT*1j>nFwWkMt3rs$7e18P=lvQlh{1=Yz5B8VSs#K4r1CwWt@8{`^RDB zTQW;^hoRads;^X4heWmKl3A)Z8mf30r8ML46Qa6yw(2@VHNu)|rqzEH)yQnsl{2a< zQOjznPTSRN#d?gUsD%c}H#w+F?Nd|q1$ zgJAJrs%mSmtMxa)JcU(ldk{f;DOg!x!*05%-O?&PfNB<_ky;JFg6K90p_p}jD^cu? zwU@W{HE(XUz}!Nx1dV$v)iRN=cI)!iMOITy&(cp4z0R`wno+M_JMFus9b8498&K#3 zA>0fWH@CvVznXfn2wZ^{g5X+vLtpdttytHjL2MSgb$u)Lp;=nSZnW254oqySWs$YI zp}E%Iw!95pXd5mP*5RT$QFl}qFJS&O}Fi-9M40%i|cgu2QzgWYVWk%H)2Sv5uWWt?Gt zKL9`6#$Y1pDG%?7K`_kY5P~*v_kwI$*1HY$m|;)4MB-4X< zRMyC zR8USjn;0k(54L8fKT&kmNW#fxiX}zPV7+o2#+(wCh7yH)+(JeY-sMVZ zFjsKhf?ITOpVys1S51;kxQu$%(T(Oh_h63CvK>xD&+(3jL=s%+QVHbt~ z-Pe_fr-!TkNR|suGM_CE<e5Q zV=82t6e!?q-~<=k0X^FZutoGeW$4(4Z`m2y(sgyDt1H$WTN{ZEmC8By+5tD`7BWdF zCJM>HYezS%kFM{IL| zQhA)A;c^Kgi2`@lm{KUrLL3;BOtzHCNi?cdz6?Ep@Pyc2-wi>YA8`v1WcNCW!T|hW z#HbEx(urgyOUnnG&48OQ#vV^`#9<7|!+HtmWw8!I9im}oa`fCe1G#dt>Vq>v!&nVV zutckqxG)qDv`#t$Ba>GYf*94f7RosYe~8r)H=7@Zr38J^>s10U)>$khJ86LdKbBOT zFoK2KEGY~I{T=6&7ks)Se`a1`b$xet2XMJ}xo5__&qtKnsuCC5Z zE}1PuZ>bqByqDOYf$93~l+M!LVRtt1w`k#_@^scCZl-CEW^&izFu}~m1{Ily9DtOY zCZSMHmK+>nC~*e0nY^yd_Ge2ECGCJ>qL~3Ndtb zep0o4jO*zvEA@a~3cr8iI{HkIx?KnS{>_$lp6lnz@a-N@|2aKZoga@2Myi9d5Afae z;-C36L7HD51Pl$t=|nIGKKnQ$1i$`jkYY9W>r0JlSp>g=Be9XvP+nA>bv~y6hLs@Mk6sv0X6gn2`NE@l1q@?kF8+4rH}a6mH_6U<`1lct_FrMX*zafj zDLz_Jya1ME{0kiDV!sUdT>gA!9vttE=Hg>~&V_$=9{elw;9r{u|JFSCcjm#rI}h&N zuISu>@3Yz4I>K~}kzF4FJnc9Ry>p%9;5|+{k;&2vk+wiQwjc{n1!R>@GbquE|2=2K z>e;J$8Uq1e#IV=lD}|3hP=c*aUbp%<2K~acRA+ST$1lYHoz`hB;~2kqMi+b`#|h$i zQzQ5fJUHIT2#)tom`wgEjvuUsPp2w>l5vxNHv*6_^VcR0YN$ec+;NE$cofZ4!-F@l14lu-#b0xTB5zr*&A8o0hU zhFe$zzk$ntYv9Y+{@)w;N4Z}=Ht-FM|GR-d&HlV&;6LTE{7GB-+r@SkaQlL9Wxm{o z2|mHR34326>zxHTWmlpT98h`xt-Hz%OI_<GG-)RGP*^ayy#GjWL|Ea-$nDI9Z zT=s$gF>skDoBJpBkFuRb27Z$DR~Wd&O^1Q+;{JZnz(37)ZZPn_=JIv}$G@Xsy3@c< zXjr)h{u-C}82IP7U;7OF7wpf&27Z?LpEvLw-0qhR{Aspx!oYp}UVOp8vuyuO1Amus z*>7ZCWc@dAz2N`M`mKzk8(1f4rNMuL%TW&>&kvH;8~j(fVw-`#&Fu~v_zoV2`wd+F zH1b6Qf0pe$W#C7+-O~pCG~@qa;Nri0D9HG1XMdV`9t1zf`cVVF!2WbIj_L^Q=JHm9 z{|GmHmx0qCmZ0uo1DAdO83SL*?Vey<+LiBwiw1uS_v=>%U%of4;`4^|_bujcU|j6K z!g$W$|2gADgD>Aje`)ali^t*H24B9rUNiW$Z2yA6XEW;82LB&;zUugpB>nn1D=ahc zyO}R%D&(_C(vWW?83$>1B@4*Mb5xYevVRNS$M_YT3w|q?V+KCT<#h)BMJ}&5@RMBL zWZ*Ax`9lW&7MH~@@#oi!-(v7XJpQ*Exa{Y582Ae2%f2r5S2Nyk@MDY*82Dz!@jDok z*pYblo&$0Gw=#c(*fac(GVVPeB45r24;cJ3^B-m$i@f9ri7<|s7w<7}iRax0F6-ix z1}^LCF$0%%D(6ONSJwN>24D6c6)Wx?f=g4#O9h<|id1m3iCD=UEvXn?A;9@)v{(s|(E$FY;>?=QF`KtpAQ;8t`1E+D-a+;+O60_};2Fno(iTYx{pXuIwp{J|qJa%s;_# zI0%jY!veQb;Y&r&GA;FRP~g2J>dJQ;exqW-{Q+^_b`YWzV26ZX#YNy8@2`+!>dSs- z(5Wpi)&&J@-y6GFFZ$lS4{@{q*Uf<;ZxQ?7VGOLPzY(}|jo$~WsnJ$^D)oJxRiEbgErOc4^pCLr|5(-3f~o(1hNa`q literal 0 HcmV?d00001 diff --git a/omc/plat/iptrans/obj/ipcfunc.o b/omc/plat/iptrans/obj/ipcfunc.o new file mode 100644 index 0000000000000000000000000000000000000000..d806a90510abd5c836c53a28a490d3ec828e12e9 GIT binary patch literal 8760 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 literal 0 HcmV?d00001 diff --git a/omc/plat/iptrans/obj/ipmsgfun.o b/omc/plat/iptrans/obj/ipmsgfun.o new file mode 100644 index 0000000000000000000000000000000000000000..b1b5b106934c566e0b6dd4c68de7fc58adca88b4 GIT binary patch literal 8344 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 literal 0 HcmV?d00001 diff --git a/omc/plat/iptrans/obj/iptrans.o b/omc/plat/iptrans/obj/iptrans.o new file mode 100644 index 0000000000000000000000000000000000000000..3cfc480875833fbba52cafb3156cc7acf071015c GIT binary patch literal 94536 zcmd443w)H-nLqx%Gjo#3b#hO*Pq;@&NVtmxxeX3-iv$$$5<@Z*qPdyOaB&6HkjgZh zO0>AvrGVD9cB`(tt%@iTtUn0qR&?D;e|5KP7hTe@TdHnLyR7`b&vVXunIQvI_W#?R z4|(5np7WgNJm)#jdCqe#?_ry7=^}@&YsOF4=4e*TfNGli9t%2`!E?1iT7mYtXZRmi z`y-!3&IKdBGe>>rFW`67caBi{=XLtd`JeC~J}LZ>H~n3LfS#9Kj@f#6>x4v z_2d3XM-M_Oy$12)e!Yhh4xe=TyK+g860O%l8@Tt3_jm3hB!6d@jb!Af5u5V%O|>%< z)d!&={;n=+6o1#Q`}7DtXPjvSYI`fKDi^u6On;Itp4r{>x5p3A7DxH%h0 z9X|%Vv*SZNBONF4^t{sX0l#__fncQLl!VJyPqECnAHYt|4vaG#p)wHp0Ewp-M}F$J z3$UXnTx>R`Y#tb|j4r<(1Kp9D(Rb8|#_Q~$MhPB;1y$kBxvs7XT}2`lE(2WQmUYtK zG}GLjX|k^Sh_fgBHNPeMbof^eKajdyyC{($k+aYjm%oT!g457atT~-pSBu44&9ON7 zdu4ulMdy!{cCr$h)vI~?PbJZ*>Lm$vO|`M}C({BuT(c`|QN~3ld}Oi%8e_z^k27QK z=PrcS8400rG8E}}9pdinU{%~j;mF~?|8?Ye`#Igy@$XQecp0dbI%6~RPzF}kNC(-$ z2M@9}1axciQHIdqDoM8Y=n>`;-9>hbUg$y(a(P~v>+rmC+>B|SS9<0}dL!?n_2nQ6 ztv>`pnl*y7AAA-$weX5gE~YC-qrL)=zssLT!CxZC3NHJK#G1-jNP5)^Y6l=HsF<=L z{qrz_Pmk()mmo*|*8jwj?ScxDW3FT_VS!Xzi*XcUWBejx;d$kRGA44g?c7D9%)H3) z$j?a|;FGykHq4~QG5-GA{{MvPvU#)qIBY#*N=^en5 ze+-27gY?uks}iQ61O*BYl|>mkV9Kp8gV{KRe31?+1kLs3>g%a7m+ByLYe9p!7?H})Xxg!B=&b~L4Vgzp@AAs7*E*XF4>T}SE9CnG6PFVVI zNe62^GzAV84Z)F@zKN$@McB1s!vVIB^7x2=&3QW7L8F(1@u1A9Yyc4Io0DkI200uD zw!gi{?LSI+wBS*OIG|UQr~M>+mvEk6nkB!u>wy;V#zR?ujtQ-OV21%k!_YYAc_qUP z&4uIsrf2(KQMJ_IERhaqkbP{+nikLQ2(%w08?0?gl7alKWrpeXY+nt!R;Gw@!`W!7 zY<-h~(%EquBqHpJ0G&Jvm`;Tb75sn!23$EIWb=Vc9tR;SZ|28{Du;tY%7`99&~8M@ zL5Z-rkYgs?!+Yge66@5m%e9Lv%Dnxojgj{cfMe|q^efBHqDF6*W5(typQW%IVhdFB ztaWkO!BF`P4FiyLz);s{%)`pkcDi( z(=yygatVi+P9S32Gt5{Vm+&o?J(b+Ki^4XS@FP+OMe`B5buE zJjk{iP;v>4@TFWrX=@FaP{yvrB~%tLSYDMKLMNr7*e&dmQ>cqwLdLk1OL$@iT*8r( z6dT7lqz<8fD;F>ES~CAewNP72KRevOluxG`;qFYXj@Tb>5Bs1I?`swS``< z7Z_(H#yN@M9e-!lokiXQ$#5Kzs9oUfZh9T<$iR!sI@(cS1-({qycI09f-|k)Tr23e zf)!S9jS<{`YjfDUzIsEzf56)os@@!^C1&qJGODwlUi(AM&EAIQraC{kP2wLgS|r9M zi4kaM3WU7X{sVQ@^-bQEh5%Oa9`Hw2@9^)hZVMDrEqQek;GFFD@>!21LpwAe~VW!WnI#Gn%7_${* z(~K$7Kao9;M~U1VnyqsTP^cNe)iu;Tk>I;nJ7VkDYc|S5{tO7Tp35=B&VG;R29I4(M7_tecT-#H06?Y=WS?@@;Ji5xyamFDCt zSGfP40*rRHlq$MTm)4SYws4-XoSBo_YHa8+)1=jhsF~(Ps}FNw!7-=og_Vt*g{6KA zff$R9(UzcU=0j@+?FZ?}vn~qcZ%y70YjL6PyJ(uu4g$sYPMTP3?+Fj{yt0dE(G(Cb zR%m9p@9wx+$xp7(JLO^ptxx{cfA~}A7EjD0IqBsOpuz?RqbxG94!(V@oCXzGemu#@ z#AkUn*7Hb~17my{APv()NqspmJ)T#5 zIp}KARQis$Z#k}QO29LJ>ol1aBTk`0QmP%1Xq$87%I#0lg=Oe1>de05aV%*m?ZC3_ zJ_)D5-{s3V&;u@bXY2jX{oiG)>VNPp!s*)#Qb&F4Ujg%E)T*BEB$o7i1rgsV@HN!3 z6WE#m6(FMt;ycml^G1B{cKY5$1p)(b1yktnTK%py)S}p^p*G_Cuzkyi+MlpMHE`8& z3SjlXr-zvoD=t*-3v_cqj zUe(&urBG;~!#3fiP-xZZ`!G7BSe_lv|_T@-Kd>?nN{uq+t)ul_7 zXDuxO>#MIT$;@Bf>d5?G#pFQcxr@_oSISsZW^k+B?swl6Rf{Mx+SWaI(LyjY~LVZ|2SrQ(^%VL zr+uI?5d#C zQ*zB|SL;FK^JDgpy2(Whvs>&Um@EwQW{qcnb6Oy9o>X!t}Pw9*(-5;vgeAmLi?K?R!>I zglh+in8z?hV*RU7{7<5IGblnBdUz!`JsCxJfK@mnsJ0V)h&lehA^C|k&Gs1 zv8mMRv9LQpC>BOqDPg1^GGtL6DAmHVQmv4c_kW73f%yBM=gQ*Xf0L{R(h`f)|EU%v zeUGoF|MUD=Ef}q9rY$yB326Do-0ZT(a})O8gvSS+2O@gN14;65^(v1m1~0a9Z7BQ& zz}2E0@%>)!`w@!uyzKjZ`#EQ50v_9@V6qoVY(M7+dHTnhoZzj^Vdq+$MC4)@o92GTgpQ57?;Ox0_Ii?`W>FAXyTxWkG5_@a{(&vOcY40I00#f! zSsr~)f)6Mz;^&J2`8neIQtNvXNuHNie@Wk6{LEhB4&Mb7`X$k#2J*bD>NYSf0|&EH zIGthuBuu7A5m6R43V5)Ht$Zeujmm#XlWpIZ4{Z6;^X)2fz4Ja6C} z;u)l1cZRS|W6_1aeW22!W^3H8os8O5fh36$ITHEEvN#9kf(JR3G&;Cs;mX|V(#V#N z;YuGr>N`WWuYJqMPR}FXgD?4jl2>+l*PX7K|vXBGbq zAYY<*tE`I|fz-~+;umxAN@}z1#b2)Wo=X;=Dt&6L?=qj?>l@cG|%>rEqzFg zYJ9H7)+E*NTQ8^aYf;RDjpyYCE;moAMecO_meXQuBBrV2m*M!9CtL)OcG-U90#z75 z93Z{;OxO-APgzN_tKw58%X0J`p}HAHW8jYZ9i#deb#6Gp6~ir1aQ2kW%aP2EbR41~7~0II1urs-pg+KPBK&e{H;Hcqh11cj=s0yFdg9ot$6W? z)4sdNhw5V38>3JULz<9qNc7FOQavwgIQ}L2CRrc@H_~yOswSx%p!v3 zJ40@Y!cMsiw$}Fsu<<<>iI>05d>uIucR|{-%RL>>BihOQM|}H^_?`h}-#&vg9Ea<% zSo350B~$4brs{Z6$ZrBU*nW^+TIgn+yrSGZybK_IeV}yX-U_>l%HZ!9{65 zNYcs*O_qV|P*LYDoBZM|AoRV0te2~2@WF$`@apUhDJs~Qy#XGGI>T(Uu$HFv-AQhf zLh16efDS<9&;)ZM_=xX2ELI7(ub;9IscnyT^peo<>t9YXzAP$r#s16j_9n2<)=6mV z9n`u{MYXQ9JdcfD{HS4h9FfDcDgAb2*N5Pyvx}aQw-5iyS@bscb~`9)RW*hAB+n|U zs^61UWq6#bQm1GBWmPYS%2K&pRX+ljU7b4kM?~H) z`mI&x!*-gnN(@@|WO<%!=KHOnsx1<2%QUvV$kz)j>BJre!$y{J96CE z!sJ7?O7d^e+|lfRn0j^GkNK?{Kw)BXq{(tb4XOT4X+BlARldQczQe@i^(2n7pTGyy zf84S949-NHeqhU))Q##G##FSQzmrc=P3+WYtx6>fu@Xut0m~ueEmGj&KXL%5ysXvN zkElGh`6)u6o(Aer)eF2zqNq=0>fsVZPr!!G)^Ub|96M@#+}RiS+*NS2#-IjvS^F8pluT zy*;O?ll-%@h#~NHX#@7~uW(h%`)c04!TgQ{_wW%QkwppDB%C2~LXHA6a&M zhwlu^K8{nRbpM4VTZnKBYQ`dbf&+Re9U}B>r+G?W2ObKYC2or3UL;V>Hz*NRTZoXV zsyv;}J6~m-9-adfIp>MqlgHB3;nM{XI-zo6M@C$X42eOFa|tZBiRFlcg&rW=*tsKv zLtPav6pFFlzC^SC6u9l{q=v_z*7qPD_LdGQsVEg1L6khN@Y)Ja*?3;&(2fenelpkn zi|p8rFwWa9J7Ks>>f}U3_eXBR>0RYF&CA$dKsn6@M#TPcQ6zj8J?OOTLFae)&aqlV zX~5hV=jn*=9qowkDE@l!cMN}TV`{}GFZ)Mf-`89pq$@QrVMzh3y~nY`_fCIuyYF4> z-oKl_^&``__8m8@fbRoErtc(}M6Rw1T-f6Azj^qalX_z->C+>-kOs#E{ZkK3?R!{a zMwRJ#8Al4=Z9kc)7FgcIir>*BsP56e_A5m1CG_6@TVks-5b0xtd#r!LmEgWjxNq+? z#Nhcx9t^_~-`~Sd_>S)IeTY}@4&OiEb!><4XL!B6!}k%!u;WCBhO z-L)Mg0?)$>FQ7EZ;1Q~=Wc8941K_C6T{xKVY>dqOUA`Xw70tZNF*D+O7JdC$Sg8Uo zoT8T;3hgHpdFi9S42Iv735IJrr-S8u_!hMMaf%GpdzO!Aemr=LHOZQNqdw;%;V*FZ z5X&(BCpuSu;r|Mk$KZUUG|lJ8oL&_jX~54J2K=gMNi$Eh*vx-*S~LU@84LzjSv@5t z&~jZhElX75s%crGO1L^&hNu#+j*O*I5S9C?X<4F5x@uaMsFJUamLaN?t0NO7s?@8d zWr-^7s%crGO20Z@6^)3QXBb#=51QDyIt$GD@sJ=zh+s=0ZE zP&PZ{>`h|JDr(Wk8a%KUPQ!ZC5!p_1kfj%DpJH2?)DnH)Uh)xq=kZlV?AY$Scx-pb zu{~_wUW01~l0kqMDToaWbGR|&QfF|bpALR?c%GW)jpLVQlLkiY^t59M#q*6-@Cjna z#|O`x1Ou@{KGxiUiv-$0E=6$l!U_t`w4n5r_^JgAr3G-t-9LZzqD8)y<}pmQGQVpL z5d8ZWE?((du*yobe}Ln&lScj?b@hZwjf)RAMF^eM8{iNog78m#w=IhsP4->{;plT&q1j!f7fg* zvQXxMvCm#Akw{USa#oO{^%^3jzS8XC&+~C&bslc?8|ZuU&Rx_Neu-!EoZFcSR(6RP zjyM++meokKgENqLEg|$b#%CK-G0+;Y#(b0+{yEp-MfIgAv54C?J{zb8(Tr~Wy2+%m zH^hRMUDe;@mI~r+FVvYVN?sn?>eNKwWU%IDWuI+1M z+Gcs_uWfx}ZO9(02{l;JKqEypZDpXk)>|1~*H+UC0?1i9rPg~(Ykeqi5wxPYl@Myv zlC=fl)>hm`;SJR{2BY78|mg<^&a5Y1)wYd>Mpn69!I?7Q=^$cCNITUE~j;~o? z-P%^f*F8-1VuvDx`yAS4r6n`Hz@~Z|_kmDbbIm=?Eg@Cii}@ai>sqgk=SpH&v4P7p zF3%rbLvb-*ih<;`%I4PA&4r*d3-w%I-9|NN3e=MH@tSPax1z-B7vwaHViEtx!RTFIE& zk}|ClLI{M$kEty((-p`95E&8{UhBfaV4&4RrIhO0+E#CCAlz2HuE8pVQkt5Z)-@oX ziN3DBsa8cMwou!T0XvN~)or1wyPI+IhQT3A#Jjj+)yjFxD{=pb_vS!r8`W{;wKtbm zm6j3c^1q7ex`4N|EIEzajIIZP3VPF$2gq4k3Pf+|WN+ydZ|PKT=`?TYbZ_YlZ|O{L z>9yX{dEV0b-qHo$(uLkqpSN@oXpkCsD?u_0RrOB2c3Nri)N7|tTA#|Dpssq#VmS@@tQuZNO88j*)EEe zftmo+q}C3jFl%`%5OH5?YjZ0oUHq%yPTR%_^SNV6oQmpuYS8TlfRk<+a+G2s=|QTK z~HN8~6B$ers%5+I(x}-9Fn(B80$^B2zGb#5emyrAP z=`8n|W&fMyK3z(4x|HU0Db49pnlq#{XGm$zkkXtXr8z@NbB1h_8IsBjNo9tlGDA|C zDXGjX)0A|T{0DmZeM>70ctdlYcYUCt1(vohke19rOXp_EG;grE6&4aUP-2n!fxRFj z)6`tvgs}?%ig|0QTdLR9H`IqVd&f7GmljV)t56Zu4GoiEuwWs)voL@#z}pyTYa=Vt zYV-}1(gv$9vjnII03QX-^415v&8njZYA2$sdJGQD;gEOZ`udvnvTO?>ia>KP2m(#b zW^pZK#{(MzvH~``GFw|~jjEYq)nJoYlVc@UwK=HJWVYHiDFPHEYiMLMYsbUvKv}I4 z%e>XF;TEaMF|a`llo61l@BCmo{#*h%> zs8|z^Y!Ew;Gznv_o5GFj0<9C_s5FNgYQ5_MU{0Cl8Iuc@Lao9$ddr#xlhrj>oUx|5 zsc9TWw}7{%p}8$kTd1hkG&fc^HX*t|TR?>|hsrHNDb=k3v{_?w>t-IhO0?E>u;ge- zv_f+j`I5EUm_DD8z`%KjiU%92>+aBetUnF)P3-Y_8v;$`G$6)+$6FOF0>N-?ix#SB z(c++~aXPfQB|zA<^=RCXCWmb)fPu+Z*VI7Qy+*zTm8<4?p+93vC)dtO)>gqQ!(i9g zLhjtmHOU&_YrNV<%{T{QoC3j#kCJuO_h_T)Tj+pDeO1@geRhXCZbzlIIOM- zAccVCnAlCiG!9WDQ-?&zL@Jl_xk+;7hH`7m$FxlxQ#)}?+eNaKsSw}*Orh$l0w)oI^An?jFa^sxW#zS)YAf2}#k51ED6 zR0=P^pL;DHmH11gho)t@6Y0fc5AJSx1mRHxpnw%}G3;@G+-4|4%W`qv>F&XlB8#gj zC_#9JOF&{0hrj5?gLXuz-T?aAv zF+5Z?@(CbI{UG0@CdghF4rL9H^-cM)d$3bgG38}J^kschUP&Io3HfwN$4#Q2ggEPVnl?*v zl=6=A?*Zh}>>Np6+zij)r$e7O{l@|7W9Uiq3UUk|AI=$Z<+jDY4+ z5Y1}@=1RGz4bOTI{BvbpX(QZ!G%A}`=pois^Q8S*R@gwxNc#`BACe+bXlcK<$t3NZ zhx5ynKji!p1mqQ!Y3H*ki(7NQj!bJ1WI-irNhH0&1Yj0Uq?ft-(A$_o`jkZKFDf!U ziB#P!Q)Y04u4vV?^qCx?>z@$0mLpynnZ=RuGIAY9N@Zj=M`p@MIY;Ko$Xt&2Wn>;l zDr96nN7l&5!aN6T$6YeAC?^q-^)ljTu3KbeF-Jl&a%0LkRAG~hEXyM0e?Uf-dwzz< zLo%|$oeFBSN{IU0`F9|&UqU_$zMdMEuC+9ip=tn9>oy1nIn=~W(r3nfy`8n zq{=*L9LbQ8bdKc6h=(HuGLpfOp)!)m5wDEoq@D+F<7Fh*vj*IhYWY;(q-W3`g9*UG zYDIvh>XBk8%^K?d(%?O7cnVo*tvFm?tBr6X=qj#5(Ca}^@|{(fLU74<*2ok}k$h*3 zN~N<(lJBh1c_d)Tch(q=3})`K#^yc@G|6|?IF5{$N|8Nb2qkfIwd54IpM*2Od2)v3 z65lE^Je5?eRHlqerx9YNjEv{VTp20ih+jq~q+JiR3K^NmkySEMoKDqWBO@jG#K2uL zGKnMWrQCi9UJ5F~0}cfb#|uk+Q?s!?%&583vT1lwk?FaIK}5EB?u;Btk+RF3$thBH zx!2~B?UAy}oy{pycDd!bL^)4$(?B*FK`t1ojjo|-xpSPv%rz9In|dmPCL61mieh6m zN2FHg-keKVF3nBkHsFtSfDT3x#ao=E07;7Y&$QO=M@&}iHao@J?G*3GB`ihp7=ng$ zB*{CS4*|waS&&KwVB zBj1#fEy*__|0x;Sn#d8sXxn5;5=S0LUPowY9C6l#BdTe4aYQxk;~Y^< z`xhL^P^6!5ya;OCnkV%q$KZRIp{RY*1MfGo;PXWYS*Pj0I1S~U4nlEQjSmS1YC5xnw zo1v(H{aM5rF6nVoZ@LahQBru-@p~k5vt;D8W;|{X%nNxQq3ldOFU%3yEO{FeR{$!T zC2u1~k|o-vM3PLZWHoQI^9E33Vdp)a@dCn0Kf)H(DKMTw&RF+v(EW)dYQ z5i>ITcQXDB;iS*-nDhf6Wndd_AQB4wnT(-8NGimG(XSr>or=|xcx)yoc@y4*g!y>GISX6bo^I>_>JR%HHm#winB<)dQrv;(O;jQ`5p=# zF2$tJa6E}hxQW3^{3*TQ+FYBl01&G-44jok>SFK_2zn7@7+QDt)1s*tamb zjCGjsusEt@8NS?=fLKUe#v)I2PL|Q)B)W{%!erpm+%D2*vxW>@mYV?OjsdPnzwu(s zip*#rmwr<^X|R=@ft4BLM8p7BWkj>Yn5$!$hrxj7`(!FrsTN<|>*V|KL*t}^AEnbg z=RQiJhn7UXD<=)w$w_-DiEw0A^0u@Q_|pb2Pk5QqxXaT+fh!U|hyv@}B_$(&%Z!|+ zbn?YD1i)T}gG)-n(JTZzm3xF zplZ`YX3IUAPScbQO5(zp?9a`znTiz9j_kh#7X9h_@X(UjkNz!CW%^PNEnU1u>GaT& zC^`WFtyF)Xpih%UV!&km3;`?~N%l@AmFbDFEViV7rd(3aHzf?BG*SUo>0MmusRXs; zA!QlXS;X`ms+FcwR7;{2F=l#5JtMUc5=l)8Y|x!L)BSS;Y}1pWAlK|X45ZleUr*9MzP`@nMKPJ zPZ?lYcHsgp`*ngIrpFUh%Ovu$2NRGP9Jz~;ensgfZ>qRKf1!J*L;Zmgt%k@CN-pwn zhTdvKm1p>5nK*+Incy9;H~MTuwImYGU`pYl2bHsyR}&_wyF}+6EM@mZ#^0gzohBuk zIq8%hD{qPZbw+6CN{_g>!=emDH&SrMqJ%GeTW70!6i?WXv7e$c!74w2csK zIzQIO`F0VQT266sQnv4N1il5TqM`M`Z=zu7QW(D_YE0C34=<2sVYFe1Y$lxD-`tuQ zY|(}%x@iP(c0aK-u@Ni&BN7uA!WufePj2PB-o!-C+PzQ4M;h^-t-_X+ zWH2?kc0wWg(RWnz(|3n}jnyDR$RMFA_$}{Ix1tDx-Hvc77d2j_fb}^xc!;DsYBhClp9>YgBZU%)g4cJCnfL z=jd*Lfsnsq^`?kuI`fn)NAi1 zur+XXpFs3(L^CA%$A`8_&3il{O7q?|S=tYlxE4<&BvT$|_v^A&-%8*W0B84WGXA6y ze?`Xs(unVu@!bhL|8aJ|D&yZa;s<1WPeL+HD;(W(r4DsRHF}{EmcBc0h-&oi1m2ZE zv$BY~6UNev$Gb2mO=Hc^Hsn7eBdcrpgL$)HW; z!N!nQDXyUr&(;0F8`}~Rt6Q|yBKzAY!`1!78`2!zEK;R8dhv~IvI8!QD#b@t!B5}a zYm~A~45m^@O_{B^Q5kMxbjmOTBQLWxSFqw3W72$~I^lX2+kC+m&^`zl9g>AGU2vbH zL4b>UoyP=Kigp6dA^r5-Grg*~*Ihhec62WtQqx$gz3v(Bl~AA z9-d_51*1s+o5^}jp&}hLNpnrs8?>4@T5m*~O;H(Loh#BTTZnXpMfF{0l&HSO?2@v) zh4Pr<_nnH_xC$YSpZdyeq2D6%Smxl8G{_m< zh!pG(r#2bLx0_Wl`X*OJ%~nlW&5xE2~;>c~nyj zwT1O9Q?y0SWLj@btZzXueI2Y27#jor_;;In4+U-J<~k=2CiYHnt-^^(mn}OXnp@iN zqMyF|9m#ER47bHG+?JT!g2O2|Y{1+)yI+A*)`F%9S#Bw;ZMki7HWSf@?$aiwbnFE>$rge~4 zA|sVihDwQ4GYZR0jXhH-7ENpd`3v%wxYp zPF!U*h)mKkV6##F`#7XWqQ#l?-#ZHJr2iqB^v^CL%~TIXQ7tsvc#lE#kYgl;4PWw* zgMDvDx9mKJ9cp?ZP5qmWR9a&~U*a0P>5w~o-Rn5|6Nl$JOlrNBM4TqkJ_d7fUlbP& zE-65L_YGrJ-R^UYR&`@*d%uGREJwGW3E%HX`2n(^Uts(RY4CK!84nOZ)v#5|9T;yIt2fSUSCgXfWsF(f(k z<~B|o>9|fhYd@9>I9hT|3dxlk?ckBo*{#%gv_mc&j+AT&%-MamjTs*+87Bqi zdX95=sB8>DZCVm-=`fppI#u5IjW*c~k5i)U)0NNpy7VFYb>+qN%J> zIn6#U3`DGNGFJC@UCfc`6NLNE+5FU z4er@ZMMU3y7W5M9wGSn)rl0h7RAnDj`Sjg|<5gwf)|KPZpv|RJeTi;zdj!)dd@)xG2Mtt`1E`UDcEt9$$BTMO&!wPlh)R=edox0kE?o1bsx23n!>LOv$0 z0Fb+1VPHJ-xtuRl=tCsA7Zu#V%4?tPzc<$m-Qs$un`c_di2m}+efEi8A>ehfTwJB>OUWmM}i`IN|7oEFuv za%+q9;Qnh=OQp#wp;yb!mZp!9diA0apDsJcv$C^zboQ{RvvJdS^uiy2C1-bUTVcKC z(Z^7%@NR_0QHa|!Lmy1TuQ`Hb>Vv5%NSC8^cRq4x`VLdGZZb9N4#)aXc574QR)coDKX6uiv*B(`+|GA>}SRM)A)eW`g+}~8` zP#zf{K|;k8NyT@mbSUTol8(NMTZeIXjg+`hZ;n6C=81cm={Y=3>VzLAg2*fvToWPc zgs5fOK@0(7@&}v1zu5qD`@PPi2uPW9S1S}wHcgYJEhMbRV*up)?F@1T)8?w_NK2BXd$xz_g`mvs`*C=sK(KY1(X%cH4EcoN7j;%u&3i zP_G>~=wV&y!u2JZ>RsHMjXK~=P;>?(foRQ3(O08F^Gysi;J86{j0N`ggLPz~a&t!G z`B=kMJCo)wGTE`wybsNPLv&$AAEzXZtR}`T{2)Br&;C7!4b10lgu-<_TJZW9*P$`* zjnPhG`GUa1V7ql)|IhR^dXXWQfDxv3w-dWu*rAVbc!~&%hXj6b9_E-`V4mH;6sTHo zh%Gy(S`U~Q<=ij|Cs-jX%2G%oWH#y6BL)VogYBjVmzHWqIS0cy#3=k=%1)tULz92{w;QE+Y=jf0RftwGVvZ1hCDQQRE!>V#xgxpSF*e&#lq2%+7UByr#W5jQToVF< zV@9q>a7@S%!ujO3og!(T80PfM7HQ6m*`mlfY_@QN%mU$>FGivihx55@UXerPg@o?> zjn?aa+A%6ir1Xg)dm+Dv#3V|)QDp3cKo)0-qy~}EP0g0_n88A$sScJfQ*l!f-eZ+7?~wpOTPCkPRDfU$fx_hBa)sLnNNwdr%5}~AiTYzz+EU(yM@>(ik66^keK+XNDYaMV`B6k zk@B2KdsGagQgio+jOWD=BD_<$A0^?B-Yzmi!u`2O-zbW16NN!BzD^7cp$WqxYmXT8 zyvPiRv~Dquntw!4WY&oc^p+(e$1yiowyG0qb$@L_~Txy3=#6qtqJ0{8rb{(ZcE?L4?C$9SpS~Ds~+(D{y8>vn%R3}d) z1jWd9k&5SbdJbDl?58djp4ZSOUNQ7B!bn+4`sYSG`LbH$A+2$vTh=*7W{X5p9T$aW z5Qilpk??KDj2!3|VpE*ohu)++Q)i2*&g|J@g0o<@5OYM*0^y#|9opgi8@tkcs`a8d zpBBzf#4z`3unk`PCF4)OwM-|mH= zoD~)&-6B0C9LI!?hIH4v*NCJ~L;}=tuj4)RE3e}fh$wLnnxGx34t*ypgH|527b^CU z7_@^F!uglzhNXGJ>6k-?;B6W3z6Vx6V#S`eU5pBfso-;5NQ~(P4EDt_DI0x$R+dOc zm!y_4B1sexjyc)F1@(U#Mixchns6%NuiZZro?nw}UC)a&$w=~}BL6Ajf}()TVD~{W z7HlQD4~Vo4BIPOYH7;8W-UkRw+jg|zL!wwpB++AGtQUm)IS>v~9~<$BNPW)eV&kcVABqIj z>zK&=YvK8!NJBXywO-_Oi}5dr!9g*uTMQ40p?lD8(8-2__>dEpjk^KFSCXPukfJ8D zjbky?Lkt@ah=fl?#zx_SU8kZ#B5NP@aI{f2#e*VYy%0e$3R--lNIWLe>PQxYNKQeL zQ-Y&3SBS94`9u`fi9xf4w_N1hNF6hMiAcCnjHna&vqjPz;hrr#OVB!Kc+eP1eUd8d zT?&i3Mof{C#Hf|(n20V(h96zjJy%St6GdbhX1GtG>d3{$VUH-A6;;Z-%x^67G#6;dzmc0v#|VcsYY&5SkU%2&t%hieozT z zJRscL#b_9LnABlGk>$Qsl)WZALD-nFSweS@an}Q-PdHK4wIbzt8U_=}(KQDFvj9!q zD@H64!=Y8>V)!R$Wr!)?U5C!HMkE@Xgxrdi8wDnRdr$@UZJ^q(sOCJ+?oPoHDsTxqHxB3B=%}gGl;kR*!=bo49YxTsPemfE zbx7odL}FOL$w{t5?S*@N9T|~qkpSn${TcPWv;m?57J>+U-#Y)5qdclM{>3x7B zp9n9#olT!fBMAS%3AX@>F6Q=$aX~TnA#rU9`g}JPO-?Y1r?JWDzELcqce(7=AsKr} z%pzckn8`TZVm7^><075#k;zqZI!32)vFPtf-{rD0{;zPrUvR7_AWuBKl%Ba|q{SW% zW+6k?H*Uwl%->Fu~>_Wfe2&{jORt-UL#+|+i`G5t`#|ZRcWe>7+jZg%pO$jjx|iXV6AXD z3qt@@+W>I-Q=EY{Tq9WpFwf*L^?;`cX92FJCoGb=T3J+?AoXk>*n%Pr@&V2@YelJh zFU;|rXGF?syx$RtcfbRIfm$kDpOF2e$S}&jM*8%KW@FX>k(;h*!lTG}eW|l)HhJhN zqoFeJnm!c?VUYs!5f(0ZXCUD$6Z_PUQjpP^pL zqV|c*cCzegOGMTep8(%Mgicv_^w41%ds zBJmS3oaR#)Tv9fJ!B2z}QwWsd+{2?IYBzx@iLOX}*6E%gSnL=)c8TP$a6BER2EZ(k zhJV(-HNtZ%6(wfN`OA$W3Gq`QcoD7h96 z2#4zO0zFXGl-uC3!T`XoV+7B{VDLHw#33G4-TWv-(*OOzfExo|>C4q*J=C$2dv#vMcAVv+o|a67*X_kEaqkMoz>PExON zOU3XFqO46g>bcE{4{~icLX?=pQ8Y+1FHFJ4Qe=%t+e;0X;{Fej02fXoB*XiLI$@56 z{i;>VK$Lws8wn?OH+9>qf;m*Ku z#%v4)B|FAoQi~b7EFDt;Rc00%goklb7C2!vGQbHN@jX$55kF_P7}3t5449dR#E41J zkqp9lNVq1UCf!d_Rp3u1Z$L?F(M0I}GMG&5%X~3gYG!i)opi|(*lg&{GIBVIV8A~U z>8LrTOLc1Kxvxa(F-A6LGNx=8s(}hSD}Dw)^shxZ))Uaosjvv;V#eB-cBUpemH^ypo zSZae(?t0G8c#(moe7wW}O44R6hOvTQoh8y{i^c6S2-}$UkXSq^Cgx@|PPmDJCfcQ9 zwoI#{GF>WW%d|2o)1_jzOgBemx>U@_lro8|BTbyhvqmR#?S*rf>X?RELx_wWX2x#E z_$)bi+{nGp0dsT{wGw%rG%&!-(EQio{*5^>{GBwqOX zjP)RB1zX)ac{1a~XhQwVc|kU!yNd@$=NxIykVhxJ_&z(0t~9Em3k9{> zz`AfQFW9&9;SF=_N~Vs%{Ka;gB`HU|4`VFL4PN(ra;T z6hRiYg%($EdEluE_Z^|YMXQ%DShaY?@~SGWrmCh!Ypbpz!dhrURa>A&t6Z^QN!7v| zR?b_-d{$F ztsIk#R-S7BArB~x^H7@-ia#OR7J5o)ZerRzqu8v-F* zTG~Jfix-+rRga2lxZMjk$7xlK)vfp74oWT5Sk+ity_x7N#r29B5uL29Yi+KsPxThpd5eS9ZJV2F*0(k{HHX`Z!%Z8} zq{Sh+=Ccins8-EA#VxJPA>1(5+*%Bk#Pz0TLQO+;+j=9J?(QrO)&y;FEmR+B2u!ZR zZDx&Cn*&h&ig3u+R-2RG|ls&L|+ z+Z%e>2DN9k47Q+G1yy50h0!&sF>$3Q`ajeZU8cFIwvD=SO}MqHrnw>9h=V$~bh8S# zsI6LEsp0y!7PHkz=WEc;H5)?2d=QtivKo~l7KY+O$bn6$Gg=fXG2c)vsTLLUZZOos zunaY|t?0n0kA_ecu6t{4t<{X12CJ%D>+lz-hG!2gy7QEU5+OoCp@^%T^3D)rHnmqmZRQZk)f{P~D*9P1iYsC#Z@RY-vRSL3DPA47Fgxfs2Nj z@QM}lS!PyF)fEk^U|sY^Jl_{+ZPuF1UR709*A%X)+E5LhLa&D0VK&JgXl<-2Y&T#t zAjDcK5%~4BU^U#e0*)y=+@l`yMXTm5}tn#`({4Z>9$xZ@Z#uYy!-83%gW zf}82s6cTwUs}>qS7T&UA5TNC!I98TCsRx zRmDo*qQz@8svYp5Bpc|WMy;)>u|=7F5^<^OW1(higbTN6>(M(y>jKqKd$Nhd0`$KD z5|TEFFDO)(zG@rVR5K~#2W7#5{+8w@XaHR@hzpmkoA?a#M;(OhUj?-=-94zu!7vmK z2In<2FoY!rH37kR+Z=7;VLhad1G8z|`_~%a zk%2}FjjxC%Jzc({a`6qz=PgBf(mO@78Eu*)pE8oC^6{;jKgFzV>v@IXkEfN@`<(Nncd zCFxcLG=`O{i7ybpNG#J?j%$4@S1edjajP79aEEr)I&=e)aOJJb(Lg-ra6L#3V4qZb zkSsPH%`)v*ZSJ~h@i^C-rq9^Mp5fNeLMxH9xVb_XYOQG99oGHBh!rW#|Ap=s3( z)i58#&7yggt5#I_mh*VSJ%UET8Z;8zJQf-GV;CHR%`LD3^2$%kd0`q0q=nvq9#4K# z5PIJx6Q~4ZL}nk?8#Q>)rI~)iP-un`Foy)$TiF0r;hs-9!eCUWLH{MS3{mT~a<%c_ z$u1^;8q8w=N1x$NQn_lS4-P4D;aj=#rq#aHKGdpN_Fd~TcXAQfBv!R;ZX+2~g-Lp3 zfngTdz>*U|p1^vDpL}&MX(&=0)&?5j2@*rp z(N?Zl4W&bK0v|WM5<$8Te|}9ZJR0)oHCzZAXsxQny}k|T*YE{dWzaHQ2XvEWc*5{b zp!*O(l^V@?=mD2B1ZWHBc3K$3Xa`(cS~5?SfzU#lkg&R0Hyuk0SdRgR-Fz-jy6U71 z(n!KFg?OY|SNMEOGz>Q6tlHU8b_uR^;9gEx)ZB_Tf;WvDi&)P()%l1{z1vO*5gw)wF!{OA8fd*W@8{jdW94;8%MhqR~WYEA{Q&rEk zkitfbwNSTap5z^_n6_=8t^+UzOu}Vp<6Bg=EyU8w%2iUJt7^!@<4F~qcvi`(ji$6} z8tS=+@_db*Y{S7;>~h6}P#V;(fjV0YOS!7Kq1G7gVU$T3NCg)yUg|@!=qc2q@``q< zmYn{z2I{2a$v#`qbVzxiW;ST#VH+0Up+I(ymGf@lx>p7oS2v+$?_rsf?O(KF<%;D# zGfEdQ(;Nm8riQIt-$?U00^LVfGDAGnc?_e(Y?6&+R%u>1RewIJuBTiEVy;G?cFM5T&NU{2~t792oKFP z6ChXG7|cy6NEeJ1794TkLXHQJ+ z{Nn*mR$B5xK>4o)3R7QWPm3-B(*^3^S4vI^HHw}T_hmVuW{%2dm)E7sk7gNeZ?&P7 zXkDwFXLFw{u5X%yVXYQ3`;zr+k=yKVo@M|5jM_ku1Fhj2xKT*JPNOHDC61q#9*Sc!=66oygQ zUQimO#wfM*&3F@+9L1!8s%K6;B@SjWW-8U16@wrK>!=${CD%f|6h$`mz$65GbB|EC z34?DfWe!-ZVk!%#$E3)Mhlpu6ELbqhJAU;#EYO72`dM*Vn4@J|Cr>UZom!;8d^|P- z$6V>0EmqvSkznPP9Nh+?&;8gW7iIEPN7k`^n8h=S-q*b>&o#PTs`nwele;sAu zI1?R&Kr~)g>HM9Wkxn$;v}l}EI1kd>z;SFc%aEsNmYM%8mCn~180n6OP5w@)bnbIzdb61>Z~VtqNn|99bmxbr{6~|)z^^*0 zeb<=fFI4IO9F=~;Os`exg+#=lzs9QHc9qWe6dCExpP2cdQR#fOl9_(1nf{ha=ewPZ zbjQ7B{Z6U$wf6EIH<{@!{s=)`ZDr(l{)<(AmCjdZnduYE@)xRfzTwMEpYN14q(U$L zk*HkSZ!cV&LbjPwFa9}As~w%D?j4Q-(zg*hO4!#g!Ab-gE`VbAGcj=b!h`T%RB+sY z#lL9^-mBpJ1qEO}hAYKFxDU~B1EUtxKOR$VtAc+R1HWIvPb&BWN+e%X z@VnR;sLwwDqn}e=8z3X<`6%90uk{Mw;Qucf?$o9#JY^!Z?{tzb$MiD3OLmueo zl%G6bl;o6mI1d0fYH1}+0iT&@N8@LNdffAtD~ zdyF2oDELkVH#pnGaMkfa!JtFmNN1v5jJWZpJ6y9&sHU+`g?!&ra3gMf2>TcI7zh4w9QeP)fzy8qJP@D1j)VUjz)22&gE#$*FUc<`xI?Ly@kM+J zI_5z1>Hg<|;Pihe3QL*u|l#erV~IMw$7cHZ!Lv@!{^ z72G*W3V?lg1j$Dre7b*)e#X@>cPRMi(Gt$SJf$o6=P_`))q?1}IY#31|0IlHmxBM3 z8raz91^fvG|F0V)zHuky_Z0l4atYrlU)qlVA4r}(3jcv|64AIs>4P}`jJ<3k}E)IP?4juaMs|MoV69=9X2R<|od>r5;|H@*?r*Tc#)HwJz zDEyyKmiTJ8)oxbsBWgf0ZcYm*_|M1z!_T<0t~Cz*Epg!FTMs0Mh@wBDQqnhWr~OL> ze_@t{8`ppRP{A)KxKAeIro4ga|DQPUcNLunXG;RA+h{*maNisW=eY`keG2}h!Z+?v z{GEayRQSe4m*mS2RNrjCslEPFG0t-p&>s;8za$R4T+#Vh^`k<`u6AP_{N6b5wQ=CJ zao}|A?m+cwi38sd2fif^e0v=D*W2XHwN+Dy+QIR;Ap^RL6dUd^CI44z1SNcOYpCIQsko%bPb~Db03-m7wd0#r}Y!UDC%5wn-;-B0M zr7Y2Bqhq)AFWNsh563Y{xs6J~Bxa3%Xl?a^zPV=}y?tqJi^!aiuX()GIIxDwV&@QI zh&sQ9wzE#68fgS1T;4*Y{Ss!SQk@NuhlPk?Ixr(o(8^;$>f{KCRcVFBr>cw-dz7GT z3Kol`V^LR{4auO~P8|D5|!3m#u+O5_@&MG*;$h9@_F%sItL;08ZAF>o~< z)Qou((YNz6&W2BE#yaPG1t%D})CNB*ZTNQi+#Ulr_zA|qM}Zdo+HCag{5)dAA1zV& z`7IkhP00*?p0~lt#W&z|w>$mlMRbgIxiZx)aoeS`kKq^+nc@^G z2}OnzO`1vaD@l?ZI&xH$Oh+Z@*WmZu@47B-*RlTjJ)h6J-*@j!3e-;rw|ML$`|CN!tzVe`mzoaKZpC<>g|L$m&NcGg?EMitr-4|@Y|t37Q^e~ zlrzT(<7^tklaDCf}DH#)ud z@8Gy!E_ylMEY!hzM~eSn!*^CDIlcE^DEcQOd16hB{Gn!g*F}S6X;MmKYVo zSAbi7{CZ%Y<1L(jK5TzX@AJ^Zalibo24|i>4)a-g&FOCn(~N(c={FD@6Az%36p)EH;O7=0JvTwaC<$1q4N z5gw{Ymet@|?>^BVMSBkmKLK9svdE9)hwK05;O6hQQ{5f+`6&|~VrRvCDu)-3@9H>S zC2;1a5xDu^>UbxoPYayoFOHi(eKH*P{)3!<2d7`)^ybfgT;;g=aJyj7^s{1d`tiA5 z^hr_pv)SpJg=xmQ$LVdk7>xXX>+~I+{%6NKIbI~(xYde|!!&S-a1Zi^*)Ju zTR6S1_cq6Uy#t+(&)Ybs_w`P9yoHNrNsQ0N82*{#)-NoF9k+P69G!IB_v4@7+K*S^ z#0B%oR>+abKI|Ij*CAI zqY_0*hM7aLIJ<=xeX4@9f3f;Xw2tAU9JlQ|eV%dL+GX`vc~3aU$;4!%4czAU z>y76{AHGhO4^yLe)BEG2|A2FxFwWxTB0V|R|JTLvp~6$5*%Py4_*&uIPVI}~-#Kn= z;5aW`{`@$39CSwv@8h`lneVube;yw#bKL9y?YP(f0dCsn;l+G5w?Q9D?(nkjxIg(7 zxUojzMSY#LFcAv%yuQ?)+C^^lHmMg)w~66B9M2o1JPztDobkL4ZdxDD0nyVZmjw|D zr$G3|Qm+M_Ie6Mg`H-6gr-{t(njW?5pq<#s4+pf7JPB1kU`t?zqoGqH0tV>&5PR zqLgs#UM3oYYo0qe?(@*o@q1i6A1!7 zbFT0wlfn2_x^7?AMgLEz{+63#sD7v3NG!@}+V9;}=cJ{^YNZcp9C*m0=JRN+h@IK&kg+GG)FBCote7W$s;4ccF2mY4uC&4!hUj)8g_)_pM zgf9m_Abb`0ap7ygPYZt;JohzG|J$UEtJlB_34aUx3gH{TQ-yB=uO@sics=3!!J7y_ z0Nz&kA@I(^kAn9UegeF&@RQ)fg`Wn0Q26iQ6NM)*u4V|&3qDV{{U48&#lj1LuM%Dq z{8izXfo~9=1HMK0IPjgqCxY)2J_Y=c@JGOZ6g~_5cj0rv^Vg2rZE3XeX8)ICrKs>H z!AlBX1fC{*DR{WPI$7wy9K3<>Rp2dzuK{l_{AKX&!e0YV7rqsIpz!VB*}`{%j}g8b ze2VbB;ExL55B{X^1K`gIKLox;_)+jTgr5N4B>W`!HsPnicMJa={A=OK9iGsGM}_Cb z0m&)h_J2;vVkaL%VZRpwFX;Fs;rkpczn2RifOyI}ZsRjG#azQP3c<~`V|a0Ytgh3W z|6ussD4hOn98dZe3NwY$HOBu=r#FB8FMp0dNypU8>vpCWp02OkxF1M>E? z^BEYdnTM55Z*g|dAJzMc;}%bC|Ij%S!nkq*>wpWh)j}{))mPkwmw|YB;7xVd)=(*lr;q*SvHyj`2dn-ZF5_b1|GZwK#43q+|S)iQ&~8 zH~-R@zSeOcPb0@oUjx(49rt=(*TcN=y4fBvdj5VzeM{*2#ptIxZt<|+=Q-}VccqkGI=m^x4A8Toz^wWvuh@=g${9J|yVat{23I@vL+DTb+Kp zuoIhi5OR{98Zp)G;Ih9@~W> zPVei@aeDJ_kA9ltxcPL2&l52|E1cf@yyLj}+y$QxozJkq8UL4}?+^W<7=5nm!_1*r zK8J@FeJ+dP1Hd`nc%9or!g<}=bm7d;Gmcxk80RW*i^sR?UB`W#Tbz&Ojq&8SAFV^t zI1349JgJUbJiK1HI=IGD-|4Mhu1DHAy^nK}=$W5s!Wqxgj$1rq(2pyezt7JrPG2eL zf5ZR3YnHH7J@U+H36bhGL#@`U!+UvI?m)?++C&ycM_(*+CaOREs&(}Nd^WW0> z`26>X(ckU#_quvVJMOn@GaVo0^cx-bzxQo*yrJH6Gx z-}gty@P`~X|I4xdnd$r|IRE*M+pZ<+UF3Xxy)QbwU!Rn38fFf~+H3XJM!hw`&0}JC z(Z8eU>vBEm^chY+#_7`n&lg@+W;>o-FJZY@>A2~wek)%(|4Ct*@f2ug-$uGl;hnsE zvoH|~+tq^YYL>)F-N|l`-x>NlWAsZL_v`;nj!#aU^WW~c*Z%=-^;&zc3NI^V zY*2rI#|30U;abkW}HVWtR^}X=?kvwr_%jko}X+G3f zblfkGEy42!?L*o+ohb&kPpM{g${1M0BbKLj)b?t&E6!V!JUi2B^_;klB-V!E4F}?S>-SKhZJNoo@ ze7xiLJ3hnlryckHhaI2k^sU;5iBOm~o_Cub!}rASindX|fX`szyq^5E7@oJo`99Ql zis6q7=XJc_#PDl6p6^fn=or3H_+X6xBAw3nA^%GZe=dd}6FwaN4R1T&pL|jb|1^dd z?tIS2K5|@L>G&mq|5_l@RR*{5+0W@4JH36!^;j#%?IZo$J8u3d7l%Kg^aNM`XPn;q z{KM&IhxzHh-RW)pKz`J5@AH%67EcMplc!6V2u0&r3vSDW>B~a@rtos$?>V1|LC<)8 z6@5eKb9D`(P^?~)P+uCH^|pjQEk@r|^u3^O6Ql1f`XSH{jL}aL{V3?C$LODN-1paJ z=aUxNn?Jm)oD`lf!ii$tq7Rk_(_5ab-0ZmZ%WTBc9o%#s!;ASG=J=zIFBG4J@OjSZ zeZPF*^cD~IlfM8eSTnE2XL~D* z&&JDz*GD#ED8-|T^bBaX3&UIL!{#7g(lOlYU4~5>w zycOyPS;IqF7`>h4hmiQS!ZYEsUU*Gg_(Itfy`A;3`&e7q5xt$|mluq{9^sE85Br6G z3H?FgRgwQ6gf~V!XM~3*XeUcv#KkNK0A^Bdct|$sj2Xn(Z8L9^LV_c@X?5Wpzso?m-p#nJVS~_@!co-Cg{h%34aLr znjyRZ#^(azuR+i2A6f4N_}l%yt&sl|O`g5Zk$e%>8}Epo_nYALjMP7fakWMCrO@x& zh4cPLyM*6|_2<8Z*F)aE6W$p4|4DdB#GgF*?%KNq%X?we!}t#%4^4zG!8mLw`~=oZ z?S!X-cM^WYDhj2$@L$lbp2F?^!B%<;Ux$457d{tx7%F@-@^G(k-k&8$IQOe32=9ix zO%=Wi>!sPkXJWkZdPe5?N355g7X3}|vHOo(p?)3We?j=Q(DQmj>d#>LeOL6$kpC^h z^CC`OZ%CidpxZC{lZfY-@H6PI--P!EzXw@3WLg+Gh+hTS*Z$I}AibE@zUk+;W%bH8(`@b}Q~YlSbxxP3>sJ(t7EN5V6) z-sAnxna|CUJaJI;9gw#lg*QTe&Itb*{Z|Oz(?1{9FC~OOkNi{;{wSvF3jYuE&4f2Z zzwkbUthWZ@v-^WvA#a1c^%Gt@k|nZ*7l8kG;axF3LwI>C?@tIng>k!F_+qS=?Ec+W z7-t>(5Xwg384*r=BK%>DlfA-wqTde---Udh63+ejKZU;t|MJKm1ycf2ovxKK3o~MLwM!hS9{~K{`621%l`>F697$^IL zkAnV)@FG|)P7CMt)%lQb=9$~G;=*r)e_7#;k+&Mc3!~o~3jaHJYvBjcu93pmLqAS< z7vz75@V{Zbv_|*~SkJsId8phEzM|Z(r@lSntRwo@(XOV#_aHyK9*{mwpu0o#Z==0^g;!&L315fx^ElxrFg;!P zG4#tS;hEsC39kVDzVPyB*AC%tWBK~G@RL~Y92K5}^~|rrzr^^@kNTOnmGG}9obg{P zycX6EO@&XzIBzffQmj|+5Pk*vm-qiye9Jghwz!m|HT-OZ0}>3zEU{SoJbR10m~t`d-P$PO+;T7@wXGs|1aSE zQR%Z9arO~?YmCnk!V6%$jS>D7>YXP10gT&u!lxo%&kFwzd45rNKTNL|eg~G{v-kfF zag+-$9&hXseJiy0Tj392JpUy8VT{8B)_?Z3`Tv4A3k$yo(!uVD4gSyH;7|?7*8S0NX`?tR|&W0|5&Ln zocb2RTVOrYL3j}?k9P{Mj(+bid_L-ZOgQ})3%6@BtgI1U7yfSx=XtKJ!aHKT9TiT0 z-lvy&8xvKV$cybK`FPAd4PJ(Jws`RlGs;MNscn(XWC2bJ4d({9lQl&&fR_`Zus#7sPtV z@`T)Hr{5}i zdp@3(-A-RMLdm~hi9QSa1IL`6W87xo?~Ux=&k%oZjBDnT_bV$1PW^+}AG^}&txNDT zY$8?kg^b91UKm#?mqs1Oc=Eufr0`N0f7c1G4gHM`>{RxrG@Z6k%!*GPoTZCg+GG+dR6#R)cck2_Q=m^ z;VaOti?4_p!Z>@tr<(AYh`*WerdUpSe{%XfkL75j=y{#eB;l)&hsT9~hkjWnye;~7 zoA8~;+aJP@A^xIQp5I=c*Q+eN72eJ%?;muKdHjBO{ z#z|#dn8o&1!Fa9%&i4M%Ci1yi^vus4!k>Zv0O9sLWGfE{?}+jCu<)zV-uc2uW4-sh z@ay68y6~2$m-jhmyZHRyFGPO~RSPxt&yg0U-<-i#a zpKIJe^o*ywaE|9p;ir)QY~ky%oK6tV-*sk!GoDVZqxLKkJ(s&zgwI5Otrs6YUwD`3 z*{+kq*{(dL&(G(KXfjb;IO8ub`~xgUyl*_)#pg}86#ZQoCnJROI<4`-IsRu0=lQR- z!nxjlSNJCwKc5Ppg>m?maIO!35Z(>rzi^rJ^OhU!swI3Z>TLwh{P6kRw~C(EIo&RL zK6ieY=(CakvBHlao|(d5$M}3fcx&v>yaCQQ`8@GYMNgmo!WsXM!Z}WI;o?^=zdu+- zp%emVy?pL@1<^B~b%YO#Y!Ww!Ps_&97hOdE8TL2k3I84AVX^q|dG4=^egyLTq3~|- z`AmHHy!gYS?~8u?RXE2#p9{det;c%uN}Nb%-o9uQwYLg5^=ucPBS5|Yy&|`peO-S47V|yf1tOw#%Q0&)8~Fz2A!dS;Tot zcy9D#{_@d$%qO>NR|r3Z{qu^#f5v`h3*jZP+}$QT3*#hRIG4v^;JHFrxx?%G8c}@X zM9=dWvxHxQ_2CoZv%X5?vqAJ+pKKT2%MudGui`VkYQ&3Fh~Aku_DdOX#(x<4S~2=2 z!g)RY&Ehkza#Y_?(KG%r!WsWc@mU6+w?xnQw+jCX%h3+;*;p}(=NHir!g$M@7JYAd zFqCsFnl22^ym9+pMtBX3&zi!yK5PokJg=z~`F9dMkAwK!4c5#3hb+;jpxzwu{|VD` zM4unqoyEd=o!MI9Utu|V2b}rgb00ny{T0anKb<~zXlfd!kBgr1{2`q26hgl-4~(Y- zIOE}SB`S!12jZ{k^cGJZjDwb?gkj&hhg&_J_8Jp5yS4@LY&LKgJ#N`2yC5mkUp`B!yB>_>KrCnt)q8wu(GqhN0Xg z`qkJU=;!oiJr3su_*@dk!}w>25A(cGIQKK(5&kWfi*3UHKzol1UxqmIVtvDS=3@O{ z1f2QriSx4+MbCJy6VB~OE8+7mN~SH*P53CplPP>G_3oMkGPH%@A7!HZKj+YCZzYA;;ZXQ;4I)7U~ zaDVTJ=(!&FO*r#kuv*gY?Dgbau1g8$`r&Tj?5| z4p$22IDAt$$NxvdnTI37*{*`s&(8zLZ7JdJV|lDDoOx?3ocXy$ILFlk!r3nm3-3@c zif_K~Uf6$lUO313>%zGly)T@{*PjdLI6nx^{<;y{yHld)??)-vufI5iZR450LzM)l z&nT>iuMvIJ+C<_;(XY!JebYho9B;jZceyCiXNu3ms9>7tv+_k>JS&{b^$X6&hVpi6 zU?_av3fsH7P{coXdP~{B2qzAS|2G)_KZzdlME;u5C;D?dUnZRKmlw|QkROKTgHvls zg59PB`vtN@d8fC}2rq%%f#iC_cw6YIiM|7-YY88P={mv}V7k8Ww=j*$*e5zhUhMZ&qiw?R1f z=MMmllSp0K~@d46?@aGvj7E}ZA9KM>CI>W75$e0~bXk$r71{ytJgIDg-1 zE1bU{^%u_Hr=|$!?_bM>^Y^$9g!A{oL&EtxBcFf5`1$*673`Oh^LOO7!uh*-f8qRn ze~NHk&#+uLub22hIIq(shNnPL8DGHYnR!2?ES(=UR92Mo=mAOyjWhVM>J-!p8;kj$YWo}t6CGi$Z! z(5>dk?2LN`VY=VYdut8P8a6yLEBgV|o!S5HzF8SVGO-r<|G%Y%S#43~ekYxp;lsf0 zB+)w-`?Jt4H?Xd3c9ujRW?@5kKXyFrGBcYu1v*?dl-y4>j^T`N6NwF|_xiIW`j9Hq zw!dqhI)9=^Bpk;LCgw}UJKySu4_3d8xAO|-&t335n&5so>9yg*h1#Ejf0&#Fp|#(J zs3L;cOL<8AfZp_bO)F|Z5OUw3BsB9!N` zoJLdst+g;OH2+@gSk~r@cvtORfnO;8-RY5%^IQD351{dn2uwW#N)(!Fe-nu-qqnnv zRXaI+qs+t=F#iEu4@v{ojt^g4DE^d;NXhk<#a}qQH2y~eGbP&@J|@dWE28%~#R2ff z`uT4A;}@EL0S?HrWWnHkd|w?if1wRgg*={&rq1Px^S_Gu`90qoY~ZK!-#H)Y=J3JB zr7nM*Kb1nfGk?VU!Uyxz`ETD4Dblfhh^EfvpVPLQx={bs?i)qQ=bKso*(q|?&-K@Z z>NfA!-nYNuyrOk_C^il&gqO}=ATa5oK*DqIK1;qOPD}inKRdm2q4`q>M#@8x&Dp;? G|NjAPa4O~i literal 0 HcmV?d00001 diff --git a/omc/plat/iptrans/obj/iptrmain.o b/omc/plat/iptrans/obj/iptrmain.o new file mode 100644 index 0000000000000000000000000000000000000000..9fe40bbacb92b90da7d86c215a38034c6536e4d1 GIT binary patch literal 15504 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 +#include + +#define MAXFD 64 + +/*@ignore@*/ +int +InitDaemon(void) +{ + pid_t pid; + + if ( (pid = fork()) < 0) + return FAILURE; + else if (pid != 0) + exit(0); /* parent goes bye-bye */ + /* child continues */ + setsid(); /* become session leader */ +// chdir("/"); /* change working direactory */ + umask(0); /* clear our file mode creation mask */ + return SUCCESS; +} + + +void +DaemonInit(const char *pname, int facility) +{ + int i; + pid_t pid; + + if ( (pid = fork()) < 0) /* parent terminates */ + err_sys("%s: %s: fork (%d)", + FILE_MACRO, FUNCTION_MACRO, LINE_MACRO); + else if (pid != 0) + exit(0); /* parent goes bye-bye */ + + /* 41st child continues */ + setsid(); /* become session leader */ + + signal(SIGHUP, SIG_IGN); + + if ( (pid = fork()) < 0) /* 1st child terminates */ + err_sys("%s: %s: fork (%d)", + FILE_MACRO, FUNCTION_MACRO, LINE_MACRO); + else if (pid != 0) + exit(0); /* 1st child goes bye-bye */ + + +// chdir("/"); /* change working directory */ + + umask(0); /* clear our file mode creation mask */ + + for (i = 0; i < MAXFD; i++) + close(i); + + openlog(pname, LOG_PID, facility); +} +/*@end@*/ diff --git a/omc/plat/iptrans/src/error.c b/omc/plat/iptrans/src/error.c new file mode 100644 index 0000000..65670c6 --- /dev/null +++ b/omc/plat/iptrans/src/error.c @@ -0,0 +1,114 @@ +#include +#include /* for definition of errno */ +#include /* ANSI C header file */ +#include +#include "./include/iptrans.h" + +static void err_doit(int, const char *, va_list); + +char *pname = NULL; /* caller can set this from argv[0] */ + +/* +** Nonfatal error related to a system call. +** Print a message and return. +*/ + +/*@ignore@*/ +void +err_ret(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + err_doit(1, fmt, ap); + va_end(ap); + return; +} + +/* +** Fatal error related to a system call. +** Print a message and terminate. +*/ + +void +err_sys(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + err_doit(1, fmt, ap); + va_end(ap); + exit(1); +} + +/* +** Fatal error related to a system call. +** Print a message, dump core, and terminate. +*/ + +void +err_dump(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + err_doit(1, fmt, ap); + va_end(ap); + abort(); /* dump core and terminate */ + exit(1); /* shouldn't get here */ +} + +/* +** Nonfatal error unrelated to a system call. +** Print a message and return. +*/ + +void +err_msg(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + err_doit(0, fmt, ap); + va_end(ap); + return; +} + +/* +** Fatal error unrelated to a system call. +** Print a message and terminate. +*/ + +void +err_quit(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + err_doit(0, fmt, ap); + va_end(ap); + exit(1); +} + +/* +** Print a message and return to caller. +** Caller specifies "errnoflag". +*/ + +static void +err_doit(int errnoflag, const char *fmt, va_list ap) +{ + int errno_save; + char buf[MAXLINE]; + + errno_save = errno; /* value caller might want printed */ + vsprintf(buf, fmt, ap); + if (errnoflag) + sprintf(buf+strlen(buf), ": %s", strerror(errno_save)); + strcat(buf, "\n"); + fflush(stdout); /* in case stdout and stderr are the same */ + fputs(buf, stderr); + fflush(NULL); /* flushes all stdio output streams */ + return; +} +/*@end@*/ diff --git a/omc/plat/iptrans/src/errorlog.c b/omc/plat/iptrans/src/errorlog.c new file mode 100644 index 0000000..3778645 --- /dev/null +++ b/omc/plat/iptrans/src/errorlog.c @@ -0,0 +1,131 @@ +/* Error routines for programs that can run as a daemon. */ + +#include /* for definition of errno */ +#include /* ANSI C header file */ +#include +#include "./include/iptrans.h" + +static void log_doit(int, int, const char *, va_list ap); + +int debug=1; /* caller must define and set this: + nonzero if interactive, zero if daemon */ + +int under_develop=1; /* caller must define and set this: + nonzero if under develop, zero if not */ + + +/*@ignore@*/ +/* Initialize syslog(), if running as daemon. */ +void +log_open(const char *ident, int option, int facility) +{ + if (debug == 0) + openlog(ident, option, facility); +} + +/* +** Nonfatal error related to a system call. +** Print a message with the system's errno value and return. +*/ + +void +log_ret(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + log_doit(1, LOG_ERR, fmt, ap); + va_end(ap); + return; +} + +/* +** Fatal error related to a system call. +** Print a message and terminate. +*/ + +void +log_sys(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + log_doit(1, LOG_ERR, fmt, ap); + va_end(ap); + exit(2); +} + +/* +** Nonfatal error unrelated to a system call. +** Print a message and return. +*/ + +void +log_msg(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + log_doit(0, LOG_ERR, fmt, ap); + va_end(ap); + return; +} + +/* +** Debug message unrelated to a system call. +** Print a message and return while . +*/ + +void +log_debug(const char *fmt, ...) +{ + va_list ap; + + if (!under_develop) return; + va_start(ap, fmt); + log_doit(0, LOG_ERR, fmt, ap); + va_end(ap); + return; +} + +/* +** Fatal error unrelated to a system call. +** Print a message and terminate. +*/ + +void +log_quit(const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + log_doit(0, LOG_ERR, fmt, ap); + va_end(ap); + exit(2); +} + +/* +** Print a message and return to caller. +** Caller specifies "errnoflag" and "priority". +*/ + +static void +log_doit(int errnoflag, int priority, const char *fmt, va_list ap) +{ + int errno_save; + char buf[MAXLINE]; + + errno_save = errno; /* value caller might want printed */ + vsprintf(buf, fmt, ap); + if (errnoflag) + sprintf(buf+strlen(buf), ": %s", strerror(errno_save)); + strcat(buf, "\n"); + if (debug) { + fflush(stdout); + fputs(buf, stderr); + fflush(stderr); + } else + syslog(priority, buf); + return; +} +/*@end@*/ diff --git a/omc/plat/iptrans/src/generate_iptrans b/omc/plat/iptrans/src/generate_iptrans new file mode 100644 index 0000000..056375c --- /dev/null +++ b/omc/plat/iptrans/src/generate_iptrans @@ -0,0 +1,3 @@ +#!/bin/bash + +gcc -o iptrans iptrmain.c -L../lib/ -liptrans -L../../debug/lib -ldebug -lcurses -L../../snmp/lib -lsnmp -L../../public/lib -lpublic -lm diff --git a/omc/plat/iptrans/src/include/.copyarea.db b/omc/plat/iptrans/src/include/.copyarea.db new file mode 100644 index 0000000..9718762 --- /dev/null +++ b/omc/plat/iptrans/src/include/.copyarea.db @@ -0,0 +1,12 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\iptrans\src\include +2 +8 +a:iptrfunc.h|1|11d70a3f6bf|7a|61ee278e|e1096920bfa411dc851a001c23e19543|0 +8:errlog.h|1|11d70a3f76b|538|fbdb8e2b|e2c96974bfa411dc851a001c23e19543|0 +8:dbsync.h|1|11d70a3f72c|39e|e3790e4e|e2396958bfa411dc851a001c23e19543|0 +7:debug.h|1|11d70a3f6ee|3d8|2f1d1a9c|e199693cbfa411dc851a001c23e19543|0 +9:iptrans.h|1|11d70a3f5c5|1ba8|babffb23|de0968b0bfa411dc851a001c23e19543|0 +a:function.h|1|11d70a3f671|d35|d1703d82|e0696904bfa411dc851a001c23e19543|0 +8:config.h|1|11d70a3f652|20a|3e469456|dfd968e8bfa411dc851a001c23e19543|0 +a:includes.h|1|11d70a3f604|39f|d85a1d82|df3968ccbfa411dc851a001c23e19543|0 diff --git a/omc/plat/iptrans/src/include/config.h b/omc/plat/iptrans/src/include/config.h new file mode 100644 index 0000000..ec8e6d2 --- /dev/null +++ b/omc/plat/iptrans/src/include/config.h @@ -0,0 +1,23 @@ +/* +** PACS-WLL 2000 project, Prepaid System. +** +** The module Copyright (C) 2000-2001 interWAVE Inc. +** Written completely by Zhang Shuzhong at iCRD January, 2001 +** +** module name: config.h +** CVS $Id: config.h,v 1.2 2001/01/11 04:07:56 zhangsz Exp $ +** +** configuration of Prepaid System. +** +*/ + +#ifndef CONFIG__H +#define CONFIG__H + +#define HAVE_FUNCTION_MACRO 1 +#define HAVE_FILE_MACRO 1 +#define HAVE_TIME_MACRO 1 +#define HAVE_DATE_MACRO 1 +#define HAVE_LINE_MACRO 1 + +#endif /* endof CONFIG__H */ diff --git a/omc/plat/iptrans/src/include/dbsync.h b/omc/plat/iptrans/src/include/dbsync.h new file mode 100644 index 0000000..87b822e --- /dev/null +++ b/omc/plat/iptrans/src/include/dbsync.h @@ -0,0 +1,37 @@ +/* +** PACS-WLL 2000 project, Prepaid System. +** +** The module Copyright (C) 2000-2001 interWAVE Inc. +** Written completely by Zhang Shuzhong at iCRD January, 2001 +** +** file name: dbsync.h +** CVS $Id: dbsync.h,v 1.2 2001/02/08 10:53:33 zhangsz Exp $ +** +** Defination for Database Synchronization (dbsync.c). +*/ + +#ifndef DBSYNC__H +#define DBSYNC__H + +#include "iptrans.h" + +#define DS_PORT_NO 4959 /* Prepaid service port */ +#define DS_PORT_ID DS_PORT_NO - PORT_BASE_NUM + +#define DS_SHM_KEY 0x80000000 +#define DS_SHM_PERM 0664 +#define DS_MSG_TYPE "D0" +#define DS_DBNAME_MAX_LEN 14 +#define DS_SQLSCRIPT_MAX_LEN MAX_CONTENT_LEN-DS_DBNAME_MAX_LEN-2 + +typedef struct _dbsync_msg { + char type[2]; + char db_name[DS_DBNAME_MAX_LEN]; + char sql_script[DS_SQLSCRIPT_MAX_LEN]; +} _dbsync_msg; + +typedef struct ds_shm { + char time_created[15]; +} ds_shm; + +#endif /* DBSYNC__H */ diff --git a/omc/plat/iptrans/src/include/debug.h b/omc/plat/iptrans/src/include/debug.h new file mode 100644 index 0000000..c14b2f5 --- /dev/null +++ b/omc/plat/iptrans/src/include/debug.h @@ -0,0 +1,53 @@ +/* +** PACS-WLL 2000 project, Prepaid System. +** +** The module Copyright (C) 2000-2001 interWAVE Inc. +** +** Written completely by Zhang Shuzhong at iCRD January, 2001 +** +** file name: debug.h +** CVS $Id: debug.h,v 1.2 2001/01/20 19:58:49 zhangsz Exp $ +** +** The debug information defination. +** +*/ + +#ifndef DEBUG__H +#define DEBUG__H +#include "config.h" + +#define UNDER_DEVELOP 1 +#define DEBUG 1 + +/* If we have these macros, we can add additional info to the header. */ +#ifdef HAVE_FILE_MACRO +#define FILE_MACRO (__FILE__) +#else +#define FILE_MACRO ("") +#endif + +#ifdef HAVE_FUNCTION_MACRO +#define FUNCTION_MACRO (__FUNCTION__) +#else +#define FUNCTION_MACRO ("") +#endif + +#ifdef HAVE_DATE_MACRO +#define DATE_MACRO (__DATE__) +#else +#define DATE_MACRO ("") +#endif + +#ifdef HAVE_TIME_MACRO +#define TIME_MACRO (__TIME__) +#else +#define TIME_MACRO ("") +#endif + +#ifdef HAVE_LINE_MACRO +#define LINE_MACRO (__LINE__) +#else +#define LINE_MACRO ("") +#endif + +#endif /* DEBUG__H */ diff --git a/omc/plat/iptrans/src/include/errlog.h b/omc/plat/iptrans/src/include/errlog.h new file mode 100644 index 0000000..5e084bf --- /dev/null +++ b/omc/plat/iptrans/src/include/errlog.h @@ -0,0 +1,39 @@ +/* +** Error and log proccess functions header file, +** to be included *after* all standard system headers +** +** CVS: $Id: errlog.h,v 1.2 2001/01/11 04:03:57 zhangsz Exp $ +*/ + +#ifndef ERRLOG__H +#define ERRLOG__H + +#include /* required for some of our prototypes */ +#include /* for convenience */ +#include /* for convenience */ +#include /* for convenience */ +#include /* for convenience */ + + /* default file access permissions for new files */ +#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) + + /* default permissions for new directories */ +#define DIR_MODE (FILE_MODE | S_IXUSR | S_IXGRP | S_IXOTH) + +#define log_flag() \ + log_debug("%s: %s: %d", FILE_MACRO, FUNCTION_MACRO, LINE_MACRO) + +void err_dump(const char *, ...); /* {App misc_source} */ +void err_msg(const char *, ...); +void err_quit(const char *, ...); +void err_ret(const char *, ...); +void err_sys(const char *, ...); + +void log_debug(const char *, ...); /* {App misc_source} */ +void log_msg(const char *, ...); /* {App misc_source} */ +void log_open(const char *, int, int); +void log_quit(const char *, ...); +void log_sys(const char *, ...); +void log_ret(const char *, ...); + +#endif /* ERRLOG__H */ diff --git a/omc/plat/iptrans/src/include/function.h b/omc/plat/iptrans/src/include/function.h new file mode 100644 index 0000000..7a243af --- /dev/null +++ b/omc/plat/iptrans/src/include/function.h @@ -0,0 +1,127 @@ +/* +** CVS: $Id: function.h,v 1.6 2001/02/08 10:53:33 zhangsz Exp $ +** +** function.h +** Created at 2000/07/23 +** public domain code by Zhang Shuzhong +** +** Description: Header file of function definations. +*/ + +#ifndef FUNCTION__H +#define FUNCTION__H + +#define DisplayContent(buf, bcd_buf, nbytes) \ + BcdToAscii(buf, bcd_buf, 2 * nbytes); \ + FormatOutput(buf, 2*nbytes, 2, ' '); \ + log_debug("packets contains (%s):\n%s", FUNCTION_MACRO, buf); + +#define BzeroContent(content, length) \ + bzero(content+length, MAX_CONTENT_LEN-length); + +#define WriteOutBuffer WriteToOutBuffer + +#define WriteToOutBuffer(PROG_NAME, ip_semid, poutbuf, pbuf) \ + SemLock(PROG_NAME, ip_semid, PORT_NUM, 1, IPC_NOWAIT); \ + WriteMsg((in_buffer *) poutbuf, pbuf, OUT_LIST_NUM); \ + SemUnlock(PROG_NAME, ip_semid, PORT_NUM, 1, IPC_NOWAIT); \ + SemUnlock(PROG_NAME, ip_semid, SEM_NUM-1, 1, IPC_NOWAIT); + +#define ReadInBuffer ReadFromInBuffer + +#define ReadFromInBuffer(PROG_NAME, ip_semid, port_id, pinbuf, pbuf) \ + SemLock(PROG_NAME, ip_semid, port_id, 1, IPC_NOWAIT); \ + ReadMsg((in_buffer *) pinbuf, pbuf, IN_LIST_NUM); \ + SemUnlock(PROG_NAME, ip_semid, port_id, 1, IPC_NOWAIT); \ + +int InitDaemon(void); /* Initialize a daemon process */ + +void +SetTermSignal(struct termio *ptermio, void (*handler)(int)); + +/* Initialize a daemon process */ +void DaemonInit(const char *pname, int); + +/* passive a socket handler, from comfunc.c */ +int passivesock( const char * transport, u_short portbase, int qlen); + +/* passive a UDP socket handler, from comfunc.c */ +int passiveUDP(u_short portbase); + +/* Fill string 'c' into last area of 'str'. */ +void StringCat(char *str, char *c, int slen); + +int ByteLength(BYTE *bcd, int c); + +/* Cut string while match character c. */ +void StringCut(char *str, int c); + +void Bstr2Hstr(char *cptr); + +void bitstring(char *str, long byze, int biz, int strwid); + +/* Binary string convert to int. */ +unsigned int Bstr2Int(char *cptr); + +/* Hex string convert to int. */ +unsigned int Hstr2Int(char *cptr); + +/* Get current hour */ +int gethour(char * hour_buf); +int getweek(char * week_buf); + +/* Get current hour */ +int getmin(char * min_buf); + +/* Convert data from ASCII form to left-aligned compact BCD form. */ +void AsciiToBcd (BYTE *bcd_buf, const char *ascii_buf, int len); + +/* Convert data from left-aligned compact BCD form to ASCII form. */ +void BcdToAscii (char *ascii_buf, const BYTE *bcd_buf, int len); + +/* Convert data from ASCII form to right-aligned compact BCD form. */ +void AsciiToRbcd (BYTE *bcd_buf, const char *ascii_buf, int len); + +const char * +getdaytime(char *daytime_buf); + +char *GetASCTime(char *timep); + +void * +ShmInit(int shm_id, char *prog_name, key_t key, int size, int shmflg); + +int +SemInit(char *prog_name, key_t key, int sem_num, int sem_flg); + +BOOL +SemLock(char *prog_name, int sem_id, int sem_num, + unsigned nsops, int sem_flg); + +BOOL +SemUnlock(char *prog_name, int sem_id, int sem_num, + unsigned nsops, int sem_flg); + +BOOL +ReadMsg(void *pbuf, void *pmsg, int max_num); + +BOOL +WriteMsg(void *pbuf, void *pmsg, int max_num); + +const char * +Inet_ntoa(const long addr); + +const long +Inet_pton(const char *sp); + +char * +FormatOutput(char *sp, size_t, int, int); + +void +ByteReverse(BYTE *p1, BYTE *p2, size_t size); +void +SafeFree(void *pmem); + +void +GetAsciiField(char *dest, BYTE *src, size_t n); + +#endif diff --git a/omc/plat/iptrans/src/include/includes.h b/omc/plat/iptrans/src/include/includes.h new file mode 100644 index 0000000..b342ed5 --- /dev/null +++ b/omc/plat/iptrans/src/include/includes.h @@ -0,0 +1,47 @@ +/* +** CVS $Id: includes.h,v 1.3 2001/02/08 10:53:33 zhangsz Exp $ +** includes.h +** Created at 2000-10-17 +** by Zhang SZ. +** Include all header files of PACS-WLL 2000 Project. +*/ + +#ifndef INCLUDES__H +#define INCLUDES__H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "public.h" +#include "function.h" +#include "errlog.h" +#include "debug.h" + +#ifndef NO_CONFIG_H +#include "config.h" +#endif + +#endif /* INCLUDES__H */ + diff --git a/omc/plat/iptrans/src/include/iptrans.h b/omc/plat/iptrans/src/include/iptrans.h new file mode 100644 index 0000000..0eef4c7 --- /dev/null +++ b/omc/plat/iptrans/src/include/iptrans.h @@ -0,0 +1,201 @@ +/* +** +** +** file name: +** +** header file include by IP transceiver. +** defination of shared memory structure. +** +*/ + +#ifndef IPTRANS__H +#define IPTRANS__H + +#include "../../../public/src/include/includes.h" +#include "../../../public/src/include/public.h" +#include "../../../public/src/include/pub_fmt.h" +#include "errlog.h" +#include "debug.h" + +#ifndef NO_CONFIG_H +#include "config.h" +#endif + +#define IN_LIST_NUM 200 /* list number of in_buffer that + can store in the buffer space + */ +#define DS_LIST_NUM IN_LIST_NUM +#define OUT_LIST_NUM 1024 /* list number of out_buffer that + can store in the buffer space + */ +#define PORT_IN_NUM 24 /* number of in port defined */ +#define PORT_DS_NUM 1 /* number of port to database sync process */ +#define PORT_OUT_NUM 1 /* number of out port defined */ +#define PORT_NUM PORT_IN_NUM /* pre-defined port number */ + +/* Port service */ +#define PORT_BASE_NUM 4950 /* minimum port number */ +#define MAX_CONTENT_LEN 1514 + +/* IP transceiver shared memory ipc key and permission */ +#define IPTRANS_SHM_KEY 0x60000000 +#define IPTRANS_SHM_PERM 0777 +#define IPTRANS_DEBUG_SHM 0x61610000 +#define IPTRANS_DEBUG_PERM 0664 + +/* IP transceiver semaphore ipc key and permission */ +#define RELEASE 1 /* release semaphore */ +#define ACQUIRE -1 /* acquire semaphore */ +#define MAX_STATISTICS_SEG 96 + +#define _msg_list message_list +typedef struct message_list { + unsigned int msgSrcIP; //long msgSrcIP; /* ip number of source host */ + u_short msgSrcPort; /* port of source host */ + unsigned int msgDstIP; //long msgDstIP; /* ip number of Destination host */ + u_short msgDstPort; /* port of Destination host */ + int msgBroadcast; /* message sent with broadcast mode, + 0(default)/1=no/yes. + */ + u_short msgLength; /* message's length */ + BYTE msgContent[MAX_CONTENT_LEN]; /* message of packet received */ +} message_list; + +typedef struct ds_msg { + unsigned int msgSrcIP; //long msgSrcIP; /* ip number of source host */ + u_short msgSrcPort; /* port of source host */ + unsigned int msgDstIP; //long msgDstIP; /* ip number of Destination host */ + u_short msgDstPort; /* port of Destination host */ + int msgBroadcast; /* message sent with broadcast mode, + 0(default)/1=no/yes. + */ + u_short msgLength; /* message's length */ + char msgContent[MAX_CONTENT_LEN]; /* message of packet received */ +} db_msg; + +typedef struct ds_buffer { + u_short msgReadSub; /* subscript of array msgList for reader */ + u_short msgWriteSub; /* subscript of array msgList for writer */ + db_msg msgList[DS_LIST_NUM]; /* message list buffer */ +} ds_buffer; + +#define _in_buffer in_buffer +typedef struct in_buffer { + u_short msgReadSub; /* subscript of array msgList for reader */ + u_short msgWriteSub; /* subscript of array msgList for writer */ + message_list msgList[IN_LIST_NUM]; /* message list buffer */ +} in_buffer; + +#define _out_buffer out_buffer +typedef struct out_buffer { + u_short msgReadSub; /* subscript of array msgList for reader */ + u_short msgWriteSub; /* subscript of array msgList for writer */ + message_list msgList[OUT_LIST_NUM]; /* message list buffer */ +} out_buffer; + +#define _port_stat port_stat +typedef struct port_stat { + + short portStatus; /* port status: + 0=idle 1=normal -1=abnormal + */ + DWORD inPackets; /* number of packets received */ + DWORD inBytes; + DWORD outPackets; /* number of packets sent */ + DWORD outBytes; + DWORD errorPackets; /* number of error packets received */ +} port_stat; + +/* +#define _port_stat port_stat +typedef struct port_stat{ + port_stat_15m port_stat_static[PORT_NUM]; +}port_stat; +*/ + +typedef struct debug_info +{ + DWORD debug_status_id[20]; + BYTE debug_status; + DWORD debug_ascin_id[20]; + DWORD debug_ascout_id[20]; + DWORD debug_name_id[20]; + DWORD debug_page_title[20]; + DWORD debug_page_line[20]; + BYTE title0_p[1024]; + BYTE title1_p[1024]; + BYTE title2_p[1024]; + BYTE title3_p[1020]; + char iptr_asciin_buf[4096]; + char iptr_asciout_buf[4096]; + BYTE port_onoff[PORT_NUM]; + BYTE port_status[PORT_NUM]; //overflow + BYTE resettimer[4]; + DWORD logflag; + DWORD srclog; + DWORD dstlog; +}debug_info; + + +typedef struct port_configure +{ + BYTE port_config[PORT_NUM]; +}port_configure; + +typedef struct iptrans_cdr_rec +{ + DWORD inPackets; + DWORD inBytes; + DWORD outPackets; + DWORD outBytes; + DWORD errorPackets; +}iptrans_cdr_rec; + +typedef struct iptrans_cdr_period +{ + iptrans_cdr_rec cdr_record[PORT_NUM]; +}iptrans_cdr_period; + +typedef struct snmp_info +{ + BYTE process_conf; + BYTE version[3]; + //port_configure port_conf; + //PORT STATUS ; debug_info.port_status + iptrans_cdr_period iptrans_cdr[96]; +}snmp_info; + +#define _iptrans_shm iptrans_shm +typedef struct iptrans_shm { /* type defination of IP transceiver + shared memory + */ + in_buffer msgPortIn[PORT_NUM]; /* message in_buffer defination, + a port buffer attach only a + application module. + */ + out_buffer msgPortOut; + out_buffer msgPlatPortOut; +} iptrans_shm; + +typedef struct _iptrans_status +{ + port_stat msgPortStat[PORT_NUM]; + debug_info debug_msg; + snmp_info snmp_data; +}iptrans_status; + +int iptrans_init(); +void iptrans_timer(); +int iptrMainInit(); +int iptrGetMessage(message_list *msgGet, int port); +int iptrDirectRecvMsg(message_list *msgGet, u_short port); +int iptrPutMessage(message_list msgPut); +int iptrDirectSendMsg(message_list msgPut); +int iptrPlatPutMessage(message_list msgPut); +int set_iptrans(BYTE oidlen, DWORD *oid, BYTE *pdata, WORD datalen); +int get_iptrans(BYTE oidlen, DWORD *oid, BYTE *pdata, WORD *vartype); +int trap_iptrans(BYTE oidlen, DWORD *oid_ptr, BYTE *msg_ptr, BYTE msg_len); +int CloseTcpConn(); +extern void *iptrShmInit(int shm_id, char *prog_name, key_t key, int size, int shmflg); + +#endif /* IPTRANS__H */ diff --git a/omc/plat/iptrans/src/include/iptrfunc.h b/omc/plat/iptrans/src/include/iptrfunc.h new file mode 100644 index 0000000..398c992 --- /dev/null +++ b/omc/plat/iptrans/src/include/iptrfunc.h @@ -0,0 +1,9 @@ + +#ifndef _IPTR_FUNCTION +#define _IPTR_FUNCTION + +int init_iptrans(); +void iptr_timer_IRQ(); +void iptrans_close(); + +#endif diff --git a/omc/plat/iptrans/src/ipcfunc.c b/omc/plat/iptrans/src/ipcfunc.c new file mode 100644 index 0000000..a4f89e2 --- /dev/null +++ b/omc/plat/iptrans/src/ipcfunc.c @@ -0,0 +1,93 @@ +/* +** CVS $Id: ipcfunc.c,v 1.4 2001/01/20 19:58:49 zhangsz Exp $ +** +** ipcfunc.c +** created at 2000/12/20 +** by Zhang SZ +** +** IPC functions for PACS-WLL project. +** +*/ + +#include "./include/iptrans.h" + +/*@ignore@*/ +void * +iptrShmInit(int shm_id, char *prog_name, key_t key, int size, int shmflg) +{ +void *retp; +char *func_name = "ShmInit"; + + shm_id = shmget(key, size, shmflg); + if (shm_id == -1) + { + log_sys("%s: %s: shmget(key: %x)", prog_name, func_name, key); + return NULL; + } + + retp = shmat(shm_id, (char *)0, 0); + if (retp == (void *) -1) + { + log_sys("%s: %s: shmat", prog_name, func_name); + return NULL; + } + + return retp; +} + +int +iptrSemInit(char *prog_name, key_t key, int sem_num, int sem_flg) +{ +int initarray[sem_num]; +int sem_id, retval, i; +char *func_name = "SemInit"; + + sem_id = semget(key, sem_num, sem_flg); + if (sem_id == -1) + log_sys("%s: %s: semget", prog_name, func_name); + for (i=0; i +#include "./include/iptrans.h" + +static iptrans_shm *IPTRANS_shm_ptr; +static int IPTRANS_shm_id; + +/*@ignore@*/ +int iptransCreate() +{ + IPTRANS_shm_ptr = (iptrans_shm *)ShmInit(IPTRANS_shm_id,"iptrans",IPTRANS_SHM_KEY, + sizeof(iptrans_shm),IPTRANS_SHM_PERM | IPC_CREAT); +} + +int GetMessage(message_list *msgGet,int port_in) +{ + int port; + port=port_in-PORT_BASE_NUM; + if(IPTRANS_shm_ptr->msgPortIn[port].msgReadSub != + IPTRANS_shm_ptr->msgPortIn[port].msgWriteSub) + { + memcpy(msgGet, + &IPTRANS_shm_ptr->msgPortIn[port].msgList[IPTRANS_shm_ptr->msgPortIn[port].msgReadSub], + sizeof(struct message_list)); + IPTRANS_shm_ptr->msgPortIn[port].msgReadSub++; + if(IPTRANS_shm_ptr->msgPortIn[port].msgReadSub==IN_LIST_NUM) + IPTRANS_shm_ptr->msgPortIn[port].msgReadSub=0; + return 1; + } + return 0; + +} + +int PutMessage(message_list msgPut) +{ + memcpy(&IPTRANS_shm_ptr->msgPortOut.msgList[IPTRANS_shm_ptr->msgPortOut.msgWriteSub], + &msgPut, sizeof(struct message_list)); + IPTRANS_shm_ptr->msgPortOut.msgWriteSub ++; + if(IPTRANS_shm_ptr->msgPortOut.msgWriteSub==OUT_LIST_NUM) + IPTRANS_shm_ptr->msgPortOut.msgWriteSub=0; + return 0; +} + +int clearPort(int port_in) +{ + int port; + port=port_in-PORT_BASE_NUM; + IPTRANS_shm_ptr->msgPortIn[port].msgReadSub=0; + IPTRANS_shm_ptr->msgPortIn[port].msgWriteSub=0; + return 1; +} +/*@end@*/ diff --git a/omc/plat/iptrans/src/iptrans.c b/omc/plat/iptrans/src/iptrans.c new file mode 100644 index 0000000..7e52b13 --- /dev/null +++ b/omc/plat/iptrans/src/iptrans.c @@ -0,0 +1,1864 @@ +/* +** PACS-WLL 2000 project, Prepaid System. +** +** The module Copyright (C) 2000-2001 interWAVE Inc. +** Written completely by Zhang Shuzhong at iCRD January, 2001 +** +** file name: iptrans.c +** CVS: $Id: iptrans.c,v 1.9 2001/02/09 08:53:43 zhangsz Exp $ +** +** Description: IP transceiver common module of PACS-WLL Project. +** +*/ +#include /* ANSI C header file */ +#include +#include +#include + +#include "../../debug/src/include/debug.h" +#include "./include/iptrans.h" +#include "./include/dbsync.h" + +/*@ignore@*/ +#define PROG_NAME "iptrans" +#define OID_IPTRANS 1 +#define IPTR_DEBUG_ID 0 +#define BASE_ID_LEN 15 +#define MAX_DEBUG_MESSAGES 1 +#define MAX_TELNET_TIME (10*100*3600) +#define MAX_MULTICAST_TIME (100*60*2000) //TWO MINUTES + +#define TELNET_PORT 15 + +#define TYPE_UDP 0 +#define TYPE_TCP 1 + +#define ACCESS_BUFFERED 0 +#define ACCESS_DIRECT 1 + +int port_convert_flag = 0; + +typedef struct _PORT_STATUS +{ + unsigned short portno; + int sockfd; + unsigned char type; /*0/1/2/=UDP/TCP/MULITICAST*/ + unsigned char capability; /*0-6*/ + unsigned char buffered; /*whether buffered or not*/ + int connfd; + DWORD peerip; + int peerport; + int recvcounter; + //int sendcounter; + unsigned char convert_flag; + unsigned short real_portno; +}PORT_STATUS; + +PORT_STATUS port_status[PORT_NUM]; +iptrans_status iptransInfo; + +extern int debug; /* defined in errorlog.c */ +extern int under_develop; /* defined in errorlog.c */ +static int iptrans_shm_id; +static int iptrans_sem_id; +static struct termio prev_termio; +static iptrans_shm *iptrans_shm_ptr; +static DWORD IPTRANS_OID_PREFIX[]={1,3,6,1,4,1,1373,1,3,2,2,1}; +static BYTE IPTRANS_VERSION[3]={0x08,0x03,0x01}; +static int nowPeriod,lstPeriod=0; +static DWORD startTime[96]; +static int sendcounter; +extern int errno; + +u_char warningFlag = 0x01; + + +socklen_t clilen; +struct sockaddr_in cliaddr; + +const BYTE IPTR_PAGE_POINT = 14; +const BYTE IPTR_LINE_POINT = 15; +static BYTE *disp_ptr ; + +static u_short parportadd = 0x37a; +static u_char iptr_led_bit = 2; +static int debug_messages=0; + +int SetAsciioutMsg(int flag, const char *fmt, ...); +static char *iptrGetASCTime(); +static char *iptrFormatOutput(); +/*----------------------------------------------------*/ +int GetRealPortID(unsigned short port) +{ + int retval = -1; + int loop; + + for(loop=0;loop msgPortIn[loop]; + pstat=(port_stat *) &iptransInfo.msgPortStat[loop]; + + if(port_status[loop].type == TYPE_TCP) + { + Receive_TCP(loop,pbuf,pstat); + continue; + } + + nbytes = recvfrom(port_status[loop].sockfd, &bcd_buf, MAX_CONTENT_LEN, + 0, (struct sockaddr *) &sin, &len); + if (nbytes < 0) { + continue; + } + port=loop+PORT_BASE_NUM; + msgbuf.msgSrcIP = sin.sin_addr.s_addr; + msgbuf.msgSrcPort = ntohs(sin.sin_port); + srcport = msgbuf.msgSrcPort-PORT_BASE_NUM; + msgbuf.msgDstPort = port; + msgbuf.msgLength = nbytes; + msgbuf.msgBroadcast = NO; + memcpy(msgbuf.msgContent,bcd_buf,nbytes); + + iptrSemLock(PROG_NAME, iptrans_sem_id, 1, 1, IPC_NOWAIT); + /* write to buffer and statistics of packets. */ + if(! iptrWriteMsg(pbuf,&msgbuf,list_num)) + { + iptransInfo.debug_msg.port_status[loop] ++; + //SendHeartbeat(); + continue; + } + pstat->portStatus = 1; + pstat->inPackets ++; + pstat->inBytes += nbytes; + + iptransInfo.snmp_data.iptrans_cdr[nowPeriod].cdr_record[loop].inPackets ++; + iptransInfo.snmp_data.iptrans_cdr[nowPeriod].cdr_record[loop].inBytes +=nbytes; + iptrSemUnlock(PROG_NAME, iptrans_sem_id, 1, 1, IPC_NOWAIT); + + +#if UNDER_DEVELOP + if(debug_messages>=MAX_DEBUG_MESSAGES) continue; + if(iptransInfo.debug_msg.logflag == 0x00) + continue; + if(iptransInfo.debug_msg.logflag != 0xffffffff) + { + if(iptransInfo.debug_msg.srclog !=0) + { + flag = iptransInfo.debug_msg.srclog; + if((flag>>srcport) !=0x01) + continue; + } + if(iptransInfo.debug_msg.dstlog !=0) + { + flag = iptransInfo.debug_msg.dstlog; + if((flag>>loop) !=0x01) + continue; + } + } + showlen = nbytes; + if(showlen>256) showlen = 256; + debug_messages++; + SetAsciioutMsg(1, + "Read Subscript: %03d Write Subscript: %03d Port: %d\r\n", + pbuf->msgReadSub, pbuf->msgWriteSub, msgbuf.msgSrcPort); + if (ds_flag == NO) { + BcdToAscii(buf, msgbuf.msgContent, 2*showlen); + iptrFormatOutput(buf, 2*showlen, 2, ' '); + } else { + memcpy(buf, msgbuf.msgContent, nbytes); + buf[nbytes] = 0; + } + SetAsciioutMsg(0,"Current time: %s\r\n", iptrGetASCTime(NULL)); + SetAsciioutMsg(0, + "got packet from %s %d #%d\r\n", + (char *)inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), i); + SetAsciioutMsg(0, + "packet is %d bytes (chars) long, contains:\r\n%s\r\n", nbytes, buf); + i++; +#endif + + } /* loop */ + +} +/* end of RecvMessage -------------------*/ + +int Receive_TCP(int port,in_buffer *pbuf,port_stat *pstat) +{ + int nbytes,len,i,j; + struct sockaddr_in sin; + message_list msgbuf; + + len = sizeof(struct sockaddr); + if(port_status[port].connfd<=0 ) return 0; + + nbytes = recvfrom(port_status[port].connfd, + msgbuf.msgContent, + MAX_CONTENT_LEN, + 0, + (struct sockaddr *) &sin, + &len); + if(nbytes<0){ + return 0; + } + if(nbytes==0){ + //if(errno==ENOTSOCK || errno==ENOTCONN) + { + CloseTcpConn(port); + } + return 0; + } +// fprintf(stderr,"connfd[%d]: Recv bytes:%d Client IP:%08x\n", +// port+BASE_PORT_NUM, nbytes,peerip[port]); + + msgbuf.msgSrcIP = sin.sin_addr.s_addr; + msgbuf.msgSrcPort = ntohs(sin.sin_port); + + msgbuf.msgDstPort = port+PORT_BASE_NUM; + msgbuf.msgLength = nbytes; + msgbuf.msgBroadcast = NO; + + iptrWriteMsg(pbuf, &msgbuf, IN_LIST_NUM); + pstat->portStatus = 1; + pstat->inPackets ++; + pstat->inBytes +=nbytes; + + if(strncasecmp(msgbuf.msgContent,"exit",4)==0) + CloseTcpConn(port); + else if(msgbuf.msgContent[0]=='q' || + msgbuf.msgContent[0] =='Q') + CloseTcpConn(port); + +#if UNDER_DEVELOP1 + msgbuf.msgContent[nbytes] = 0; + for(i=0;imsgPortOut; + else + pbuf = (out_buffer *)&iptrans_shm_ptr->msgPlatPortOut; + if(pbuf->msgReadSub == pbuf->msgWriteSub) continue; + else{ + iptrReadMsg(pbuf, (message_list *) &msgbuf, OUT_LIST_NUM); + port_id = msgbuf.msgSrcPort - PORT_BASE_NUM; + if (port_id<0 || port_id>=PORT_NUM) + { + if(port_convert_flag) + { + port_id = GetRealPortID(msgbuf.msgSrcPort); + if(port_id<0) + continue; + } + continue; + } + + sin.sin_addr.s_addr = msgbuf.msgDstIP; + sin.sin_port = htons(msgbuf.msgDstPort); + dstport = msgbuf.msgDstPort - PORT_BASE_NUM; + len = msgbuf.msgLength; + memcpy(bcd_buf, msgbuf.msgContent, len); + + broadcast_message = msgbuf.msgBroadcast; + if (broadcast_message) { + ret = setsockopt(port_status[port_id].sockfd, SOL_SOCKET, + SO_BROADCAST, + &broadcast_message, sizeof(broadcast_message)); + if (ret < 0) + log_ret("%s: %s: setsockopt", PROG_NAME, FUNCTION_MACRO); + } + if(port_status[port_id].type == TYPE_TCP) + { + if(port_status[port_id].connfd<=0) continue; + ret = send(port_status[port_id].connfd, + &msgbuf.msgContent, len, MSG_NOSIGNAL); + } + else + { + ret = sendto(port_status[port_id].sockfd, &bcd_buf, len, 0, + (struct sockaddr *)&sin, sizeof(sin)); + + } + if (ret < 0) { + iptransInfo.msgPortStat[port_id].portStatus = -1; + iptransInfo.msgPortStat[port_id].errorPackets ++; + } + else if (port_id >= 0 && port_id < PORT_NUM) { + iptransInfo.msgPortStat[port_id].outPackets ++; + sendlen = iptransInfo.msgPortStat[port_id].outBytes; + iptransInfo.msgPortStat[port_id].outBytes = sendlen + len; + + iptransInfo.snmp_data.iptrans_cdr[nowPeriod].cdr_record[port_id].outPackets ++; + iptransInfo.snmp_data.iptrans_cdr[nowPeriod].cdr_record[port_id].outBytes +=len; + } + +#if UNDER_DEVELOP + if(debug_messages>=MAX_DEBUG_MESSAGES) continue; + if(iptransInfo.debug_msg.logflag == 0x00000000) + continue; + if(iptransInfo.debug_msg.logflag != 0xffffffff) + { + if(iptransInfo.debug_msg.srclog !=0) + { + flag = iptransInfo.debug_msg.srclog; + if((flag>>port_id) !=0x01) + continue; + } + if(iptransInfo.debug_msg.dstlog !=0) + { + flag = iptransInfo.debug_msg.dstlog; + if((flag>>dstport) !=0x01) + continue; + } + } + showlen = len; + if(showlen>256) showlen = 256; + debug_messages++; + SetAsciioutMsg(1, + "Read Subscript: %d Write Subscript: %d Port: %d\r\n", + pbuf->msgReadSub, pbuf->msgWriteSub, msgbuf.msgSrcPort); + if (msgbuf.msgDstPort != DS_PORT_NO) { + BcdToAscii(buf, bcd_buf, 2*(showlen)); + iptrFormatOutput(buf, 2*showlen, 2, ' '); + } else + memcpy(buf, bcd_buf, showlen); + SetAsciioutMsg(0,"Current time: %s\r\n", iptrGetASCTime(NULL)); + SetAsciioutMsg(0,"Sent packet to %s %d #%d\r\n", + (char *)inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), i); + SetAsciioutMsg(0, + "packet is %d bytes long, contains:\r\n%s\r\n", len, buf); + i ++; +#endif + } + } /* loop */ +} + +/* end of SendMessage() ----------------------*/ + +int CloseTcpConn(int index){ + close(port_status[index].connfd); + port_status[index].connfd = -1; + port_status[index].peerip = 0; + port_status[index].peerport = 0; + return 1; +} + +int CloseAllMulticastPort() +{ + int i; + for(i=28;i msgPortIn[TELNET_PORT]; + iptrWriteMsg(pbuf, &ipmsg, IN_LIST_NUM); +} + +int TcpConnectCheck(int index) +{ + int timeout=20; + int connfdtmp=0;// + char welcome[128]={"Welcome to enter debug world! (^_^) \n\r"}; + char timeout_prompt[128]={"You have stayed too long\n\r telnet again please!\n\r"}; + + //if(port_status[index].connfd<=0 ) + { + memset(&cliaddr,0,(clilen=sizeof(struct sockaddr))); + connfdtmp = accept(port_status[index].sockfd, + //port_status[index].connfd = accept(port_status[index].sockfd, + (struct sockaddr *)&cliaddr,&clilen); + if(connfdtmp<=0) return 0;// + if(port_status[index].connfd>0)// + { + + sprintf(welcome, + "\n\rSorry! %s:%d has connected to the server\n\r", + (char *)inet_ntoa(cliaddr.sin_addr), + ntohs(cliaddr.sin_port)); + send(port_status[index].connfd,welcome,strlen(welcome),MSG_NOSIGNAL); + + sprintf(welcome, + "your connection is cut, bye bye!\n\r"); + send(port_status[index].connfd,welcome,strlen(welcome),MSG_NOSIGNAL); + + CloseTcpConn(index); + } +/* + if(port_status[index].connfd<=0){ + return 0; + } +*/ + port_status[index].connfd = connfdtmp; // + if(port_status[index].connfd>0) + { + port_status[index].peerip = cliaddr.sin_addr.s_addr; + port_status[index].peerport = ntohs(cliaddr.sin_port); + fcntl(port_status[index].connfd,F_SETFL,O_NONBLOCK); + if(setsockopt(port_status[index].connfd,SOL_SOCKET,SO_KEEPALIVE, + &timeout,sizeof(timeout)) !=0){ + fprintf(stderr,"set keepalive failed\n"); + } + if(setsockopt(port_status[index].connfd,SOL_SOCKET,SO_KEEPALIVE, + &timeout,sizeof(timeout)) !=0){ + fprintf(stderr,"set keepalive failed\n"); + } + send(port_status[index].connfd,welcome,strlen(welcome),MSG_NOSIGNAL); + if(index==TELNET_PORT) + PutEscToApp(); + } + } + + return 1; +} +/*--------------------------------------------*/ +int iptrDirectRecvMsg(message_list *msgbuf,unsigned short port) +{ + int index,len,nbytes; + BYTE bcd_buf[MAX_CONTENT_LEN]; + struct sockaddr_in sin; + port_stat *pstat; + + index = port - PORT_BASE_NUM; + if(index<0 || index>=PORT_NUM) + { + return -1; + } + + if(port_status[index].buffered == ACCESS_BUFFERED) + { + return iptrGetMessage(msgbuf,port); + } + + if(port_status[index].recvcounter++>128) + { + return -1; + } + + pstat = &iptransInfo.msgPortStat[index]; + len = sizeof(struct sockaddr); + + if(port_status[index].type == TYPE_TCP) + { + if(port_status[index].connfd<=0) return-1; + + nbytes = recvfrom(port_status[index].connfd, + msgbuf->msgContent, + MAX_CONTENT_LEN, + 0, + (struct sockaddr *) &sin, + &len); + if(nbytes<0){ + return nbytes; + } + if(nbytes==0){ + //if(errno==ENOTSOCK || errno==ENOTCONN) + { + CloseTcpConn(port); + } + return -1; + } + + msgbuf->msgSrcIP = sin.sin_addr.s_addr; + msgbuf->msgSrcPort = ntohs(sin.sin_port); + + msgbuf->msgDstPort = index+PORT_BASE_NUM; + msgbuf->msgLength = nbytes; + msgbuf->msgBroadcast = NO; + + pstat->portStatus = 1; + pstat->inPackets ++; + pstat->inBytes +=nbytes; + + if(strncasecmp(msgbuf->msgContent,"exit",4)==0) + CloseTcpConn(index); + else if(msgbuf->msgContent[0]=='q' || + msgbuf->msgContent[0] =='Q') + CloseTcpConn(index); + return nbytes; + }else{ + nbytes = recvfrom(port_status[index].sockfd, + msgbuf->msgContent, MAX_CONTENT_LEN, + 0, (struct sockaddr *) &sin, &len); + if (nbytes < 0) { + return nbytes; + } + msgbuf->msgSrcIP = sin.sin_addr.s_addr; + msgbuf->msgSrcPort = ntohs(sin.sin_port); + msgbuf->msgDstPort = port; + msgbuf->msgLength = nbytes; + msgbuf->msgBroadcast = NO; + + pstat->portStatus = 1; + pstat->inPackets ++; + pstat->inBytes += nbytes; + + iptransInfo.snmp_data.iptrans_cdr[nowPeriod].cdr_record[index].inPackets ++; + iptransInfo.snmp_data.iptrans_cdr[nowPeriod].cdr_record[index].inBytes +=nbytes; + return nbytes; + } + +} + +int iptrDirectSendMsg(message_list msgbuf) +{ + int len, port_id,ret,sendlen; + int broadcast_message=0; + struct sockaddr_in sin; + + if(sendcounter++>128) return 0; + + port_id = msgbuf.msgSrcPort - PORT_BASE_NUM; + if (port_id<0 || port_id>=PORT_NUM) + { + if(port_convert_flag) + { + port_id = GetRealPortID(msgbuf.msgSrcPort); + if(port_id<0) + return 0; + } + else + return 0; + } + + if(port_status[port_id].buffered == ACCESS_BUFFERED) + { + return iptrPutMessage(msgbuf); + } + + len = 0; + bzero(&sin.sin_zero, sizeof(sin.sin_zero)); + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = msgbuf.msgDstIP; + sin.sin_port = htons(msgbuf.msgDstPort); + len = msgbuf.msgLength; + broadcast_message = msgbuf.msgBroadcast; + + if (broadcast_message) { + ret = setsockopt(port_status[port_id].sockfd, SOL_SOCKET, + SO_BROADCAST, + &broadcast_message, sizeof(broadcast_message)); + if (ret < 0) + log_ret("%s: %s: setsockopt", PROG_NAME, FUNCTION_MACRO); + } + if(port_status[port_id].type == TYPE_TCP) + { + if(port_status[port_id].connfd<=0) return 0; + ret = send(port_status[port_id].connfd, + &msgbuf.msgContent, len, MSG_NOSIGNAL); + }else{ + ret = sendto(port_status[port_id].sockfd, msgbuf.msgContent, len, 0, + (struct sockaddr *)&sin, sizeof(sin)); + + } + if (ret < 0) { + iptransInfo.msgPortStat[port_id].portStatus = -1; + iptransInfo.msgPortStat[port_id].errorPackets ++; + } + else if (port_id >= 0 && port_id < PORT_NUM) { + iptransInfo.msgPortStat[port_id].outPackets ++; + sendlen = iptransInfo.msgPortStat[port_id].outBytes; + iptransInfo.msgPortStat[port_id].outBytes = sendlen + len; + + iptransInfo.snmp_data.iptrans_cdr[nowPeriod].cdr_record[port_id].outPackets ++; + iptransInfo.snmp_data.iptrans_cdr[nowPeriod].cdr_record[port_id].outBytes +=len; + } + + return 1; +} + + +/*------------------------------------------------*/ +int iptrGetMessage(message_list *msgGet,int port_in) +{ + int port=0; + u_short readSub, writeSub; + in_buffer *pbuf; + port=port_in-PORT_BASE_NUM; + if(port<0 || port>=PORT_NUM) return 0; + + pbuf = &iptrans_shm_ptr->msgPortIn[port]; + readSub = pbuf->msgReadSub%IN_LIST_NUM; + writeSub = pbuf->msgWriteSub; + if(readSub == writeSub) return 0; + memcpy(msgGet, + &pbuf->msgList[readSub], + sizeof(struct message_list));//msgPut.msgLength+44); + pbuf->msgReadSub = (pbuf->msgReadSub+1) % IN_LIST_NUM; + return 1; + +} + +int iptrPutMessage(message_list msgPut) +{ + out_buffer *pbuf; + static int reflag=0; + + if(reflag == 1){ + iptransInfo.debug_msg.port_status[10] ++; + return 0; + } + reflag = 1; + pbuf = &iptrans_shm_ptr->msgPortOut; + + pbuf->msgWriteSub = (pbuf->msgWriteSub) % OUT_LIST_NUM; + memcpy(&pbuf->msgList[pbuf->msgWriteSub], + &msgPut, + sizeof(struct message_list));//msgPut.msgLength+44); + pbuf->msgWriteSub = (pbuf->msgWriteSub+1) % OUT_LIST_NUM; + reflag = 0; + return 1; +} + +int iptrPlatPutMessage(message_list msgPut) +{ + out_buffer *pbuf; + static int reflag = 0; + if(reflag == 1){ + iptransInfo.debug_msg.port_status[11] ++; + return 0; + } + reflag = 1; + pbuf = &iptrans_shm_ptr->msgPlatPortOut; + pbuf->msgWriteSub = (pbuf->msgWriteSub) % OUT_LIST_NUM; + + memcpy(&pbuf->msgList[pbuf->msgWriteSub], + &msgPut, + sizeof(struct message_list));//msgPut.msgLength+44); + pbuf->msgWriteSub = (pbuf->msgWriteSub+1) % OUT_LIST_NUM; + reflag = 0; + return 1; +} + +/*--------------------------------------------*/ +void iptrans_timer() +{ + int i; + static int count = 0; + struct timeval tmnow; + message_list msgbuf; + + debug_messages = 0; + sendcounter = 0; + + for(i=0;i=0){ + msgbuf.msgSrcPort = 4966; + iptrDirectSendMsg(msgbuf); + } +*/ + ReadAsciin(); + + if(count++==1000) + { + count = 0; + SendHeartbeat(); + + nowPeriod = GetNowPeriod(); + if(nowPeriod != lstPeriod) + { + gettimeofday(&tmnow,NULL); + startTime[nowPeriod] = tmnow.tv_sec; + lstPeriod = nowPeriod; + memset(&iptransInfo.snmp_data.iptrans_cdr[nowPeriod],0,PORT_NUM*20); + } + + } + +} + +int InitMulticastPort() +{ + int i,port; + struct sockaddr_in sin_addr; + char ip3,ip[16]; + + for(i=28;i0) + { + if((mcast_join(sock,(struct sockaddr *)&saddr,sizeof(struct sockaddr),NULL,0))<0) + { + fprintf(stderr,"mcast_join failed\n"); + return -7; + } + } + return sock; + } + + + +int init_monitor() +{ + BYTE page; + BYTE *ptr; + + iptransInfo.debug_msg.debug_status = 1; + iptransInfo.debug_msg.debug_status_id[0] =1; + iptransInfo.debug_msg.debug_status_id[1] = 3; + iptransInfo.debug_msg.debug_status_id[2] = 6; + iptransInfo.debug_msg.debug_status_id[3] = 1; + iptransInfo.debug_msg.debug_status_id[4] = 4; + iptransInfo.debug_msg.debug_status_id[5] = 1; + iptransInfo.debug_msg.debug_status_id[6] = 1373; + iptransInfo.debug_msg.debug_status_id[7] = 1; + iptransInfo.debug_msg.debug_status_id[8] = 1; + iptransInfo.debug_msg.debug_status_id[9] = 2; + iptransInfo.debug_msg.debug_status_id[10] = 3; + iptransInfo.debug_msg.debug_status_id[11] = 1; + iptransInfo.debug_msg.debug_status_id[12] = 2; + iptransInfo.debug_msg.debug_status_id[13] = 2; + iptransInfo.debug_msg.debug_status_id[14] = 1; + + iptransInfo.debug_msg.debug_name_id[0] =1; + iptransInfo.debug_msg.debug_name_id[1] = 3; + iptransInfo.debug_msg.debug_name_id[2] = 6; + iptransInfo.debug_msg.debug_name_id[3] = 1; + iptransInfo.debug_msg.debug_name_id[4] = 4; + iptransInfo.debug_msg.debug_name_id[5] = 1; + iptransInfo.debug_msg.debug_name_id[6] = 1373; + iptransInfo.debug_msg.debug_name_id[7] = 1; + iptransInfo.debug_msg.debug_name_id[8] = 1; + iptransInfo.debug_msg.debug_name_id[9] = 2; + iptransInfo.debug_msg.debug_name_id[10] = 3; + iptransInfo.debug_msg.debug_name_id[11] = 1; + iptransInfo.debug_msg.debug_name_id[12] = 2; + iptransInfo.debug_msg.debug_name_id[13] = 2; + iptransInfo.debug_msg.debug_name_id[14] = 2; + + iptransInfo.debug_msg.debug_ascin_id[0] =1; + iptransInfo.debug_msg.debug_ascin_id[1] = 3; + iptransInfo.debug_msg.debug_ascin_id[2] = 6; + iptransInfo.debug_msg.debug_ascin_id[3] = 1; + iptransInfo.debug_msg.debug_ascin_id[4] = 4; + iptransInfo.debug_msg.debug_ascin_id[5] = 1; + iptransInfo.debug_msg.debug_ascin_id[6] = 1373; + iptransInfo.debug_msg.debug_ascin_id[7] = 1; + iptransInfo.debug_msg.debug_ascin_id[8] = 1; + iptransInfo.debug_msg.debug_ascin_id[9] = 2; + iptransInfo.debug_msg.debug_ascin_id[10] = 3; + iptransInfo.debug_msg.debug_ascin_id[11] = 1; + iptransInfo.debug_msg.debug_ascin_id[12] = 2; + iptransInfo.debug_msg.debug_ascin_id[13] = 2; + iptransInfo.debug_msg.debug_ascin_id[14] = 3; + + iptransInfo.debug_msg.debug_ascout_id[0] =1; + iptransInfo.debug_msg.debug_ascout_id[1] = 3; + iptransInfo.debug_msg.debug_ascout_id[2] = 6; + iptransInfo.debug_msg.debug_ascout_id[3] = 1; + iptransInfo.debug_msg.debug_ascout_id[4] = 4; + iptransInfo.debug_msg.debug_ascout_id[5] = 1; + iptransInfo.debug_msg.debug_ascout_id[6] = 1373; + iptransInfo.debug_msg.debug_ascout_id[7] = 1; + iptransInfo.debug_msg.debug_ascout_id[8] = 1; + iptransInfo.debug_msg.debug_ascout_id[9] = 2; + iptransInfo.debug_msg.debug_ascout_id[10] = 3; + iptransInfo.debug_msg.debug_ascout_id[11] = 1; + iptransInfo.debug_msg.debug_ascout_id[12] = 2; + iptransInfo.debug_msg.debug_ascout_id[13] = 2; + iptransInfo.debug_msg.debug_ascout_id[14] = 4; + + iptransInfo.debug_msg.debug_page_title[0] =1; + iptransInfo.debug_msg.debug_page_title[1] = 3; + iptransInfo.debug_msg.debug_page_title[2] = 6; + iptransInfo.debug_msg.debug_page_title[3] = 1; + iptransInfo.debug_msg.debug_page_title[4] = 4; + iptransInfo.debug_msg.debug_page_title[5] = 1; + iptransInfo.debug_msg.debug_page_title[6] = 1373; + iptransInfo.debug_msg.debug_page_title[7] = 1; + iptransInfo.debug_msg.debug_page_title[8] = 1; + iptransInfo.debug_msg.debug_page_title[9] = 2; + iptransInfo.debug_msg.debug_page_title[10] = 3; + iptransInfo.debug_msg.debug_page_title[11] = 1; + iptransInfo.debug_msg.debug_page_title[12] = 2; + iptransInfo.debug_msg.debug_page_title[13] = 2; + iptransInfo.debug_msg.debug_page_title[14] = 5; + iptransInfo.debug_msg.debug_page_title[15] = 1; + + iptransInfo.debug_msg.debug_page_line[0] =1; + iptransInfo.debug_msg.debug_page_line[1] = 3; + iptransInfo.debug_msg.debug_page_line[2] = 6; + iptransInfo.debug_msg.debug_page_line[3] = 1; + iptransInfo.debug_msg.debug_page_line[4] = 4; + iptransInfo.debug_msg.debug_page_line[5] = 1; + iptransInfo.debug_msg.debug_page_line[6] = 1373; + iptransInfo.debug_msg.debug_page_line[7] = 1; + iptransInfo.debug_msg.debug_page_line[8] = 1; + iptransInfo.debug_msg.debug_page_line[9] = 2; + iptransInfo.debug_msg.debug_page_line[10] = 3; + iptransInfo.debug_msg.debug_page_line[11] = 1; + iptransInfo.debug_msg.debug_page_line[12] = 2; + iptransInfo.debug_msg.debug_page_line[13] = 2; + iptransInfo.debug_msg.debug_page_line[14] = 1; + iptransInfo.debug_msg.debug_page_line[15] = 2; + iptransInfo.debug_msg.debug_page_line[16] = 1; + +sprintf(iptransInfo.debug_msg.title1_p,"%s", + " IPTRANS Version R9V0_01 Page 01\n\r\ + Port state \r\n\ + 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\r\n\ + Port Status\r\n\ + 4950-4965\r\n\ + 4966-4981\r\n\ +\ + Port Overflow\r\n\ + 4950-4965\r\n\ + 4966-4981\r\n\ + "); + +sprintf(iptransInfo.debug_msg.title2_p,"%s", + " IPTRANS Version R9V0_01 Page 02\n\r\ + Flow Statistics (PORT 4950 - 4965)\r\n\ + PortNo Received Sent Error\r\n\ + Packets Bytes Pakcets Bytes Packets\r\n\ + 4950\r\n\ + 4951\r\n\ + 4952\r\n\ + 4953\r\n\ + 4954\r\n\ + 4955\r\n\ + 4956\r\n\ + 4957\r\n\ + 4958\r\n\ + 4959\r\n\ + 4960\r\n\ + 4961\r\n\ + 4962\r\n\ + 4963\r\n\ + 4964\r\n\ + 4965" +); + +sprintf(iptransInfo.debug_msg.title3_p,"%s", + " IPTRANS Version R9V0_01 Page 03\n\r\ + Flow Statistics (PORT 4966 - 4981)\r\n\ + PortNo Received Sent Error\r\n\ + Packets Bytes Pakcets Bytes Packets\r\n\ + 4966\r\n\ + 4967\r\n\ + 4968\r\n\ + 4969\r\n\ + 4970\r\n\ + 4971\r\n\ + 4972\r\n\ + 4973\r\n\ + 4974\r\n\ + 4975\r\n\ + 4976\r\n\ + 4977\r\n\ + 4978\r\n\ + 4979\r\n\ + 4980\r\n\ + 4981" +); + debug_set_response(BASE_ID_LEN,iptransInfo.debug_msg.debug_status_id,&iptransInfo.debug_msg.debug_status,1); + debug_set_response(BASE_ID_LEN,iptransInfo.debug_msg.debug_name_id,"R9V0_01",8);//module name + debug_set_response(BASE_ID_LEN,iptransInfo.debug_msg.debug_ascin_id,iptransInfo.debug_msg.iptr_asciin_buf,4096);//ascii in buf + debug_set_response(BASE_ID_LEN,iptransInfo.debug_msg.debug_ascout_id,iptransInfo.debug_msg.iptr_asciout_buf,4096);//ascii out buf + + for (page = 1; page < 4; page ++) + { + switch (page) + { + case 1: + ptr = iptransInfo.debug_msg.title1_p; + break; + case 2://page 1 + ptr = iptransInfo.debug_msg.title2_p; + break; + case 3://page 2; + ptr = iptransInfo.debug_msg.title3_p; + break; + default: + break; + } + iptransInfo.debug_msg.debug_page_title[IPTR_PAGE_POINT] = 5 + page; + debug_set_response(BASE_ID_LEN+1,iptransInfo.debug_msg.debug_page_title,ptr,strlen(ptr)); + iptr_disp_page(page); + } + + return 1; +} + + +int iptr_disp_page(int page) +{ + BYTE disp_line; + BYTE disp_length; + + + iptransInfo.debug_msg.debug_page_line[IPTR_PAGE_POINT] = page + 5;//page + for (disp_line = 0; disp_line < 16; disp_line++) + { + disp_length = iptr_disp_line(page,disp_line); + iptransInfo.debug_msg.debug_page_line[IPTR_LINE_POINT] = disp_line + 5;//line + iptransInfo.debug_msg.debug_page_line[IPTR_LINE_POINT+1] = 2;//data pointer + debug_set_response(BASE_ID_LEN+2,iptransInfo.debug_msg.debug_page_line,disp_ptr,disp_length); + } + return 1; +} + + +int iptr_disp_line(int page, int line)//return display length,disp data ptr per line +{ + BYTE disp_length; + int loop; + + disp_length = 16; + + switch (page) + { + case 1: + switch(line) + { + case 0: + disp_ptr= (BYTE *)iptransInfo.debug_msg.port_onoff; + break; + case 1: + disp_ptr= (BYTE *)&iptransInfo.debug_msg.port_onoff[16]; + break; + case 2: + case 3: + disp_length = 0; + break; + case 4: + disp_ptr = (BYTE *)iptransInfo.debug_msg.port_status; + break; + case 5: + disp_ptr = (BYTE *)&iptransInfo.debug_msg.port_status[16]; + break; + default: + disp_length = 0; + break; + } + break; + case 2://page 2 + disp_ptr=(BYTE *) &iptransInfo.msgPortStat[line].inPackets; + disp_length =20; + break; + case 3://page 3 + disp_ptr=(BYTE *)&iptransInfo.msgPortStat[16+line].inPackets; + disp_length = 20; + break; + default: + disp_length = 0; + break; + } + + return disp_length; +} + +int ReadAsciin() +{ + int pageno,len; + char cmd[1024]={""}; + + len = strlen(iptransInfo.debug_msg.iptr_asciin_buf); + if(len==0) + { + return 0; + } + pageno = iptransInfo.debug_msg.iptr_asciin_buf[0]; + memcpy(cmd,&iptransInfo.debug_msg.iptr_asciin_buf[1],len-1); + + DecodeAsciin(pageno-1,cmd); + + memset(iptransInfo.debug_msg.iptr_asciin_buf,0,64); + return 1; +} + +int DecodeAsciin(int pageno, char *cmd) +{ + int res,port,no; + int srcport, dstport; + DWORD flag=0x01; + + switch(pageno) + { + case 0: + if((res=strcasecmp(cmd,"HELP"))==0) + { + sprintf(iptransInfo.debug_msg.iptr_asciout_buf, +"log help page\r\n\ +help : help for this page\r\n\ +set on portno=n: set port capability (n=0-6)\r\n\ +log all/none : log all message received or sent\r\n\ +log error on : if overflowed, point out which port overflowed\r\n\ +log error off : no message put, even port overflowed\r\n\ +log src portno : log message sent from port of portno\r\n\ +log dst portno : log message received from port of portno\r\n\ +log src portno1 and dst portno2 : log message from portno1 to portno2\r\n\ +"); + break; + } + else if((res=strcasecmp("LOG ALL",cmd))==0) + { + iptransInfo.debug_msg.logflag = 0xffffffff; + break; + } + else if((res=strcasecmp("LOG none",cmd))==0) + { + iptransInfo.debug_msg.logflag = 0x00; + break; + } + else if(strstr(cmd,"and dst 49") && strstr(cmd,"log src 49")) + { + srcport = atoi(&cmd[8]); + dstport = atoi(&cmd[21]); + if(srcport>=PORT_BASE_NUM+PORT_NUM || + dstport>=PORT_BASE_NUM+PORT_NUM) + break; + if(srcport=PORT_BASE_NUM+PORT_NUM) + break; + flag = 0x01; + iptransInfo.debug_msg.srclog = (flag<<(srcport-PORT_BASE_NUM)); + iptransInfo.debug_msg.logflag = 0xfffffffe; + break; + } + else if(strstr(cmd,"log dst 49")) + { + iptransInfo.debug_msg.srclog = 0x00; + dstport = atoi(&cmd[8]); + if(dstport=PORT_BASE_NUM+PORT_NUM) + break; + flag = 0x01; + iptransInfo.debug_msg.dstlog = (flag<<(dstport-PORT_BASE_NUM)); + iptransInfo.debug_msg.logflag = 0xfffffffe; + } + else if(strstr(cmd,"log error off")) + { + warningFlag = 0x00; + } + else if(strstr(cmd,"log error on")) + { + warningFlag = 0x01; + } + else if(strstr(cmd,"set on 49")) + { + dstport = atoi(&cmd[7]); + if(dstport=PORT_BASE_NUM+PORT_NUM) + { + sprintf(iptransInfo.debug_msg.iptr_asciout_buf, + "error port number, should be : 4950-4972!"); + break; + } + dstport -=PORT_BASE_NUM; + no = atoi(&cmd[12]); + if(no>=6) no = 6; + if(dstport == TELNET_PORT && no == 0) + { + sprintf(iptransInfo.debug_msg.iptr_asciout_buf, + "The WXC2 debug port cann't be closed!"); + break; + } + port_status[dstport].capability = no; + iptransInfo.debug_msg.port_onoff[dstport] = no; + + iptrSaveParameter(); + } + else{ + sprintf(iptransInfo.debug_msg.iptr_asciout_buf, + "error comamnd!"); + } + break; + case 1: + break; + case 2: + case 3: + if(strcasecmp(cmd,"C")==0) + { + ClearStatistics(pageno); + break; + } + if(strstr(cmd,"C 49") || strstr(cmd,"c 49")) + { + port = atoi(&cmd[2]); + if(port>=PORT_BASE_NUM && porttm_hour * 4) + (tmnow->tm_min)/15; + return nowP; +} + +int iptrans_initshm() +{ + + iptrans_shm_ptr = (iptrans_shm *) iptrShmInit(iptrans_shm_id, PROG_NAME, + IPTRANS_SHM_KEY, sizeof(iptrans_shm), IPTRANS_SHM_PERM|IPC_CREAT); + + if( NULL == iptrans_shm_ptr ) + { + printf("iptrans share memory fail.\n"); + exit(0); + } + + + memset(iptrans_shm_ptr, 0, sizeof(iptrans_shm)); + + return 1; +} + +int ConfigurePort() +{ + char confile[]={"./conf/iptrans.conf"}; + char s[80],s1[80],work[80]; + int loop,priority,len,type,direct=0; + unsigned char conf_state = 0xFF; + unsigned short port, realport; + char *off; + FILE *fpConf; + + fpConf = fopen(confile,"rb"); + if(fpConf==NULL) + { + printf("%s not found!\n",confile); + for(loop=0;loopsa_family) + { + case AF_INET:{ + struct ip_mreq mreq; + struct ifreq ifreq; + memcpy(&mreq.imr_multiaddr, + &((struct sockaddr_in *)sa)->sin_addr, + sizeof(struct in_addr)); + if(ifindex>0){ + if(if_indextoname(ifindex,ifreq.ifr_name)==NULL){ + // errno=ENXIO; + return(-1); + } + goto doioctl; + } + else if(ifname !=NULL){ + strncpy(ifreq.ifr_name,ifname,IFNAMSIZ); + doioctl: + if(ioctl(sockfd,SIOCGIFADDR,&ifreq)<0) + return (-1); + memcpy(&mreq.imr_interface.s_addr, + &((struct sockaddr_in *)&ifreq.ifr_addr)->sin_addr, + sizeof(struct in_addr)); + return (setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP, + &mreq,sizeof(mreq))); + } + else + mreq.imr_interface.s_addr=htonl(INADDR_ANY);// inet_addr(name); +// setsockopt(sockfd,IPPROTO_IP,IP_MULTICAST_IF,&flag,sizeof(flag)); + return (setsockopt(sockfd,IPPROTO_IP,IP_ADD_MEMBERSHIP, + &mreq,sizeof(mreq))); + } + default: + // errno=EPROTONOSUPPORT; + return(-1); + } +} + +int +mcast_set_loop(int sockfd, int onoff) +{ + u_char flag; + flag=onoff; + return (setsockopt(sockfd,IPPROTO_IP,IP_MULTICAST_LOOP, + &flag,sizeof(flag))); +} +/*@end@*/ diff --git a/omc/plat/iptrans/src/queuefunc.c b/omc/plat/iptrans/src/queuefunc.c new file mode 100644 index 0000000..5b45123 --- /dev/null +++ b/omc/plat/iptrans/src/queuefunc.c @@ -0,0 +1,133 @@ +/* +** CVS $Id: queuefunc.c,v 1.3 2001/02/08 10:53:33 zhangsz Exp $ +** +** filename: queuefunc.c +** created at 2000/12/29 +** by Zhang Shuzhong +** +** loop message queue operating functions. +** +*/ + +#include "./include/iptrans.h" + +extern u_char warningFlag; + +/*@ignore@*/ +/* Read a message from loop queue. */ +BOOL +iptrReadMsg(void *pbuf, void *pmsg, int max_num) +{ + in_buffer *p; + message_list *msg_ptr; + + p = (in_buffer *) pbuf; + msg_ptr = (message_list *) pmsg; +// memset(msg_ptr, EMPTY, sizeof(struct message_list)); + + /* + ** these are some messages not to be read + ** while subscript of read isn't equal to subscipt of write. + */ + if (p->msgReadSub == p->msgWriteSub) + return FAILURE; + + memcpy(msg_ptr, &p->msgList[p->msgReadSub], + p->msgList[p->msgReadSub].msgLength + 44); +/*message head length */ +// sizeof(struct message_list)); + /* + ** increase READ SUBSCRIPT after got a message, + ** set READ SUBSCRIPT to 0 while it equal to max_num. + */ + p->msgReadSub ++; + if (p->msgReadSub == max_num) + p->msgReadSub = 0; + return SUCCESS; +} + +/* Write a message to loop queue. */ +BOOL +iptrWriteMsg(void *pbuf, void *pmsg, int max_num) +{ + in_buffer *p; + message_list *msg_ptr; + int port; + p = (in_buffer *) pbuf; + msg_ptr = (message_list *) pmsg; + memcpy(&p->msgList[p->msgWriteSub], msg_ptr, + msg_ptr->msgLength + 44);//sizeof(struct message_list)); + + p->msgWriteSub ++; + + + /* + ** if write subscript more than max_num, + ** write subscript equal 0. + */ + if (p->msgWriteSub == max_num) + p->msgWriteSub = 0; + + /* + ** if message written successful, + ** Read subscript is same as Write subscript, + ** then Read subsrcipt add 1. + */ + if (p->msgReadSub == p->msgWriteSub) + { + (p->msgReadSub == max_num-1) ? + (p->msgReadSub = 0) : (p->msgReadSub ++); + if(warningFlag){ + port = msg_ptr->msgDstPort; + SetAsciioutMsg(1,"Warning! Port: %d overflowed!\r\n",port); + return 0; + } + } + return 1; +} + + +void +iptrByteRev(BYTE *pbuf, BYTE *p, size_t size) +{ + int i; + char ch; + + for (i=0; i> 4; + *pbuf <<= 4; + *pbuf &= ch; + } + memcpy(p, pbuf, size); +} + +void +iptrStrrev(char *sp) +{ + char ch; + ch = sp[0]; + sp[0] = sp[1]; + sp[1] = ch; +} + +void +iptrByteReverse(BYTE *pbuf, BYTE *p, size_t size) +{ + + int i; + char *sp=NULL, tmpbuf[3]; + + sp = (char *) malloc(4*size + 1); + bzero(p, size); + + for (i=0; i<2*size; i+=2) { + sprintf(tmpbuf, "%02x", *(pbuf++)); + tmpbuf[2]=0; + iptrStrrev(tmpbuf); + strncpy(sp+i, tmpbuf, 2); + } + AsciiToBcd(pbuf, sp, 4*size); + memcpy(p, pbuf, 2*size); + free(sp); +} +/*@end@*/ diff --git a/omc/plat/iptrans/src/readmsg.c b/omc/plat/iptrans/src/readmsg.c new file mode 100644 index 0000000..5fa77df --- /dev/null +++ b/omc/plat/iptrans/src/readmsg.c @@ -0,0 +1,189 @@ +/* +** PACS-WLL 2000 project, Prepaid System. +** +** The module Copyright (C) 2000-2001 interWAVE Inc. +** Written completely by Zhang Shuzhong at iCRD January, 2001 +** +** file name: iptrans.c +** CVS: $Id: iptrans.c,v 1.9 2001/02/09 08:53:43 zhangsz Exp $ +** +** Description: IP transceiver common module of PACS-WLL Project. +** +*/ + +#include "./include/iptrans.h" + +#define PROG_NAME "iptrans" + +extern int debug; /* defined in errorlog.c */ +extern int under_develop; /* defined in errorlog.c */ +static int iptrans_shm_id; +static int iptrans_sem_id; +static struct termio prev_termio; +static iptrans_shm *iptrans_shm_ptr; + +int GetMessage(message_list *msgGet,int port); +void PutMessage(message_list msgPut); + +/*@ignore@*/ +/* Set debug flag to control debug message print or not */ +void SetDebugFlag(void) +{ + debug = DEBUG; /* DEBUG defined in debug.h */ + under_develop = UNDER_DEVELOP; /* UNDER_DEVELOP defined in debug.h */ +} + +/* +** Handler of terminatation, +** process while received a signal from user. +*/ +static void Terminate(int sig) +{ +int retval, i; + + usleep(100000); + retval = (int) shmdt(0); + if (retval == -1) log_ret("%s: %s: shmdt", PROG_NAME, FUNCTION_MACRO); + retval = shmctl(iptrans_shm_id, IPC_RMID, NULL); + if (retval == -1) log_ret("%s: %s: shmctl", PROG_NAME, FUNCTION_MACRO); + retval = semctl(iptrans_sem_id, PORT_NUM, IPC_RMID, NULL); + if (retval == -1) log_ret("%s: %s: semctl", PROG_NAME, FUNCTION_MACRO); + exit(sig); +} + +int GetMessage(struct message_list *msgGet,int port) +{ + message_list msgSend; + if(iptrans_shm_ptr->msgPortIn[port].msgReadSub != iptrans_shm_ptr->msgPortIn[port].msgWriteSub) + { + memcpy(msgGet, + &iptrans_shm_ptr->msgPortIn[port].msgList[iptrans_shm_ptr->msgPortIn[port].msgReadSub], + sizeof(struct message_list)); + memcpy(&msgSend,msgGet,sizeof(struct message_list)); + PutMessage(msgSend); + fprintf(stderr,"Recv msg %d.\n",port+4951); + iptrans_shm_ptr->msgPortIn[port].msgReadSub ++; + if(iptrans_shm_ptr->msgPortIn[port].msgReadSub==IN_LIST_NUM) + iptrans_shm_ptr->msgPortIn[port].msgReadSub =0; + /* +fprintf(stderr,"iptrans state:\n port=%d\n packet in=%ld out=%ld errors=%ld %ld\n", + port, + iptrans_shm_ptr->msgPortStat[port].inPackets, + iptrans_shm_ptr->msgPortStat[port].outPackets, + iptrans_shm_ptr->msgPortStat[port].errorInPackets, + iptrans_shm_ptr->msgPortStat[port].errorOutPackets); +*/ + return 1; + } + else + { + return 0; + } +} + +void PutMessage(struct message_list msgPut) +{ + memcpy(&iptrans_shm_ptr->msgPortOut.msgList[iptrans_shm_ptr->msgPortOut.msgWriteSub], + &msgPut,sizeof(struct message_list)); + + iptrans_shm_ptr->msgPortOut.msgWriteSub ++; + if(iptrans_shm_ptr->msgPortOut.msgWriteSub==OUT_LIST_NUM) + iptrans_shm_ptr->msgPortOut.msgWriteSub=0; + +} + +void timer_IRQ() +{ + int i; + struct message_list msgList; + for(i=0;i<13;i++) + { + GetMessage(&msgList,i); + // PutMessage(msgList); + } + +} + + +void init_timer_interrupt(void) +{ + struct sigaction newact; + newact.sa_handler =timer_IRQ; + newact.sa_flags =0; + sigemptyset(&newact.sa_mask); + sigaction(SIGALRM,&newact,NULL); +} + +void setup_interval_timer(void) +{ + struct itimerval value; + value.it_interval.tv_sec =0; + value.it_interval.tv_usec =5*1000; + value.it_value =value.it_interval; + setitimer(ITIMER_REAL,&value,NULL); +} + +void init_timer() +{ + init_timer_interrupt(); + setup_interval_timer(); +} + +int +main(int argc, char *argv[]) +{ + +int err_flag = FALSE; +int test_mode = FALSE; +int ret; + SetDebugFlag(); + + /* + ** Get option from command line. + ** option 'd' is enable to run program with daemon mode. + */ + while ((ret = getopt(argc, argv, "dt")) != -1) + switch (ret) + { + case 'd': + /* Set daemon mode and open a syslog */ + DaemonInit(PROG_NAME, LOG_USER); + break; + case 't': + test_mode = TRUE; /* test mode: bind port 4950 to recvfrom */ + break; + case '?': + err_flag = TRUE; + } + if (err_flag) { + log_msg("Usage: %s -d -t \n", argv[0]); + log_msg(" -d with daemon mode"); + log_msg(" -t with test mode"); + exit(1); + } + + /* + ** Get shared memory block, + ** IPTRANS_SHM_KEY to be defined in iptrans.h. + */ + iptrans_shm_ptr = (iptrans_shm *) ShmInit(iptrans_shm_id, PROG_NAME, + IPTRANS_SHM_KEY, sizeof(iptrans_shm), IPTRANS_SHM_PERM|IPC_CREAT); + memset(iptrans_shm_ptr, 0, sizeof(iptrans_shm)); + + /* + ** Get semaphores ID used by shared memory block, + ** IPTRANS_SEM_KEY to be defined in iptrans.h. + */ + + SetTermSignal(&prev_termio, Terminate); + /* + ** Open socket handler for IP transceiver. + ** maxinum number is PORT_NUM. + */ + init_timer(); + while(1){ + usleep(1); + } + exit(0); +} +/*@end@*/ diff --git a/omc/plat/iptrans/src/signal.c b/omc/plat/iptrans/src/signal.c new file mode 100644 index 0000000..dc92737 --- /dev/null +++ b/omc/plat/iptrans/src/signal.c @@ -0,0 +1,33 @@ +/* +** PACS-WLL 2000 project, Prepaid System. +** +** The module Copyright (C) 2000-2001 interWAVE Inc. +** +** Written completely by Zhang Shuzhong at iCRD January, 2001 +** +** module name: signal.c +** CVS $Id: signal.c,v 1.2 2001/01/11 04:07:56 zhangsz Exp $ +** +** Signal functions +** +*/ + +#include "./include/iptrans.h" + +/* +** Set termination signal in a loop program, +** handler of function mostly deal with something, +** e.g. closing file handler, socket handler or free allocatied memory. +*/ +/*@ignore@*/ +void +SetTermSignal(struct termio *ptermio, void (*handler)(int)) +{ + ioctl(0, TCGETA, ptermio); + ptermio->c_cc[VINTR] = '\x03'; + ioctl(0, TCSETA, ptermio); + + signal(SIGINT, handler); + signal(SIGTERM, handler); +} +/*@end@*/ diff --git a/omc/plat/iptrans/src/simu_debug.c b/omc/plat/iptrans/src/simu_debug.c new file mode 100644 index 0000000..6dc082e --- /dev/null +++ b/omc/plat/iptrans/src/simu_debug.c @@ -0,0 +1,21 @@ +#include +#include +#include + +/*@ignore@*/ +int main() +{ + debug_init(); + init_iptrans(); + snmp_init(4957); +// heartbeat_init(0); + while(1) + { + debug_rt(); + snmp_timer(); + // heartbeat_timer(); + usleep(1); + } + return 1; +} +/*@end@*/ diff --git a/omc/plat/isdn/.copyarea.db b/omc/plat/isdn/.copyarea.db new file mode 100644 index 0000000..656fa72 --- /dev/null +++ b/omc/plat/isdn/.copyarea.db @@ -0,0 +1,9 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\isdn +2 +5 +3:doc|2|0|0|0|7014726b6cf311dd91c7001c23e19543|0 +2:ut|2|0|0|0|715472936cf311dd91c7001c23e19543|0 +3:src|2|0|0|0|70b4727f6cf311dd91c7001c23e19543|0 +8:Makefile|1|11d70a47c2c|b31|b248c01f|f04486166cf311dd91a5001c23e19543|0 +3:lib|2|0|0|0|c2f385b6339611dd80a0001c23e19543|0 diff --git a/omc/plat/isdn/Makefile b/omc/plat/isdn/Makefile new file mode 100644 index 0000000..41bc709 --- /dev/null +++ b/omc/plat/isdn/Makefile @@ -0,0 +1,98 @@ + +##----------------------------------------------------------## +## ## +## Universal Makefile for module template : V1.6.3 ## +## ## +## Created : Wei Liu 07/04/11 ## +## Revision: [Last]Wei Liu 07/07/07 ## +## ## +##----------------------------------------------------------## + +##---------------------------------------------------------------------## +##-------------------------------------- +## +## Project correlation(Customer define) +## +##-------------------------------------- + +## MODULE= [Module Name] +## TYPE = app/plat => Module Type + +## DBUG_FLAGS_ADD = [Module Define Gcc Flags for Debug ] +## DBUG_FLAGS_ADD = [Module Define Gcc Flags for Release] + +## BUILD = lib/exef => Output file format +## CFG = debug/release => Build Configuration + +## SRC_PATH = [Source file path] +## INC_PATH = [Include file path] +## APP_PATH = [App Module path] +## PLT_PATH = [Plat Module path] + +## PLT_LIB = [Needed plat lib for Link] => just for test or wxc2main +## APP_LIB = [Needed app lib for Link] => just for test or wxc2main +## LIB_ADD = [Needed Extend lib for Link] => just for test or wxc2main + +## PLT_LIB e.g. = haepub fsm mng proto kernel aif mgc mgcp sip rtp \ +## 8ecp bicc smpp xapp tcap mtp3 m2ua \ +## snmp iptrans debug sccp public +## +## APP_LIB e.g. = msc vlr ssf hlr ae pps mnp smsc vms aas +## LIB_ADD e.g. = -liba3a8 -lm + +## OBJ_ADD = [Extend third party object files needed] +## TEST_OBJ_PATH = [module object files Path for test ] => just for test +##---------------------------------------------------------------------## + +MODULE = isdn +TYPE = plat + +DBUG_FLAGS_ADD = +RELS_FLAGS_ADD = + +##Default commonly as below + +BUILD = lib +CFG = debug + + +PLT_LIB = + +APP_LIB = +LIB_ADD = + +SRC_PATH = ./src +INC_PATH = ./src/include +PLT_PATH = ../../plat +APP_PATH = ../../mss + +OBJ_ADD = +TEST_OBJ_PATH = + +PREPROC_CMD = +POSTPROC_CMD = + +##---------------------------------------------------------------------## +##-------------------------------------- +## +## Make configuration(Customer define) +## +##-------------------------------------- + +## CCFLAG_SWITCH = on/off => gcc flag show on/off +## COVER_NEED = yes/no => PTF cover report needed +## COVER_REPORT_PATH = [path ] => PTF cover report path + +CCFLAG_SWITCH = off +COVER_NEED = no +COVER_REPORT_PATH = ./output + +##---------------------------------------------------------------------## + + +##-------------------------------------- +## +## include makefile.rules (Do not change) +## +##-------------------------------------- +include Makefile.rules diff --git a/omc/plat/isdn/doc/.copyarea.db b/omc/plat/isdn/doc/.copyarea.db new file mode 100644 index 0000000..99b2e7d --- /dev/null +++ b/omc/plat/isdn/doc/.copyarea.db @@ -0,0 +1,5 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\isdn\doc +2 +1 +11:D-500014-0-10.doc|1|11d70a47f58|14d200|803a9bd5|fb948a666cf311dd91a5001c23e19543|0 diff --git a/omc/plat/isdn/doc/D-500014-0-10.doc b/omc/plat/isdn/doc/D-500014-0-10.doc new file mode 100644 index 0000000000000000000000000000000000000000..9973973417330aea459b718eda76136333a75f55 GIT binary patch literal 1364480 zcmeF42VfLc-oPgTQZT^=sDL^uVnott0xD-n0z^n52_OoDlueN|vPl37ielFT6!q-b z&wA=vPS18K_KsjZPfj?97{)H}AcFd39#rczw^0 zZ@90|Cz{`9wAMxYwJlzYafJ6``@|?SU=K~3!FE@6e{E}PlhEVYp9UvD6|9G^;iqU# zo76?q{sVKlpbchq)3l%AbZ)R7zJ|52nl>*^)BXhu;x%mx5OwEgCzinaTmGTVnH7&j zwiZ6AM2lqkAde~EM`=B@vXjbAno}^RKpk}cAK$gNHflt)w)dzggYiGrlLhE6LjW z_b9EH6k6wxo)@h>gr*+aN}I^}_wX$r|L>Pxiqi5pZ{Ihgw6{5B{aaDm zdd{2I7;WVGWWMF&{LW$j8N&DAJ}bTI`_tBFtv})4pAxNAbIJ4t(b_%i$Igw`R`Kos zvGRT3YLzbkQHggm6&t$3w;oF6M5XILcLR(?XoC-H71-7jQBYtQn%W{{?hr9ftpo_!;^ zL5Oqo9F=}6KNHcH1UdK1Cq^#+`~{y-EWLXKYxyP<;@bkb)}gweQvd< zUMJT2W=};*Vq&4EH6^ytQ|l@9lH@Gz#h#hOT92O5(p=rp6k9}O+&)&%@_5UeY8qun z(vn$ST3_Yy#>S?nq{R+SOB<1#o}4}`HdF2~&Qo7CuckgWHmj+$vRO_^SEme19z5Ld zl+yYNJtMCuN6s3o&N?zVeQ1!gCKct3i;Ye6i6TP^skKyO;h}I_Ym8#5F7@hV9ui@c zVJkT+n?K6TY;jF98H>#;t>gcqnyUKJW-0$z$-Ay{66^m-%x@&J9Iv;<<5k-=vh6IY z*sKW zW{=ffr%IGjJ%{${#jQfeI7G!roCPgSjSXIO5dr0+O06}Xxgp{n5?S0sRosJ9;)}`~ z8a*K*8yZ<;!&GELQsN6em7XR~eYpoCB&}#P;zXfMV|6 zNY5y5YN($tTZZbEm5J(=idlrZ)9}ddbfnyg!ohkxO{KL?gA0*`BUQx1+mY!A6)`d` z^vr3gY4RAJtf-}~uC!@>h^R+I7WGIKHL1ouU{HGaSVyW@M}$xCk!dPcWSdi8*;MLn zZbG%iQp4-vk!g`dpDxi8dC^ooqp7^QrWqGU?7>Uo$aEFy$ad0fnBtHW3VBRzL-}ky ztERN7skF{e68uZ4KDM?Yg#8>jII>$9wmBq)!p7b`P4(zVE>>R~D&?kGwwH3lEYWX@ zLkTfNL70Y_p4LuD7?wFyO2ScPgox8L!gk{{tZ=Ag-K>Da6{l%$?M7-C+|U#>A=l&e zmR5Q6u?q_bc5UR zLL&^T8=7)tN_>7xvx>dJYc!}-{N7MEFb%NX8yFTiG-U+h%o!6Rv8JW98<$~fLsLdt z)~xJol&&A0S&%t8MC7KuwHvu6}=86k?pG{eE|_@5Dm8KQF&YwBvS52;8EuQ{f)eD>VZrV1~O zq`F29sD^WhyP3w=?%fPyLk)}ZoX~$2GGz@ZNM1FdtX@l*?Y1rUM(@$5{RJDXF z*pa3+wi~NqjU&ZTOSbiiH6inEnqa#z8YVbWT(S`({hpTEP~~abUAu9r7AZ!Z*-+u3 z87d8CzRDY#DndxgG&&>ZUWv{|ykGwkEp0BX!7ik8=xwNM#xA7K<7>@%^~#1OUdUeBG9WC=#H?-8! zgYwX$t@oth{t8qSqxEXq+31M08S7YV^HoYsw9qk`8IIcfPmTQCn z>a8i)%S#)Ti>UEl@!3`;DG@V~&U~bBO0JptpeINi(p{;chZ{T!Iis+lMUF~0 zhSDpY@71LVuS&j7wTQgPEIA&bE9rQenhM_SDIY4g(Z2D*pyjWdfpRnobzA}#fL zJ$3YSgT*Yv5w;RnxNn5e7+f&!A-d0qi=p5xUQbhUb3?Lx+le(U&GS?>G|PaAbpNpq zj!T~v-69cW%jok+R(*x7QtZoHIn|jcTovOqUR1NfRA5yEMV2;*TGSdnD4O5qE&NWY zZop<#sWvy&co@^E^OQ4OQsWg9NRD^JxCor0;+IaM_saE5K8q2k^A!6mI_f& z!yg#!Ke@6(Ix^_2sWrX^GPY=#zm%J4()5ojTk4gXlu3_>{21MSBLiL;08nWm$(I&c zE=_en^dchzrT~_i$>F9obynFMs$u5ENIC_lTm_2kX)=bl!Ve21CgwGy#9E^SdQO&} zR9VBIOg*DRhuh)Cm{DwIL!Bs4Z0w2YGh(xnN2H|r8%iwwW%6Ow*8ers}pF1MFBVoxZ= zS5K=U?jbW`C#8%Wk{)XmhG8d` z(le3=r>Do}6({HA=mkwRGH{?5N?&HOSY)2^qk4`de768&)%f0t!)C;0XXa)wx;G@Y zAg3r#&s4rzda)jTjI!DyWwl-vS#tI~u^hT)MTToKY6VQzv=PI~*fk^{YYq^K;|o7d zgC-Vc#rl-a*yD&Ga$Ud4ylcuSrti@1k-zlO~u~RdqWFK!9!eC#KDeW>9B-W66 ztQ0?E4l?-VE5)puDjLhzEpMeFv9U!N1&sWf{KWLZO| zojU78IaujY!`_~HEK5dBC0~Y z+M9Y}mM_Wm;xwi4OGBu>N-8eX3!8<|Vwk2Qi)tRpkf_`xg$@VJb^5-N5MRxTWT}xI zT??NqO(98BT(vU7=3B>^kuztx`SNEdo3#5=60MBkH_Ylfwt%wn=sDImGecBG`iK## zf-`zlQW;}S(gaN!Q_Jkjn1+VghsT-?D?CYdaZ!#wGEKhqA!%uPdfMRR^g+(O!OQ@u z4ERnT<~x08+7QRlNhvb(BvqF#RhNC4QLh!JrwmU!(h-_C5e;Kh0n^V{(`AW?P%^sXa%CwD+)HLu+aqs;JUw zlo~aq+@9LfuqD-JQ9YuR#L51;C<#(7Nx1=|N7kV3g@PH8o5C-fua`IBKRl@w^tY)0 zO*dzZ*_2CHSMG~GVS;w|KSj^Sc8qv@qSwtE*j-E&afRWFJz|B~>8Zu(I)ne@qN=H( zrIA*hRn=NWVeOj*(O5m74i$wU6=pr|UL3p8vTtpmyxp01R&y&7EOdsJSWF}X3#P6$a zy`|c#w=B;KDKn8m0;$?eL2c%5!a&nBVN;S z`VPh>n$29VwV}%-du(pKr>>#Crrc5i>l;d1?$WCqK^_X;w~ArYgtSiW;x8cnh;9W@i*-$6|hVZeq<) zJu^SIU}AQ$akxY@%W)17j>|48=1!cJS6rAs(Rs(Q8JRf~bBd=q!<>l|YjBiMUVd@T z*lDq>YhgIU5nfcBQ9QXQR&12z7QW(+RpEMe-lWMnh0~1VC7${@jx!RoT=Ue4&dSYb z_t*txPXqjN?*r+PWonNk%yQ%3#G0wCsDYFcGDMLHVfdTuFWVUztc zz?iQtD~hDSXH@Aj=1gOscAb$Lh5<`!YH7>U*_cmWXc{!opJ233JSR;vX_**lvhv}} znGBd2tCy_4h*8d@$cWfCZseDEZv#;>J?qSn)QWz$HEwAZ0JT$yB?O7%&90i>XbgdA zOb_Zhp@t-X?7}XG|o#l(Xg7U~L#NG?@5sstE^ zF8_7ehKt8cf1~{B{6(#aRW}qSw2jK^P8lV&99brzDy$?geR^u8>=%&U8qzCrsKI7L z^RF-Z`oi}X$W@u7yOuv4tr1IV=IjRcqtmWC@m?>be{ynOp>a)vA-{6AbxKq6E@dGa zXjxykq9clvraDueoF@{nEmEvZ?k6$W+9t=9CP;3N%3FATOyQ`!_`HF6*BAbBhJ=Zn zcgyS3mPjhC^h&-&GLj#Wr%2F07rK_j6$NlOsTf&ZUv8DuqShZS98;UnW*#j}Y8lqD z;o_U~%E~`jJn=lyq1(!b7j~T%(;S_4I7dYbrR42$cbEDt<)0R*yoN6=tE?ntg_MG% zD`~3SPnC7=vTkQ2P3>Vw^rB+9tE8vTl27utcoN#QD;AzFSG~8Ob&{k+ql~gHUQ(aX zmRq)=$U0M{VWMNm zqfg!qg}0P@COy&^*H(lFE70QG63ngC$_vV@be=uwizOnnjJn-Uj+(yWygkZ(IYa4# zSl^;n(FWVU$sJ+}_b78}w35;G`3QfhS>8vdM2Zd1>%}6xl%RND@p$#@i`VxOB3_}) z*w#5Jb)c#n#9KRcqtRz)QagwTmslm1O2g_rh7VMAoE?+gwaKWVm4>NUq{fyjn~Ze1 z>q}MV*!G>xeZ;Gl;V;BvSNr^oc$9Q4DlLy(Za8^StN49O8sZ~PE&geeSkt0b@s}BO zzfO_R?JMh3i#e29Y_BZGXvye*H7Tv< zPqh>4*poU$v|s9|dZT8EYs;X0QiLarM}xNazAEk88;jIJQa33ZkT$JX>(eIR<>WwY zr5Rr@trMvirG}JNi{wk%DpFI5FO^zU)tL$8ENQCLi_$_Z*Q5>h`t1MIEyu@~R*7e5 z;r!X!qSh^*{R$G=E-3r)#AP!VwW{l9Qx`qea8#YN!V=o#-YvAwrTpYhsoEU#j=wAs zA1hu@zF#RCRdvuwyO)Svrc<^_Qzc}@tOqCU*3R9>PwHQIwxLMd43tzB%%BcaX8y~^b``H9nd6eqO3P*gT6ahjZ^%2@KQ z$|s@NGdrPeLS8QQ<_)K)tE83k+oi@q&-5$}N zgfrCrR4j5wiNnfSLR;(1SC`)FamrGp8I@LVv}D8z>Ww-s*=*TtyEVMG_|^HAHm)m* zuj-E_*y)HVJfiTcqNDO+r->~_r`gt16M_ARZn$NiS~;LNwbF`D+A3msmS&3vIi+rB zifM7tY5o?c>@1;eY`$fAl=%*^yo$@uG4$GLd+#n@c)qg7a5?bV<{3Sae_%d;&lc;< z@q|1ruYC*tZ`ta`8DgzF&sHtDFKXS|dP$ymiv;|>>dhv!iG|7b4Yl!A;$?qXvhaM% z(&aoEA&?P)+_Ly3UzUk|h(8tE%b^7|*{HRoCU9D+75gtsHqN-{#68L+Z+5F(_2(qE zqw?g=32oogZjUW2E0_LA9(83A;|7I{7f3%STN4k~my}p70;wmr_m1x^`0>OICrcm6 zeJ?e(Aw45GzNq!1Da&Sx$F=$&W2W2r5vheruj*wa(q~h>WYuGraSAmeCG7&8=c#3E zL$wj4g&<=9EqF3}#KzfMmoX(7;gT^B88Ne3^MO~TY6Exl-@w3+8XT4>S#v(6S*_8L z$szNJq{P6hA`eMTl;s4huruS+OKQ9o^(Bqo<`Q*-#8VREThfQ?WU$`s z*eL%g0=&P$HK|@>D1T%nePff;uWbJ~cIM6rr(~2d&Lanp~!-duLwMQkMX00Og zPcl!}q64G!0(mgU*6~C`|3rA?4{^hDbTwm*xqUc;2*C}Wkqnp|kAvx>}IvZ_|-)=+#_*~r={wR9rUlCg?G z_GA@SrnSg0i)_erH3luKywp-zJ0|jDs*Sqd(4Y=QP}5S1LaD1oyCP3JOVZS10KQd# zMV6=ZCZ4e0=)wzyq1%;^PMo z3w9ue4@#+Ml3R3RKj^A|j@sbRqV)FNX{x{@! zJNGkvW4N294;SAbA8&Xg+pEQg^mkI}sg+YM{}|8W`sUK6=8|$&_lkcv_n8hg*8Jmr zFeZIV zDyt;-R;VPiNmaUp4jHUuGuKMKFU0osQq(f1UN7riSfRzO5~UqtYFC}Ns-(QmXy%w9 zzL{#j@G4q1HGW}|95a#JCT&zbi+!7PGn5KDeU!{iTLJc6y;O=UV35oi*ZEcpvB1!{ z%qtIQ$SJbi&5={_vb=nPA~Ed^>osKWDM3X!C=&J=<5+K5Yb>`e;ngA)B3wTMk2j1|4xZ@raWlBLvG21?!>-)tWsb8?b19l+(0Izq zxT_tp>BxLnIWiC*FAr1soi7g2ce1Pb}?81 zWQJajCergrWyJOrh&M($rKh826r|5`lo4+Ar%IUVkseXAR^saa=)}_KJEm*L7`>$= z;#27;;Tl;-(CE8bwq#cLM8agQV+J#PaxY1ReRma;9ZNY^)$vzi^tzfDn@uvWS6538 zDhYGPAgQram#mHE9Ip|JeO?MNHiF8R>f_0rW4u{1k}8@1Zswe7*B#VZ_IdG~p~m)g zVyofjd+;P^k2BU;jsQFquXVx9$DkUfDdize9#IEinecYVl z5?MTyJt|RIqhY=JF?uG8(Moditiza%t{Z3Y+KKH7AzZQ78GWOiN|*|cr>&{ zN?E9HCBbor(~SGr0rm~;q^Zl)BHyI?bfx*C^@kf5pJJulxHf+ZZC@ISFCD+WC zm2v+w0+XyRP|-~;E-~|;pBXa7z>`8nYL`SnVFxV=|HQh>VsMbM@QE!yFjbZSd_@s> z3JEtpwn&^>kTu0u2F6)dL`D%=2SY}Yky)HGC4?F|j|GdsE;#?>1uwV2oVkl`NVuYN zWyinJTn7W?EXgxe$C)GlIGo3VN72Fjx)SBi>CkXFbtdGuNuOHm7`|H;w2X}w zq*=#X2ZNWWGLRtUA{*8 zK9|liasLbLVsahaA*Ey_G$+q)$&e6VIfbqJZMSHZm!%T+k>E)*^ud)C{}@~cgGbUq zfw*GylSf$Pw=?6PNc+eRNuj?RbtiK0uy8v2|HMKK!G>}*wiXATv0Viytx1jma-b(j1a`Dj<584lceDz2ndvacYV?DS(bMQ&oI?8jj&Ohy zQ7PhC86&MN-lPFW5*c(Mh7^f~H@P&YsCy66L+5f3-7B7CDakDwSHeRf@&L-=GGJ3) z%IKdyas&fBY3cU;$e84bLKwtTl;e!X$mAjl#3;-rp6+R?XE0QT5pv8iLSr7&z20+F z-Z^OIG?_kX zqdA}1-ip~I&d#B4KZ-v1WctuD3o7d(Wlf{K3ep;1aIdbHX9^-;n=5N^tveMN_mNeU zp;lEk6SL0jt(}w5X|UG>yVrB;+)u59bFKrGbmaO{qSl_u3eYOFaLnx0*=ew%aOI=CzA~1F!i~2R z%N(GQY+uf)3)LNYv`8hHH)xo%d%m-Mne?44Pr0ent(dLE_+r)zCuUkDDv`U=Va^bU z5bVg^=NsjZS5cF5<|{PJdC8{4v5bGyJDSWBa`J2{&j%Ld=M`l;9?CM_7l2Q*9)jZ8 zTOPZT!E!a%YChPc=1XOwwZ64sHm~O5AuQiDj;HyVowcs85|NTvAa6{OnSxQ)M3nL1 zRY_)UN&W;zT+-uH2lAp4UarB|w^{bQ=0Lp%WT0=>%y-e)j2xb{WIV_dCFVPn+RgrR=0Fi5Y8sAZsQD@sj3> z`XW(c_M4liAE+SIzL|%Rv3MJk7>kv$O*JknTk`Z%4q-AXtbCHJahFkBS&t&4r!uCP z%Afd7S<%wSakYwFjn%5v${wD&Qfpb{dbJW*zO8Xy8Jm?*S?4aJz8+S#hEI)szYM&c zcs+NjBu%oeM)^+heiFB=L$=rItNXNYH_5BYhn3sF_DA@ zCB-v2q6u_V0cvSFHNSXpS&nEd2No(ZSbJ5FOkw&}j#y-uDJ1p64=RR$q{sugL89TI z$_7U?vdfEe@rxk~N1ovg5>Xz(j)-KJMI)gyRYwdo7MVy26cR-(H8r=i-h2TO z@u_2>;x%1lNtsbQ_?3H+>BLQ^lA7wA(H-NP(d9YoDLI+hA=B=>2mZ$2Z8f!K@Yd*v z?_pNMEZDJ@r+G&u;sr?ZWygv5Mp@!xxLJ9wS5}eurdoMZ zpS5DceW~GfrPW@|Gqr_A3!1m)@a~mS#?lN`cZ>>EYw)reSz$p1qw0#l6IH!nJg@7k zv1Df7s50r@=VUTFBXuUNg|Rt>xsD`9T4iDq@}P8+WIFO{QxcJ)TP-v%?^2?Cd4Efj zr;5G{uQ05T_#}JQJ1|SVI;MGg`sAM!ENCpF1md1cdJE|t{N-~zdx+0XODcLH_&L}R< z&MhboruJ5K5tyeU|N6)b2p3DB=;b1pJzCKc7$PQPZI3Lnai+;?W~+Av7U$$VuHvg3aiLH1cbFJzzP3$o8blMT;epJavD z=lFbueUdN8KFczD`y?yGKF73WByVNU3~`@gWX*MoD`%GV*|At5b~Khz+2>dx_Bocl z*ymUw_Boaz*ymUw_Bk#Ew@-8hbGBLw=a8bIE}}^GHD0CH5@^S71^P)`UG6Fw&U7lM zuL%9Z85C8EAhV^49xv~A@tDeZl&pXLy)~!Q;FM|$^LjyRMPy>4-IcCj6t;eLQp*Tk zt^6INvnj6%lXb?2hgvZeVjU^W138+|CU1$5_Z`R+cygyjt*;g@o0+J+ zz4)UkM;G+*J&{ww=tC}P%GV}vhds)!=lR@3o_}vJQt2E?u%07yuJw|YP%3Zoju%<) zWTi>csh&=HZ-IQ*pT23PcYr+^_WV)k?P{&KyCR zIZM+{hcnbJV^vNug}FgO(eqe@9ho_UtH&$RH}%(G#OS|y}h zi{tq%Nrl=|Pc)}b-#DXw-c={6_~P5-nJJY|d0&VMwQ_v&$r~?Q)GF^9c)F;|8Alh` zV<$4EQAwWSedS?|ySp_*-Q5~-QCC?dWtElxm19{0mxE5o`)gDw`rp?oQLC)fn;9yM zF&%4NV;N6{i_WQgt2;~SrW@}@l9HDk$atF43wIeRYqLw=I=@ewT^jNvd2kz)w-z}i zV%hFLFI2W`m$x08b%%?JI+6r=Q*?Bp0MN0B^&I7Lr)HLg= zK5g#%%6qS5O{p5wRjCc7f1&OpwMpPym&BE%#g;2MEoy!Ds=?ZkS}wDP-lC%mQY%$> zs^OW$CT#r;6`Sa;=&?Hoc6qzQ#VbqQrnFeJI@odXHY&f#SaBaiKNH%N&IUi&+^P?J>Tj*V4~Mn4dH)8Nl$rY@g{2AT;$ehyw6D0Wd2w6Y5UKq|5{L0Hu1bg zt@7@NIN$pRdY4)6ACR|fgp#2Do%*zW$U9!-o>uukabf-Ga*sEd>s9x#%h%thy6fr4 z=VQIxP083Z#u@ z7pb>Rsbh;;C1BkZho z>{#RpZD%}I-4m>>BWbOmWbC;G+Xt$eRdgxG$XTvYW<}&xW`hS(mMXtq_REcuq|wSR z8b`(POUBR*_JV$}KO6uDLK=Jr8(|ZSjMubLFd8yo3}izwOo6FzB20%FPzoo(JeUs) z;Y>IS&Vh4b%Qqi=v+9|@-g)I^tFAnM{$+Dk%~^HXD$ix}<$L<7`P2P>0e#Qj)lc_X zrPYt`8rP5%)y&sEy{aGHt*h3%`o)&f&hQ>~h@7S!sP>1)Ej%G^;f%P2b>rjX>c_`- z_43`!cW-q(^SGW`DaauS)?!q+c8K~O7PoNpz^KgQ`f2&cMQf8_dfdX9e3cU9yQg{W z0bNd#{(-u3a$Hp1c&%$aNW?91QQE6 z75z$hgu}`KF{piCnP~@E@{dNYT|o3824W!&;-Ne21__V|Jz#g(1NH>bnZ2PW^n%{7 z59|y3K_BP~qF28-`$^lfv&9*~|FfO-&b0kkcI*UTQ(gK;^}KnWR@y(RszOvpWNn9O zQAZ#a37h^!l=k$xD6Qc8D6JTN;bTYCx%K-jfv#P(sHm=Dlj7ek-@cXY7<6YpI0(eo zZ*~^Iw;^{vcOKc69q09(+Z`@}?t5vy`$uK;*K#VOxVWm~yb~*N=(1&4Ka#Yq-wcbh z>hit9-0o{ln_VHtiGH8{Q7U?^I7*AYe74qQXjHe=`|iaZoy4#&#I0`9x}|S^<%gL+ z-ygjsrcXaD=IUrUQ9cRgw-$3r*TAsin82`)x&($@(91t8esy==H*5awwR$kOY7@H2 zO(WXcdv%(eYDOILTXHDp$#>5!UA`Q!&z3G!d-7kO)jj2iKYfD-_X{4pfAHX;t7EjN z?pMOp2*@o2|nkoKF^Zrdc8vp(yr4f&36XN2<_bNfC~ zrqj9g4pOFoTcAun#j*~@6vqUHebgl|?1Em_CD!*YrV1j}_`XuOPA`zqS4`g*XtW3n z?+|0P&u1fdt9@>@&3B&s=SS~U`CGE{eItM0wzU!S5oYT5iTR(Czx2VR|FsmZgX`hX za69Zg`Fkk(ooN4lQl%>Dlz#~O7uhcXk^i+|>A-DlTY7K@+mFFV@Gtlnx^$;$0SS-@ zd%@nYFYE_>;7}L_E^VfAZ|t=aI{ zz023gA3NvWd&(NeU)>tF*!%XX-aBoE+2^LWK4xGHJ@m$Esgw6peQ5>&{Coc?5%lgI zgAUs~ny@XS2>YnCxkfHz)WRB>2pkg$95Y}{z#2D^(U2sub4$LKY(FP#J#2(uKxFOm z1z$Q#`ZMRwHO`%-+q>hu{=c^!yj?v`(=z)pQ#sr)OV!0@noT2?T5PKa}X-!q;N@ z#|MV#vHoHIt)9TT0lP~3Uwn8R#6x%34J@DTviWsR1&MIy80R$s+jogFy+NmJ2Psov zYd%=3|DnXd^ZLgJhUu~XVcXUd_>EPeqwRmGyL-Uyum|i3R$cyE$p0l8<~vCK0SXqh z)%Q@~x*nWK;I(?Jf7tI*{?caa3B8~<>;qOC?zfQtLlkqT{2e1j+c^}}QTw;r>e5b6 zhhtzYNSoaye^;CDBd2XdxZ}K}b9;xBK=78SwAlS;enPeXVywPdKJqSrNif8jxPg)F zIL`_ke|kl#`Wu;A2xjVGhmWUgT`z0Pi(lMlkv@Nb7V}7uW?#mh{>?ruW^=bl!s1uQ z*~7$1WML-`4u9qv9Nxpanf2XwbwE(Rz@YsDgPeoGn%1~F;%pe>zgQM?a43& zq>t{JT|L1mVb_recbwO6=l0d2P9LJ@+pkV-d|auC$=EY6Y;(6r!nUn};HMaJBj;xa zDMs*mL5s1*Vx}SQ6W~OUahY;wp}1rp;g0kA9lRarUo=A_ZX?~>uMq)>MI!>kHXD;k zu5g@=YoDDRq7lU7nn&7!8liQw#^7dBb|o+iWIS$Hlz#=aT&Mg^ZE3fvF#LZvYwWcg znOA@ZWE^%^l>b2qo$~j2iU{Rzjk#AN^BOn_Wc+bMa^0#Y>2<7iT*Rl}VuZQvY z(#zl%aOuKKXC3F-DRdsmb?%IhY{xjO>%P`{m9G0(Tcm*=P2lKt*Fx(IqyE2|p`A|u z-y#1WC-Z9!AaXwwu7s=LYPbge29Lm_@OO9|o`9F&Wq1YF!oT4Q_;Te7|9Ih^C1w#D3_*9;DXx0MoNxXDd|;xd+xsGTp`PP#|(^iq^hx6%2e)S z&ZjwU%`9Wx(4);O(~j${Iga&LIq^Tk5wpaZ;7dDc)p|Ks0yAsL$pjzaJ16v-V{4gj zWaoBetut$V_cmmP+}6QYAh!QCd;{IFyWJoG5@Ao+3kJYpkOX5O6S5#1#=QM&N+8huC1KBmXJ9T;!=?iJ4$n2-#xVE1lNsZRd)W0G4r@E zT2ZL(vQxBTTXZ!tO^U>Fo}bm`RM9>nmujeiI;aOPG(!t4h9$5RE`dv78A#o5Ia~pM zg$Lk4cnBVazrzRcA^a15fVC@E+_U1QWjCF*Y~He!_pDseuwwGcY$HTOexSddSe7J; zilHcb9ZO#f&#}#tQ99yR3Z_?jks+8J>6JRBdE4(vR0&N~xrnTU`iNY%!jJG1{0Dvp zsrP?{Ht0*csvqnR2f)E_2xP-p7zd?L2IWuz9;k#WsD>Ii8_t0ZAFulO={ujkcGoSJybH&oU6;d`AhviLY=Qzx^DmIF zH*OVPg(Q~1o(u255iG1+2rJ5>DujS zyN%sX?D1SU4=#WU;X1e;mcyg)cX$jQhbQ1k5PkUvJPp$C`WJi*pTOsUufKD}@}zBT7gv{`TI2Fd&R=(}dUZEwY{CtW!BeL=c z;^()=JF7I_r!+U1|JAldyTWNo$7&w!ASwH$a0y%vSHL~+7q}N*f|ubHcoklQ*WnF# z6W)SvU;}&$-@zsb+SUt@p)(*dFK{pm)pnK_xTSY!UD_5obxaoFq#BtHDt%8#Ia2RAl7G%R%I1VO2B~(E*oC%-5^ZYxH z-Tl}#cQ3tr!RHI!X?f?w1bUym^N>Z z9)|Zzssyi8b`nfW`-wc-K%;FR4PBrs#6SWhLJvrS!(ku{f@DYm=^La$I^;qgK|hstYYdcBXxXfn)#QYeE{;WStPXTU-@6QmEg2+oEZ;6}I!ZiYX@?eHKx1P{ZT z@D{9uRj?Y~0qIA+2k*lc_yM-H{kO1RXvwPb=&H_$tUQ9)d1PfDPW#SPnjOsk{_E{O zDf_MPBm4rt!v6H_4}b$b^TnMjfjG+N-f5(?L~& zzjj35`-ohYz*4vrmceBpV?0;DpWp#_5FUbu;qUMmJO|Ii3$O-0h0kCu{2RUi87Eo? zUqLM6L~-D(|F?hqui?PZ9w4~)R^_zufSspl9g}`!(haV?;cG8d|F@`|2Gi|+B9D0J z4n1IZ=n1{y5abpK7mvdk_+yFPi&2S6c3NpU?XSf|!z;p0Cya2DjtMCTA32(uA_!_=}Z{a)G2r@?e zJ#2%&-H~Unawyjv~{;v{;E7aK4|+i zDx6$8CgI4W7*2!BRbGN>aByE2-alvuh#dBYp0F?M2g#5EsgMK5!34;KJje$b@1F#P zP!A2z2y>tn=E6mAG5it!48iMvX%X1=|Mnp}Pg>zhcB;B>(2@;bhQZ6dW17*PCP$_@ zO5fjC789ZUi(GDpJK!$38}0#_%efcsgID1-cpct=Rj?Yqgmv&0bdynMh=q9Q4!eQO z2PHxe7zjszv;J?t|3Bf-&>kRo*|%4ks+?Zyzww8jgX{a6C+d6JR>bfSDk3e6yewPJ;z-I-CJ#!dY+!+zEF<(D|S{nIXdT zBa_$D1GZ0I!OKsTP_~LYSP5-Y%izD+|9?T*OJw%HpUCDpcphGWm*8c11!NBQHFzDq zg7xqV^3*%t(XRBUX_3*V1FFt2+?Zb<& zUA%eK<`aD(QXPc-D5;I)S(i|=cFM*dJ8b)OCS2XWEi&HOmi`Bo-=KON)K~5=vKS9J zFaah)1$dwm&VYq*CM<%p;T$*@&V%#e7Pu8|gFnL^a3?$f55hwb-2TUO!2a(&eEVb> z&i;p}xPz8kcn=%2RJUn8VmMukOmCFVKcuW8Li-olya8{*Tktll0(tY8tlM}O-h<7s z1%807@H6}Zam=p9LwD#8hl1O-Cud{ZLzTrIc0_24ZLb#SSe>fM;*Npar!(PX^8eBP zlU06$>Tys_?J4pa07-B-3DXMn8t zITOx;>tQ*3`}wzT{r#=GZ@&A2x98s)nY8~Or zY1{OuV^R*MFOg}0D#7cNJw&FreMBxg90UhLe>fBdz+oV(2@Z#B7z^WIJWPOzFcV5( z7Mu*Hfb###AHL-LOBx<7$u6<||L&=wZFO7xX?t~sDv?W4woj+RNv2~mj!cfhbvV3+ zDh=;(f%{n!ni*b^>A-j?h)u>CE3 z4_kpZjB7E#8%VW7VF3IAj)fwa4AKJl+ugU{z~42uUwR>br^?ryOFg$=dP30&mvVKl z>g!V8HlMQ5dOG*yWqih?ETP{2&)Ki=BiG6%d}sITRh>F6+6?7!A9;N~KO~?Y^|9aI zZ^j+?9=&)KACKeg?tEg0)z#M9_<}#lvn^h3=XniHm-3$hGocL1!Lr?3*uE8>fPcUn zVA=9Uw!eqNm~BjgL68C2FdnACbeIXHPzL2t1$8h7T3|k$1`FU!I2$g5Tj4f%5FUcZ z;YoM~UW7fFuiXoJ!#=Qe!)F`beg2sZTlstVnGN?obNh|AZ@7KK0u z_&wc43@`7q#-WSmZ&z44qxY(QFaIlBE6tlLt+cd!dCNY5F`(t{aO3Piz4iSvh0^SF z@ynY`S#ITf56bpH5V`*3^i?i@z212w!X4)&o!dLR1Q>(oQCR0Ypfz6GXuT`aS7XHZ z+ppNI*y@qa1k$RoKN0S5LEw8jUZ6oxaS@F`=VQ9jm)B~%1IT)1y#IIHYTf~~sLM~? z2JLa){?{F<#k59SiHYfAZp94l9vC*A<*e#spC>;};trE{07a?4z0}Kd)~+=h9c`hv z%olq&UjR?E#*5%XefQiFg{yMBAf6Qw_T$>Jy}d8?sFfGOf7``;2T_|i-maYj-#Ki!jyMl&$94}xSJL}y!}>>!%yV>=i-%yuwV*bb3Dk@?>2A=^7l{#N^`FKwtpVFr|e$4b6@Pv3?e z=OsH~JBaMB6x%Nx+#%V=F1sr#Oa&D*cN{ZDT$z5RUtPWGI9`<6G2e+Vk6SM^_y=a(;xUrDom zlTE$%p({V|)-}#+^%Uv*1)k~a8Tz%5r9J=F*o)10HM8GGyFFBI!0bElmUg<8{JxxO zywlg{f7~!L7U^vI?nm2y*`!Zt8uT*0)t=e#mqxtRH{kfneXk@2IoolZ@cWJr(x;&9 z?{{WkZ$LZDl5rLCY=mb)WW6i<|NVw^$OrsS+kY^--h}+cwp}_<=JSPY%y8};@7x(1 za>scf#P*)X57+FsC`#))KtH5^bn2o9%m!bX{Dz(SJ*%R?UX0zdG1`A0cFJG17DB%R z%Iqp=F_sVSjl3;Cegxa%%kOZC=}#edGD9A5UE@5PyGZ-0Wv>?r(1% zKn&*FRn6k^4CNI-?dzzKo9l<}3b~1~>g;2Xw^d(HV_WL%-&p?Lhwlm{7ODJ~?h@J@ zW3|oZB5!B=Oxk9@vHXAjUCIBfT_QIz;o9K8vHZVb%+Y^baM$(!ExSZ+VywQ_-t@JS z;BZKWZ1|1k|M7_5ll-f8iQL3UA6sPK6P)tTVqbJ%EKG+PFcZ#zg>WV;g0tZqI2X=? z^Whq}4zAYOhQGkQa39b>4~S=mKkfx}0>(QD~3R_h$~)d5r#X#UA&W#~cUDUsEGK zcVygcpJC6K=hKBZFLBJlx!>5hyR&D{xB#m~0(<)AJfAr>;Ozg;PwL`7;y{Y`?*3|E zikahchZ}Qz!N(gIwYczv2hBLF)oG60o1+Q`S~AW-UY3l@*%lf9#`gc#$lsIwPunGO z6Jy!(S;*V6XR&3m<86`uXv1R7|0seWAIB;ct1oZ#n4TT=dy@ZzT_QIzB4_c{;-@YD z`~chHpI?XD4#H2v9m-c61ONO{=pW95Sf1jYoP+U*MaE3z3>P;29Ja2L>t7Q53$f4Qeik` z!UPbVxgKr<(Vc72ljU#|+zfw%N8uTG7FNLb@E`aY_Ug~N!%yFN?(qltd(O8ddm9P8 z@9|r%yY!YzZ+ZO8*2lF-KGdtP@4Gp$UZuugIzKU7jZe*+v0s(rN~7kbj*+P<|eN?+BSj*`!v0agi$V1BiRd@|%Itz5%HtaYr ziF~_vq1z~CVj-cme7Ou8mXcKeZX?S{SOKX8!x-&f5j`fp>VQ`c{@^ez=9ZX%g9f{$bsldEZr(Ip-_)=hGI+cd)TatY3{)THo6@?c1%3<{HpU@1k`R zS-%eNfY_ec-7m1~$p5=e`TJ=}sA2zL@)ueE3NiRv@wa`TFYG$X2rxcFO$2^R2kzivP2aB!ugM&eIK;%CZb{+fQb5^JQZ@c}Ati|3( zfo1c@?Nai;p;P|bQU8mq#m7$+nSWhg!HCjyjBWd@uouVLEugHO{jWch>lH zi;WkYJFX+n1HX^$-(+;i_q%DkNxSP;kT>8If~5x)Y|jSK2QOR(q8B&9UGNKZM<0?Q z6)b%@j&0GIA`rbf0Zs(bp9&Bis)X0!4R{|ufv;daY=$i`Ac=R7K`Nv{9>}v@pT70X zTYum1sqvf_dv{-R#fHTfUUB;3c}7UB8E&)_FU;%jXi1svM41=yg=@W?dnd##EIn>t zc?yuH)r}UDMyt<0n*;Xh&-TY^!nO1KTdR!UJks>BnOawCRT`h%E5uPVQz2W$fh|J6 zw&Xxd9?wzcuYt&Aj?-yJNCnEVBPYSqEDQWjqt`KO+BN{`U81|BrV}2mWW|Z`H5a)URXBdiM7y|0Byg zU|-vEo?Y&ZuN!%c7(`~zNst?(m6^Txa` zurC}0!{BH*21dgl;8++BIWQASzyp;~1&uHVPKFEMYPbge0)K-?;Cc7}zJaaqBg78m zowCpa_J;%DKuCo&$ONOWVD%D=?{_8WrAIbAuwm<`8*XHWPQ)@fa<2KkY=gF+YWK@i zW2O9-uVZYLRb7kryUc8%TkE&X=J&zQUIMLm>)|sdXlEW5t(6`}>(SM7cp>SoU~PS? zH6O0$zzFfw1OM&l*BGPIjAh&X6i2GtZT}Awdl$J|GXEpnzeoE&qN3CP2eW^Xx7hiO zAhv!d{2t|hOQ-yU`hStP`1hwkeEf^>dzAlyo=*D@X8$5@sn?}WkD_jsdj0n(|0_G? zAJqP>cHBP5UD|T`?^OPKS9aQeF#8vITkUtN?f!eT|BE~2AJqPxeKqN)O#$hrN&n2H z2er;oUDr;r^N4F_l=FyV`?sCrGRFU7t2*sJi2cVn`{Ab`^M!CeeC`mJmgU^xCCc_E z^bW<{@wL1QJ1Qk!4Ywk?w)aH`d}qwloYvD$nz0e^3jPgWz?bj?Y=z=MJi7+bj8t@itzWGP@^AH;t^8ZVF}1b& z)iqn66xM9Lcg@zDuf3duTm62^!F&r0ll;8oRaW5sXZGJ5^YZ3oKJS{Hl)u;vcdjci z=Iz6+Dq!yZ&WirdH3+=}S0@;;1kUn@UdQ0K{`V-6`4kYDp9Hf(WWVd!e-wj}9e@72 zbIfQ<7kU0$WZev6=V!qp5PRQsN@Rz+v|Uk z^>UE<{6TmKq+Z{3)b>O1X!+wEUu{T@iW{VP}x z(th7{&U;9$JIL9|1$1x(UJKdk@fB%{qw$X2uMGD z*OC8so$`0cUUZ-%@)ubj3Njw^2N(x3F0<>%e_>;%{oA(RQTdCkb3n%6W{BKD#^QDz z`R~axwNC$U`TmZ|Uu0bcGVVGDnn1>1cOCiP&?*1z@c$y~Q$WVrFM^9f#@lxt`KLE^ z+W)ruf06a&Aag4>!!025E4z;T|IsP`?XZ85^*tbSX^+9PAaiQFj{GNiJMDkl?O$a5 z9LW6XN3a%T9@X`(w`^J!zE6ZZzVjpA=-A5D8)c>NCmoZ0?6PC6_rG<{|Ec*uk+n5v zF7xG0%#ptb@54qIkmBbH6tce%`BVi7R{4auK@EAM`?}DWh-?1%v(I34K-53rd zAP)+m30mO{I0ya&SHaEjA$$ZI;b(|W!d-9=JPSk9co*C^Th_ogTUNjH z%wzX$x$m3%w%oeq>Md6<-g4hr^Na(v)my5!_!P`~a~tb1{xWMq;Cc++pRjb#I~?KG z`xEx9wtfM?@%{v2d3d+3jixg#3FC+b;V+Z_DlQD|6KQP2nDPqNk0B? z#}(#XNzMJ9i-LyF8L==h+;6Q%kY54P4ig!Q+?qk;bPb4%L_P;2gIcJEMreX&XoY!j zGMowv;0!nu7Qs1i9$Wwy!5?7>{NR%k8=-eLI!|-$gucdg`VtLcJLaqA%ZMU&~t>4h?BXYR}mcixlC%6i(f$Ly7+z6I^KF7A$Wg|4f9dH+X z0qfwQbl%+p??Uuo?AMXR{|7tYIg|6HbLSK1&WFyOcbq$}Bd>=%;yUdm=V_s1v(K_6 z7hA+{#YC0LuOAyVo?RQ-Z^Df&bf07FcPZ`P#kwZSl6Ihu>?5)q4%KiH)IvR2@)gIeUV_)4dI)jC7qAZ2!#A)I_8rPO@CLjEU5D}P0mMOf z=m9@$TKmxtt6p05!=}d{{9)DY*R4{2SFBpRY7>8F{jjON@`qJ+vF+aFq>>A03|PMc zm(=B?iU+eMbdQTtLGs!jejIK}T$C)tbGUg~y?6cT>)Q9Aygk(Z1vYtGyS*pTS#^m! z)b!q@?w9$F)a~2lr1Kg_*r`(~<7A0<{kUn4)EMywuJR+sZY}N@e<%qWqg5+%g%p>s zgtP%7!_jaf+zhK>Ao3Xmtst@!xoODADYFDqMg#f&7}h}CaAXGq;Aof!F30?hEh{v^ zxwB(Wa~ZbFv;WI^Q`e5mE?q}LNAQ|6wilf{t_VW!xNd4)-?fX+Ueyz{jux-Kt=nF} z;Tddum+PCm&IIKPEdSrny2CzVX9FM!M3yhXEASzF1eR=LOqq`6yAhh88CqcpTmsL+ zbMOMZ1lp1K2p9^(VFZkVVweKw!3FT+cRzml@s}UJ`tj2rKl;!OS3b)Bi%ymQt4iem zLM&zOtr@{A1$|zyN0hD4SbUG^Ywa^bTRc}L|Lm{?u3QoEmHp9OpAB*4nKL4~XDBPg z-mCU2_qX@{&QN~4!ST{D$8S*vdIkShAMYBjnRdS!JMIM^X7B4_qbGyN@D+Fs)`7_G zXc!G5uO)B^+y(c*v!L-4r_m4xSuhqBz!~ruJOR(ba}dpM0d|GZuMFR4>A!r3KFxI` z!fQgG=4u_fqIT_sjv&I*Lf2YvW{8h+TY_Jg$>-g)}b4g7!0 zwetUYXUPAv%Qvh&VGFhFwQON8md0zB8e#oI6iPw&OT!uR)*I0? z`L3!MacDF~>L2>ILD%7atzMvJ#3Ux9^%ffxxxWJMnzA2{{J(&2AzJhRL?7;jr{H7g zflgTZu@^dVG>DGek8V5-)6tJwcoale_BxijAI3ly6vC-67@hIgqq_*(^7Uud-v^() z_1vTPeZA$a5BR&~gKI98zjII7(!|R`{65&l*h9Mc*Q9}VL3>|(O7H3`CjQ&$M+lb! z>}~w-=pYcoS^KYco=M24)utt2K9Bw`9%Pa&*4@XQ>LMytsHir7s<7N138Kqh|!@j`=QD9*Z?kmA04G zX7tGH_p}a=TgVS`IwI5h5Zi)&=3V@bkpg+LE8zJqT5i@8UsjLL+Bf@n$Z27_VuELlHE`ndNMJxprKws%_cXv9W#YOz1!Vf9*I^ zLzAkbtwy{3=lgZ={iGhP1(AC*oCBA@WpE4J4)=lR#3S$;ybu3`ui-oR5q<*EnP~K+ z8^l6?NP|DXv5*1dAqOnoDr9>$%!dm>bZrSNgBxMfx;5+GS@#Nm=J%s_u3OIbnq}+O zY+85DDeF#Iw`pCYtE1p5C2GuT3nn>gKBLAYbW`I{|Il!CeaBi2{Z#9Mcfn^K*NYdx z_p(|K#@%^e{4McQ%)5s;hZF{B$r2jXWsrZm{cHQ6?Opqh&SuJCQpWee{qQu1oxcX3 z!baExU9j)5Ahw?eWgzySfnDdrd2ktA0b=vjIgIU< z$jc=jxCj0M_riT}KWtwA8GrKsyX!xDMYfHfYPyjUu3mIUy;er@C)q83ZBE@7|4gYFdr_2 zo8V#C0Ec0-qu^+m2CXm;{s@*$-^BKF@B(av{jg=R@%45JJ9nfkc5H#zr5mCAMJA`h zl@QGTK1KLi_!0)?ZCi5d?Ns4NLhe*Jk3?83_9gb1m_2)L^b)@5>?MRAQ`}AJ*e5~c ztRY{K@#Yzfzrhc%6@G-cnT)@{CGZ0L3=>Nji-Br52i}K`@ICwlJ!df<4836=NP~13 z3`1ZzOn`~-^QJF8{NmLo|GNC=O@DIyU9@oi&$Siv7f#!xSs&`LpHn{atH(4(w%45K z7};jd@SD}4<_sk&-~3%KwdI&zlZuggc5dcG$6d_&*T0@+md;)wM%%&>jbo&U*w*hi zJTSI!BS`!vXx4%=%xh?wxSJltXdiX7=qMd`xY5Q4Y!R9>2?vS12g7j4gGb>p*b2wx zYgz#`!aP_GZ^1{W2^b?0f@R#cXeMA|#- zD>69*2160dgLB~uxCQQnhu{tP5;j1OLhKku!&GR7g>WT22v5Ts@K5*@zJc9}=nq1t zV0UU6bXfi(lYx*4v!DUag`41hcnV&HmGBX4h91TEb{GWXVJdi_3Fg6Ba5X#tkHQ^Z zLMVj>I2F!>i{U1C9G-zU;Unl2(oQV{TLU8O{~0ntE9XErSlrUu1GWyaI2*7ZA;y+n#VB z41&RM3`~VNFc+4<-S8N!hVP-vbbd<;GNBM=K^=Hu0h|t<^53at&|&$DOfH1W;VQTm zu7hXbSy&D4z#)tQ91VYf$*=Q#cjh{Gnw&eX(@t_8iEzgib(u2)we9zmjJ3*Lw^q3a8ymD&!<{B; z394oA=zni5!EPecVK5vfLLD^00yr1WgP%0V$F;NBaX|alx$|yhJIp!+`CKd#Ip?Gf zN@T3oWkvM0do1g7QGYGw-Nb-+V}6Ja4BHwIrWS#0)4Go+Y{k9qBY``%S@d1)+U@7w z-QT?%xGuz43bOBB@~~HrMZC2QB3U(R&-(kGE3rq&<3#3DU@FvtCI8ddJ_jrvc#Q2= z;8l1Heuacm-WLcxAOi|u5){HBSO%BDV*=iN{;>$F8I1Z8Uq7nK5MZO7qwOV&8Xx$k&qX2DU}MBHJ%C$0zg-JqP;} z`ZU)O`+|;aEf(LP&F+wIQ15;CpYRVI{ME%+%YM_4wb-!O?;NK*=nvSR&^z`yzrj|= z-V|cgCJQ>IF>$N^H?*az<*&WSU3|9q>jtL?U6vhs$9c(4-R_v|4R5ivW3rE3R>NCj z{zv3*)z7ygcd4VLe*Qh$e`{@rYK;FG`CIL=w~@QF$u|5><^OG`{Dc1fx5)e(Q|{mL z-GlCRKiD4*fYC4!av=}$p%SWKHk=OU!-cQ}{tUOnz3>P;3D3f7@D6+cU%}U~1-3$T zInM$?BJ_YGVI*w+@{@P}kG=B%h~oJE_*|h0NJm8!R8&;#*bAUw7o^)!ihvCi#4f1V zh>8U?mWaK?-b;+wdygVwK}8XP2o?|(xc~RvvfLd-iAjDW`Fr?rcV}m(y*F>(%`y*kw2N$w1CAlZ}L|BLp2_^9vp zzl7g^7xVqRDdbLlo%;EIQU1@r%fCeXFK^e$rjuPJo7@ogHwXlSaX?{Cps;M~Bk%4j zoKZNyJwUQg84vgi%C?p*78kDf7Or_o{r|zE|4`poiHiDvvx>PXSHw!Q2u?Bx90k9I%9(rh-#I6|!-Zlao_{eEyx^ z^?gY@{zK==W-}|w_p@`5YZ_>Xd-NND_FyQO2O_{qFc?PN15B51Duplj{#OSIUka9< zseCyx%_w1vkbeL7@Q;lVs&W5~XNfh*zMcUj`y1dsNB~d33y=y(CtiaLkO?G!p5ssh z`oI8G1vLP#J8iK~`eOsS0DlkwNRKj}+`D?}(5`#ycimgH=-#YFldwN}@RNJa_qyG~ z9OX-=*$dhS@@qWA&2(YoCIfp`Us=}S^y{D3VgwAFb8Y^n?W}C2y{kb z`z9qRZ@3@cuVh>L?nnl%?B{ zWJ0po0A2%<0k!#kV2O5~39f-kqZsoBJ3$Vx9gTYgz*$fclLH6P2TTByz*=w~qyz0h z++P3`ZXI|jZ;-4RUGNHg1R7Xys0Nw)t-N`!t>hQLo7ECMFR_xE&PW0}1s@;m)g0IXZ z6ufrDXS!gcip?bCY)P?mG(i2ynL#6xO@A;ItOX>S6hJZ|c?<@_z#?!A@G>EJq{}zy zzve)`(Es86vRQ(P^8JeXR9i3wOa(uHJs=+32XDYz@DKC-p{-x|C_6DXTff5hXUpz^ zDqJIy`u}bLe`t;9zvBOEkj$$Cb5IX729}@=AYJGHIsz+T4;(;W;03(Fa1aP4172_D zVV`to5r_syzzIM)lnF?OveTa2y_S9ITK2Ks*&BCfWB-OWpEW- z2Zuu7vx96P#Pr)3R0pPDB$xzd08gyMjRtc;JV*wwLC8dm8KBc-yeAI0VAk#i`hu+V zr_#T>m(ow9?@!;dYEk+kY-izbQhGqTm%Fr!W6XW5S;Bkl5dLeGWpdiW`{hN$c`d47 z5+xU#51rA9zspYE3%{;e>`g()Pcd#meh6alnD5H{{!33}xM(}U7|`unhwzvIB{$u;y`fqg9arbKS`RGV!sZaZb` zCPmj|_ufFZw43-@()&}1=Ad0|G9Th4+-6ncM}ES`o$G~axj>^M9m z5NQS@%?Sl*k3#Cc%$(I@d5(cTn(R*GW4HEwj3oBRrx*S-@#lh41hEk)r8COw$9z!7 zacm^EV-eP!jYf*JKMe7_u&0T7QJ5*VL5MpV`B4bf+Z2j@H^jafH&|uHyADsDosVwqW8c9A+Nu0KFK(>#c8{b+t zy;eDNM}2JZvL>-heS1ndJfxb_m41eho04+_7cM>@CTkh~Di79~^+wqo@Pmy;5^c{I zCu*w@+~GkwAYb=jgp8855VbR33t0P z0~-%hcIv&jGwTECgokANypI+(k(ErAqNY?ToUBdJ=6%p2K9EfSTGm@C2Y=~4mByYm zhDK?k9;6xa*91r5V;JU)rKwOj&!R*avjP zHMS^M5Mqu+sREHdS1!$h7;Wtq4=y}a0YA|;kgp}(s4T-tCvqx{I@Q_1e1w+*Bsb`RecSqXN_U@+~oD&k{ zNPS2{@*vX3QQe-|Q(R$_`S#cC<>MZn8Ry)@iPr?~3NCdnZ86eX?$HE!apw#@mBQ{% zqY|4s=q^(6YCG}wA5pj!UcMn2IinrQ=$&@i4wT zRGaXS)_!L^QWhyYk%nk8J+!+W^tBWIx5d62S~^JD+Kq5L7X55Ijz+^4G-6HhM{?3< z0%m|~NgAX9!H5?C$(ph*Qu&U@o=kswOC=eElzg#AaRLy36pn-CVmaf8LMTRW?2$d8 ze93BXTB~SFg5<94j(D7YHpbPZ>9njwMKwAQB_f++T0&3wvl`87$Cq@PkJHv(UQ(pj zX7=^%FGQ+OBHdP$W64&1evw$$?PWH8lUGZhCQhU)!X`8NsoUqf8A<+5`ODX(q|zEm zNK5{l{>kT2a$Wy?9lxZ%rmPOM#yZlE}A3N$srxY0FZgk<%OH^gz#{-s>eD>lITexkbrtkmO{&?psHa zzq8*t!HRsT&(V46VYUkvjb1ldIaos?8#gQ_Gy57NXxyN2CEJJWFZClXoZ5DZOPVwF zBs#~IPoF2>_V=g7*{9pncsyy++vxBR%0WXiqu*-ZbtBb$WnopE-iK`RBERas2R9xF zn;1DUk1PH7(Y!lzf`xTOOS@o{+T>+D{{FNZBZm5RMu_Z;%wwcH87v0pZE8qD9k@L; z-)<-;jSnyTceaMwHFYYobMI%r4o||5ZIj zg{c(iUh#fHBgMDqWpN*;?3zinF6!lQWguI?wI+>gy#K=Y^j-)V1-MaiAKTJ!04k$P*K?cv8W8qd8U8yd~|lE{zH zPB=FP*U>zL{B9qq6*7g^(G}#m55?mP^0{$iY*1m$V5#?SiquQK!W7s0;Ouz(PpMN( znlG42b1a@W*AnzUm3tWSCQpF#p5?E0Mn530g>N-JRl165?ThPZ1~FdhO^{E)`QKkk zmuw`RC!08~ur)}t_%_yLwV;KiwHnP@$RcuOtB07JFUysNJ7bG5IwSkjWE$w{++2uS zp2|=D5qE8IKbUNStJFicM^4?b=P2EFWoq`QzNV9>w8t#BGtwiQMUo}C(+EoaY9gbQ zQ=O??3*lK&dr@pZ#3z52w2$kfG*$;G#OCvo#V7qMng{76)rjv?vYI3=;8UP7YDoAJ z-x*OiEj||clr>eZ1vSF>Hq^9l z>?81^-c3@Z)dnsl#n!tYNv+zxk0$hqbb@BL6rZz+WJT#px<(wBycCPK6|F~* z2f+0*(sXCcph(C1;EWCQtS8#jfw^NQNi(ai_+OUOoe_LaoPP5%(2!_^70r`!p%KL% zGbaaFo!&^@1;-8u`7HSbk}X z$l`pdRf=ER9IZ%mW?B0NNPXV1kQ><$>bvrCm9<3T0={ialOm<730)^2T9zK!C>ra? zx8`)^kEdyga*>>DPg-epx&P{u-{&6_wK9<&n!W7Cd!$ zZm-E&piHg>vS^63NK4(Nn$#0#sHTcNhipFSGucGWYV-a>NwMW?#g|Do7Lf!rk%PPi zBgt`=x~%DOa+I|R>7irj!)aR_HhCpsb&vN?$!__g-12@7opnL}WOq!_7in~-aaBH) zvrDvc$(`ZSqp`$PI?9ti_`rwYj%c-vJTe-a$@cqT6n8<4-~wBuf;Jv1^&3oaMm}v* zjMBUp$9q{ph~q3R_h@NqoaZL<3&`6oenjQhWFqPR;$r&(=@qnwXo92Wckfk*g>Se(gS-7JH1qcpcJ%9Y0nn&gISd*Mp*!c=e-x5mSr zw?T+4#;X>riS(~2e&W0#_8P+LXo7Qk(tK>BmXX$!nqf`J6!{Iq|8$O4EqfzPE`~Eg z^sx@y6tO6Ms(%;MfwTYAcGRMzjdX1nl$GqRJ+AJJEnQoBSsE31dz7*>QX;!Rz9y}0 z@hLhZB{!sGi>-?^MN>AA)kiE!-$_~vdHYN`QjHsh3P}oyiZTxjWy3xe|{>C}}9o@<{8+`z`9r zQojpAxGUPHvveGBK@A)VMyf{Aw$;QMAE#xS@MXz%k3_qWC&$fIs4oR0yyL7F_Mg zwothyO6$snQI93fATQ5b8qUuUsBLIfRo+*myr~}K|4?gD>v$oIRt5Q)6gRV=a&Q_N zB=sY?8q?f{s|{x}f~D!u6*QwFxscCGJ`X1onvYQL^FusZTbIp-eDM7X)qvWJBs3oT z6qBqBCvR#Cnm5vUUJ_i1N|%u47p12tAe94j)Br1NTUf^ zctsyo<|9-3yez1-im&lg3{KWu3(_&I?s_6`MSr_^J95$|n`Mgj;=EZJ(`C}-CBa*o zujf%*(o}A4o=mdkT87hsqN!6&Cn64~b^Pp@T8JwnH@m0tirS50j>8^lE+_xu?MNC& z@u-Ekk%-nRxDk)*FP_r#B-LSnwiHw5C6gRUuesT9Sxd%S1!v?o3}xj?PN~`=ZPG=W zYtvEDd2`XRg-?OLHRSpMR}yEGo5p5pSM8w^-cxU7A(=Zn4Og@)k>G6aG7UvRhfc@BOn|fbP+v`|!lL z_f7*;1g$|IuqIBx)`ExNG57?8_XNxom;+nT1q=k7Z(-<}H56b=+_0aG|rdIJCCGYVBGy+QDhoD;(ff`^)w@WhL-`1?_+ z(mj{FyjMfMB=7a$4u}KsAOY|?kd6HuK)O&Ja^-cQ6ZUz1=#PC*Kspftc)d7_{d~Zn z2dba~Aibyw)_}EOJ-7qjWhBSn%sBJQ&G?@;tlE&AfxpO%gpW zhPy&#cYopz%{Y56xqBmJ_w!F^CI2*fK{%eN_3yW@AU?wIOs(vgev7t3OaA$SPW6Qa z&ji!&!AY3(?o9kz-OT_za3p;)9e07^*XlCty7jD}DkuzcQxza#`dvFx_`=|VrwdC= zwfH^%{9UZ5U$J{*r3I-?eUjS!A$SZv0n_{F(_k^xnU;P=Ayb8e(y#fJGYUy77&nE~ zaL>1_mlxjeSE@Nkj@MPq&GXj9q=wKDdGBs*o35CHm^y-|MR9NC5%h(|0QA2F9}Zg zEBOv*=yc05Rwee?9i!ft7`{w{zdu~=F@5x~j_UkdBG4DjMZ@pUS}p5~^ox!NMt}6^ zCJ@VANPY9HK=I1iWxJB^mtVFcsNqj~>x$Q;ct0;{C2(A2m7;waDPJrAGZg5{|&+Z1TY0m1Js|Ffs+qm8^Bp`9y|t5Kq^QF%^u<2eqay!04LxA z+`w=!61+=Imi{HAUOjd7U~=lVpB6{VNDWC1Nlx|chcoiF08gtGzH6bxH#MEsRV`>S zJOiNkd^OtB%&`P3|5Ygr7L6}11*A5*PfCg5ZEb6m7+#_c{-&oHCVQ3eYofeX71s}x z^<)E!;$>o{WRvCP_e@T97LX0ePF`*bcBu3N1rOz0qA4WsOkM-}7Cj7c1;qhAO|GzHT zkq|!R@s!6w!}08D(GTpOhI1b#H&i3!fTOK^NYUrL3jJ#3LT{aZw?*nC7oOu2Q2b@* z6L?<&{0)1vX*d{c@CSzjy!78&7_79y z;6YuctSu^5F6G+V#lt%377hDn{CH3W5xykP7TpwTa*u=+{#X$AH1OO3c(tPn$(Zkp z)DQVSNd3=Pi{#iOJ02Y8*N?DN+i$kN5khh{a@&E@An zg_g1Kokvp5sA%|IGoTqvo#ZS8Bx`R#@?HXd1}6Z?{xl%@+ZO1+E^IZDuvQ3WfN&5G zro6zo0agOfmq-r`17TnW2nP$nGVmi<3HE?};2}r`ECuUPASZ+Vk~1DB^M7}*-o1MA zz>Y03t9EROT(xEP#8C>mD6a|9eM8PB)AVg97~M@x91K{MqTz)vY%9@k))0Kb)5gp} zb{^9y*@{xp@dXx`RI}JPgm4%3cjJc_GX5w_@sJ{;8uHjWUPF47biBYd{4vT> zkV^4!j}M^;wW&{&EJ=uYSq$jZFK1r9 zB-;bv5KwSxzU82dj@`E;{Wo5t;IXC2>*=?gQAj{OF@=3OuTQofMD~$XNX}9kkzDw` z_a6Jy|I7;dphBA{EVh2jfkOGdAN+4xpn@*Vhi%MQ_hFDNusy z!79uM?-Rv_%@IswDNu^5tc&F3QN}T$8aI|H`3NiH2N^x}j@L+lU$tLE5$U5*uw}|8 zRf>m2C>0OuU$J;tb>*UAYH<}%p@Ki%xMs+ToOy{7{wv#Ffd^NRu%xst)sT{;t$sHC zEAsP?)T+{)<+oMiN(?qGIk;NM!P1|HtRNb}d3eJt1%cmEO(x*w-w`^{33LJ7Ko8Id zxBxfM7xV`M!C>GCyn!DW4n~7O5DY@V1TYDNff*niWF$Ysw>Qs{) zkuJTc5fwie+e8jIvazkPf!~neDi|jz6f1l90>q(*kU4_EKyLEHeZ^9*%rVVNPnlAc z`_`t8e43qm7&C_+Vw6CP+||Td-@kI3ij?#=PxUa-a)WYv~B# zsH?F@BWWs94+TDfx6=$d5T=@K8WQvDHC>0OuU$J;t zb>*UA|2`9;hIiAL2^2;GRqE%xfIXo8?gZrf{9h~XPP{A>w}o>vsr*}1`Ag)lm<5g? z|Ked0(lJ3HT)BTmg=0EUuC81(>^~uY6?wZp1hOZ)J`9ju9|_2=j|F7cd7Do5T){U~ zcsbP@`G)!%50d2bxhH>cLH^)hwU5;$k(p5Qyb=@m;p;oTvko;A`g%_jjKMRQbY3yM zMXMbQ3d>(qF}#}W!a+D-(prUk!Ir@D2Lyt?5f6)W{h{E!0SIgH@uExE~HuX4dLQbRO4zqTE)UTu0tN zmAZ?{6QurXf$PY%n{pjPJ`M%YzJ9hSzHX&#tU*?$|BMuW9sJM#lsH~{WC=|mzl@jt zA?%+A7r|w46Wjr$6Y(GcJOR%@I(QGVK@Ru?azQ>Fzq)f0f7@SehUH~o?tC_2DK(M287(vwu$M5Ng@@Aq-+E>#{XbAB{oz=?|F1>= zr@HffoA3V=M*D>}0R5lB=tE)uyZ)~v-+!s^8ok1N56t08!~H*9{y<^Tzw`t7Oa1}- zWs~j%vhL#W5~ZseH;{=*vTgM|O&-@>E97dWDBDjeyj=M$Q#RM&_xUYTo}$X{)3!u; z!xvCoJE$60EXcTcP_^Pg(zSx3KmN$se4T>?frF=`Plrzl8sXHT6zSLF?rb#hBL~LNFShOx*13mvp4!ftk518todVQoL@~SSQ#&jA;v@)SK#|v1*=J8 zg5tEkx}o17%WAAik9G`JbyPQod%;-2w11o`zCAVcJ8g8g^z&8Zb0|oKv&l92mXMX8 z;5-_Ei^Bfs7+2fSZ@P7Qk(H8S<1EuFD#tyLp?NCg3>0j@40$nz$sYukdeC3~%wM=~ zP>LHo^1QYyvXL0qZo<%4(6g}EB4@lyI!}?rT38v4)(FPajp+Z+{&4@N{!9IsDa-o5 zEKJt_Wnr@ZPhmtcf3H|)|2z7>GWFTHAOb7|E5Q!13y?0H24}%}@CoFCn$Qh1PzR8% zWF%bJb0OiU`QrzVAKZO#lb@*B`OhEkyYQW;AC=tCxlTv@99^y{-)}ezQq(%gSrC4u z3~PNQ$CbAvlsetR{pFYpJ*;Ssd@2R~j0}rKam&WX;!Q|_MIsx5G>h87qOlRJ?3S~z z7Nw=CP4a67T)=8@2pj>&z;SRAoCasXd2kWLgW>5|-vzV5GI04d?)3sU!E5jq2r~ps z7rafpbZGOMB?}|g%$z(*`scr9sLRm8#h{v8OG-WQmazCOi!bNWx3*ksE|gM`uG3;mdD41r$ZYro z(j(q;hISQ>AqA=6*Vg29rZUPygGk}`%Y_;voB43kRfyG~Xezv?Uqal%6lLQkuP<`> zq9sbx)XHS%N%rz`KY?R;x$CEKawhp+2P9*K`N1N-x6^i^{K0(r1BImog)^lels>@- zlTW(z1mt6tv@h0%?U$~Fi0S(=>7D?C2AOjKY_N)U;qx>kTs&NiA>#V1;x3}p^N*7B z)L(5vcMpxnAXVg}yiPhBPzY5Xuc~m2g9>n}V@v!xNdspKzfSt|O8`hslVnN#v^D4p z0>M}i3_`#Ja2~XNgZsYU;rkpg1B8RwU@nLN^T9%}2rL0nAWObx$?^vZ%XPQq&)h8a z;EMd2OY#S2OFf8{KcjF>`5#D&R-*Rd40Mruii-&v;HUvKliWF0u@|ctUR9_S?jz8{ zV%{L^55~T)_eDd;B4;y;o>il3jd87?U=X&0v1Nv2pUpuJ&%t@) zPXSS&GIYWiSOU@yColza=kSju<-` z|Bc4MieW1}zvec=?kap=20Lxg17GqYoVJBl9^umNT>QSCYTOxokBBeR__3kTPJeZD zkd6vPtv`-QM1{FyRHI|*sMZ!kL0f((kS*0Pe4|Hc$;By{5pe5AUmOw3GHT-czryro zBdc5is!=~(27Ux9!D_GutOe`AMz9%d1wVrwU>Dc}_JIT75I6#kf#cu=I0;UJv*0|q z2rh%G;5x{Y@0s5Z*#E3SWbIBPTs4x#O>i6B0dXK6B!GwDF?a%=f#)C@q<~bA4qk&y z@D{uW*&qje0=Xa`F!XmJ5CdhP3cic{eHFP#;);MxY631}s5K&>FM_?LkLi4LSjZGJQYz-zh^8`I9VcK^M>s^Z>m; zNn>`oh)LlF1XC2>naQ46jZF8PwyCja zw7BM;t-@N1yoF|q&IxPp!AyA1c|m2Mu?Y8$fB*akT41UGUu{+5zZVxQTb)%Sgemz6 zTEyWV1koxXwgRDOi5Od3eLr!Z@Is*4I~Ah;)+jI`Q_hHmG6ZwL-+ezl<0fQ z|Fc?tDom;^_%k2Xo0n22emr(vXZ{TKGwZnxZ|TAVg@B&V@W5-@=~d43y81SFeSI6e za=8s_i9N>te`emiJZoOAnOl};&C50O7Ufyh z*GWE>9n>b$Pl`<(zprx>2pm(}!zao^Dh* zXI_qORO|Be;pm&DavW02G4nR%>BE(C=H=){wJA>@j=ohbH*GKH%*$~ptW9}3kZsD- zjVkBN%W)};ZeC!lNs&9vje5K z%o?h4_q&Z`bibQ``_tv_AWKdzcpO_&`d-0pI@0%=;P$w(Y^AS2mb=})^digdbW_I5 z?Fw(+!OvA>iVE&>E4^fBs)BOgC~{laU)5rNf87Pe?st>c{nWp)LW<(UPwXk&b@*4w zL?vp6;BS?SVm1B)lK2l)0l&LfT$zOY&A-Q0xSM~&49Nr@$Fl|cDFBDe!K;{Ly0K%r1zsPh26BQV`Jd9~Btu%+xb$VpnWK z4^%3hLJ;0DNOwR>5TMHZSrBp_jbp~NGwC9H!km~&W&|!%Qo64CX{+bVMmae)F%1vq z57d{iVF;(RrnjT00jg`eRLdNUuwpSK@scM@yGNJqU6?>1U_Ig(S0?Aosg1RZ8 zv{c}N51tAVD=Dj}s#Q=&goD~lC=iK+Vv&-P7|kV^it|jYqoiA-sg1Ip<4~2FWAvL% zU%XDWR;RtE44iIdnl<+vJ43C4VWrAdjB3}ZYhJIuWs8=rTDNK2+19R0*KXZ=IJ>yI zx%chY-^<%)n6IDz@SxyvA>$`ZoHR3h*6cZR=S3`88Wp{4`Hw4BuHUe6)8;K(xBa|t z|AB*t4j(ys?DUzl=gwcacZOBv3B_WOScU2(5RL~T9kEi4rpmfDjw(aP=+$gCT~)u+;&ppZsnu%k zlxg5O_ErT$Gs~y7-%!=0H7i@iW_(l43M(e7R|3-z;hiu#A{}PMZruw0WxylD+o> z)t&bcyYp_ZKio63=9iN6KRBxGUpg(TUJH4+r!cBUBpeY#N#$3xD4uB-(^iigG}?#p=g13mmNM!SX~J-=$dU9 zBVp|~N?7dM&^NA|>>5k!W98-W(f#2t3HwUy>Tz4%Ssm}N!0Ls^m{obRwn*5GdR7^^ zF}bcL@%=+{-!9FUuuBql&MjJha{rjC`I*_45*9u6e1Jl>E=3B}-^KCw;i1hxpNao1 z-}OV4ScRlq5`5+xh5j(5WA=%W!+Ks=AYoIUH~Xl&TH9XrqDtoWXk(MNmN^0Wu@5Ay zd-BfAtU9UZT3(+rsQ&Qql@Sm2rdm4MO`daYjmguz`f=~hOd53e;>v!>`y;xWjhLr4 z%v`N*a%%UTCW?}?QV+ejZoP!v3pe@Ha76zT)5iH;%}bu@+Sc-8rDKQEzurn+4{po7 zk*a&9d>W+2obochxv-H*r(9yZ0S?wrqCx ziQu*W=N>=BPp~tb5Mm zW2K!|Y3ZRUnggDu_P!f2YIV*rm%CM37<{N^C2#Y5psjYlTIClW2@BQ+xf;* zwH@sYl&9P2_YoAJ(tPKGL5+T?xMkERi=Dn~oa)iUciJf(vYTsnu>RTY)5wG=`@6Rv zzxPV^=B2+cTl_J+-5Eoez7eC{hUA6?x&-gK9&y*zzwfzQy&u19u%+SM=tl?he&4ai z*~X&t#Y1hnG+Xxg)~+7QE7z@dq4mx@%h!9|KAXg!Y2G9}$<(l}S;g>|W+8QU-g2(@ z&Omi+Rt59*Yj2vbk6=9YTU$N%&rHk!fk zt~%wh~Nas zc6!3DDm{feez8~XZu-JTGw#@ShbH|_)>%+<`ISL$wmfoPXq|1)LVr`o(KEx_40^5a zXlJw5(N3T7xU0Q!&$ml+`1IN2lgNF15y8hU&|6g{SFLJ7!zcT0jcT~7VGHp}^V4lt zsV!9fRNEszZf5?3;U+naVT0%H9zq%e9;INI!P}s}DY*!|$fYn!Ibj^mBi$k59LTJ~k#)>G|HhU_bFz01zVb%GnqRUyxE5ou(VTqsml#>ii(H(_PJCE2a-`23Xa%ciw!a4#+9&4t`~leXlIm9YD>Ozyw`yeI$e_WRSU zk^^HBZie2_>?~nQ?b86F87>4-3>b0MKzPms3@$wO4{I_0c-*R!+npM@_?$8!?e7SXJa!;!-wz?idqdl5lWx;|sYr z%oOx!gS12rO-XDjC?77h()o!Ye-JtgRHENqZ zo;@zeDBASN?K|eXs-EdzH~aAH_j#Q%+~QU~duFht)3K<_t*Rdp?CCh;VCYl*!xFZ3 z*HHCdU$%He&0p_LYW?ADubSBdyu#B#p>z zS37HsITneMjI;d9OX4^%F}LP2343pF&nnX&X564_(c`!whHZN^SS4ZMPKo(5j=jv+ zglqn6YtiFRSA`e4+XaPYMhuX!o9+WK4#01Rt6eOhUs&H)=DPwEYrUb!VOkUQe}N$X z;^sr6VaD*h&j|@T6#A*@a4SV^Tz@2U(5#1=O6T(TTl8LV@zd(F#>Vd-btM6<{ErIA zUHwg;#0j0x#4S(gcyRlL_J=zeHcRYoTHi6Ui`h8Q$}wlV*k805-%(Y<7T4+`VY^-O zU1R%JS2!HlEN6v{oxaO_-XZ+bwtlNMl|N)eSGqFj#?i2ZHqSp*)Oz9MuJWv1-{iO! zGlLJ;6ZGy7e(S- z;Q?(MzS**J)kg8!hs{oot95VZM5jx>)sJo(I5?qS$CZcQ{qiUw;n;)gz4!Dv-TW8h zSyjX{roMAax>f!2;KNIMMD(nzJK)OBdRKeR)44yg`Tl+FJ{}(vJ+`Z(`^B*L2Ns(> z+I#oVPg_)4cZ^C+K3>V&L|@Ad3+_opyaxicK& zu&?rVcVy_>x|oD#YkTAwW~Cl{;ZYqLY5$vqrJKfnYM9o;%1AH%_v1QnlDj}x2XD*W zKJ7?=YR;K6hJ$r(|Gw*Z*Nrw~432GF+;gh#u_mdi4Hu0Vk*~KK61jO7{@#<*jq~eA zt^c?tEZ|mOlgytcbj_c=Qwv5~CzNdTxThwcj1E}kRcG(k&~2f z`>S*Q(a`kM$11$c9Rss5c$;xG1`llm|J9T>o9vrT@$Af zojV3fPBq{B+>4*Bw8=lKv?=-5 z;zCo##D!*@TP|U>;tuLh9d`Jg%7NuUb&Ir2*X+^zC9Ly8{5Q=a_G9&fTQ{V&i2bp{ z#$Q%gDYi{`%e|XN9IF{SH%mRfQHGJ)(4({C>v`01zwR}!ukrd1J1<|l8~VJ>)0od{ zF?n^?99%bdd;P_|qtz~5s&oB37KOZ1+kZHdwtIMf)!SM1atCcUySHr2z_u5ZesuM< zKC5xkzS-oZ{fp!{=ak3W8adsnF zNpb%j4Y+&i)4a}3`yy!Ro$&5DIzFQ4`wKM6rGxyZ*wI5zml-#W% zioJ8V`KN0E$y)x6zS;!;K($O;oHJ`@&Z<)h4G(5TMl^nHw(LnKx8%onwpQ)?eAF!a z30b>scQ?yPgmwFAPF^Tk(zw|*cl>O2zt8H`OGc(oft9K`8uQS>mvXm{-IJ?ucy#!b zk=F;z(sy(+T_0i23J_h*cpW^Vcbylz*R;+Z_}jJT7tiFG+8ckgZsj_6!H>`Dd7M9V zd{D!vvN3b}Fdy?BuBt`)16Xv`Dqlky^%0E?ww6Xy*EEJ9hni`Q$c@W~v?R z+8)eax!JwxOE*3Ldq&rnkLqyuc>njE5_+bsns?V%SM^TS38&gEO!^S^aoVud3k#Q@ zx!K~x-e=|s6E{m(uLXy%-fw@V%E@$<4(wd8zEgD1nbBDM+;K_4qg3oj+v~bY*rJ!S zL(}VozF#@%fo5*sin$sZP)~cd}#W#B( zVRj8iyI*&B=Bxe?p6g=yF{1LC#xS*m-{lKnuy+RO4YUc^I3mIJo=&4pW45>JJbd89 zeJauYdhB*m?Jy~Ds^%nvI?7K1o3*|+(AQ_^7O$BLv&THMdFCaK9kT5CtNbyGL#DZ$j3Wk=NOG4SLg)NC8pxaF2nS4_cj!eaX~`LQrdcE3&>Cja7N{pzh4~n?}ryp0#g=dRSM3!`TlUK7N{$pI_nQc4xH5 z&X;-PL-SPc_D^4?)H1Qvli?|kUQe|ujMVV~oNp_vq9&g5XyVxObBEAYPa1nAml~sM z_N4rPlN};gyqB;CqpV)0ntaYN|2%3-ZXW#EP^BrS>`d;beT-$<9esb3uu&N4W44B7 zJlXL3p_q4BT6wt!@09dIeRn74isC=UIOHArEq@x^^w=4ZhY~_>+_CzQ>3&t;F>g)m zs!XkaWhojoc04j;(Bv}>jBouC>c4c>5Qp5!4jygYeKWV`_oyC|pN>h*&##6Yt+VOc zUdK(olViGK2{WatvDVDS4VRxhVd8cqyvc8)rYl`AIoAK7T)SQyFJUGad+v3~AE!BS z-^n@;l5;hxnKXZese3`oITi}_pIhUs;I3{%>|Y zt8%=7=ic5`7f-5aFg;&ocY~cCm^xng3@OygJvXR*C9^w657oEakr5=hzp%(1oJ|#O zYM)9kl*j!FwGFtN+I{Fn^LTx$mh|MFe*jeaHV zi9mYCIe%XkcT?x4f+Xu0a!HOZNV2vP?yznu`d*&z?L)USeyjd0`J41vB`WBf%QT^+ zGKu)Rq|a1EM?fF*E%*_Kbo3-9I8&ASmap_j8`8yJ?NwKdxkRMB3GZ3X6-#^5l)o%z zl_*a^sWK@g_wuXv_nZaGq?Y`DqGjJ(`+I8(M1Q9pD?bhUvOls#k2AZbs+=>!`$wr# z8@@%4Y`7^N0Ob9n)UR9esrp=!_614u{!xKN|6ZQ&?ej(d=)3-WdH(UeeZIGk=(~N! zAcH3?zmH$v$J6iQ>G$#UyFDx~d-&z`s&BW?DpA&@uUGxce4rdW4=8(%lb*DceS9|7~CW1*|GMEDB zr;(#!3wYv ztOBdSPhbs*0c*iJupVpx8^I>98EgSt!8Y(S*ba7ponRN(4fcS&U?12I4uFH;5I78u zfTQ3T_yrsXzk(AW7Muj9z-e#>oCW8=d2j(-1ed^Na0Ofi*T8jf1Kb3+z-{mwxC8Ej zIB*ZdgZm%>JOB^DBk&j`f+yf9cm|TdbMOKrgO?x$yaK5p4WxtL!E2BKGQk`07Q6%R zK^DjcA3zTH2tI+&AQ$9;d>{d2Tj+6VA;9Cf(jOwE-#(^SJ*faypav=cbwIztsR=3q zEual_0R42K9?%B{zz|ddl|dC?1gZjKkdOBsRmT?3H8WFC1JneyfElO_>VUey9Ml8# zK?7g`8iGckF=zssf@YvOummkYOVA3m25mrF&kR0>NM$2m#~41TYay0+YcMFcnM#p&$%6!IA{P za+t#MjmCDY)MAiwl8 z*-+#y6#nubfa}+EvwL@7yM#w)3k@+%| z^}4pLx%?eq{f8q@FXY)rDvOb2O+p&a5IvY|E#+@s%9YxUjSEW*9M> zVx*)u3DZ0Bo6AS|%6?_!&(~cQarKRg%b(Am-^wQ`z(_h$I_k-XmVN(Q=j#>87Cq&|}hLZ}@IPkdnq>c@DOO#sg$09qG_b|6joqaWRG(EoPG zB(NYOvd1Jbn56%-|3~#~k2=zp#~Q~rpcCi}DBKQPGFn|hH_#pQ06hVJoxR*Xg*oBa z8Ib7zk*Bi|$ zkm^0P5$T)4M~ou`S|dU7YZN}u#4K!^NGcZ#oG=AQu7LoNjj^u{gxV(`P+5i)Kr*EE z@dgyPiM3D~kFr6{txT-N()kP>Rkv0u+^=TM*#>G8>KD|e6|7m98Mc)HnpHyioXJYD zB2FYabRN*CQl}aSqiZ~Y2B0`}4T1bRNH<0HDgD}j;^Py>?<1WsHv}{Rlny~Yra4do znAqWOlF(R_;EwofVTTISK~!nE3(8=F`;HBa4Iu>sJ+xfs(0GH*ReCd<=c_pQaFYb!F0qo zfP6`|V!9Zgvb3iM;84EpY_H!@7LS{=yTGFL z#+c{KOfllwVV-J=(a!;4Hqv=*OKV{m*{MFH9=7R0C?KA7)PJ!m8yDz%SX%rE`lmOXr~%lc@ZWR+hpnL;ZU)VC)H+A{IYl_A_p z24kj}Ou&3G7sRz3vOOgHg|0L{#q)!5j#64W<>qg)_$z-|6|$%=yh2<-Wb zBXJ$gY?`SoouY+3ZkAI=Fk$djWm`IDiuv|SF74KcLuH}3+m)A2Ndt66AQ*!9v`?!p zEj71?cweUUp&LyM811V{k1+Q|nrFRdw6PpnN3dh;I*FwY9z$8VkQ@5xKQf(s}A* zrP)Nj&U_yog17@g6EGfh0`h&7&XED8a(%gvQkl87=KCF=*SGdh(l6?t1OLMQ*&Ah~ z{ux|QR?>s&%u>Zzlc4=Srx*Xr{^{wTEbX8CmfDN&m$aque`^0EUE=+Fu74`ZfMmk! z&tK6$7a_lJP?r8l?f50%#Thd^7kD++^*y;B`C=m1LmU3UZCm{K#hyx|_aE)2-nfRw zOY-H(&iDcOeoE(jfEawKpYmm=ag@g83V=R*Tl0O@7-4WpijAd|HkF0)CP;?Vmx>jAJB)&%I`}9zTrOsX1^jd z2<2OJ?a2V?_4fA~8xRyQEZEe|Kgd78^q1so$E9CbafeNtHfmz(>^C&fCrJ8LmNc}H z?bxB?{YU#YYTA^&Z?li4*kAaFq~D2sA;K3=;mwDTKaEJ=_Mz)>bAPdmNw!aB#k~FK z;HSNPu_|j&cmI7FFX92|51sD|Lb^;R$z_4Vg1Vwm0#GrX#RW)jFrwIf>Ex3GR!3K3R&NOeKwf8?-3iE>c^L>v?^~?WLXQuCV=rbK#S}O|2b_+-Wv%wrN7t8|@;0G`t zEC35ZB%t}&Vz2}(1yLXxECb8Ik6;B@308sC;3u#K#DKM69as-GfQ?`i*bJyludv+) zeg@mY4zLsK0=vN;uovtD`@sQl5F7%B!4Ys290R|Apxo;1oCw&VaMv95@dy zfQ#S~xD2jKt7NzNi*b64yFOHHSt-`i{v!Iv+lH$4ILGG#{R& zGabVnSzqYc3Ipc%-hf@ic~w;eSZnOGi#jD(+j@CkKbwn!-~CeGh^oALi>l6KlI*vV zcb_v=1UYZmys*?ahT-<6Cm1zxF9h90Q}YOv&3!uhC(uz z7J`&_Z{Kv+8lctZ?VBf`n+lS%{9eA-PRsnYZ(631xl~Tew7!{`8zqRs8NmuPx2vd; zSSc-28P}&}x~isSs-ou9AzpLxhNwvbQPKY)rUl0g;>O~2b z3fTa|ItHw9m1(-7fg6o7rcPl;{kz z*3$`4?xm-0=A~y+ug{au8#1koOqLo~(-lP-io4Y^Jf%BLS2?xPG+mVl3rE!mi&vGa z=~f7#WnOn5wUyY1LVG&P8#Cfu45F#<`8Gdg)mm9oT63mCzT@ ztW2T(Z!XfLOezd{TDlFPyM7?N(QzpMv&9%Bzvzo4}dX%9?l%ZynVZ|szSFI>R z?I=T?C_~*S!|r-fI;n3q-bDSHE7dZ3_AxI&C|2#@Y*ovqty4Q)W~1FsSK#d`^mcWz z)@i3J_I6eBc2)Lvovvb|z24z~{e6ct+cbgDS$oJXoYwJn)%A9D)$?}M_jWb#b~W^N zy<5rKwekknDp7_;o;}5?Po1l#I8Dm~X#kH06v^zL%@DFVF z%!#?AI6ZR`T<{fM@D-&v%}9N-<)JvxuY+Uk@YFYlEuY}R588UBrW=$Sg?8DXtg31q zIw;hxu4!$Hukp63+nrM1 zoJheHN{-t4!jV3GBTcIw)eam~LonUdDr%8q>YLbfoE3Z;7cefSr@>&4K#v(7Q66lw z#{q})4i`OA9daEi_N%6ApdV#uVCZ@>Q|z&%LEro{0_$FNmR|C1*7K-U_|8kwTl+M> zy=AN6tX)B_*VetbvUz;W@4MNonB_6sVt$Fa7LyqBCPuVwk(q(k?iw4X>1rR_yiQNY zY1?t#W!TZXbX%}reL&|LUCuCp+R|ZX1k>BzOtNIlT0A|s862YREcGUR_C}~T zS!io!pwh}vRp+3qn$E!rItSJJ9MrC5=&s|b)^@W>C%q*(s)FiQm~YJP#8ZjCCB8`f zkZ7rv@gjTW1t!wGC%7P}B@o;bToE)+5hV&5Cz&P++B|zKY?I`iEJ_l%Cs~h4K6ldQ z#Y^l)CJQ2y9Ytx_-I*-dnJmf>=({IfNfum57QI8@t7JRDt7Op!?5bo7RI(jKpRrpz zTTnY&6eX~APwJd43ifIxaL>j+XOXT;^0;ilxNMQ#bW8W7rP+d|*&=<5PjWNMMz6#T1 zfqQ_`?USwQvL@HoyPkWnt)`QqxJ7J}ce}({KC^wh;TL`SJB)Og*4Zp^kzG`+nuc4u zCiY8gv{Xaqpr+2jiZgT$YU%9Ru;12j-+^Nm&9{3hjnTL4Tc<_Lp_XRt49DuVu^akv z=?>bkqH59aWVQnit*sX6BVl~%lrPYqs zadm8W1?yQT>D9G-oam~W;-oz&R;O2AQ}Jz$zO7~*{y4P82$$rb#`p&->zy0EXVf0AvyJ;`^fW(lYP`p%A#<|29h!alfJa|FKP~T1`=41& z>+?h@P?TX))ymAOrByep{_XmLHo(nhRP8WNhr^+>9e#9pG4iP0Vu2aE>^mU3k-=g?;>7-T=)oS$ z)T5b)t%sY3pT}d5`5tRL*dCA59(OzzP5#hgb7=1v=OwIrw9ks9(7nA^2~JGE=Iw6C zHb+d2v5s_#^o|Ufm+3gf;MdjnXErmwFvfiCj_Fo)cemL*M6V&N#)MFzBWtsHwD-In z!g)JH+qN(#yE{V%JKQ_z9CIo3LFhIIX4%>5sjbc>+XaGnf2*ffPg#n?ZLgNPH)5W~ zyo(8n^e}82AKom!n}k)`7&(3O^?B_Cp5m!KC&F7^oDu0GV#MkjXk zkz1$M+*EmRV{*)rSnG|4W3{dXJPOFtYGpmPU00n-ar=$+EjypAZ_?hx-elvDs>&Bs z>LqU-APr7t`+VQFDKG(f$_O02sJ)T~B;d49TMc}iSFNU(sP2a!J zn<2Vx(zgv&gBj3-)YJ zOxbv1)NeE9wT_%$xy$$qu}ttNHu&9m?L|!DIgWWwW|PA2RKII-X^h3iDxFUWj8wW$ zJZW>o`G(JhZni6$tjrLz-Zq|@dEyMAsCt$ln0ZdkQ@xV-DA772QSiE}slm&ZFX}#Z z&D0f~YnEY~;g;d|yF<6xx9&^A(j>lhT=$M^Xr#5bx2T2%JKuH8+Z^LD2M5KD(V7(- zt!29{R)5>bMK^j_*=-bB=meg;u{81djr~IeY+R4bq#>fIvscw#IIB<96s-f(?MK|v zN;!VHrO|n7L!}0nOih}Z*qRLT5}kP_%zY{l)eO2-|KTF5i4KFjl?+aVXP(-y$Yj0A z0TaP%eM`Xule%*^9sgjW*0^e8HfP!7BptWtkS>nB8V_zfFouneiE7+j%TCK(%U>(I z@dB+dBdfhyXSA-qjkiiy@z-PT^R!;-PO&&+obvjE39EMaQc^XC#tt^UFJ}nZRQ;!c zRo)ASGm+=1K$96Jha4_CBsg3)VfhZPO=@~rdUWw<+1SD>#DmTCSn09DrjG7$9G;ti zWg#(#oP?Cu+|>c<&gwpDG(tU5Jx`sj-l_gt{ewDRjRw1vt2vs+npT>wn!cJu4NB8w zYSw9XYrfH3(%jRSHB}6)t5%XH&OKX%Nbl#Cs`lFM+JV}NQMxpwJVDG{#ZP;HmS{I= z4`}t;tJ)%Mg_f&B9=g`LZaTTH=Kd(%G~E&%+N3+6)9bG4igXn^uHHkBTI;*%<@zN3 zWc>nt<~5H<^p$d_{%idY`k{hUQ5m!LW5hEwF$5aI4gCyC!xY0p16ps`YdCHgy1m!c z+lFF8jR7?@ijD1!-Hii{DaIMbEMvwNW3KU(@rLn{vC3Fk>OysI+JHLWqB9j2qE3#L1!=O)@DpnYjZDBU22{)iq=&!Jb+a23O0 z`g^#`rkJjw88O*`b?PBiNwFN{P32@; zxl|q}PnJ)Wqs8)#^8NA?@+UW zQ9HFvouD40o~~Y|{!Fb?zc{HzlTNK^X|g=tT0Hrox>D_+k>3wG5O>eHUuGMamq%y@ zXhvzKY0whQCd~njUUOAbq^Z!Hzd#6FwJo$AwY{{%v=g)$TC`f5qy0*IUi-85nYK>L z*H!uGLUi1Rt!8b$jL6mnPs#@AQgt(ReGBg$+&T^^H?>%Sc`3h(=7{c`?k8P|u2v@{ z_1^kmeUyHXK2DKheL`I~!0lLy#fT5N{Z5_{6Z(u-Q=eym{cA zqEggm_i6ooz2T~%$k1fLBvhvS>CjNWDnVC zE{Jx;wXsTt+QLIagORd3QqH|qBWfrSOWI4iO9r<3n33GlLm2XjWT|Ac z(yWQuoU~)W&yr^nWb2Y4R5Uf18cWTh%qys^)R)wmZtcq}&7a(+iaSo0_C(5uHB_^e z9>K-W3!cmT~a+UjA zlYy@lKPd7QzbKGOsPa>xFjb6d1b_F)k*ag*MXJ?}W`>k05`BQZ_p4$~sII7%f8I$w z7G<|rL=qR7YB#mNx|6y$Om$RhG*`Vwy+eIejkIxtCwLdDkzLDm*9_F8Xl7_omS&44 zS93~pL-R;erE%2OWqF0ZeEAZEJ)Qr|7^>}|9ikl)x$;m6kGS(Vu_EYpmUfFaS9?l} zZfGBAtF(?fPhDG`RJTNr;s(c@oUB`*`&73__pR=-4jFY89aHb7_t$sQ_tp>BYe1EP z$SdwRuWTmkQ~hM0NxQCBUEia+tT*Z#-)`*rWTq>Dni|>|C=%^ zi7*W?jWXSAHfxCqZ89A&=}lKnMW$(nB?b>#+?wu2<4&&TH|gv;xrSiPr+I$g2;AH3 z^VHKfyOAeaDR@ABOSAmlm|}7FI0E2-w_& ziAQSRw+`A*wW7L)4Pa8oXgpEJ^YjidQ9p%D5&P+>t>PIWUBl{_?TM_ejI6E%GpmD- zC`1%38Z3(Pt243vmxUf*F4Bq)iYmgG?H#x+qtCV@m3Ckkab=cc-GK z-p@s}=+?j?mWRXJN~97LCrOq}l`NKQl zs}~k90fqDYO3V_l4}ty1IgIS?m_UFz=yCb#qN>a#3_2mYz*PCFcFrqOx{I52uE_F9 zW!DqbF}6P1ae+Q^TfcxD>LP~~5==s#1+UChA$kAhTB5=tep-5d0nEQ+vbHfpFV#0F-_ilrDlUreRc2U*fO^q5oe4*gO>@A_U&smno5q7b~ zyOyO7x?9H*@G=~VEm@3FOIT$hw#3m`Gry?HaT{}lcNamiZ+h+1QgInj$^-_z^>jZ7 zaSO~W(wz(-JHxIQ@+D1YEoNzG+B`E04Pq>#*=7ZqF^QZ{t|fPo$HUF>mB1 z{lgp#%mjitgyBF$5Cm&Go6BQlL=eF)hX9TOunF!Rw$yyh-Mg--U#OELmysx>ZL2B@L=S)siAnIm6g?7FA3sLkNbL*TZD5=C zAo26|CFZ)MT!Kh!O~<6k#z>V8W2T8wKyPtNBpxol88k;6JVPAYO*|4+rXdw2R>1;M z`ji=B*$QzQnz-4gB59pCb%l5WVg#A)%7>(@yk%or`o}SX62)L`I}AnpsZGAf$Ct(P z@i$Yhog88r`d+*iHzn8HJ2`;a*WzgR5kDl>lNowh4f%oziMwE zU!sgZT!=<`B@s>x;#;ATi+&Jhx4Z5ZxV4LkQ%Ic()gKGH*va{M`}|-f@iJ(*urxT& z6J@vKHs2av%03qE9CVp7Qpgh8FJfirrRG~hA60nuUEM?4QQk{d-7a1}x@RnV*i5-p z+$)dTFCXjPR&ma4%wd-FC^4+vkdUj2AN-3g7mBLZ3g)(tk0AUw$y}eqU$O#7dO(V6 z3u!ZNBJ#R$JcISZk|&m;gkkN({~G?n62+cHrFB?xXP8mYn&1{&mR@Nb|0K2(cXzYl z&$}fNOjVd;B7+%_C48a0E?mY62x%C5N`?AFJ*OH@zSP`vPANN7eNK)VPL5@JrkncA znSJ}?Ez_rjUK!ziL>12P8JQMAIHGZRbv{a>*?c1J2cbhM2d;?p9M~b2-N_-a+fB^D z9vvDD=K3QE7V8@`j=yZdVYl=4kBUhuc*WxRb>sTnyj@}j2FffkcS4nI5aVg--mRIU z3KDnmlmP_9>Fh*($n(yCX9ITC?YJ6YGZ7xC$EBue7UlFyS8Ukyif7HK|x!cxkj`x0Ld zhc9uM{fGkuWPyADd;wlN`%gbR!nz}<5&YUQrNkU!DhFHjt8#)Kxka_CPa+|uZ+9%iSo*Q-!mY4%d%)|2O`!9)N z5Ll1Po0XVn)%MjBFQ8hQ67zsp=t7Bk{ElA40u#Jh0E-8RI#FWY3`MExhT48nV(y1v z<-yq>zHaj9$4+JAQv8R+$Rx6NyjCYF?IGN@0!983l4c3+eOe zf>)&$2WB5~0IV>9nu~s14qEUtC=h76>A=m5j7ZMP25fE)x8PMeUJ98o7gl-23m8}r zZsQqiZWFihItVDjmqk^((?GI9>(SQci@x2RwzXe$mL99bt|x-s^)zTit3vEgMZ0s| zj5YmSoT=fWI-np8cXxJ0&Hd7d23$cpK}=!fy6j;cfOU*btj4Q6U8Gr$D(-uksWPu8 zja44RIRlfQM!aHh1q7>&`vQ=`w^3p~F^qY&u7%GTMvxCX%!i%MOGna{#gB1GnJbZD?o9lMgFP+$WrS&WJS-(8N75@uWyoGxgF#4qv zJ|$*fmaE{1KTtJ|C1_b8b{5hG}JbVW$@t&xL<~;8F_-oOs?D3(u$R2 zRD)xoh1KI9mvew|f)+3miijeju-Y$Tt6#*9Ht9s3Ac?(Xb=w43e_G0F?0QF3SiP)@ zSGOu^V5_ygcEk}D={EUk&hfqz!P3r6ZvT_oH8&zpuw4FxkE-NJ>{asnFRu_YBw3Oz zlHD&k{}Mc^hzgG%?I*O7sB9lk1xlKFM$t4^;E+0k#T9to9u4g(PaQ3oQq`Nr+;-Zm?pk zVwNIcg<`AX%RyJ#2#ZcDZYt1YMYY07<)xCSB2)uZqf}^`YKdx->VPU%hwVWXD&(v2 zP(RXjQ{Po5sR_*jHTqP&NA04&td<)s>d8ho4RSDc()890*QhjeHET2lu#)X?So6K6 zd~G`MK=VSw)1oHYKyA3TpH``zqFt!%YHqmcGuZo=o1G{4R{MyBct`TJzi5$8sPof> z>Ap6gkHBI&N7q&Vxz4EjUUyrE+8AqeOGpdZUY|`4)TijpGxS;dE&4A9NzaYG!rY>z zuAJ82)IZi&>zxe9%OEjW?TH3FU)f|p2MoPQJYT6W_?kS74@lGvtcgi5?_Oa1)VRke z5TVP)Sju8#n&wmfrcS2bCjM}f&B_yB{roG_c@z5i{uN81socb&8`G`mu5>|PI+0GJ zGwJnPV1E=tyRu*IN-V&ey#}jXOz?SH+N`A9x5VrRE3B9&OU#%h@n{}9Ho!YNg$E-) zP-TQot^Wunwko=8q!FpgAfZbs_uwMVb%kVjn!WnjLp9JJ}>nF{wJ9`nAp$Yl(GuN>=8@Tw(N3O+o7U^KGMjaakEWsb#`o5zc)TDvn60%6Lse+H>` z5^Z^{a=ziNfSw+1l5i%G4}vEL?Aj1w(=ywM@mL9?9rW2Z61k?D%cMFmS*to;gTR}cSJKJxFGfA*a3-_4V4X$=hIH47x|=&`Ly)ghCEQKi1oCT zA%e|VOkx0GD>RPW57Dte09=r$KGo)geA*r81*xXB<+(qGEhGG=rA!7RjG4g1g~CZ< z@w`C{DSIFqe;b?v=`ADk=_cgE7kUQTYJ635E`|TNTnnX>!d4d}!-?h~E`!Zuu;3$Z zdp6yX8mETcP5E?1h0Oa}sQiv`omS zT}fljA`W8RE3DSShyq4%jx?LWW^$NJCcN;um6&ETd<;V4FPQNcAoLhWJ04mpL0n-@ zW}?ZJ=A?YO+5MN&LTtsHEow_>lBF90!GqY_%O7qHG3Q_7AbJC##EZ2=lJ2SlhGVn zj}=}YBOa;Kt<3~)kHO@E@m~v2!mp#?G7dmS{B?42wRyU=keDvUnJ^#xy+XzzucS)z zR0IXYISauY(Si(Rye=Qk8X7AFC^iA5=hL&Sjb)sPl1j|K$rQL^ePDQx`$#2xts@}+ zmdWQwf(shC3Yo96J@!NyzqP&%tT7 zo(HXAhGPxvOiIJ|a8@Q|zhMrX#p})+4ZT2=20a2^hCBRB4CXbf1k!wEc^uTTt*<=4rG!4t=JohF%O^_-@^z=T^?PGIp(%vl$#FTf}0+ zHT8Z39;)*h@aH}E;UWAjh#BuVfVeHT?H-P_o;i{40L<@g6XP~aGGO8WgLeztFwb}c zh-rWct;b9O%znVMsmIiC2M|9225*zJrOE`1GmOi6)MK0hGXOB1>oM7!0mO2^bg0L8 z0_F^0@SaawJ~`|G1OYR>j`f&8z;ptPe?8_fYXFf57)ba!Rad~w0}T9sjXA>{KglAn>fP&(+Myw>Qg-c(W3y&o41b#%tFA(>f@Bd`3@HV6JC#* z1sJ^9{Y~9jfQbN%jXn^u-VqRrP7WW{HHB2zcHW*Ez|7Fkv4wj8U!-Dv1hFdIfpJRA z*nCq95=(`|P;??FAGis&4Qh6b#EB|kIt9ip{N4C$P-oV&11il#TD}=4hbK7s?AOVI z2*kAI`}%=B-ylS^dnd(P588j|LGZ6WXlE_rue`k7hh7dTe*GQr;Md>L{{45@iwh6l zt%tql?LYK#Nb&3M2>sAI;K94^u)iE0{CYj$!LPrg!-w9{(fR;)6>OWeb&W_6Vj#iL zNWj{kgshtcou~qA2hgB60&R;SMwJ7w6i$Y2K}^esNjaEp*0-@9kOaYchkMe~X-b?2 z^dsnOanSR?JctkBn1DKrLE|eyPU4|0JOhn^)RRFsjzVeGW|4JEw0-PsD-zDCtyM}? zz*rE9^iFoutl7bHTX}4eL!bn|6*(l|jHTWPR(+YRf!6RB19n&{IWLqF!+>dVvz!1r@8gI=fWhBF+T!>D=JGqKx&!9XJD6m^(C=U}0n<3(?RVt>rrkT3Gl1#!4(0)1 zM!th#or@!8y@T-s%-VM_-2wB(JD6m^oO=h837CR+Fgbv!eg|^~FhZ~mzM;Fbbklq2bkgSV7dcl>bn@Avj#AD3$m?s`atV!0L+`#Ne0Xwz`SYG5O*1I6fjs@ z*xDi<^7#ocZ(7+C`o=@Ryy-1|fO+~3CJ->s-@zn9J{G{dDNiz#`4wRB{(alKG6B=5 zmF-K}*S!Vu2?5NTcXb6!$9FKZpcY*L^QIO#kWVkbi0X6BhB&G3#5n_Trq#!Rh*q(H zSsH}A^?hvc!Rm&%06YK(07n4)eFCNio;2cj;%|^KP4NU!2;c&Mr;&KNi0z_yR*bn2 zw=wSHO#yJ7y#Sg4;8KbKya6!XeF6LcKml5HD|B+}c?Cc!>-lZqp@a!A)vztqz-*jj z-2)91ZrB2y07fq`*xI&0C*VEMC1%)04JOb87^}K~ZMnn@#>oWGZ;eXKAh$f=2Z*Sq zC3thTmt7>`%D*$6hv&aPoxcQwsPSz;w-=VmZ#mow|6M1A?2j*vBW^+k z`$E`eZ}{)N^Uvijh3Mr_!eAgB9yk7qMdaU1@Be!`MnTDvm&Fn5gWfj00P-K>a0xd< z33t3x!UQ4A@hi;zs?G8F*6$)PGr!#naoGMFS^(uk_b+H?tE3Em+uTe%8h~gI%FKNW z;9C-4V@Ea^wr2zLPJ{IuA6Om;A*0E`WOdzxN?0_o1TG{}V1gTIC<6W^`jdwK{Dh`dY8T2HWn-Ce_P?9y^? zi8=l(pNQu>eJb>SSz^vQ%RdVuFJ*>@u-$dRV$jfy`A2q@n6G^yLbpLY(a?bxH-}Gx zz9@r58dzEFBNDGW)=J5Dgs)C1Sc*C!5|0J)w(|GsKBvSS2<`M`P)zf^Ns_iD<{Js( z=P&qSXwUl#Qg-V97kw<+5&^LO7!QDT)+Yd1++_k_U9u7Y>yym@Sf}g;0IFNhTg3Y0 z5&+I;H)Mi!1I`1xUkiVdI^kFGzZW0ts`tL-L{h*>jbj!R55iw+{WbTY?y!h4b?<%v-28_DFinpGV11nr@JDEiB5lRQ&Zq+;duHSQ*j<;X8*xTpNb%GNOg5Wf|kl)MTt>^gsITrlJ^Kd+t zdH)+=9MyjAoZZJbyZe7}{#+k;x$El!{2k}d;eLku5^jXo+5V=t0BFyTv_)wK3330z ze0}Xun|28L5DuTXedS*`>dT13f7C&_{=@Un{%?POj@xBC0QRwi?+mTy&)R;$*>y1G7JCA~Aq+Sc z?l)Nw$KJN~cvb{7suZ4?>yfVmh5zr)Z+i$uaFqW0SwcOs+eEgSB#?~_yAz4eD)EMR zxZf)QaG!>1Sm!f-;G^F-UkJ~0@H`2}$Ii}zFczrK#~z0KGX?@a2mo6$Rsn1P_!}_YAR44a4oZV;}3X-#B`{I>Zv{CBkN_fC?+@$+VRS$%0@3!5JSJMVFR z@0?um_9+&4{9>(T*Uu~C zU$K1?{#$2}O@Z^#-am^B(>oquB|tDhHo#3zMP@DLf6qQQqPYTsH|UQAPd@eb-)IJ1yfOZ(QDNfN22l(-J@13V_S-AzJo> zXE2AcI(z;dy(#>~tFsd3*wZ>4xR?`*g$4wgTX?eu!>^;n|yd z*!mRiSGccX+Z=ZG_uA?C3~&Vif0ds5A?;QGaMq(9aJxDKOaQ4n1$qEpW*rAq#ft~l zwI|8YaP&h?IBK!V=6{uI^FKLb^)s$j+Wg!G6poj%$iwRA^=)nSrR_s(c-(vObKF|s z=j9H!`tP>Hn^yTNZGziE3XlVk3GgKVt{;{O7^D!&1;F*~1Ms%9Nd=o+_z*4ZG61&` zZXf*H-d)A^BVYz3oW0(|WtcUnn0O0ETC8lvdE1!>q-kA*Rp=scY;h>dl+o&MJ z!>0A~V{BT#W|7U$+GX=S&)J^uE4KQ1o?M$`C==TJZ+(7KGW?Z3xERXp2lNdC|0D3b zgAX1!TOY*FBHmw_q#vZHdy{* z84s?$ZE!!A!Dwwfo+SiKvB`jWdu+b&g3Z4HqcSWz-jTNd8ILE!d+`_}8vLH%$AkYi zeett6z~ShzR z&*Hja8wRc~w$rl#nxQ>Re74~T76u&N^FQNRdmVp|XYrnwRM04?aO(^n&!df5-B3Ci zjz+tMTm4hrZGQB4n?L!0%?~|k^DA%I{9{k7ex5If!s+r#+^jy(^jEd{U*%bllh$*o z@ua2~z}tNaKZ^nQBRu<>r z;(FTqJk+yZS71Gn2+$QGECL_*yC5c;6U0>Vj=5mKVK&E}7V7esbj5DS*FHXk^T8QX z_>Jq$_)F)DGnlxYy1q`2%ZweS&+H}~*`8CM$?QI+mz{3*=hpKz;b62VfsNyN`R5y)3pTZ~ofphtt`^5VyV^V8sRDyt_d`7K4xTdA|+t zZ+qIm(hdQTr!xR91C}$M@UA~%8?e)lCw_915sdTU)bWC?3vE7coz0)P!|F@F-)r+vd}sAh>Upc5=W^ZZXPmfe^$YeD*`9wu zve?!(Fr9FpXbgbE*u8BVu+tKc$FLr<+X?==XO_P?_Z*L7ahb5IfwRfoN??uxXMAHQ z@A+!7*!l$iNb{^AER!%`htEB?8jP*K+^n`}TvuGD3`l=1!!&KP2W%*Y-|HbRK8HLD z@Nm-Ktch^G8-6!F=k22n8MEx?ynPJeV;+vKF&CO3aZuSb`kIAHf`!n+0crjdt<$L1aDBn*& z8L)hR2)<3OJa-CW_G);{1p^L0ce0oJugDcFOLhbNFXa2QPm`_k-R@(0VfkeDG5((_ z-@gMIVfp^3z8&6e1KcM6NjunOl3l(phW7x2{_gzDPCq=>i--6z0O0E9060I}`R3wD zpV?&UvK*UVcIa=ArS>{w{>Sf61lR*`4&V&HPXKT8Gk*3X04`S_fVUl%DcIqBY-P6f zdAkg^zw58^Cmt6+N~?~~nQI{=(0&y#lu%8z2Zq z`a#SYj8~2raJX50+J8EK;&bx1ACOq@cfmfU7w%tnA3y)6@+XkqdY@#=`gVA?4RD*- z+wiZn18!g35AFO}0O1<|zh^(O(=QD8b3er23IML2KXIP+d9D~j_}pUr9gGUk*;l}P z4Byq_)iE6V8NbZ6`Y30E?e~y_w%@w%ZT?1BS;6sqVE%>EebUOt>2YDU-;29j{fxUq zY`;G+io&A>TrS+VKQxB2)6&lO*$@}cfw7)m2;c?qHs9lCcm)IJ+XvunXXARCUGGD* z!1+SEA*`$IfN{W&R=_ySfA}|c_VU?fMF!xe0Q?#I%G+%xg|s06;Og5B*DnA`zaI6Q z)cj*(QhRyr^o)nRmjK{8E(ds@p7=!xw?xZh%D&)-gu#elQxm)25SyWn`O zAdKZAZg-fKMOwYr;kW4#1GuiXhxPQpWtYLfjOUYW{j42W^>IJ^8~fQ{c*hC=Oqb6A z-lq$GhUtRK@>_Jl<-~bl_dabh0QcYMD=m?9ylvj|A&UI>T zuk2eilIVBA-1?eK0J;5M=MpT9%To`Ls# z4e)z<)=s}L=#$uvo(TZ1UN$+v5Bzz{WYDa5jRLP$hym3(93{GkBiD5{zx-RPpV9KJ z)t44CDf~Q-f)z6yFWukfkLqmm6Jl-t2PE8I<7ZrU69De>t>BN#>#%)JjGyrVaGgFR z;}YT7uhiEnBd{Lj0PtP|Zbyv6fStYl?7HGM;4T5Y&;PBYAJ!Fbx5s)&n*{)_zCEx# zBNo;sCcNHFQh#^v#MEvX>tI~t85eH#e_3JkHypG1(~UM?$fm5%8I5gz`%X6Br;pXo zn3iPw{ehPGD`T9+Q05{4R{(4qX#qZNBYV5xXTAWqZokzozgBN-lfd-HZSuD7{MK&> z{#)DFY5RWL{2g}MKzN@R0NZ)7KEOU#i~(?fNVpBKEj|f++$OjVn1&ci`8OHs0nYMgFmSk( zzmL5h;4Gib!D0Km{tmk4!TSya*yu_yq!11Pz;p%gPu>H|U?xJE|5m&F6J!Rq6j9;shzx3}ZseHl2evOeyI+tl8^5cLo7M*u{`ylS^IWZ{GWe^;C0`icQ? zpTK<;JIp(n*RYRy3G>ZAp?&N!-3e%o%iR!sEO&9a&survUHD zBi5h)C|Yj^+AaXt3GfX7rggNVk{9i`@IP8-c)wr&5&h}N4v>AN>LA0k!efs6yT#Vu zcKm-+zT5eIE7boez#afS0G17N9j7@(J3e=E0w0I%{qFCO;r|PMcP@0W>PqZy?AY-i z$M1`Q#+ctREwGHmeNf9|bF{qsf9u@xkMzOHV2(`ps7oZK6`rq)S2nQzw&VX7eGre$ z@E8M+&FuOqnP+Bbc{3P4fse!g*ZSZJ^}$F?PwdY>e&`?92eIzKV}g$W@K_J`!7TO+ zMizU^J7YFG-Qn?H((iwy4<5bqb>#Gi2d%WiW8Bfcd#%6i`2R&8On?gFanEpoBmgW2 z&#_msv)F7-9QZhFr^VkP2lFBSD*%7jxMvpRH4y-hd+c^!tW!1z1V znQXzhrm~ayO|5$BYA+A#oEWw!VTb-H9WnDO1hgK95C zR*qgD+2+WXk#S$FjeM|jYh?89)seGTu8F)JuZgTYw9E0LmZbkbaour@VJo~?BQ_QpUzKxMz?jvL`x~`85ZP7qB zsQ22)E;(*8?^~-PPd9HWODI?#d3mpwtbFv6$RWXAvYN4(ktuo)S^n+Wk=1=&WZ6GX zvX0lphU9-Fui`dM1Lz2#1;D(D+cbpxBdaOz6ze)~A8V+ChIPn6#k%9rhjqijkG0vM ziW%x~o~h+!|3~}C|6lOwVc{Z~aN@?uvQOvAmi+W-WRG1lWE<{fN3K{lMJ83RiaeG- zQKtTOdF1(xD%rp_OCpb-ohUoQSrEBq_!QX>ZW)nst(}ORs*snE1D!&yT~7zZTWw%?7akK$OHJh zWbb&$D-i(8UcBan9kvx=-Ku)HOh)E?8mVrxQdS+39l7b%YMCWyW#nmjwhZgls+QR@ zrxOb!J1$)bXnCG7|p2ce|SQp~82qS@I3+W`Vj5|4C$MFIt>Bm3VT{O0|33Z%gob@)VW>tUa+946=iRUSBk&g#l7e>?b z5&fc+E_-F>5>*zo1WsvpXJxn}F`Pk}L8H99JoM<%BN|=4d>I`&bjXA@ZrtdNGSFyx z^k@_t8;gRe;9%6GNt0^pId|65{l*`>;Qf0JA2CUnn&I#`&nIPDUzT&>SW0}+0bIhu z>J0ae;Un?lL*bf(j8aQaawu79DR|WmUvg0VxEzkJ91LgZqWA@HT&2`llTBpf%WuBe z0Fs~CmIasWaNv+RZi(4;0;VJUs6PR-A^ad8m#-oq#Nqq!VNu; zc+3$3x`hi%$=KW6m7VR*$#&;vyYu>dEtn&8@ZJNL=PW$Kf_qw+r;&?5#p&bXA$MsYZ)xDu#$H0lxQrG~J}tJnINu0t z5YpnKZ7vOqUCoqCxad5qz~tt__mQ-v`nXWXhS9Gt7lczq3rfwV2q*Fz$Jwr}ZUhoH z0vR^~nK%3=N~H6e%fr_A4G#OsZLOO_w!7aOyuRd)@_Z)TDNg6 z*Seh)U2nR(hPvS6C3MPmcg}Wi0N21b%yuWU-TB$>f?nC~!fbb!Yyn(Lc7=7V*b>b4 zEv&9p!F>}eyA7axBRY2xq6mH$A@O-~0wXy=D(E6)B`2^QlM^_}3ET+&=kmjSf0A!5 z>0UxG_=#V@W5M3!1YvT5OLBs1a)KNDa8FKXl$_9bdxFP^Z1*Ng7VrLmrcdH}%@KOC zx@6vf<`IO*IepyF_S>xHY!`mF{@YV?CUz-|Lr>xg;SAm}4B@#k%qMZhmR%NBhsTq`&6tcRe{pm7c@wt@9Ehq|M zOv_>}4P>(bmIf}7>}k3W%Fyz}6G+mZ@5&fIYOsbUZhDMAaX2wIfy!Rlzu4lSe+Exq zro(mKz1>DAknK9!or=Tq@8#ze#q!;7hxiaLp=-9gn|nf@+00U`Zaw%kA%(m16mWOm zF)H)Gg|)lC>=%4(*X{*hOisAG?IF6jbDH+KZh`hw?H=v7+RNGuqt>EjZu4^^b>2C1 zg#7Gpc5ZVK>^Ux62fj<(h2yTfA>j7(xci>tv5oc|Z!EsFW1EXd%X9Hm@>;j1+3ud% z?q1pMqnf!VoG)iJp{`I_hM+Cq_Z%woK8*;6HKR`xjJch!6osq{y?=Hmz*nIe5Ln<8 zba1It(2DMUZrr^c+F+ zhmRq&RP%_?JYtqW@W3PD^8=5VCJ0`9L|lBt3@C%((?`V9N6bnbmHUF=zF@wBVDlG* zPxBYdYzWF;FsF>{Kx`cJf*ACIDU5%V{(|^C{RJ~>?x3PIFNifSn1pNKql1<~Mc=;o zrZTq_`9`<}J}QFW&tE*NWENTGAz$~vM{banh|`SAWVsQ@w^87u9)Rf2>Bl9QJ%|XV z7Am0y%zU_U!z1v~rx4u6S;s)lcfnV8(?e#p^SpT~e(Q3gb<~tji$=dl&OV$H|8?s@ zD)zNJxJL5w=LrYT-r3_5#|qU4m3_hDRg79VCdRMPNAmIVIWj+^bY)bwuaA2V;}B!p zHO_(~ZVd!S8VZh(g52$gy1Nhi^6)o-!AkZd*O0+2nult?3hUyY=F%xDsXA%f*!Ap7 z$QhdIu3Sf)PXwF!aMkuPnoO{qq{rNHNJDBJ33ctDz%srZ>08j{ISIsQ(OYs zF8(3+<{1-sPvVB_1$_pKS=XF-gF7rZTAeg5{?TN~0!c(KV)5aWDXE_psVAnL*__m- zo#Q5=yB{N78BsZsJuzJ_Wlvm1EQ)pRy@}|Ro+5W+yi5#0Jz_1rnsEDk6tyYJZO!47 z)-{<#-YKWUG1*Z>_*zEz+SUiFlNMyA)CPyl$CA3o{p~X{kDgIY-9#_~J2KqFO_na) z8xvcTnfr0>$jCF2e$Ks5oSde3nYgGT=Hyoke>kjgNg*Wu}vyMfrBK&?BGjwfRw^f93I{GLII9MT8v{!Uj3{<2j&^<+#Vv8bI zaY}JRv2tc*DB7ux)eczQbM2@NMe2jGn+SAb?&ah`?mL&x)=D*Tnqwd~#*J)>>OB+>Iy7m(_19jRtA$iGu24l&7=AK<~Q8$uC$ZzEh(4q_K zJL*015E*s9yWm3i874Gn?`yA=X(wwG?zc1B-;SZtq((WKxjUD1 zA(X7yqc|rrJ4nxIe$td^YBi*mbze~#o#m|y-rm#D>`;H5bi6KIH(#|@wI%bH_BmHm zBEkYsH#^p2vQixUy?OWdi$79s{wgd&KjG`EC%0VTqC19}+SU4;qk8h9>aMDST-rgJ z)}=?I9}juDhRE{7ukQ(O$~nhv_2`%O>C9lMd3iL>oZ-Aw~cDbM9G3$H$+Gpgt*EfNmSYvWHIjOBX=qVIc5 zDrE;wIx<{8hg_ilob0|w@49FFO2Z&3Du>ZYFfq@t#`wT+2xh?Pz05_4%-IWfH(#*; zE-fYx&+R+zKKbPMt*|EFOMTg`FSHR+qW+@cBblcQ88!C_zR%>Vt@1yk7RrYwv)xW) znon;3Or#T?6cN9;!Yx!H|HV6wvn1}400~;OZe~%lforD@=s!dHYN>F(*wI)>g=-$IW%>U-&j=_lwj^sDu&uC<6nr|qxL`=xKIrO0L#4sNh?*MP7%5|a z<49w=aglL@F=Lu7Y6zD_@+D`^L^DcOdkNOOO3 zB$-aO-RO7r@}8~hNqk3py4E$lU61y;$V3t%7g2Lj2T@PaP|?RCzFM?Ov|V&W)bPCM zXVEhesuS@gK9Uegv}CYktYnrXV})d^#4oeaq3@G0aZ$|y>M81l>hf`Dc|5Bq# zhBYlsmd9HwCzq;O8h6dG`$6Bt-E$tE**S+meKm=iG)<-kt<&t*e51Lfxu-E}7}}c` z2!XdYSR17sq)pY%)GpT|t@fbywDzXl66yc zi*-W_@158>4kdZ|86pRAv%7cSAGP5J|Rz5c4c zNME7n8axcBwV|6qZb&jrHY_lFYS?3_d)YkjPEjdpv-`CE{w2dbgW2G}U=k`*{**Vg z-4zgd$B?fv)QE>0SM;FmL8&z1(HuCdnDgVs>3)Fe3a(RF?*7}9Pn6DEkU*}89@!8Mp4tKC6sv+b%4@S zSG%<@uQY%1kgDvMA?=Bj4;|#qKJy4JeqQiW)=n;yvl8T+wzV4{nNbrzbcKAY9DON2 zBmYtUME+9ltZ1ePQt%=b@e0pX?&B1;UWpDV&MIyxo+@4`8mL67b}A%OC8);nkBpqC zx}nZiX&cQ9DI1^Y1MGcF6@#_x#?L!tjct(KetaZxk+1eqhp3~~gVkfzv(#vXdaL?N z^%->otzz&@?@Bdt&@|Pw(NLQHnvt4x%_0rjpxLMSPGivA*OY14+D6*C4PK!yU%o_P zPv<`~Mrz}=qqUQ60uExH`L?cQw zW*XNScN@PkUNYV@nvL_u@tdkd8a>C-)+Bw>K^F5#UsIwf%~aTI);bf~ZTiM^$#lfyOAeaB5BOT+lnOP{xBE38n6td8HF*wB@+p)0}M&_N=K5DgHG62&aYEPfDYv%^c6!o}C-s5-&Gw8^&K|KaXH{u(Z^62oM zyfDSQ@MVH=v;8*6_sORYV=tZ?AQ1H!)o*ku$5K2Mz3_f1a+W+8INDM=yo)4Of)tWT zlKGOgl3kKxl8chN5@hllTvj7#NQtTTl%skeg;J;(br!XS%B4i&lNUd;`d&=9& zrSdp=vV5u>Etc!lC)Fq9SL7w~aydtV8Y@~U9JPHFiHa$jg_?B=@ovS(Rh?EP5MM`&Zv+ym-m0eFz z$JlzfMp*Y?)5$0T3!u!RNg9@wb#9%c!SR2G)Hd;)uJeCkm=|paHN+8@RMJpA7*2}B> z_VJ4?sS8+(3C|JSyA9$^ZiUtOTJlYe;Hq5(A7+FJy?xHIJdUu7E#9>(ebC)HmVlSx zP;AL!j9S7f6R{*;Rw6=rRz z`I@_TT~ohMCrK_NQApd&)e3w;s1mHyZSl=vDPXYnMrvR9P9zj{7$klU*I(2n9R7$j6t(^YJ%RuALlW8Twwl z7B?l=+&eh3lHe-xNx7^Hay6Mle&rYimrf77!g|GdR3Sas)vwyy$CoJM4;P}5UP*)# zgZNgcuS`*x2%hD^2`*M-Yi0U-@zPpMF!sOMC}$(NdY&M9Sws?W($!^yF1&va9tIkRtnyk+{7&?_Un zkEp^KJ|oj22uCz7ug*tFG@DQ4{UCHm<**_M&w(9c*_|8$yIC*G_UO=PFxMYRu!`82 zar|Wq4!fPVe^g8o+?LJr>&ErDdAr0643t@7?u07aAjZ?uy<0Oy6<{}~@rq>bCfZ|8 zpS(>i;eu|Wwj8#Zt$Q4$E0&xIFRbP~E{}$*m#0YMh$SwFM)(xdACWJhJg>$OJ6+MY zs29HR&Jiwi)&=z<%){a4QBIbAo|GWnP;IGnRz7Vh&5DR41alEHoY{{!KqN%L&AlaN zAGnkqt|x8{7q5UxzSzX`x$G75JRwuA71geyaHr$&Jrt+>nmT?&cPyijT*~jt4OA?OvWO4 zdk)CtD2JjdERlb*ie!Qw0*f98_yY+xls%}#T)MiI3#%Pia^I2CO3@T7rCU=(oK;G1 z5pHE(ds6n%Hspy1coF2agQ{L&`!+AE zj@VsP^^NOI!A(JXCb1a3B8Z!AL=Ef)TrOC`NMv$+FY=d((Jcm%_=CV}3E`Mn;vj1# zo^V7A*HQLHQ<{m>egJcO>Jrv&e@Q0^EPsIf|F%)16Zo!mkpHdQpABSrv=bmK|3d{G zoa^QPK-P81!#DE3onWZohu~#xfvG_Oz+yq^N}3*4N6~bRNJZ0Cqyx8x>3|fzG;Jwz zK-FwS*UOgr?deZChlZYhTfiJHrv~b)qUYRVS(u)sarwX=p zQNL^6!RlE*&1B?B5wV!j_AoJop|>hJJ<;Y8W1^nu$Ivs?f-_mj+u(VVv!PL=Tt@l}b7FekXZ%Fw10@4-hS!}I z66sDC1r4q=+9?w-82=Jp5VCFvxNuN?0j#buGX(Qc-6)@2g2N4{Y@8u%;(gOMm*8D! z)lWTL}k$;IZMG>U<#SZ7dbSl`O0_^#!(=M&@n>PpQ_#CtX~xY%N* zI&pX$G@IoiMhvI)zN7eSW=wA4y}7;f=N*eJi^{P!95%%l3*^y1!kGOg^*D@R%xX83 zIyTFvkV@gh0-N{$$J~3sHI;OIz%wZj1WlpYLujI+0TdN+O{jK5wXC`cO-0cFf*k__ zb`7>&*A@`4tr}5mYY8g0wIHlmR@|UsMVEjeqQL#mB#81pyU#xReBb;1-plWh91?XLC?XJ~}+~T!vk40kDPjKL%xJc($ z+~B9#C$g~?(b$J+@jm7SbJ(+qP zW*i03`W!fHGq{TAFylC&!BBb?1~eE2QDNXv=lg-5n!_IQWW7Ow(dac8n{_CHf+H(z z-~~l4`!i(y*2u<4WDyer+-*hKM`W&Yyr?A@|iSyiD$OVO*KFwmm&cs>VKuyEw606-gXrNs8QIB8r4IYzWbP&vv=H>VxG~6R%q|~pCcMUjuHL|^qUck-=k(Y(l&OLxy7AfunN_8)!IhTEz@w>$YZCHi%&0bkIhTv z;p|f0>*{IZ0)__9R6YJU!ZIPLclw;<6WBk@KWwJ$r?5|9GB^88vkE=D^QSw_NS}kE zM7E1uv5b~uH#m5dL-41t?T(qy2}JF)Q;!#hFJ~c>{M4m+HRJ39H`0z>$_TejIxlm- zAGEG0%W=DH_9ibHN{AJA1)V1$XwV(n#ia8de)hqfQgcV~j~8az#uzb}Sc#1>3SEuE zu+Pt{&Ztd}yslmuw)h1&CDyplu%)N1?~XbCnhKEFUh+_!~pOI+OB6N&E@bFDFW(`#w+-ZCaGXqZ(>U@ul@eMv7pzt|;R`@t= z6h3bjQTSjH9x5uY(kpzF=qDq8#YTh1cgE;zg|EnHaf`yYPxKtt;D#mmi3G9+m*moI zY{bv&ZVcytYsF%H%b&-`?;K#oesv|>9iGd0`R?g$5!h9%a2K5j?;l`cEU;p~x52^+ph+t5Ol(CbLo6RK3|~M3Nhw8VE4xNI=xOf z+RoDEpy^6j_gM&tN_bCZ;BrpG!AFyDV1p zOPt)YydMk8`{NXDN~Lfkl}d3N6(8WJAW?g8F>6#{);ZI-~FtezvjY6P6xo8`caWdZTK~^1f8q3JrpgqCMHNhJQbSO~5QbCDA zp<=CqC{atQL^a0LDZM?eMzjx?PyV;Ingfa6{m~%LNd4v(MIuxz+7aE zX0_S|UcQqO+kkyOrhj8q${c2eCt2Yrum{{Zf#jVm4`X_Jt7Na^7My1GVQd_Jp))Jy zwiT#ZM#HR(K#zKx_$vtCWCVJYmMBuqA3%>fbPss#nLYY|{lJ25+stE_2#h=1TG|e< z8xNY)WiHX9hB!GoJ0qS-XFy-69dY-XOOZ&^|G*V@jfm!C znLLyph8sCC+;+A#Zar}>ubpk@9(JRVAcjj66h|9za}(Z`ZMi<3N%Bj$R0nvdeO z^S7qgxG@HLHw{q0&-Tn3H)diir?Fobn{k5gK?yNWuuUflmtFHRJGZgK-a3|=DI%6* zgeiZ$fo{mTMIsslo-l4ovQNnz$y$x8&_Gj9W|mJ{ApNwg=l;logvF|2c zsP#A>Q2Z`uWv}WICnrbxc1$+WG7c}ZYs#t7{TA4) z4RJSh1rrWs-eSV3LcwrAD!gU8FNIocI6vb0L~3Sz$j^9@%v z9<(36%w-+wCzd6R!LkV0fg-2Nq@b6 z>;NOCV0C{DN7?>in5CjpH;u+PfmdVB3dT0&c7u{N*5(KjfI(&vcM*4_TmG;?zwjoZ zkXSIuJPE`}ws9ayPryyRAhpRhIgoyMr5Y@lD|6S3b6tftu3G3cc$xk4y7pFBe0-rX z>g{9f6Wj51_3B}RhRZiIyRX=W!MkZo2jdCgl^627?o3!IyoeSSd0Q)WAP4ovlC1aw z{xdK}fU)F*F6X=B3iok&rx3zjQ1i=oTOWNR+3@Ciaqg1_7A%KBWUU#l2*O5o2r0Uw zPj}HMgwj$1ur}Qu&RiifFo`Vjo{qu~rl2Mefg!14+}q(2v6YljTiMk$IU@!J;XWxy z!U(_`+#&>FDr&KM(EiNo0VavFU_~)lJuJQmL2m}wLrNJhYKh^)2;?B8U-p6Fqgid# z(%GxdiTsrp>0tX%=#3vaqF;?-GVn__(%Yk7v*&^^q%uIq=B&j(F^vq?4>xm0jt5vj zPUz+1J~}6Y0|GLJzr>2c_@jEltM?1|sq}XsA`84(4H^6BsYd=}6{aSxW)G~#Jmg(# ze%;Y9XO=iOcKogToKRcAGaJXw{NdihG=>}V>RRZN!}l>RzkGLFG*7tFkqM%83SLgL zK*kPM?4!0hd+{db$X`0Xs3qp_Y!--DQ|n2*ZbroVZ9*jL!A0BpPi*h5SyB!r$|y#Q zDPpgNl&Bo6*c8=VCu)z@VjBLC zN;NP|;KAc&C1uWU1~~CU2gIj!K+U}|MWa4|?3?#tMOr7cX2n`xY`LxzI?)NO^Tig> z4eHW-v9c4=fM9G|9*dR{>&EiY^YL(`Ta%0yFqg$L=y(2CBxES`XYiPXei!iaou#k- zmF^}65y|apFrPy=A?EW$;`$1TBLYd;1kSS1p{O3)D8YjMtT8(-7HZ1#4#X~)K7$6+ zlxcJAEFvzQwT%HQ@CvZ8rD57o2B>4X&>M|Ln)xxo+AzC0O)n{-+i5{kQlj_9CnqcP zrgRbXmvENF6OQ%A+9UK8^eMO>opv3kfi?X)W@0Y>g(l&Nd3}uVND!EbM!(R8g4GRK zog@Z_(_m9428Z#?=DtHQ-OGwO%BmQTvf9EMLBmNPJMVj;<(;BINR9#_`P)f@wSfsj zQlqyvG{4~C9f>Q5kgT{1YItvXj1OF66I+JuYzJa)=*VfdJ&Aub>h078q~uW0 zywYn^pi}lcNegue=t2?EK_rKShz_pRX-u1GmvN7Gfair{>~@@lkjI-7?Zj#4WiB1f zn%+0Fx+{s|>B$hkH^OZDp)@ZmhOUR$+Njc2Z2eJa=6-;e?8h54knznHYj05n5ve)E zoG~`hF3q+R2vr5{Oe8Aa;<_AU>hrpN1DuISEf%GrZ){$3+3B2QFPh9DlZdE|_#K+* zSU)glGUsK#oI>D8675*8hjMTXv1HH?BaY?fRp_n;Lk8nkKTp%d)h@DybA}3v+(wv9 z91g;ah^onnc5-6HSSvmtS|b^-(;s(A7l=-EwOGONBVz5L%QeZzZ?=zQz{-Q6V|3}x z;!_gm&WN|z9Hn+k;^8ZNYuhxgHJAcshtOp~i^hq}S4nt`Bny7H^apbZk9qYxq_wCE7J**65~(xp@s9md6yH1ewZfk*S|h@MJi1xi7I47*G*AN{@-8pu#Dp6%pK@YS_#?b7?4>Na zTyIj)gCggNP~8JI1sCz_YK=F`5n0G7kHf|*EKuwz`bE4E2V^j2DV`f-Tkn%#K=8s5 z+z4(O=5B<)@Y9%U9%dc}_Jn=WPI&9KIn$%2he;Asacoq=tj4ARFU(~|H-fn#Oecp} z?_Xpt;uZLmtoO1|n)^~gO3>UaH!9jnK`#hLD0#_Hfu;EpUi`S_rV+L`;*L9HzVRwk zJbPcSa9!MKd4#dXID#AUe2RU_XjV_9r*h0XELFDOIB$8XyKJR$oARJiqbyE&7i^!x z4JuRq0rzPUB_*gg)Iw9bz@Zu zDh1Zw`O!{)RPT&+-Cg45g?HF3_BT>)fc5m0LYoW@Jv>%?P^n4oYwqrBq| z9u?c>tgz4t@&|@NxU+$cuo)sDNSSZ6;;#8Gv}Iv6uWF3)Qr%}{Fg#|3=Gn2S)k4eK}MZew)@3O<8neA-QqJZqMtc`Dvg=NT&Tls8ltnw2eETemHNUqr0l-AFrId!h$8Xt(@2Orwt>58@TcF%*UMA+^leA9=B?D z8jW3P%HZ9P;OZ`-vFRJRt`E$^%v>MzDWT*355w<|DG9%0F)&=`*lyiDoH2gKudl0d z>{Z5ToS}aF@wmgPq@sR3L(*{W!u`=sx6RLV9_QvzMN31|!|;=Ahw@ z<@~zk=u4Y|^H0&$^6ZBJ;iJ&1Xr~js4-Bl>dEI5rlZ!E_sNm)0hAWQocx}8F4HsOh zYv9DB(nJN!3L|>+m8>ee0Ljto_#*z{o~h2!?B}~FW*>I#vXdM+!0SvKG{7`G#&-2l zC*INhlm^T8J!>~B({j@IjdWbVu(@mQVVbua-0p zkJbLjRQ%H2Z4UcH-CDD-T^R3SM%XqyHVwm+Ipsj1fz$|U(kG{k7-~t=Ao`}J#wp3W zFDxFaDthrwP<^yvJ58LwiNTO|TX~Ohnr3Nay2B~XHmt({OUFL6Ri>s>tcTNQnO`!w zlHKfwI!+ka`$f%2rx&$Fj(xj13K@CAa4XZ8juXRu+#bg=3&c4Mqb4pDGoZqMD(`e)ApP{(E<^qPhbpeg&q8YjLWi+Q1_$*s)aXY#D{SDm< zS*CMBPja6fx3c2j=cmzs7)%LYzB8C^*5uMJgL6fDA>R>9Hgxy>WO}Nk?5Dk){kkIxiru(I}_9nuseh0CQIN+$$}-$@Cwf;3hdX;=)uBMRID@D zwBgYIRVQuYFWW?2wV4ZQs64Gj4P9)K#(dm%PRrV z+h;e|X1EKYRbpA9-h2a!t1DVbefXdL$OvX(Ke)8i?9|@H_X~gr|DKJSMEdU2hl0|af0IE z56cdsU+7n8G%A^$PSIJ2z56a|mst*${AH1dHRLBWleU~P`LGqoV9`p-_``}7G4v?h zew`G97s>w#Y%ck*l0k7#>3sGLlkudp7J3c`;}WY!9&4Aavvr>EBKThQv7!%rCA{gd(7L^d z576B{19mspj@65UH_U3m?ve;}_l#h77f~02+-*x7JB_n&PFKNBH#0^KKzEtMGPN3O zQH33kH3nGUTr@E zDY%s}dQ9m+EsFAcF7mQmLydgR=zonMbD&DY&I^vJ_UwpN;v$ioc&T^sK#^F!+FK*) z2oT*dg3)=J7c?LB#yd~>5R9(Yyt`P|0IIMjU~~Y{oiku`U;#79?<$b;==Z!6`O`Sb zXd*}8>o#lvZ=jFV!Z>gSf9rNjrW95}O5{G#BSv6HAUd!TCfnG&0Eq6q>q~;rRq7!+ zB?Az;K6;2Q(l(ncADD;d5|HjhV3KP(V02ByN~Jea)f12oxq?Be$z=jT=>VjY3gC2X z_YVOBUIx^;Ep!cg)K;N>=JZEE&vockpbP4^e;pe0dqBhsvAjG$t|kE8I^^Rji~kA5 zio(M@WYMm&*$M+dm&gkf834LPfX}(_8Obuw0}IvCzy|>)I6@W`G5atW=2kF%l80Pw z1>^vaTj9y|B!JvR_yatSxo?J(;z7iT&=Y}56HRFC#VH;91$To@Yo~fp20#uunxgSt zWPN4vi(H;^Ou}lW&ZWi1AN6iQH)clal^V0KrR|KFZKDZ(OYIZG;Fqq%q8qmOnCqRa(9Ac z#);#94~X=TO^3q(!{;O~VQ|JP0gj7FwOAdVx|AMifa9{{E{{KkyI-BP6X3WQZgL$A*2{U8FJz-z+Rgw3*@yMFHaaJRRvk#Ai`@$zRlO$$OH z%FuLCk}KYreU3JFqn#IR4oaY0V&g#1f0e(Y|50^bxciJVnp;0#^BEPJ@3SUsVTO_c z+I{_;?t==6a?eW5&q^8B?x@$sftNBq9v@|S)Q5X%qrLe0ky!>f&WSdZrbpuv_n$eS z2EWINE04u!ksghk;ndS&u01-3ue#+*2L&!|E=QY(a6cY6^}1%R--FP7dRPu^!$Xn) zmb=F}<;U#xb}nPxM!euIUYzl|+H3cvK}XKN+w+M9u$;9w3f&lKYo3zLJg_l0{&n^H zYV7>ZM@%yZV9vbw7X<)wo&d}RYz(nex_<@Cf%ldkm>Van=htytl)u$J)Sb6E-|m9* zDnR*Tg7T+bQ79ezFej_D6_<+%2*O$YLHWySRsPKG4aeRCzQ*NzD@Ne~0}Z&GeYzO0 zXvO8;1qR_&?c^v`56hA5?S|vPtzZ4I7b zp?xZKAisHj+lPLY6IUSXK-0Fe>}pb}gSRM;9P5{9fEN7N3HL;1Azn zk^V227&!S52HwV@KZXC#!u(65KVgt`-atAVAss_rgk#@47B>P1AeO((eKLfZ1%b(V z7>3-LpjQql1Gh6Pwo`}y=EuKl6hFx324uO;3n6$d$DbC9gkex)@wR^x27>(UMba4p z>FjMyhj0>rbF7u~uZfT_2O!LaHesXz7~a_f{wGzskOr!v9&Em5FKWBPq{IMUQAtOH z9w{qz!RT70uJG~rQTX@X2s*mAfJTi5CxHZ*Le6gx(#Er+*^Ah=xa;tuAiTJzGt(At z9|iCUr$6`*1hbpF88u3RaQmTfLSBZDCIS$oX{-kSEJo;dWi@I7Q}!lkyCScUa=?55 zBLQ#%<^pVTghAT;-(66^zrC3K!JSV3;LSoU^(OSLl{(qWca0xwt7|}%n;~Z-SdnVV zsPa!W)h6`O>|lh*o&bNnTfz<~9vILUz)Fms>}{0Mo@tz8T>dGMoJBF?MJ*K9rj$l@ z4P>#jjrZ|=;-(5n4ZzFa8FT31qBogpnLzzpXV6xJvPsn6(%`PDgaxw5-^$n$4DmJQ zW}+#4g4fWInlS|RO~>txx%A|Pw8PxP=85>Q`F)^qchfNw&;XcxYLF%Gp_TbVD~pF# ze^mc&zUe9c-MrI7t1b_%?(i65va614s&jLAUA>Lb@#gw;(Ab~X{m@4zn!m5lPA7RM zTtw%j?+X&1JTSxt*WcG2hrS6AyFV_k3NQB7f@e9iyC4 zX!68S+qicXEPmG$J#(RJ9vwe7=3uU^0A+o(|q3u zQ2Z!kx5#0}-1t$2z&OkW2Hz`Ucp{D;We1=4F)(_-7ok`Ds232zg+vhoKG* za8EB_9B_>oE`kuAaAPnDA%ZWyg7{HB@Hv(+hQXIVs^dqM2_l9+#lYAGQDPuOu-`Oa z8^P=NVb?UnS;ib13Yg(5umu-th6UFFoTVL08QdPwT@PAtkM*q7^@?Y32Z6u$IA>oj zai@0iqYxBy9p2KXN1-raa>(jDQ;s>&=Ktozjb2;dGUoR1dNoHuOT;he$;Os7)qJlEwqN_ViBB40STAbry!s1hizA-mCk=L9 zEQe5232i(W8IPNP7Y92~Rxvt`6>Jhdd%yYv>ry&p08xy@A4-+y{dMbN0ZNRdyFE}? zRHPI#FRgP{F+w?)K$EkXW=BVnAXEBu9U&|;^A_}SizG94&RFrnyP&H4uJ6fg4*RQZsr!@ zeCuX)JJUR4OY76^dVYT`4|eBn@zs1{TAxF--C2EX(Q3^FKkH*-w}Z2+*YIe@^*6wonLZE(TNcx=)&wTFgtGc z!U!in{ov!}5L(7K^t=vUw>%$>eTc^N?d<|D`<5g}xryVw(0yF3c+U95Uf#Y3?;g7p8&y#f zhDv9jjGd;tJxh0cHo^%tcWS(vwCswKsP0uRRmi(4q-tu_{Hh`R?Nx`W3aZc&s-ntL z)u`-DMQDano295pnm}brw@~}3Gt@1roLchy2XtlX?VYN64k87AqrU=P4?k6`ppQtB|?UM&t%*4V9997calM|65q_CN1@2;q;H8A zx+q~+;M@wydkIV0S?VlBL!||ZaA|^cnbcRlUn=-y>h|M>^|hwdQ|aa7J>`fax0Uyo zf3KM!pCMl?AE{}~ls~pOd^vS<@h)YJNGxlrt3G!rzhVX1{A^p}-a#Rv%{WhI(l0sE zE;%}uB+(Kt^i&{E#TbQD5vNF1Y*y@1oKm3cibsmVW7>j`3MW-}Wt1hVJ~K=SduyFs z?rWS~?oU%9(>E)WTa^ct=ajdV301X9bfc=Hs&Ca0)mW8G6|YKD!Or^njria>)ooRI zR*BbZ6>3ygno*>O*VPa8hLYD4*TpnEl-j+t4`jeDC-z;+S54=zM6L zo+o`xPTaY80ChOplk1mPo;A{PBER|IqX)^IPffkzawM^6dC>;fsd-n1^o%a_OP$&0U z9+}$Xx#(B%;hueZ*p~=<1auVj@eTPTXmCD{@6_#RzUsKGPXQPT-{I)rWV;+W_YWko zM{lhXy}yX#MjUIe2%2uZ$I;?dpt-=VsXTKaM(vN5$S`yL!IJ9j3j2f6m-~VfR@@R* zixbvfmzhPPo&68&1}Ch04tMIxi|W!-o$LhQE2YspOU-n?_{C4kR75Kl)B4_i9#U2P zb10|Nr0ay8-*%la zNMPr$Y;Zf&@rA36b6tl>v#Bhx_0$R1(Wb1rz;huzV~Tfe%HoF}FD@^^OL~qQzeZ>; z*pSSrhiPYM^35AY<3(=2eiVuGd)i+Z=6x)pq~nVV9#5T)ADh2@7WFZrWJvBBO4Ph- zTBf^aoTk%zp$MDxJX#Wa{8)#>fApG%QSvey@xp#-`-|=4aWBP?B@LHKn7vv3MYv@7 z6Z%rYOP`#%xTG#8V34=Kj)mwnE)CxiRUL{?Y}a z(980Cxs&pGfYSq8lUpZCMWHS!0j~#N@IPM67(Svn+wz;G3r}{MRXkNYU%TqTlldOQovWNAJ9mG)p+rl=&fUQ_uG~y9pO_ z`#wK>b3LTU9r*n4Z|kR?=XTFSJ44U?>T=|o_M!IeqawaS!+K}cIIb~dr}Ne0XQYRI z>5m?1{EF_LG`k^H|2}H!`6VjO?(SKtccI|t;ggR`CRV47vU`45I3@oC?@1kRS3YXK zT7SNGK;t-3{ldKC$Cl-z4pT+-Yq%Y9KkwvjBwM-tJ#9EF2A%eJntFj+baR{f;BL=# ztSjp9q7lEuzG6VFHRV5Za*kO`dyXsEy1&vX^5~iqsL{IVyIYME9L$C|l;u5!yP`OOmV2?WU~`mlQ}#q+29N z%RVEyB`KFYE84_1(K<=d;Bk$QmsKsg)A%^M>Xz_I6?#xrS=CgG#GWapA$J_Us-$4s2WA@FDE6Mwb3tx+GW()0rfo zh3qx#o$SNx3+y{=kFoV^WWskb>B0BlkK#|^D;`*VgI4pe2p>3Dxt`|V}&gi=L|s6C=n zqU)kZqAC%VP@&?08zo zll&oRC*(=(rKl@^xb$0TjC6_gX;59tk5aRrq<2*mRhMEoD+8Iz%~hYz%DAdrDQ9ex zZ*=4>xN|P1JoR=~c?zlzdz<$_RVQC~kDHX3wS6P){t-^a;>0YYeNCsx83lV6D?$!z z&&v&*-}g|$4DF@%s(^0oP|_k*W#GD+-^OnldrDWhCS&W--Ak{2T3>YJDMz{c?txOD zw}naODg9C751-bLJ+-)aQ71w1=4VC4I@5IPwU<-!;=Y5G88u`=lSn*amU!6absgHF zjm&V+q0#YmI)*tK5=(s0OaC>APopw9Rp}0Ktk9o>a@te)*8LSRfjb1OGOk>%U z#IyT8?EmWE3ZvWtWy$LD#icKmAJ-NYclgn_d41LJWh);3cI+3CTXDSehFRtAo85YE zEEWZe<-<4MDJfTU#j>6iVCRa6Y(_dOVvp{rCVYLn&9gVT2mfeX72zTRJdmA5fui+1n%B5Cf%46B((5@#QlQ8s=2 zhE^H{*V>7gc*FMfM!7>8H{Q-#a&#wwtct6DQ6Xd2?X0TxCUNyD6LlALpF`-vtps+M z`gkgza;1EzZAZL%AIn~rcR%ia+?FH4dIl>bezk*1e182^b;`-i=M{9FXua{duxZ72 z)Y`OZ#i&{x%eU0@(0FJ@X{Ko88kC~hsL9ow&|K3z)V$SD8pJKi5V{u)E1Fm|vnZ)Z zc|$Q^Rg_UXjc&k-j)#jb6x}JJ)20=_DT*3F73wXMH6ltpee0}tX5xnCZ7W&@4ubr2va|93?ye=~m%{}lf^{}I2uijRfnLI>f%9(SE4QQ6-+JQazr zz2ghdzHTUkqeg^@eHE8(A52dkcxSD!KqVv)S*ehmF(P)O0zO0yIEln!(Uy$2zN37G z+0?H4xO!9Jz(E(keLd;EvF8iX2ATHq;*@Vi%|*?e2L?q1Q(|#u$D3~mfhP9-pM5O+~Uot^51GY3*k;6#HStM49my*E>WH^k3 zoJBHKI$z3zlR}CHD9G$sF(vWP4wbdMxo7y=mDUA`GdN}DZ%n6`O}+=Q&!8- z4!K%>UjBAf&Xxdelbo$U8aQLdPcdE*tyrX3t8nd%Ee|RJtvf%ysTf^Vt)MHBrLu?8 zLpe%0MJZRNC^ssX4D7Km^7RY*#<~neP-IxS|M*8$YE-Ozs;pBQt2(KAtG-c5RE=RO zh5gX>J*Ex5N7ahNlRI6{*M#Z1xU5m_R2^2)X`LU}URC|}hC;-`z}C|DfKdKCQl~Mp|{X znyxW)Bhr_Z#C!`|3~cuKIz7lEIxlc0?9V9jpW6BH z`J!Ko0>A0}xSw;-qJu zt^O|AuFWhviY8+YquwRugVEtx;j70^5GIj*3`Nr%^2m+FAllCn(VP0MK^q}d=MI~ z?7#YxqI~e}$4Ks4CrTOGQL?L7pkEfRqv%yguAhJO=&M1nv{tn2>^LnkrKnu5=;@+` zqBSB`Sm~x2TP8f5W*zfAr-uWoWt^YVX`;7aNV=!jWZ#%ynFuG(*wVp#!rnLBHyM%h z;vZ(rdYF+g^kK$a1aGUpuCslN`ev<>lrZ|{9+YS##geBIR3|Z(9#Qm`ej}B@;XHGs zOV*xVKirdKAmXDTyCy$jcsi^KScT&og zZnu-E%+02K?3X8Pq++rHkk(|y21Sk{Kyy`b zaKNL>ZxpDrilgjMS${lvnYS`TX-hod;p%VIG3wn*K=S0mf7Wd|s zt83H@jn!GQu;P%F)sNR;WwkmV7FI>CA6ewCf7$m);r5M6m~B6l0;cZ6|Gp$N{Lx&K z?BBxDt9M7w~M6U3(VWTy}7O zRCjUIqp(xQ1I}E?dABgcNi4t$)e&*!OOHb@x!4 z9Ur<+JR_k!vWT6VA5yHAtnVC_zJ;>i|Gs+U{s$fNE{2qen4*(rbz8-m>uD%4%sY|u%0D0P}1 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�rou+4md2@;jZ-a~q*@ADsg~?iOOsSf(^SiT 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 z zIv4nC={06(L6{ItEqFC^SwUXG4+YrWs8pi21qYNJ)HX_g^;F?_wWRC41aajryg4E_5mGRXnJ8O!1UrTg7E{r#66Akq^Pac6#r+L!OzYFhB$7iU>Tqn%ck8nyNtGYb*tNo{7@xarK3 zWuUK1zjc_MwE9{`vm)GL;h5)-irwE-d4vr!sauj{)nM6nYE17VwBn6hp0_z!_M`TS z_JOwJH1@CF9`Z2Rh!l!NbgaC)ByGKHid$V7>m`fMvuodp_BPIm!|~#X>E$^i-c-jc zVr{D9Hwto{iZ`yc@pT*icBBhG+F8FhT=!A@iAWa4H@i()WWzruyDHPj+VS2x#~nJe zgcq@axAV&PKhNwnFfO8kOKg!boX5vhrb)+UOFS2FP;&u8*+%&jub5ZHd&%2YfR1i+ zaF%*ZcQ|^|vpC)P=t(5d;g!0uR`lv`zivMDM8kilv3z1JbP>k-1Yb`-<_T5gO(x)7_WuQ+By~WiDEjy658D6&X&) zX5>xjIKD~aJ79mEUsen_GYpfIFtOkjv#?Q!wuZLp7RUo9(HnJ|!ik-~VgZ$M^kh?X zhEpHEll3#->H-(X1nK9hyAlgY2;wtd5*AB4yXlBTF@5gxWrvAA@SS{-Xtw8yu*@Hd z)*Sgxy|b`1Xyc=&-j>N4JW(OfZ64F+kBY&s|LO)>7ELM^QqNpBKdTnH9k%ZIm6+~7 zbR;E8^0j2{7<9*B^XQcsP0ufl>rfkfa_S@gi28K#>Vd&4QXPn(mG4fWleItkv2xFe zZx1YpzvHk;ZvV9VSvhQw{#%kj*EGfY!OdS2cbsVO{Vge-C@evfvkLEoYsPtPyuR@f zUd>3mt_ggXcx$sj7o-V#yYW%TMR}ds=0t?KOAA_nwNIh8=nHiZkZO8=}%lf)~cZPb!M%jh?## zDaU2>+$lLO`FYeu_I-&~f(V(FtfQ=_Y@lq2_#2sAh8BzSWdpQD;z`j8oCt6IBBv=6V^b327fhRyn;6MghsFojq@*M! z%}7K!@}uG-FnQjSzmSh06G-H&^ihT=zfw+C&R0gr#>-Hl@|^OvvRc`wY^CC_9y=9v zQ~gLAo3fOpVu7sP5WE5nnz}yc_1NGQ=5J1~Ik4jT*`ijw^p38)-gaKQhw~yu8Rm_S zb-D55vwSK^_=hxhUlLQONmT6-> zk9yesARk)rsX$KIXTI3VNFt^*4X z<&G!R`^dxF>q{=}UB3F^9zhZ6ulDV@tp0Yk>*1`d40UNdic&irt1c*ddy_DjHARlH z5_-M%cJwjJ(VQVJLj1$UH^MoQJLOc896R-5^k7o+|4{cO08JfR!*jE+YZf*aG+_}D zksu(7Tf!<@HLQwN8$eK8YEW=r5*2rAtYTZ2HY&Di)uL5vZLPtoRjU@));_UOa0P9` zCaA#u&$%H8d}@8Z_WRyHdYGFtbI;72nK^Uj%-k7enUbyIH*8g&Z(a1$*l9kj=zHC5 ztA1l28aDoBbm~r77lrIrew^Y;yp59exqwXK&F6eBSk5cb@8$iXy2K;JyegiXrmZMa z(@!)(lPn@U?PAf#qFo}>*9K)mdfC33g2`o7QgOYAFL9FuN(^H4picdtkddDKt0qb2 zOV)IGe0z)gohP?&7Xxn7srEg1v!b|^z zU!hW5>-zY1?g;OFBSUP2x6*XcS?3ft6}6%}1w<@KDd?%ZR&c)n+wq4=lB-1JZk_aV zDP17YyX#30{Q&)N)%ZEwvNRSlf}#*kon+SUZe;x8mdVA857O{n``SYg%$&`&1h( zN)bu&Lh|DB(((v?wPOBgg@(^k2!6HFRo7c%`e$prY`A;m##`LRJ1j8HS{x#RU{k83dLf>SBhPRIOPR{-cV*RvS~-UGaX!h zJ-oP$Wjm@kf*wwfr{~ZgJR{jZw)EmAk&-ebdnzrV(=XK*rTifNizy?Db zyS$<_-VEMy9@)g(%hTCrT)NcS{{ACgJ&*83xDz`<1zc9m6|EMLn})ANCq?b)2cpSZ zJIPwD+D{THiI!OQl^-?TPzR4a= zpQm&Hy;M7qo-Bov!#d{qx{N~7AUI-okG`b|aFN}j8_XhoVK z+AvLmW}JptYFBEyYV$P5HCHr=(rOL)LD3$*0+ecJD8^`K^G3+YXT06oAGGfYGJe1h zo!nf>`AfXKWKpKb-0jE(kv4CC-j_k=^HQm3_JdrDQLs?~EX$;012DF?gxL?v!9Iva zmQrJahuIjg@CCtjj{3;?j1yl+J!PU?Vf~G_h`m*T00X9R8-lTZbDlfM8q# za2*b9fZd>84=Nnt>;}6+8Z4h^`)t^UFL$#F_hcm}gfPc9B*5bJQ0|%u*0-K_LG!1Z z6-BX}na%s0dAyZ2C1ux+7T0ujVkP*%p87qrc`93x#Uu9F%8=g0>=qW}gJ#COA9&Z#vR1MiHqzm~xHy&9E?O$#62j+yx!U@fiU`87A z@j1M-a%5PXypXo#b>KayU_UJXzO@zDj|t~tIZH%YKpTvsOqs^W(S#lX48Z%HA_hM- zCKS?6z%O`fhOd>={Yr}PAC|LOtRQv*8#9Hk48e``jLw1+tCFF#^f-8T64X?JxXPHyCYja7=qG$?8J@uo&W zIG(W8+mc1NeHro?Z3t0dw#HQ(q2+jB(@}SV+T-+Zj1f;%)0k?4)T5AHaJq>n*i;*$ zU}KIW`ZS1=`qVg!$t3bcKL zxo`mXikWC^GnX(IVc6iNLKTcBbTSdcGFKYeKf~1Wpf-%8nwUE&4R0_p6Gab8*>Dep`Hdn;qve?j^a8ZiSf14f7f|x?#aYZ*_~ z0VbdklMNU@7=H#dV(b7j12DZCF*z3T)PBJ9Y{a+#<^f>(HDb1Nr83mZp zfbnd6>kbu9EdosEM$9C@du~*N<^*HLi)_^8n}<<8eHK=PD=YIHgAXzNii)mXe4e>y%$1^d>l3 zt6?Fn3f2uN&^tq^1@c@pTBn*XK37?ne=}iEcxHnXVt9x;J~HNr3;W z0s>wd(4EQROA?2z5id_1-gtQ$5b*Le{9C4B&MpKrFNeA0{;x_L-gtQ$JzkXt1T;^> zoHzu$yc`hl@-%wBDve%D05%BxM8(uJLP3au1cL=q({Bt3{Ada^qAE~Tp+YeNSY9!P zm{iB16i$U^LCq+HwJabtne-e-Cc&{^ z%zg<@DUKLK1*=pLW$II-2uz3|%a~>cFIG<1&8NE&{LbbNjnuTrTjk5p91QQ#li{sy zkTbeAV=%Cfhw*O= zjy97>nyE+NZ{{b&#qwggd>N5d1&S%~r&-x%FlB>q6LWAUscycQNw^B;84x`ji;Jg5 zLJprB6{)~f;KpP)wGE<~XAO`o2PQTWpiLBf3DpDm0uz+iQBh%Hz64^v$ZQ}M^EH_b z1hTMq1;{pIw+h+qOM)O2ra%z-CLHHM;`qkPvfuNKvkx&}WFLk2>$2bL70Cs^adHsz zMRMJVA0}vO{LL!2x}kEL$s(*FRYMKc8JRu|TOwXpMGB^h1X$ZmQ)L?C>r(|e09pG- z9O?iz*3C(efS(BHaE!M5Kt`ztnWlXq48{R4+08KLcMqbL0j4#?k1)kK7ejpn7`sNy z9f-3HF#JZ0N6$FwYrwPx%mC&s4|wZbv$w(_&ToKe*BB=iFlEi&$_9+hJ5A|q2aJ0& z%t^rXZHBo6n1p5+POms>ax;tvV3sz+gac+vGfXOAjx@t$1Lkrw%yz((Hp83*3}#9BIz8AXjJg3Bx5l~%2Re0tv1_E`0&T;3NYmEh0hm_JFg}10G{eLL9Y?^t z$j^4jvj{NoVL?ONI0=|Ofa%bPxdWI)z`%zI4RN-o#ZsAoK^@i9qI{qfTLJT;T;YJ( z-wea)9Y-Ap%!{-}L7bb-;$#8lF<@SB!vo%W4j55mTB{&VyP-|fDg=&s0|s?MQ+@)W z?9qVX0LIjt`T{1t8D=}sNdye`PSaa=J_@5U0OQ?=ISO$$0;V-!Og%0f^0N~#FY=QL znA3pi*!Wf<@aHaIQ0kZ{Uj;hO@}_Ayd>lqe0P`ZPM-T_>a81(62Fl|A^CB${7^{{v zqZ1BvK5ItD1>&3m%!|6pyLB{ zh63gVop9i424G(Bc`#tInqlGr11mC3;*0{!+-8_mz^I#HCIKe9872!b%bH>40%lb+ zOg3QFG{dX{OinXQ4q!fMhS?05&CM{|0kfqUW)EPtH^UqR%+6+*qk!4d4094N`Xck~+ z@86B(v06qA?@8P!E^dJ4bI?pZ2-T`44qMMZ>tsNF@Yq=DITR4<3+w2=%gG=+*^t8# zz&dQLrW`g~6KMA1|Avp)A1Wc2$KGwa^Z>~J8izUb85c{PYnHA&YNM0iEY5kpQ*dSi!vxG_q6R+3rlXlZN1rfzEFYB7(d+T?zc3A9a{cYbvqh>*$ zkLHI}KXEFxQgGCAN?mHaUTUlkCD6s^!lC4!Csr86#gwh^pnyO3J4YuP1Vnml^^>Gw zIXnWL|B-;drNXFU3-SJ&zOXLS7rsEq1p!=TV<`-S6GBeJP}BA*`5r{LTeCcO@WK8~fT*YRE23ipa!--UVPR=%^ZlVcZDpZ;MC>VEwcHwyO_c^qKp>aeB zvU@UovW}+Z_rYL*rUbkv>aUy|h&>z~LI7xRe-$6Y_Wtk0jz#7X-*}x{_R|N z5f+8%;;8hd>FqmDmF zv_Kf2gJC@G1KWBEy$9m0X%K`bZVTL8NVyjPYFwC!BmjIj9iTNp766W)Y5*Mca{w^z zW&kYHb^z4IuuWpmItYMT+fe{J03?d^cCug2AB=*0!?=^ijhQiiYTBf<%uGf@yys}k zq=j)XO>`~&j*toDzZJmc1Kqk4pn=cFu3!8GpD~ZW?k~`HJN>Lce|*mmR|@n@T30R> zlo#m5-3j3A8fcj7@A3hYhKl?!=k3>O9Z>uYi^t>*io@^((?;h7(2{=`2l>a;1^CEM zMfAXM#o&QM-w6$gi(n|B4yzc3=#atj5wSx<;vk-vH!Jf`8z%fDFo1|FGkNhM$dY4dBsP z5?G4{9oMuQ0n3pFOKeyUlm@uW_a;tA3hxL>_FW-!2NK?SgzXFOK;m57INf{)(kGy# zv<7nV5H~Ps_jGf7yfY~s8b8Lrc;!X>jo)vYUNf~l(|&Obj)rHn%S?iFz(zy)TdtdH zvI*b~r@>VE8L4GBgpJBJ%vg5cl$Tx*2lIk)cU!ERTM7U#Gkxm838`h9Ki9(Vm&fU4 z)t)H_9DYVlrY;P&OAV&>Y}qjVD*W#Mc+>Rw?M|fc)PB8Ku=R+8@~>49st{T zSJ{hrRx*kOKN(9G)0W}+7XWlNzvcGF{5A!|o8!SFZ6#x|C&5Ef10M5$&USjoP%|Vw z*vdRd6&e`-y_GJ^ea`xG{TY8p-g}IX_uJz;i}$T${8;Bt!a#L5IiTq%dm-PDS55l& zD`k%Y;$c678^FLVBozvgEvD7RTAUjjUa;TVW%15b!ctBwG(S^msz*ZADA@!hv6Czfp) z0CvW|lF8;WqCCa^5Cs5^8NV=}$g3eBPs6}4Jk}&VjmJ#VbL^k5m7;HVKW7r8cOL-z zwIyVrWxvKS?AMsD!2nI2saKo&bwi%jC=<+$n%O3=IwZc^IPxZIK-IS_{J z=56`$s`e8CV|E;oEfO(2k;U~l`R=3t0Ujkm{#!TjsM||;gkf*eeoT2LYLpiU=vwmY ze|t<=+I=x2*U`r@0eu`3(8nL|n8OJ!BJA4U%_3#z=m~R*MNt+#fosGE9Va88&e8 zps+C!_F?rE=R;NF?ZeFBs3R@_Xv#+%OTB=Gxy;xu5Fm@M)D>Iu5lAp^nECZre8jpR z3$PC09Ka3$EX#O{2{t?J(rtFw^{`I2=m|%`PxxDTiIrLj=^!t?WiQ753R)NX!(p3a z0R8cK$dF^9oIF8Tkc_C$L;QRIaE)U>&X;gA9NM~Y!)O{2!%9aQnF5x7+>f3Gt5#q1 zBc49}NmN9C#?M~H`0C&-Cco`ZCjV)v$^Y0wit*G-+cLh)-^28KoWIE*9>Mrz@4Keo ztPIAN&04_tTYg$@3jdGv5OX^~Iq=83-epYQn0bZJP`p7 zfzA{+gk`PPF;6I85YXY=8I3xVRB&<&%oyj1`JJ&%Cq968VIF&am0`v_F?_TGxKAK1 z&Sh5tUAS?2ZqxgQ-`${|Yo2Sr56@q@+AMisXivm`6*J89-tE8yocE?P@58*=AS63C zE}EMG@v#i}UP-NC2EJz+3n+5J)pZ&2?jpR?x0`VW(nH#>n)jlPH4Xs#$W(yO0q}jC z^CDo_HUPv8259Oq59p!+84L4r)FY7|0@6a7vjAGs#IQG^nFjGJ0n9X!7Sfyt(2^#G zy$Q`pP$sM!Gfkw0G_wI((!{Vgp_v9Wo8}W~AIi8eO?Vznk~zYw2(xj z6W=#KL%lZIZ4v?h9N;oQD~QAee--x-Zx#0x-=!4-J|E(l-v#-iHa|mDCXWqyV9EzL zL^nRO;8!F-7C<^cOI@U;E!|wkAQ@51AU^U2T%#_6` zz8c0{w*`h7CtTlZ{9oE~{C5GGf7AHC^smPMXOPw;0Gy+l%KBpb$9Xj31_Ly8*gw$W z_&*lLe+)CXQFA|20}k6@%YNo9d!ZM ze%q2)sgN$#E%Is=Kuca>81f49_o}voJU8bZ<5>WJoMfCiy??$fsTc61|4dubKuM54 z9|5%F4~G3GZ7B!dUk32DZ3%fF1puzGE#W)|=a|sWe}lOp^e>rRfXT0gx#8d5-;yA` zj{%TJp98ey5r!d;Fki20Lk)RWb0Hq;;^_YO+7I~+jye3>d4u({0|0r0cC(he!La|v z_A>_L&{(4Ofs31gCu*13Cf*!b`Va6Z33!kPfIK<@(2_?O_9pGelxL#Gw(~0a^9h8Z zoNL+N{wcdIuDyoNn-SL4O&x|l+SUG>?7E)7izfgq=$}u~2bj&8$>Z{8{zrPN7tpZ- zz&?*Uta;2szT^6KU%>eRG_~tqOjL#W7GyFuaO4&K9^Q2h<0JmR#jcBnrwRbLwU5+- zk7M2wUO!lSn8|y>I{?tH8Sm^N9C-oJ8|4{1zOnuv2$7MW$U7U^|D4;zZ8#G;^VEA` z3(j8*&EK#g#LRn4&!Yh#xqk52;9fjqeRl>xJs;zv19gz`&9b*?zO8_edEGh{V*LSd z0iYZJ<#vR{<5m$CV%~W>1blwn%1j6PG9MV?lqx{pY0P4wEf5&18#JuQl0XNtDSJOT0|BShy08vBl

lPy+#XAblGmfd1gy#Ht}X6CP1|J@1Y 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

viSf>fG&J$u?Cd6KCJ|VV6eynS* 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

ler8}zOKjR&~(jutfK0ASGTgFrxn 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ⅇ{E+s3^8`Qv|kHvRjS2mct=T$20A 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%0D3d|rOM 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썼jUNWx@1jwxUl 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

oZ=_wLi>JI4C17a+fH6 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 UX^r~5$KS3Km)CMLyFVHKKUSD5y8r+H literal 0 HcmV?d00001 diff --git a/omc/plat/isdn/obj/isdn_debug.o b/omc/plat/isdn/obj/isdn_debug.o new file mode 100644 index 0000000000000000000000000000000000000000..fb246943fe151666492ec581806071f5a26f0b8b GIT binary patch literal 70288 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 G`Trj;(h+U| literal 0 HcmV?d00001 diff --git a/omc/plat/isdn/obj/isdn_fsm.o b/omc/plat/isdn/obj/isdn_fsm.o new file mode 100644 index 0000000000000000000000000000000000000000..fdded68e260c4e2683f5add27674bbde2af7253a GIT binary patch literal 114424 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 literal 0 HcmV?d00001 diff --git a/omc/plat/isdn/obj/isdn_ie.o b/omc/plat/isdn/obj/isdn_ie.o new file mode 100644 index 0000000000000000000000000000000000000000..4c12df23e1de85d9ed3106b418be8259e75a76a2 GIT binary patch literal 69272 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 J7n8F7{{e;M?*sq< literal 0 HcmV?d00001 diff --git a/omc/plat/isdn/obj/isdn_msg.o b/omc/plat/isdn/obj/isdn_msg.o new file mode 100644 index 0000000000000000000000000000000000000000..426d9d01cb8f7c6aa5d5dcece6bd9b86cd00cea4 GIT binary patch literal 142080 zcmeFa31C&#wKsmwy?5Usx#0!~^AtuILzqDZgAfdYhzyEo8$)svqM1zYMQDqtNt8$_ zVC`%B>Ql6ReYM)wPFlwzwSw06(bhUt+fpA^(%4r!`O^2=^8c;1_CEKVOgBXA`@a9z zDEIEY*WPQ|Yp=ETKIfjZr*Q2mpKV*_&$gCXshVlU_e7slDd19pHPjkn{UJ8`zc&}P zyt%Qc@$H30ExTVSYDu1G+5AG$zQPkljYq;oErq91MswlG#@#Pi$#tlmjy+tEy~Ivl zi1Nv2tpGI@?O&fwRSfbK?Yrb;(f%v#qL!D6T8^D2a(n$6XvZG5Vh5^hWG{ygD#tFh4p^i9hJ>r>cvYi#TLhV5k0G}y$x541n` z9b-W-pnMq6X&BJSmd&rX9N$YlFpFYE?M$ep@SWBQSRyL#zz~{_#F}=bs<4a3_T90j zmtetEI4}^f#`d|frW?6sZtQ@~Et6wSw#pK(hdkH*w7(v+y}7+;|HauYM~hniovo`wKeA{WjDJ}W1(N4^ zI-KCz{vseMY%gm0fid~EiM{IP>15W$JFUw>tOLl)Z!|5xem-o%_8CTUu$Je#1DsaU* za#hD6_$w|~bpiqJoo5T%tYd|5!$_>wYf^5i=}2Hsds&< zw{dC@k@p~{_8Tt1g>BJ=1FvxbF6^%u%P#CWZgE`LV^pQ++p`Nx?-Kr55CxJ`_0o{w z*qsY&DSW%lOR|Tajl18rlEXTx1B$R(OF)r&XF$@ANdKG zD~$AgP3OoeC~5AaS0mmoPx)_?99|Bree~a3QrJGCdE3%wY&RW*RW7k(&F|uyusmyN zH-3;HeZbrLAjV;O0C7kyz91-13pwfx+CeHr6zqTh_)71h^%TxVW)B5c}x6 z+>CVkH(VGR`{*euoF3ZPJ~DROD=4=dDcYaY3_Y6owlCl-`c%>WLEL1YSa#-QFLJr` z0qGM&clYampPYI!h>=da-2K&rA;iYwB?+{&{Hf&}HqCj$5 zPdd7t7FSwaPoWdpM&+pKV8`X&d2LCDuC1PJt!KW-ucSrPr&#RSI&A;Td)Yd~ znm-9P#nF)CT81KgBkAXKkH;O<&t*c zXH4%KHW;Vu4SPC^)2KTfv`H>?mt*e*SEslVgWtdY>b`MBGS;WCnH^$%->`LU^u636 z{?=-xqg7BA!>6s`Z?QGZqsFebh6_@?O(ai}=cTRT*SLVK;V4}=aF`3&8h(ye4V`X% zj9YkX7{=+=9;&9_rUcS0h1OyqA}L&6#_Oi1r$sTcBZ}^Ji_J&6*(eSN25ftN%Nxbt zc3{Vx!}W51cXc{`d$qr-Pm85bF~zgL`?lHN{q|h%?#75i73E} zoWp%1>)Liay6ZeFSBtZ-M{&C5lhht-zF1Zkaa@q{d&Y|v^Z_ri1dI5ZOt{`a=}qZD zYVAAD$2>SG@X)4=TKkUkbq`LRl@|d@9 z(#;pY%z^hegUpA{YS!Mg`z<@s>2w#T3RdfH&=ZHhzF5;eT!O=D`UH*cD*ZW5qUQ*7Rk3O7XxTLeV~V&vqPC?4H{ir0VIa#`bx!+x{B|?Y%jdI2~wg&yU^qz20?S zdM~kX;9thxvaCKtF|V z+Z{-o>})r{9Y9{L(jT&%PZZ1y*l8|$q(5qDqq8rdOM|E&rL7M98`17Fh~r08V6NKpe(o$YG-3j~3D<30W;c;dZ1xS?B)a5t7^WnW>NI`*q&{G5 zyBgCFNEQgDzUmBjhIB|ma9nq$EzAscbqiB3Pkq{~)`<2=d?SjvAz%PCcAyC7Y_*O^ z_2yF_+|zU=En?i9J~r@SYy072P%%KIuccD3H$NcA@BJ(pH6t@jUb z0qgxZ7B;W6Rjo_(U^wBP@6YM>997?N)AKp%--vwryf{DII_d2VH)#|9 zUM<^;)3MWb)~Q0LWt;OiohqEu16i`$XRY_PY+aXAT+7xhwD+)VS9M-!tNwQu8eI+P zw9x1V;4T;1b*bKFp?#N^6&9Kgu*P;?R+F);{(yEu-1lWgE9P8Xo=Cf_dbJu>{T)_A zt*nMV++qf8BP7t_oW9Wg|ETfz?v|gKDO08!A)%;qfU&^~0U)>LL(TAi65o8xFD_kAx z2mjnsj;g>h_*6hb#Mc0#k*ub)7ZW%cHj(K@lZ;8CMOD8-+7N# z{3@YKpU?D5=Q3OMEsCi?aiqf?ORk+vw<*{@aFZ@poP$)Q{{2c-ypH=Hs{p_4q2I*u z&jPR=_{S=^`2V3*z^>MP$Ao7CZFlzWbakW;-kmnkLsHnLYfnF<@7NZlu$c|?qP}BW zoWfS8d0X5!Y+Xm8-X%&8rD6&tO5aXZ5n}jyUSgTPtamkFjqP=@rh&R}fNrIrZFtk; z9DT4&Sja7t6C)birzeVAr=SX%+MhKS_2{Q~e8VDz?(Tzvoi?ttbAU>lAPq^2=qtTL zv?v{-w#ptQTAX(LS#P!JRNj-R&Fyoh=1H)IrVP{EKS?304@(dUmfU{Sw>uu4`+s~X zj!eo&zYy&UN6^_ToqlZF%adw^sqfE>do)DeCe1y2RWPGP}7Z~=kWJjWL$keUXsx{ z_@b>vUk;Ky>v2wJ>z_j;&i=Ym*MXw<)=yVgK-qO}OE;=eV^`aiFQj_&b_Le|E3$IB zDkDER=S_DGj+1h9*S;SoEe3{kM%(&Q$F38y5yZv#)Wb^xJ z=-~ub06i$=B+B%lkkh1O%ARPw@7s(gK=3m>;8*C8Ag*V4P(Nq&9AVdBo6!=z_phht zhEONE`%q)>K9r*y3~6HKiM@p{0CN{V`9{EWoxJH24!Deqx^o%pJGcy69z0RiN)My} zja0^X)=}+Gz>wBKq&=I(Ap-vM%d zSCISv2uN;MkT3riAi;y*qFaPgPlfS3*Xa1(&9CFRM)1k6Ki#exPx|*3{*5Y)C&%n9 zJcH8T8r%J`rjfYYhYANC<^rO}EGWCN-4{FXIkYq%p*wqUYW~ltwBCUaj6BoW9*f=P zN55WJS?uA>*bydA!qQH+{7~DPJZY$i?oYPLL4|gxXf@t;%2(k_ zJU-I}%qCat@tH2*Q;z}Y@tH1Q|DynUe5MN+cm_a^&vXGVIu4-6XS#rap8|N4xHsO` z1-$!b0D63;3)pZHK#$LK0VDqbUzYNjF36wYhh09?1=;g9ASs{ef+T+nNXlorARqcY zAm_wq{ux-=XO_YLkgII!&n@to8_?qT%pz1;3-ICi%>RJ)dSPlEEMA1rK9h*|1b;OR z{LwV+~2!UExW&BGBJ<)y96zc`&)rZ>tcMo zNB1W}XfNS#yp5Sz! zRZnobhS(GQGd;uGZamnw!}z}GEY&~BnF&rL@ zeszFn_V5Ev`S|S}+LPg_0iMPp+KzR#8gk918jo7s{Ptctf-QWzu|1R+O}J-6gE%vk zOwRoP)iK=xKm&?(r=~Z*or_($M+4QangBt%kh>UI>d3r`fY--iWobckhGT-O%tso6gRqdxT3tGmM2d` z!j^BI!sofsVbQ*3LK%CcU_|2)Ro=oH-PcS6_Oe!Ek8o4$kt2<#ZPKR=>y2;cI?H17+xY2OAhC=-_gsQcD-p)0ofy(~L5D>~Q`?r`Rb$8H$US>rjwf0! zIlZ#w=-$G&TW}(N3cs2RB#P*B4}N}inwdClCq}ldi#>eFDXhk~ap<7kfP{{=^Sg!Q zb_?l>r-GKC>vE@b!I#ubVk*p)>W}@8E~y^prgG z!10S*exMUOAEvma@YKG-Q>p&#=--b1m!dx{20GYV;*T|7sO$R*Hpz91_I(9g@YGZE zIr415Fs1wA!P&89`o$>fM4~@PEGj%1Ynp&Ix<1jPC!oP!XHibWT!4A+`r*e4Um@xE zVOY2fk>XS&OH^q}B+R11Q^{hg?^_=Qu|-Fd8)6T$%fdz0i((J6C(!)^3y&snpU>ta z(8{9|L7`~>JR)QWfI6GM@qw+&Ap!068w+2tZ{GdN8T5^P>{^_FwQfPU-3L{qmF*#n zLC13-+uP?>Hu}kJm$J3(Nh?_F;r6r>OKv#%Hm-0%*~?r0yu1ZZwbR;8IbWUnV)hE? zhB=x3o@a>sC0wF2XPb|dw_He%=s5!0BZo%!gHf5i8H99CFP!BtGrNuLXOelTzQ=WO zSnS~wV7Uus+vZ7^qOtq%4ggPZLx`hD2NC4D`QE6nEu;^MT(P9_?e#6YpJ;h!Z{fF` z3+#oj?A!cAm)Q0nv@*y>*_tVe$}*j``42*d!@W(J%x!^ z2v^HXS~uS!6Y|Vqe#`FHX%1g8Qv>g~Z}aQDokI!{bX}I_u${_X&e=P9&fY)|ng-0- zFGYVVQfhp|rN&=+)%b>^##f{SJb047xWm+|ClCu7cb^g+Lhjeo>5v%jQirERho`j; zPZO?=I;3}L&^c+#?!S=!+Hcz3zBM^|U*TU;e7R??^*A(-KFQ>Y$3~+lX6?N(1%sd3 z4Va#+ZgI8k0ixZ>B|0|X%Jqou`)+(H4wTO9>R_Jp)McGpiT>7J&_DRxcihq^+Yxg8 z$(h~q@YFS(X|>J4AYXDu_k+qh59-XIRuwpMy`5rx`LRM=DM4Z(DWY*LM%!59kLVSO zY!oTS3tE#{;5;uHtBJk7#41OB9W(An$GX`xF4L2uiWmCbK-xeGSxQ^rmrrOq?EfeW zORk~Dj!06=zt_Z?K#W!+)|wPlm~ln&!v}1~_$O zhmXY? zw8OxGn`4lR3SZDKYHn3TrdPgu!8a*3+3@Ho=e>hlC`uKcCr zJo%J&5H~0Ry98Ho3)?Aa#63}Fn#2(!3nD>c&8NV?O}igO>8B`>Sn?!L+6)gA z9Lx5xZO~IEeRjD}b_m@w$r+Akf%okx#cEx_LtbAOYq~zn)3Gjg;N46vT@q`$I;2Yn z-jKFcv8L71Z&mET52Q^cVwlFlSW`95ds-jm#wRRVOi%PMqoUPkkRC!)xN)G74D;{i zt8jNDu}A6RaA%4afElnrejA=W)^q{fhE^n1DZO@8>CGl?HNWUu(43ydno}~l*Xi>2 zv`+7cy7iP+!KLW#IX4g|mBj3vN;`OxLyMy;oLORq%v+QoW`%dX2wGtX2VMG#Vq5O2 z{uSD!`QBF$ZYg|5W*$LzXfn`P{S2NFp8UQWwh*1H{F?f~%jR8<;dr*aC7qoCi57N~M(*`!*v1JksOQvFKtAI3R_S`H=+? z6$c?mw2kZuN-$2UdOcMgvn#4JvCF)Cy?%9CPZcC)?7GtWu zUL=3LrP@2z(lSQ;w_b=~gUG?#F+{kotiHSL*h$`wbvLMs1zjZRPmvr$6t%E#Drym$ zeT22%3@j|bx^9UEGSn~#n1&$NA(;F(Xy@8jWDdvt3f2Y7pPbhWPeR_}nYe?7U!22cExqBBO z&m$1ub%3Bf2j40|;Ar&1l+OOoNo9`7r3$@0g&Xc!rca@JpEY`wL(55J@tBD(N1Qhu=i>R@{00ab>s^t-E0xlB0waz zz6CvckJ<}xEcrYZRj-dFU(~jWmsa97icTjg$+g_ty?^M%hDz4@e_`(`i&!5Q;`F@J zl}dAr_q=o_ABroh=D6@1sn&CJT)54J5r>W&!64D(t1#z4W9P$!-CJR3B9)&Wk;=`FS|@9q?R*nP#EAXE{g=dimPT@Gq1 zgFm}2RlEjDmdMLj8ELi1$-xP8a)AChjvZr{c7hHOUTE7!19kV9M$&j>2!SqgaK6yC zI5pHM^=4Q3N!Us&9drPflY5=rG1A}32!7+_LooUD*({wK_t^+;c4&1pf(nB4Yy>OO z<^L`tpkF_=>4T12#TL4;Rc&#L3SX!n#br9vdZE*qR{dnOrd?|KdCZbc!{T3Xd6QFw z9cGWad}J+vWb(3on@@Fl`P(5SCjbFTg3|P)6M(i$({>Yt;a(y{Oz0sw>y9Poqy?UQ zZ=ip#c%r-YP6lvCGLkrRk5${E-VY69C^9rNH2pw1utSEHMz546@|<-O9n&J{Iz!9t zcr&DP8+A0)AhD{>`;CT_~5mApcs2N$HyIxcfa3~K-NTZI2Y4(FhqLvYorFh zE|(J_!+AJ4w7hZmuLC>!^VriD;|6`slG~P>E-N~8c?v(_lrE!t_J_FBh3Ev%Dq8W<|FS^3YeYTi@U*?r`_6s1Enf$Su43_df)#$oyOW zofk;a{$^>B18zZ$doo<20rl;vhSZJ09Z+{(Qk~5W2@z?Yzi`u>wy$5~H+5n>D-CQ# za=6%D9KU80*yMxG&24=#F`~?W)g?7$C5hVlUAdL<+{%XBl5Gv~n#5SEV|%>5eykbu zzwuqVy`-ilUX@!}2KFk;D@#ifm9;gRX=bjpq^c@jmRpmo-WIQS1O7MI{RhonY9L-y zT3Z%BKR2;GUQY&CQ=7=GZm7s@h$oVDxh197w|{8h9~$_F z2L7Re_gw?XQp$3-$4lxH+u|jOT*?5dDr*oe%5s-ZESsKNAFr-WAfVJqm0=Bul0>qB z8gjETtPLxdF0-uqcv)qAyflG;1B8Tz!%t#YT|9Sb{?3W{vv;EJ#+6H!ibyrJxk9HQ zx2&NU2@@fWk3~73=~AIs2$}jUr;q~R-VOOBz^Y62-zRh96aJ00P5M@bd5M(GoJ zl_Lz-l*Y$GX#O+fNu=U<&Gp{#r00gZ+M0$quW`oQw#6)nyH(=d)=PLz%EJ^fGfq1|!(4ZUmd2TUwvHG?ztZbk4kKn?({-TE8@( z^&PL@fjpO5lJ%G@m@b>3$cQ{j3{+SkMpteuUcJ%N2_$%aO5-k@nVx&Yc1TxOTMx}K z|1Nec!rMU?S`X#*wbhiq<<{0$R#euMRB=BeZ&{r3J7}X!Y&E48UTB@{)#$9QzBW-? zT3eM{R@qQmUs(;r*rklk<@RE3#Oi>|VhGzy8eob$$kfZwsj^IfmPHCEhp9QrDy^(9 zO;#qx=IR1uHGN6*j@@$p$^Jlh#Jtjagmg9M8JvQvxGurgLcKFAEpcgODKBPxvygMi zk66$nG(a$|JxpT*CbSY$fue^xa8dtwE<8bH1*SVSs=PJ{kr)QMtFNr%%}{N*5sIWM zT{;oWRtVdUzah=#p2f21U4Lh}Kz~(dgT8nDQ|O)ff!|5M`HRQy^$Z#Px<`v@IznjY zadxxc9R|Ul^37+Z9_wtzxzuFAU}~|UA`_{OH#C$~#Cg3HmsXdNIf^mDzN(9R=ec&2 z)K`|k*HB>OWuWbsw`Q>H4!*(TC#OIKt96*EsH)wjT?DLMN1N%nD>kG&fnGq6oM#~A z*E-OExjRdz!E`mVu(5E%<*Qc|p5+``mKj%88y7cUSyNh-ga<3#UQ&Vn_a#uUK=|JYw1$K52Ys(&vKLF8x@(c4Ix-7yD&c z9&hM5RvPzjq5}C@lb>lrqT~eOds`Lf9!^?j^hLIvVYRHZEM?ia25wo?=wlRpxc{!W zEmgziTg&qOaLD=i8W_e&D!u~zH9b5~kZ>1&?#K@i%qLxJZXD?2b2;fSnLEq~C`>3& zF=U|h8}m^N4SgIRxygmrkf9fIY1Vve@%(HUIHl1d&|`blLbS7K7h=L+3Mh%vLcLQmpCWj0snF?p!W;mW{h zT?vTJhYcyEYO=TD zD!s5<=O%T%n^e7ZdX9_LZX_FLkv$N@cC9J=r7RPDFs4-BfPjik{a-uF&fZV5Lo5(bLkb zbtR~8^}S$F2h`r|N(c4rf;w7NTWYC&Zqy$Y)KPd^OYIlbn$eH>&I1BwG@uS-(-jQi z;E-UG%E#T?H9kq73~+l%oQ!gSGc16;zL}?(2Rc7cRqMyMx*L$*%^pNqMvVY zH;e7^{E#8qG5?4wgT%%B z7dr7o_SgFPvF}rclwbWMdm*v_k?&jUge5$hd=ev-E+)qNWGSQhlAi}ZUjGf zBlv|N5IQHh;%9&U%P7$|e&Y?_N`rZvI+gun2lKDonBQ_^KF#jIu-59k+aL(2w(PNB zQfU6hjo?4s2!6{It;Tn_;@6t`o$nV0n_vAtdz*vpk8W&#a$|c}uxSMU<(q*qtf^tD zJ^Mu@@WRf2yAk}48^K=$fpq&TSNxJ#{EaKxuFh~p!AZe8GiUm71nDUTT`!1gU9i z6Q!o9O_G|P<@2PbXL+*JLYk8)_Bs$}P8O=E_6qzGQ8=D1{d8@HEn#60#oRnQN(&@B zh!U%rc9iTpI*2l>d^<|E8XL52K2k$FN@|=uXxjp$hIW*s%+qA&*{>L~0ky#XghO_b zhwS-M(+XHDHLZXpQuAw!OYKX6M5}a}{YM95fyT(JFSoOZmPWWjKw3|QQqy``B{id` zi|l(1dY@WtPsNX0MNexqda13Inys0_16k3LnF^@&_D7si8$6>n>QRF@JJ=*OE#_va z88I)n=NpW++G2ms!MIgp)ReEb_nLk_^+EfmPQPn(KjF7TYKGr!_Cscrt*UGv)`s+} z@nWyDe`WglRK2~>>6h?ePkOQMu=}B-*2Yfzc4yRwJfl9WM+xPRNKI>Fx73U_ZnRed zNgl0QOWkf~&sUO8lj;7H>qiiUyzzl54yLkLHCw5I6_e`30lFC5*Q@h{|fCK?rn)d!BM_D4fZX;3E5ZS zi3WmwQU;|)x^i9y8MS1E!6^~iqsh)NI5kWe#6lS}Elf5-&nJd|ot{CVf4x*@h7SXB zg(jNs`+bV&?CggfqI2Cu=QABmbOCcPSFkN~6J5k~)@jt|`znBqwRJqWB)bp~o{%xi z+^7rOsF%A@U+6}?B7<^0Eze38?sCCam_a^ti&R!I2M486lyL-;`YFxM#lEA4ouR?C z*}EKe)-fH;+ogV9Hs1Y=S#MH27?p>U06XpA!4Ksa z&hB8LHJcx2%#(%ZJKg5`iA)NCdinhmlPQpHpUk9vwYJbt@x1L7$fu*^lOL4IXV?lJ zlFD5f6luOHm49L5|C&_pW|MeKD)+E%UYE+@DDA9&E|q(ubdK=u2%eDpc#UM+Qu{1V zPm!*Dp6BOMUHi98a?rK|gF<%B*02J4hAH;{ZEIJPs2canen- z;Zn=7L;r@_2&s*;{X~A0aPk0(%!%IC1jpON3Teoi9Gq(ZY^b3y-3}5KO%Lfk)g;LZ z=1EO96Tz8Mle9RPFE!Z~24_i4HiE&~Qj@J;aE{buvlpBzHQC+;=SfXAbiw&j%Mpnd zNKH0v!G%&ADzHUT)0#M6Y9j@88-`M+%Ez`O6=-uCg;p&7E3@cw2duhKA+TVro#^hr82kaS*{sUiQ;yWRs8NhpCel#Wg-FGAr~P$`YOOgpl`hmxRPd2$s7M zT9et4a%2rIXhZiXGPX=xqq~ws=9g&~Wxh+n3VY>nWK;HJL@3eB z<*Y!h^ebF^Z4tht*OlB$pUp+C@x29P6Cq&yLqNo?GEy;sW>U)A2a@I{;l3j)QaO;O zLE5h!ND7hibpwbAQB{E**><19QW=Y3MRB3lid6aMGJs7jQtcyx17!sdl*Jl)8cp-q z_W?Qnf*Eu3M{4;p<_%m3G4K+iOLeU3Xy&BwZHAT1^ArJumCVU-_sr8$%cw zeNN{3>}jJl`pewtH@MMnbfe!ilms^zH~W807zs&;(u)w~AtBn6E!q$K9yQ zGrtBpvUZ~tToIFsR`M8GyU}a8A{TL^*KtL>W3-AZ14X!MuE-LP)-blA0;$WPNf;@W z>vKrExl(ChjZW6WC47}oqMn5v*&lX<+sUZ4aJ#r7%QyNVremh$!@gA*Gao`(;oFrJ zy)pYc4vxk_RJPz*V6n|PKc-5?0`oIi%rJ_{T2ljJ}>4z0G$U z+QwV>i?-wtJQeV{HETeWvd~Vg!@R99a&YmKx)EQOj75sYA5^nKUic4pE?Ecf> za4M+-6)YYWspDZy)cPbEeN?hSE%*#k7@%a*vIk`yrVcdGx@B`zm`aA*W1_@$|8WM+G6)O9bH-CMeOMvVr;HfJBbJ#Fx^)D% zUTIo=ykvPm^y5*IBH@5ILlqJuv-VLlfAEM9op{KwI~n5x1Sh847!NAK_$+}q!F6FA zmGuTSH$Xrh;To2?lXcNfaMml+iHSV@F#SH7154(vQRZ$UHK*n-vu@O4w9r4T$v5E$ z8BgZ*jQw&4#1dv-8my)k5>8l==1YPfGaY@Gz+ik_6%|m%$te3z>sN$vU#Ff_@I3+Z z@a3T-CXu}+_&o>9r_j1k#$_C33;QL($Qm`arHsvB`o z2@l^D496S{)K$ZNDi}@^j6Yl$=!ixzyeb$X6O9zqRl{Bp3{wflA1(}Zk|G%1lwRwp z7k{{V(dmZtdP#cipkDmp>P1H<((6U(br<#G4_7ZbfRkQ7l3qutmwcq=ht6cA*9qx$ zntJhv3m2UbNv{{ASHDT<#UHL-bQmbTj!Lh&)Qdk{z33cDdc7>V+)TZ=11U|zP6_OK z2S%#Wu%8HQzXKx$Y1oeicE1B7wP@H61@>JBM#|8ze;3#<9T=%V!@ei5zdA4yT*ICg z*s$}A3?#0GeN|xd92k|X5FLt(0=^+?x{5lmD@&Ae zu%!-+NNCv4h4Kdp#vd-qbXh*Q7`^*^`a{Y((AbN`Xcq>4_7ZbT9#f`{Te*%j<70<)(YKG~LO z9<5nf9Q&z=zfxE?{n>YwqOYRjoU9=A@E`ir^}5ax+JERSsn5-dQMBFuCYj1 zD~HKbiT>`3$hUphXQlxieym^(j`H5icW6@>H}0d#NvHqN6MGo_;Al3b0lq^8Tpbc+ z;{HRA33zB!wp526HTBrV=POInqoC4ER(ugYLa{fE9G_38{Q>KCP6lVL<*`ZXCI-fJ?33GX6VO-8O%H|fqZ zr7Bvi&CpuAU$j(bP_Jh#)n%}jXb!@aR-F(cl`^jDGdyak&+w?FA;VD%OdB_AXV548 z-63C4$$vs6ewzD@853o4tNb)s8#D5R%k37Ao#~AIn=^Lm3_W&c#sobUcQaVl%#7(Y z@jgrk{0cn3XF66oX8ep9AIcan;SSn*2<3}Lx?jn6lU#5kuk)Y|Iim? z0$z-0!+1*SKZ)qsd{SofrHD2ZF@={R+U5(G*_R`lSrPP=h-Ox7{?&+{KC$_qM)X{Z z&A%4WbG_Z7Ow6j+%h|G?M*>8D_FXGxYBA~~!$gcHM2z~#6w;Fakhb@PVRJ33I1w43 zb*ih{o`sP_WQ;(s*3gMkT@M3IL}o}uBuaXD-jU*&)xXuF{yT+j@cj_+UDlAWwnoNM z8J6THhqg5`Ro3}6JQ-Ufv&BxX*3}Dy_7*?+#;uVx0^MYVXfw(bmwPDgbSMV$HO1wT zVcL~2#pRKy!hld*9+{&>7p3PpO5fqw&IX`je)1v{M9Hr-==v-g>_7CPxcmHw4i zZV|=38z$=J?Y}@n3g>x59_I3 z&$_!mtfzV{b9aAunQ$j&_CT0do$pW$TjT>_4m`d?wL*KhhxSDd?Oz+(yThJI-yJrS zF5?$@#(&EhUp`yQzR1h_A}{ZYyu2^+^1j&1`{E9~$2_#BI0o zw+zQMjGLo*KNiZBi4wgZ3r&$}6uln{%@Re6-j9Wry7m5C$fNh?LSDTe^3cw4c*o6i zvb+z4hPrL$P-u$BW;S}pKkTfDUzqV5Llb2{5!=khP@bSGU?bTWnorDf=)_MWt<9m> zZKK(lu$5dM((YCK=@mwnVhe|{mbJ`7{1L4|`>v&PHS^0t6NH)&Uly7tycC3qSb-rX zzI?eMrk7LLgFPkMV+MQJD_YnqTDXH~8KKxMF3~a#H4!b^L9{<`OwtlrDba?`)1v($ z=n?G?L62yE3Tk2^+Pgs$rewAJ*n|B|M{#!=>^}}pa$DSwgEQS0_v7F~@-)a2c@lpd zT&XRN)%ufQjPM{J@EpEmXkTN6=#n|l+z}50Ee->r`C7aq!HMpfI})6)XO3OXksyZ= z$83%ok`n#CV@R$SahpBV`a4E`r=ivyoZvRn=HLu%q)e?jIG@BNYAkPa@Io@F73+=aS{CrLtKkK+CwcR zdhPjI^wG)_e?}`4e^~Uz4xw3(T|29_CS*v8HTG;tB#GQ_p$FL|il?kM`o#ai^20v;#+Qo!THUkZ4f z_)7tg6MrQT+v*bh)qvN&AMwzh;?O>3Xg?D0O!6ZE&m=z*@J{lhhMGwFn4zX6ZT3)m z(V@0!iI%iEpc7NE@8*C`OvS#N1H2<}?7KN|foGC$3uJC~$-382*Zw=;wePrxnb8h2 zM-4OafX=donRq~F*}_abaK2}fD-3ZFeY+v9MW5oKw#IQ{moC+!PYHPZ_mqIge@_W` z{r8lB*MCn7MAy4SpKhp&==c>gDav<9hc3T|nJP#0Ck-?HfXA!(10JvD4|u(rGQ>sn zpdqeBKk6q%nZG7S^edNX(U1DibBC^@{(N`nI_h6!6wOQfsK3xN>(BVJD_x?0*KaJG zvzBN5TJ)><1ml>WLl;i%#J?Z#@b&{o6UPj12mF)Vk?eqffjg2N@D~`~c%>gQyoe_5 zFuZ6@yvr90jV9Yg#cm9%_dj6R9rHiplYLR!5G{vpRBo-qn%g^RAA;zG$&aF+&V>Ssg=-V)W{G z!zR|v-x0?qUMtYdykUD*#~Ze1b-ZDFSH~$^6Bp6nwDqiL(ZB7XHqW7U#d1yU+qTF1 zf7|wW|8LtK@BeMvwsl_e!P5UU^S19A zr#FO-+rDdj9{9&t$K?&7d*D)7&YA&`g-A_1H&BAYW3xCuRe$q-U{8sJf zwlJNo+Raf2v#hP`<&dwl>|5E#Azf#pS7)tpiT(j2x`o6H;*Ir)ccDX;^*z@3D<(PC zxGN?(*6~(MWxS>$qD^o_v+OL(-|zg)#hHsTR}Wl>WDidaS&du7{L1o&&mU_qRs`@3 z#ocJSCpS<}HJ66Ey95Wjkm2M$W@U~I6SgqAda*?Y+Wvl-nL^n{myA67f?>=G2%I-; z^}r>=s5ujSc!@;8N7&7AmLAERj8!zYzdaySF!Upgp`T_-EgI`1USbYqv}6;FY=<^CseKW4-j;xl`QWle{{Lhm#5WQOsp$bm3F zHdD+Zu1&FqGR=hKJ5Wf0OS%JX)0HHgjVeiukyM?d6`-qgoypV<^XL|c`P>>zEepH= zmKO!9X(5u9g_s0u5lhX=?`W9kcMZZIT&uIhfj}_VpZjS;u4aoa-6{MI!}W!sWQ>ONd<19{@F=2?G}}Bi^@jzK_yU-iycmpo6?C~tf?pH z02g$6r?FtwZmfi4Un0puO)9umsf5b7Rr&8$A>S2))WQlCd{E6;qJp=mA>pwq>m{Wc zRcNbP%z%6bEDq;TFR2W9Q+GNaxE@q9mk@iNq4Rj?)Xq4&0pxp#rBH?QRS1e+qlWHK z{g|(qe^V~a#o&YroK_M4^ju|MIZI{ta_0K&?d_alRtC6crL$(w!K`Gts9dmB zWjv_nE+K|Prxbi-XV2EPW;@x732|Mie1oHMa$u7?IIvWHFj6dZ0MZ0rztN-$T&>*I zejn74W~$4skR42ORVDuSyVb-bSM;Vl!d2CIglkT_%p){gIj-zwh6{_Bb+6{wc%{y6 zOFK38S)HM@X3W?rojh8OO8}%*9gGqoR|_!M=(S77Nmw4#>D1H*`-%l>AUzpo^Exq$ z4qdR**-fYVQNm#GbyiK!it{FFoDw9xIl*?y34({!V6wftJLCwTg1gslb7+Oi`jS#t zQV!>o7jIP&&fg;4uODwN0dgj>2!+?^T%sRx3FB|O&HgkW%h2(t5%{YgEW|yg` z2jE@uX2cS9A+tKT5U4|Qb^&t+XTmA38Fk@SmHD7ru!Q1t2q7XSYh02jx8Ugz0p2x* z)W8DfU|t6fQgClDH5|f~br~8Byep4()1H(|>vzikC(HP>zz&ro5_*!fR3;s}kMkCn zzY_n^a|q};Xlf{DM4dM}k$Y9_+OCQEKTC;Ze>+}LY? zeGe@VoESjdk(m}R^EB7i6$%|zzg>$>eX}j|0S33%z40Uve6`;2^|Imce z4%N{_CNlJ^(%AfaiEKTmw%Ufe-mDMt;e;nEsZ+LY97D(KD6L;zl241UV-nP}Nzs~u zQ>7C%v(LOO%~`0dn!L`-4Livmms_u+P6*4Y>qE+wyn+_>5RJ}eyX|qO{xKa^RzDqE zx(Uz{xUt#l=yiIjhJNQDsvvK4q52{veG$l%GjAau0;Ddhwq?$Y45yM*2^&##>wmBeB9m5IYq%+ zq*CPR-Q_#WSm)T}bgT2OWJ%}5|9>ZxKQm7a3@=qa?6Q5+2Zx_<{r99({&@Hf`cDP$ zFESnzOv6TpzoIe|70P#51^kPB^K5_77M1189~Ayo>OU0>|4IeMT@An-2cR3bs-Qp9 zH`P{I{+)S33y>$!eU|?Nm^l9=@pziQfPdUU<@0}V3&@T0RoW`kzio@d;uB%R?j2!f zH^uBMFRKfP)wLa2?TOKRFd7Lbz~_gUPlwB5;!^u%hsz1X<<-RH1mW@;H<#}hpQN^Y zTu!=yG|~lw{%C5V?+veocGjk*(g!D(`Dz$f!|;zMcy{<=<$DVkj~dm)LuydD8d9MK zA5y~)CDr`L)o|a00ZMIG0X&sbty-)6z6t%6?VFhs-X4Ci)3`B*=#YKz5;Z)jE_ht6 zzFYa0sIg06bKyhkJm2_%bZRtbjq*RJ)SH5{m}_?Ux$w2h7p{OVN&lIo|FxZ%$3r6B z9lVB`k*7vtr4MOT1DjM8)3NNxX1cC5aw&Zd zTBe3IQsWTXjW?>9^!0!m^>L-bzb9-NxFVTQ1GlOWhVM|J2i3@{)Wn1e0We>v5I+CD0tG zGLmZSVLHZv!ciW04`I((qlO=*0Fk?0jYz5mNwwxNwKSn}^D5M+dsGqgA zik0scH5Av-29zsbql)1AC)`m7^1dew;oL8Gi?cC3&cGkg2TLFV1>pNlD(0(c99IKt zQS;}AuY!RtC5S!NAAyEn)35^4&p zKB4@CFoTxE;Cod@Lgm0NUsC=Z;pe1v(7h>Zbt`WWYjK&F(G2>!MQz8IA4WxAx2OU5 zQft&LHhtf$E?h$wyFZ8u?5>EuT$3<=JK26LsRkufVV)XOq{m}=oLkiV2Bj_`tws^%^6w+f`ognR7~BMW(*~++Le8hQ;BgR`8Gg44FHsYgs!1eN zfP~6~y^Vm4UaSH*i=>gCCF8k_>=LdJ4RkT}u&Ujz{J4gXX5YP72$u~aCrJX*>F{AS z;%@Rf6PLp28Fk_07{-s|&S_1g_vyq;qnb@$4QgAn8lC{BxoXs5wcr*NL1it85`!ok z?o)7yF(4oGSrvI%g?C8hFeOH@D^>8bSdon?>@U4rO{F7>sqAQ#0;U zQCKsS74}UWK-ZZ1frBxJrHbi5E*4(<<~=Irn>|Pc?<1Xp{LChjBo9}P;Nl-s!+1WcJrDi`(1WVzDxv{bhR=+HYWh;L%n9Lfh)Gj$E5t48ytQhU@6v(L@p*%# zG>LrOINwB?OnlId7PP1{u|l~J2ru((a@wKVfIkCaEYrVp3wNNF@Iy*nf$`MuD$REu z^UYzQQMA>d;?QXV{O79Cht)!?D^z&OvVmpeeKdvH(9~d@n!c3%XgerhR!j=)c zg5k&1mNjbT-D*NPrhGyU6r(l*ro{YV#+kUr(yaEPNZb{Gct!cnEto?lIR#DRy0PdR)qI$9C*PU51{pGd)B%o@yFN}yvv?q|&7lp^ z@?NA{SE(S}_EtEJMl~Eht`N74q-8TW#@YaZG)B>(?v z88A_q`S+@!9Aq(xLs2RmM;XkNCs!l=F%?Q7#h9a9tsG%>bsYuPV&%apt zZ%`TcsF^#+PhCdhm?qy1aB9eLsO`$&so>62O0|LkT=&03;TqhOa+X8Z!Ki!5W{_6~ z{1biow#ueW8?0>nVRGUHht$-BT1g9bZbC&Vd(Xa)zzYtm!?x9 zpyp8t3Zm0-0Tw<90plJuYX?OFDF=4><4ach`(tY{(ZeoYq-fjp&d1`0vSNBXY)xWg z-Kvt(V*CId)#7Tax&&`hjMtRlRnyb~ZY0;7Mu55TdOy&Tvxn2k*KfShSzP^CrcB8qrSnaE5SRk<(0h_y;0Yq zmzNrP{Km=Rnq;+ww|bY=EU${!V`R-XysBCdXhNm6H8sU}J1hxuVSQ~$S!oIG-{&zK z@gC;Fn(IA0xo(BEOQtNtfpv5lM?-sSR%+pd@#p`EFy{uHfXk1Iqui9jVLA@?*$9EQQheo#J zwWb~x@zUUuva)(lTcW-Mvx(=fCoyre<`*X{dPBL$U0mW(H!-=6#ZHzK)6W@52j#n< zXuPV}!c5_f>+49*+t;qZOFyk*fv<+5Y3OPaX+_!k#IEJU#D!OGDzun7nZqWqu`aO@ ze7Gjl%riv8?7*zde8`KHt?jkRdaELyDBcN%&`AW-^T`wBFvS)M9NRs@la`26G7K|k zC2Sxyz*?zit7Jz>WtG;2RaTNHDc)8IPUx+*WEn7+(&7rdpc*z{n4Vy z73jOZ9-u7Pw-o7S1&oj8o*B`rg7EWvTh;OE(z;z%U4129 z#hut?ZG)L6>x$|1<9ed#<=#eHb@g~RG;~f=E#}5rt}jW%iRolRycn-kB3}9Z;?|1o z6)Z+^Da{Q{VCnV>AuJPFjMp)_8KYtJ%6N+yD8^gjy$i{)C@3FY>l0)EZVjgdtE;cA zuz2Co`i#$l#aLBrJTzaXG}kH3b4v4_(gJH&99mpaVGK(z#NutG#lT-`8Shew3DQ=C zg+NoYk$eRx7gxgq>()bu!Y5umE{fv0A?48Ozb?M39IlR5W-}6mHkCPe1+=yqczs^jEV+JxFRwd{ zqPHPic;GnKSCdH_lQ)Zu>{47s8N3xm1s=09v59;?PsuKqf07qi%M`Lt1raBl(0Xl% z*OV1+$J{5j#jy&DOUVLYzGOO3OoEnTr+6f5%PKB*+#NfQs_NpZ>#!nWAY~S>&g<&R ziZR{%{%ctbZWCtwv;=rG)*^YI`a1XwjAz-jZ{&JI#ma`n>h%`lB4$*U>^gF!>+36M zan#4JHSWc0REcDrm7q7hTeVOgSt=2>k_c}VHSsdMqZ*bkyu-Syt@5f`fZdGhd1b!V zid$~j)sTo+uU=`Kln$mGGhI5Cm(!Eefo>d6vk~-@4Hm^Jv$FN8u(@Ytg8g8%Uht$9 zH#fZAq5I;7?X=j~5?7begt_G=o;ecBBHU=4=p_wsRQ1+|I`$~8I8jkwONxRS)k|1i zQ&)zpgi{i>F%z1IQYs&C)8s|qWmS7oS1RH7MR!LSE;+9oB!w{!c8-N;MyU}yNskhY zKSI!q$7^_IAlW4)HF}|u+3FBVo|mSYO<8M85)2a~ zQpLHc;=ELGeyX@YGOZP>S4ey)1_vLCBQJ0Z?YIl+Bg??7es;xJh%%x+StF~RCX8{E zV^NrVt+=*atcxMMq&uXLsVrz#syI7U)V8CezRV-#Cz7DDRXeF95)_^+GL_mSawEVIB&`1o;B8Kor^3@=r7p7a@F3r{WHA>U# zi#aLa`QQv<+b+sstU9R1q*R0(NlPgc(aT;Z9Zm{SY#7A6(vnZinN3QYJsXK`@eZU> zl8QQBTsvX68cg7HJ8`y_^^_uT&(b=r9AXJUs)mCZrP3u%X`53jbxLIx=g`<$lv$G2 zSro@PIv}JVlvi{}3-yv_s_ZThb~)T2rA=*k7z}ZXOED|h2^C|?C}J?%#2>9ksF~;% ziR&$kmm}pv;)NCENpvY2VHL2uB1d0VSy7qbJcGHPMOdn;DvRlr?sfIR6W>`{WmRI} z`l^z|`efpgctb-;Mck@EE+MAlp5u(p_{mBWbMqTO(v=|_rz2Ke zEd;TAu}`919$BY1Epi9Jcr|ER^`*t7hz_iy)s%SP&6My9Wwo^GtukZwEI7^cMsjSz zxib?w^FXwt9TZjsWoI?{&`3g750V0MFqjIq;@Ms74vbu+YSy`D+eTYKQUMG>6p}>l z%rPt1iM^OvPNK<<+~HVnL}|Y2Ff;VMQPL(X1Ie@@W+^j{rA#7QY&XQKaiMHm63})a z#ADOEqNI+Zfhkb}UtgMpi7=nE8p^9~;H=hcM9DTTiaT~ec89c5Y>)Bl>68r*QLf*? z%hx2(*lw~jBF1!*ff+IT>Y9YMcl1fr7L$*tcX?%Pf)t z!F}V{g3U@tD&xhAts3l?>UVNFs3QkPa5fB~)`}02K`fI_s@xQ?&@f39`y5}36d6m| z!>Qv4p*cy7YT`Gr-=_@-8H#AujoCzFo{7?0xCNRgJ)0ZMw%k2}4Aw$2o-iwq#7pdy zfo213CYV+3v3s%zNqUhNR9Du}@^GU!(G%Zw37yn8)Zsn!PLe6}qWy6(7K(Npnl{fD zXSa9}d@5#A2q>+h?Ve-(@f%iqcbA=J)ZLxso7>>G%q}F z)pKB=D|k+@a%-^`aRfjMg?D{q8znVxzH9+blw?!1kmi*`P)R2dZQ#P$D|i$}dwpJP zjDfu#VaCP_8B08ILv8(a#g*l9e6p@X3c-^pX)O-JJghrtNps{XF;BFAWhSR@Md3}lFJN4NdjLh_)tz`Kw+DNWWmRus6Bp{#-8qXfI zyRp6$`%lpWpUCn7Asu~D23QOlV!A6SGC2;IqcCR?WWs!|!+TpZd8yb~QB}JQVVqqj z<@prVfme65N)uJ&JRL(W^&Cd~!icg}qc~ zSB2msxs*iX4wg||CZ`WHsT;IEPt3VQb{d=uHqfuEqO&(7+zVJ9cuSlj)mL&p zqsNOMp@Sr2H!JAu#4!c!QN-$KjAJP>M>JAq33VN4wRJ8hg9p6|nrFAl94ADSC^eLW z5g@Q?>*Do%{7yp)Pe!-N25e@7Vj8a@;K>CC%v$6zLnh!dPAXeE)T_XO3sXMcrs7J`; zCF3|D$&LvlR9G&q*~Agx!~qx^H-Ol_Lgff4eA$5!n@GzhOy)z1&?$nL35JROIT#Ra z1RVHNXvrj`WIB=!Q_{&{E9DP$l8bSsJNavv@=RQ0naP`wnYGoWGbv@CNjzD3GjWN7 zi^NS{X_}rIT)Ay#MQQ0w9PJj*pF0D=D7kY+MNM+%tXVTFYf7taB8et1ayhtDJ!!vyrO><1aPnS3;M*(l&(mmZkhI71EQ)MM zlwl*Bx1G;_8}QArI)v}aQd6spn-Y!Lj-0Cuwl#xJZEH}aEgOv_>8PWyjuQByI?Z!^ zwJBj^NJSdR5Gdai%i`OTg1^49h6>h2D^{GJJ9+cAWKANe&+li zo9WRk{D78heAAOzaOzJ_lcBfa;Eks8m!rS!4{fmQop?2MG!#CFC%xpNonDMZfBX!q z!hYGe`c`BG3mg6Zxjys~cmemYEPlL}>EnNtJLCd(jfV4Mz6_jjyktYhg`r;YdAkz&cK1g_kBjevdSw0@v=~Q z(v9ikpU#XDj_Lda94OEYCqBNGl4ZT_!;cSiaD38{rB1{7VTJ}yIEDuuS?<(*_}Pr6 zkN=7gbs#>zq2c_bNCPJvM^b#eqWkcZE=?c*haEoJHJqQjY2bw8gDD&%X+H4B4+=GX z{1-YnmS{LXw$#80M|KLwHM$Q!XVvuae~&xl0{2ZC&QEIy2G(n!}$r#h6eG`oZ_QS z_u(fEnOPk>y1V=f{B?IN`8TINEg|etx;> z;}1K0$cv{fi=U=$;K1SgaB96QAxDD0H|fLl@x9I+a?y0PhCkwl6OQ{+IBwE?_=)%i zhyP2CEQfo6=r7lC%J*l7{wWQ=!vo*%zytajxcuHI2mi-%r~}Wx zhVu)w9Qdar2EJ0m`F&ju{6`LdWg5B*AR9?&*m9=Ayd{G1g~DfNffQE>l%=ZCdfmU%#Fp>Dr`AJ=MG<`J!1b^E1w zTps-$(JWktGSU4Cp3z5t=Hb1&QKt3<6S>(kPdom&Zg0U8?C8%t5BhT`Q~!b)+-#Xg zWPd}q&&JDc=#S$EzMsQC>i;HQmqLH$x#>ScncCa%G70)K?Y~Ev+JCo@n=SKneR_K_ zwI5g_?YUa69Nm5o9zjfh>|^nLo^F5YLT(nniQ*F7K7FOMvoA!E@&v;F=~dqLGTpwu zRNC35QKY4bb!z?pO1t+so9gd>;D;uJa!HaVxrHQDk|IrVnIcVYNiLH{iAfrg zLWLZTZJS_qEteKB>8;b>+IKSX3eYFzkh!F@i@$Ro^{q<`@P@$ zefHjGpL3oG^^^%cno}+OF$bQ8`&Gkzo8E>G$9?*T@MU;Cw_iiHX%&3?xadBgw+Ws( zA;0ekZu`YL9f8jMi)NxGVhG7k)7Ljnp`n3O*FxJ^b*XP08b<@V^aTmgk1^lAPc#aXcTq zp!K^L@y9NR;`yT`YhvPeAwK1z{P9QNqmo}@9lpdF{j)^aZVQ@k)!z77(lE)(9 z&kJJWuZrBCXX}1pP$6UZ$*4Y ztNii%;YF^DoIh^%KX}E~ktdHK!k;IFer@ejy=~;lV~6l(C3xG6$ob=Pb>T(YN6sIu zYYM-*W90lHy|(Z~=g5=C2I0?M@EhP+(Zh+M@b}^T!NG~a3tGQZVtjUtza8T%gIhZs zy*?@=d5jVM{3a%TM~wd&jy8W z9nxaFb&Ovdg0MxH#z34cBiljn&TpBdw?#`vc({%wpOiSZKQ zIH90+v!Avs$m_)TWij3^#Ic;Rr{`}457h>XHkMTE==fJ2a z4}Tr{vzT~)!Z~@;7w<8+Hv)3sb>MsNKF;1vh;lG2-+L~=@Roi4D_oSR zcee7sU2gAu`hev7j{4aIya6MD{v9yXm3R3JAo+fd&yTl1l#^Jt!8h;`D?DQ zn9+r&$>6-J8Kb*B1oAF#vTKiUy{5YiDfuj3(7=b2C-$Sul>YlRW4>#+l5Ya#f2)+& z*7#-Nbw%Ei?>%}*z8B|#*R&@M?>eGq{pXWT`QD@QRq@@*0xVxuh|8-AkXIF;psJE@ z-zTpu30HOIzdD2$BKrm7n~3?El5ec}rOn$uSROvam2YtidM0O~+4A1d0$!K0o(ZgEzroQ0qSNRo-HjN}E`x%W_O?tNe6Z3B3Hgk817>zeGMwB-HhV`9+-8vdgAWUlDL z3gI#vcQ5~^U-^h#4V1jt0FnH38Llm|StTFIcjXg57*XIAqxmA`8matGxRtvZ{_?lv z-107_jQIegT*Q@p61K=5H`yg1xoMKGFX*y8*rL48&*9f-%;7d!XsrEoYd zvB~D^*Gsx{-~M)dV-x4g<$BM>`}tl_Jc_scetnH_?$_6g&i(rO(|N6si}P(=A}{~h z&YyH1evmsi{wL?PonMHzHmpuNCC2>Yo%{8^-+3b!-xTMWHP2Zmg`hC8-ReYl6X(Tv zFSzCL{p3~Wb;Dz<^9$#`pPW)Envv!4>%F^kzusSVZl?g5f4_6Toi@Qiw&ic^;vaTy zZ=EsE2IszC%_tLs!en{;dfe~audiouzTM(|{X3oeIv1R5*`xfv9~Q!fV|ki}8|%Ex zx$kd$Urp=W<>Gxm$vnm8nz!DWzc<|S`0Zt%bHCotFP}`4Y@f97C-dYu_v?2Uoc)dC z!vikf&v%D&-=4MbzOB{i*Vhwp=4U<6xOktxb%nh8ef#%wez{w&x19U&VViS5KAdw} zUVgv69&p~w<=^Jq_qX#Z=H+SV;vaB+h4ZhS`~F$;^t?RHUHlm5Eu4SjyruKTcHu#o zto>Vs8{7E_=jqN5I=|BS^?0Af^7!%XHRrzHo^KZngh|)$C2-5**RTDgtxXz#OHBNG z62Cq9?C`#QjPDU&g#DYtF+T9jD52Hqx1;;utdrZt7#HuCYo~KR-j=DHm%m>4lk24l zocU))VTrTh+HOOf`|bBr=dD8y<}X_%+zFHA@!M&4=YHIt?YvER4)Yvx?#IcCt6KIb z|JC7t#y{-5t@F>FU*r5Ic;R5jhuey9vuU4;_w9U5wdiqMu8eTwe4loHt@GcUw{w13 z^>8OlmdC&DOmObUv47yKlk+{!2B|Pv9$)7faE(7JCjJrUe!SY|+>cl1*kBhXo39_2 zhB^1+%ty}cPu9N^&N_$MA7R?#;{9@Uvf{$Tc;@L2*LK+8+;11hocrzKBwI+ApW9t| zxaJ?=+;104ocsP?*cvNLmdE$!+u^!gce!}q4qrKM8gj86>RF?Q$?{tX^kL5Jsr1jB z`}Nh*2H7xaJ#FFI4(~Wm3(sTzk0lS=bB&Al%T*gYoR;6W=K$xvJr_Io?ODSH(=ciM zb>Uk71n0gze{}BKt$}r>Fj*eoZm+|2zHhsDzr1Cv^M%Rsq=g&XEfvl@Y`5wz-sidB zxo@9Oocs29*cvxXHebKIKREZxd!8i?lP>SC&eOulxzQ*VEJnyD(Y2 zZJNyUm~&sx2Itqg_-h)3J7HqGG0$~y%kSIm4d>QWj6dSs*MF%!IZT$v-XdmvI-K(@ zXF*}gaPfY=pG!RRd>s?t+;;N9r0p}+xo@8>&VBoIw4JIju};pn8(iDxZRfsy5{;rf z7Vq2V3g^Ck+QKbKlRa+lxK&Toe9h{y&}DOD_F9T(4qvc6I)MbHBXFjXA`z zotdYYZRBCn_1o9E4Rwrv)p>X4Z^4v5@z_v^93Wj5FUw%Y@6=HYzDyLg}HH|I7h z#@9=;>{0$6;eYzbG}Fj^`y5M4@_*W=$mNl1`(!$|r!s$EIO}IS3~=$j{#DLzba^($ zK|VV!eayw7unZ46hJm zwTR-io{Qny&i6a-1uFV*CFsdDuRM((~r)^K^FZ+vg@Y>tUY0F5c(aBk`=~ zKumn&E2Datf0q3brdBcjeCz0O#!t5f4AW~dz7}p_woAx*_BwCi{3IK!!({RH62bVo z&TWXLw{>nq5xt-DtDH}8-ro5;a4y$&EZ2${|HhZ&P%rqcfw?K_6#@H*$2*cXmq?qB@%;Te6o0Iktlvf zjBm_{9%ufpi2pvu3tt<>Tb*^njdfOa?)y(O=f3~+bng4l2zrr0{Ck}H z{xH>M7A9-|tZ-vJZ#ci%`C;e%ofo}6+zFGlTUGl5pTB9RZjXg&B;4kEN4Rmmb7SJ) zRY(4H&TVL0i1qco%b(-&A96mxc@t~gFj+l*xmv?@x#qd}JHvBW{|Xmx^&CPyU%L1~ zF8-+VyPQ|El^P~(pB8Yd$MPRV{_9-4U*2rzetG9Rzs2(4I)qQ0-|Bp;^S;iT*uhem ztj^xy#yp*z_i^6edA9R;&hK%)-T6@GU2PByQ|@|+?j|0BTRlF{I}-ozgV77&$Kprf zJDpo()f1u_{Oa=OTaV5MhETRcBRi-Ilh%1NTp$CF*oeg7#^m;r0)<({|#lr=R#S#19q+|8InNm_>4$D9-#(!>!K2;YOeD;;la{L_2@r;(dSE z-wD_C@|cVF?fj%T=liBO+xdNQ zw)3arp`_%rL7e%&gIk@qg&X~li}&q(yd4aO$>M!GSA-W1?%TPVxINdV7A}u(=WG{m z^WBQ|dyk9v^PS@2tA%*0%ckdC{QcoRmus%``azWAYTrNUHDbdys#Qi}&>`a`8U@G8gajuXFC(;cMq3T{|D& zE8Gc__2(+#R>|&!skHd15hp5(p8>B2PYL(^>qtY1uZZ}|ogW`8wM6tldzZ(zLk|~k zb+Vt_>fG`)MxH?~kAEE;hbOThKu*x#bOtKe|Qd;Yo&9)UHstk z*nB5pz6V{rpKpEJDGw8uE4ml@g>%cZ8hJXwwf+Il{eH`9&L0SQSpRn}zqKd#WB(B6 zer(}eqspvK-w#VVw>sGmPlH>Xz8{|D;(eZTUA*7#ZR_0Ef1TtxEh;b3&AIPaS~ z?6-ZKTRf+S#My3-!EL$j4mbMyF5cSV0M^&%F5a*A!hNDSalNxYHxg%mzQwuauU;~G z{@rk^$LF6c@m&%BVodxB7jON6uj5;s`|Vkk)i`L~t~|AZ;Uc53baaP$4D zf^$F4)PvjlwLB$H4F81bau@IOWJ`QH;_r=#pXlQKdU;N~ZZzA(O7V-}=k<&JusW^% z*&o7}q9!Lg`@=LiKc;7ysIUnQl?{j&q z{?m#_c?#Vg{crVK{%qtg4cGP9*u`6(qbEeq@9yHqn&SYexAT$C$7>$MPj&GRy7-S> zysgJ`!_B6xF8-l#pYz@8{9)(CZD%4(T;6F|-c-0Q?`6(?{%$co$hmL-r{FeUYd7|v zb>fAwUjB~pN_J8;Ow3aO@h!xe=k^$%B+fjG#o3>~73X^Y%enQRJ!sD&)+xiJ?O7IX z_1k*1$8Di7!&@SJ>veLn z`u%p@SDf+T3z>7{t)6nx-NfDE+)p0v-10Mij5y;bIJf+Ev*`)(IuR$PIk)_be?gq_ zi=12gw?X@V0#6BMf3p3*bn(7@zH#xs{dc%{tA%-fc5Zp-CGBK)n5_M+o}sAcbhy@2 z)5ZIG>bZDdPeT{)>$%jquje}F7H{*nsk=D)L-@Ms9m#WB1k{({@{{eIEO z1Cvk79S^x*RL!~HpE=jL&6E2@m%uH*-!E$E;(eaBF5doR|Lp7HEkE~*hPim_+KhkH zx!*6EC3)tcpTFbceV(5s{ujjm6BD0mZ*GOj`k`Mh=ZJH?Tq4f(awS~XOD`8+HOzzS z;XcF5c&v?&59H+0O5|c)woOxp?26KREa6<%r}-DHUcCrjk}% zn5-Rqo{Qkt&Nknch`%x>{&g2`?Z(&NWzKDVm9fXd^tE$~{}=mFM`OH%ofHd`)nj>3 zPU1r6mZuz6aBJsQe-@t51+L3`kBhfFJRW?+xgUq8xIFiVc&@LPocsOZk6a$BXBz7H z!o~ac|I@|$dWzbc9AUC{@b#2}+j9AODmnM{G;(=-KfKJj)yZ+DrORWhh|8Pp;;qgT z(f;?j_;D_NhQxFK?Xwu)=JJepd5%du=UdZGQiRFc$Jf)yxh>ZQw0|qO_J`gs-shR- z+}e%jdtVkmH9Th1+v4RTPJ9fv`Hl)Vw&yk%Z*?9;o%>w8?L||WbNSB zV_CS(*RRJ0&WDD_SkLE@r+Vq|V3>Yz@xGpYF5cJkw{u@l5gVk!r1hK%xB4wlMGFd3 zRp*wcIqGTP^7wjMxOmHRx+MuyS8?uFWQ+5>*>LB!-LZYf!mWNg^r1iL;;TDQh!by!D z-{aicjmvw;x$n=%4T}n}_VL?SDLDHx^PKA9{p)@M7jOBwKi1O4`}XYO+*T>`-ywNc zqn$^(c%Nsk#PdAWvY7ZUT)bZ|+r)9YB~jQeh6oe;6?XR$CyJMi!V>A?%+pSs{UOu2 zwOdK-aOA*kz4+yw>f(L<>kU zC!6O#{i>`u`_2ym!I1Uu~86@|f}7nD~?K4@tvhdHngeR&ZOt z)_-_@?2Z_p8si_v_(tbdLVk`LTb=uU_yb(~VakZ`ks&Bdg~P3CxH12gaI62(aAW;_T)egC zDdA>Qj*GWLF~;95@!UTgEzUeoh;zT_E$3Dzuk-oHxz)q?oz8vy@uNaen7F*Qd^Xh* zXZ|b2dEHSr=QdyN58nb$3HDgHu^k4*#19kae$Mn5|H!$m-;P+n8{sLz{QBMN+)mZ7 zo~jRoJ7Kc;N#RCs0%!a1y5d&OZN39B-|Jl-Ki~Z>-rAqj5$9(HOvM8g?L{R_oUi?F zQy;k1nXg|tx0e*w|DMa^`{&0l-sf2@@m!CaT>N7$|F)R;o#I@N$-yo>-#na(-j>0C^(*`~<;#|*w+n8Vz z<2%5oMx5)N;nT#s!l#QjM8Dc8eoEB{c8hm~?-8G0J%at>Z@~|Uzk@u7#p_p#;HdbA z$P>PjIytc&R=`ulCm>HT@wJFADgFh#wD=~t{l1M&obNBlUqSp^#HWhyfL9j(5zg;3 zWd1hrS`z;pypH%E@cQD1;0?r&z#EAlgEtW`d{(slY2roT&Bcqu)5TAMw-GN3&k!#U z?;u_g-dVg7ysLOsc&2y_c$Ro=cyIB#@NDt(;r+!M!Uu|90v{~i6h2hE8GN{SOZX`9 ztKehB+rr0*w}VdmZ2@2B^@%Hd#;&ZXREEnf^xKf_5A4JZvD&@vxCN$HOM#91qjPIUY6_=XjVd&hfB~_+ZqZA^tJEgE+^-&f**oyNaJt z)mkO|u97&%!z^)*hrPu)9%hSkJnS#d@o=Cx$HT$m91n+zKUg)Ye~x(B){)N>?|5b8 z3&jV)7m0rkUm{)=`Im_wLi}>^+K68%{xafMi=U79_2LcT8^kYxZx(L~-zwe=zFqu+ ztD^SVDSj2=cZ=^t{d>gQA%4GjC-?#JF7U(R-Qh>Yd%_dPMfKXlcDos#BHjni-|c05 zKX^%r&w-Z~9|SKaJ_KGt{9bsf_y~Aq@zL<=;t#=ViBEvn5q}I`UwksWf%sGKM&i%H zn~2YVr-{D=Z!SI?o-RHY-bQ>rJVX2~xcy$AOtl9C)Aa>s{0@M7Zq;3dU#;HAX}!R_}mZQ}UDafZKxPQMrNsS-Z| zURiuJyt?>9aQl5uKi>)PI^vJP>x)l@HxPdc-bnmecoXp%@HFw4;LXKn!_&p*!rO?? zhi8bt1@9pK4!pDYQg~PK58;{OE8tn;L*c!}*TS>Kzkv4_-vl2hz6Cy5{9E`?@g4Bt z;;Z4K#D9U072gXVC;kU~qWB^BB=IBgsp9N!)5Hs39rfes;%v8>;!}`+miW6Em*$9n z2cIW?1@bHue;K|=yf1u-`0Max;wQtGi@yzDDgG{ewfOt+_2M7FH;8`%-z@$re5?36 z_;&I3@SWo8;k(5fU_I^;9}M3wJ`{dHd^r5D_$c^M@v-pan^K`Gal9P|=kM3kOT&vD zAN4!>KzK>+Ot z9yqp77QBhX-*!#Zj%ng6;myVQ`?cxf?J}Y~ZNxjlGsL^VJBW9OcNXsn?@c!aM-~+|)g%1`V0Us(p8a`b7A^0fq3GlJvkHN=@Plitv z{|D_hN&H#FPZgg5pCrMp`^AsI z4~QRw9~LisZ8Sa{72kvSM3MaCd2z(2h@S*6CSDd^QoKC8w0K2$Iq^#H3gT7a{Ju<% z8*I1A65kTbRbBj}w$XCd65k20BYqjS)B56_kiUU=7UCO;cSn2^@lz0=CVn&Gn~V2> zr;GQ4w-L{QXNV7icM#{e+FATw#Pj<{+5YWNf2PF0iuIKxz7KhNi=T}6Z1KC`{l(vf z4-|h6K3M!C_)zgy@ZsX0!AFU&gO3&e5(wg_(J#w zaefc%X7MG6-zvTgzFmAde5d$I_-^sl@IB(|;rqomzz>KIh94Hs#syYK#Xo`b0|?x% zukIN2la!+QUl*>07ZdLYFDZUKytH^XcscPK;T6PRL7l1Mg%Dp^{5E)X@jKwP#P5XH z5x*N=Uwjz6f%yIKM&b{^n}|OMPZJ*xZ!Z2QJYD<=cpLE}XtxaUXAs{({CRk1@fYD; z#b1GEioXWW5`P2UTl`IUw)kRrfARO=1I0gp4;KFzK2-cu_;B$x@KNHQ!^etmgpU*d z8a`2c8+?-Z_wcFWyWrEre}+#N{|!D<{CD^)@q_R=;(x>EiT?{IL6`l>9x7kR3SmqmOn@j>u9;_txgi$4o*ApRk|k$6jZ6Y*8> zH1V}?{vI*g;R|@W#BYMP5#IvO5dRkLf7jUNu>;QUW#@cH!@EkJAK;ndt*(puQ@NDsk@c!bH-~+{{!Uu~_gAWz21|Kdy20luB7JRJu9QZi#dGLwi3*nQ*7s02B zFM&@JUk0Bpz8pSNd?kFA_-gnZ@%8X|;&;Kp$*)H^JzC|-e^12U_VM{M!mT>aJCt=^ zDg4dPN0b-G-Q3Uj*yVcG7dh3&AC^Cr82+#4+~)iH2@zbXUM7O(;vb+OoUTnSm*p9O zaTB}Oxz6o2Q}P_f=Q3^)KeUZ$$$y6>o*c zTP6NIjt4f0H^ckHJH!W|{(a(yPlKPePu1#aEPw@;@xT5&eqSEpvGfVYyzE_~TBE^2`^% z0QK-XUgo(S?e?|AS3&>$QG5tC#6QJr55rd7s+i%P~GQ6zBCWSBP`I8RBcuKHbC@ zpg;E!?}>hRm-t-t^C!fIVm&@Dz838{SDbaeE6(ejc)bwYb3EFAqr`uY?Q4g4CgKx# z|CD(y#ri8LJ_Y^xG;y|D4RN;H1>zjX(!_s3`&=!aj@P>z#Jgd;yG8tqa#6n>D9-l0 zU!2>^Q{r5|FN<^izA0V>>+u8e<)~+kcz^V(E#j>6CvmQKzCX_O#r0kY`y+I&_mjlA z-c!XVV}7;7&p`WMD9-Kl8gZ`QKH_|TXplIspBpK@4ciyrXXJ9V!#Mwp#PfA+w)pSp z&wT%md45M6-;bmB!4BZ(l85W%TXFWEzr?$s-BPgKFn>RcSM|itMSo~4eiiCT7rznx zs-t)*#P<{*f%d#z{CT{N3>AML+v9`c=OWK!@%OO&FNm|B@O(SlVIBJ0dlKIn`B#b8 z!Fa{<*vxY?_D^_Tnm!oq|GVVjdMtr{#P}mvFQuY&e(C(iciA|UwizS}dORW&U8{5kU@fUD^yZCIh|8L@4 z-Xr4NpDc>!u};1&loP)Y;|zb_iSa$Kz0{TXH*vqQIFHx3zrZ{^Uh63FJYKs={8r5O zcJXDnKUBOw*4KmTRzR30i?bbG5a)5+d*VEfTP4odyUpS}j{8xZ$8iV5c^t>@ePO%t zIIc97gU;i)I^sNzyF{GFap~ebj_V}ORKYH(Z>@aTCOO95-8>$8n3q zc^tPwoX2q+#Rs7Od@ueP+I_G1kJzq{iu3rZIL23d*v{LqJu8Se!G3-X@je(28;F02 z?d}TkVW|Ha@lB||tN473t9`_IoH$rK6|du?#kpLQ#2aJ#nj!u+&Y#Q^Z-;hRDt-fe zjrbTW@7LnTVZHn)&hhquIA8ahqdmC37UT6VL;NW2^Eig_mtwv2mH1tFJ-S=G4fY4d zh%dqY$>O-1m?8cr=KH!hmv@!;MVRkq@sDu-NAYyL&K?x6iGEcG>zVCvHkS7!an_S6 zUL5h~h(C(;ev$Y+cwKHT&iw7f`Fht+yb<=VhKX}O??Lfd=vR})Io}t>c^>}_@w3ry zmx?pbYH@y!{Tp%aZ~Y{G1pD&`#F_s%><@B%osaFYl=#g!|IF{#XFT)NmUzDIUM#)} z%iBV{BDTYJ;>@2Z&h4n5IJYBy?>p<{cJ#2scSL`iBHkYDFjssI;@=hL`IAq@dH&=p z@jEe|>=K`h?e~EA0_>mh3z@lGr=p${Q7@hCR!f}cLmGb-(8&Z z%@(hW{hcm=W!p(TZy0~i5$E#q`?r`U1LI^%iN7DOyY0j)BYzKZ)}JlTI){k!eEMkd zuduy5E$e>G?P=m0FyFJp zQ*r-%b?jeVCjKI}mp0<8vy1p&=;t?!cfk715q}H)@IG;_$8q8u51$lge|Sl}JjRm+ z;;es}csA-;BhKw*i+D4v_n*YM{T>iM4ckj0Y~Ngu9EVR5=XQO%IQv5_@lF^AE)+ip z{i&Ha$MXzv_W$nU?El%~?_+=C9`Rc-zKs#@j&_+O&h`7eIM?r7ajwUA#o0ceinl<2 z-YCxVzdOXao$eFgi*`OL&U%VtK3u<#VY?_V{u}mxs);ktdE)&1>ZRiM<9&jRtsvETTZKS=x}><@E4n(4+a7UL4!waB*J$H(nesJBg>n&qAHAi2nkAU%U(Y{~Gbx zn87#V^RV7I4zc}N56=_R`8j#MpGm(K{o!IfkzNDiSWEHQ=(jhC--Z5hhxqmAhxdtp zhW(lG;yKtJ=ZJIrStNc2=KHbuZ?+&|`cnK4`1j&}!S{*t{O`Zwg)ols{Vuj!5%_6X zKlBptn&PG57mA+(ze2np{95sm@E+o0;kSv8huBI5 z7vgwqo%nXl_gnFFwEHjO{9UTQ;I>nJ8-?6E#3nCq^USR=W~^K2lTg|;s;Sr zKk-Y^&i9C)i2d`i;vDB+5I+w2-w=Nqc@~LJ!FpLKUJUhY6n_Kb{0{Ms7$5eD^ZJjY z;^$+1oPdkD+5X#;TW=y!UYy?>Url@)_Gg-jv;Owt&!PWkia&_uy-j>C+HHvV2%N_o zEB-6;JR$xR_Qz(3Z^ZWby7=A5zeM~J^ur&-KSloi;%!mSzv2tg4#n+F(=f69Z^!ah z5Z{S@QeC_->N!umHpY{t;$^YDw-%p)Iy;NE!FJS3JR5m(#Mhwz4;Qb8`p1cn!T!~Y z;+LQu=8IpCdfpcwgXLW_B@rvmG zg|YLY?N&;>9A4j3#oNKp7C(&ft)ci3>~CBlz6jezhWNAShuy{B!F>COPrx{EmpJ>w zC~+P)J}Uk%+W%Q`e(va1@$y)Yi^S(+y!}}G8MMzA;_t)16R&{nZjX3z#Q!b+5&A=s z%E@k#J6@H*c6YM)3bb2g@w2eMeXjTxv`=I4RMgW-d>7Vx2XS8iccXZ1)Zb5h6!Hue zzbg?*iGP;yAv0QJm++7Kn3v*d@Ln{qT43hZ50r3~psth1q{at3-FW-SMGv zaEq@-4F8`Y@h@Qet?lBgyZ8$veiqhydvTs8?IX_5fjlBU9qsnK`1i=aKzsnkNq&zw zmzVq5UrBsrj01m(mqGt5i$-LgK^Wi87T=3Jmx<5Ec+y4ubM*5&#kXO39~I9;{yE~8 zV!eDKJ^=ZD5N~7)5~jb!cObqLIsunA1Fw%Y#H*uyE*IzT?p-Hd46jrD#4ksGo+O@g zTvX>m@#9d>YVmQ%zeBts_FD?0vvRriVtlJ5{tVioxp-I9(?|Tml&H?p;%8#MbHwYS z{*~fuFplx}4Or*%*bm|F3D7?*6wSB(S<(OW7oxifes4YfRP@`S5`PfwHbZzHCucTw!0PL$KiEzhxmNt zIVQdp+gHV!QC)1$W{7VrJ{kSFt9VlV(4iAYh#_RGt@jmcP;(Y)9sQ7TybH>^E>u-SNZ7Ti__HVn0 zKY;z!LE`*A&F<5Me0V6v!Afe z^5U%XLUH!1_TsF+r#S1sL!A9&xH$XCL~)*fpA6^n-rF@=p7$iaFkYwDh@Xk=bgMYG zi(kc893SOBBK{ftgnIegljpC_66f+Z5a;qX7th50URyYq_m>-@`HhtLlQC{TCeHQs zmUt)ZS1gnKImmxd;+g08`uUglXY|7oaMpSB`Y5id#B;rzFV5GsX5zW8U*aRNyw}4y z-}gI5^X)J39LI)>GykLFuOa`_lK%$eUoY`&|9#>(J(&1g@+6R_-g)`k^J28;#c(dy z)g7a_eiG05juUTOI*NZBJHC*ze+r>+dC-nZ8M_y+UH0AbDUwF z>Ef*OI&s!{i}+VXqr7*(S!eaOk-seQnb=Q$L*gs8j^clmc-EP6LH_z#=gH!%vzqwh zR#=$Mg|p5gS4Mu5#23SOa+}0ww2I%}LdeYT5_#CYL{9j8v^B)#x{$dUDFW0;1w`Jk1|FyIzu9d_y{~&SZ ze?Xk=|AhE1^poe{obPj&Mf2St@tp6U;+*es7v*2BBhlT&iE!qB{nF@xW)jc*cZf6p zaB(izMDeGwKkyWs^L?aAG~aa+&-v~Z=X{Tee~RP8VvVAF%s=Xq=>DZ}_FLxfBhLIo z#2>XMhG~@K{~h-iOFZ*$7H9t5;vG@{A8^*6g5|7vaWsFezmqug_Y&uNxl{c93Q^ws z;GFNT*iIHoJeTWBanAP#abB;>@2Z&gJSaei+9uL*QJlU3k5D zUE;Z1YsER=Z^cWW7PZ@M$$tZ0kI!ga@cOz+ocX(m<8UXD1!w)-Z+lYWS^pw&=3gnk z3i~HtNdE5F&n}AXQrAmEaprF!&h^q!JfnQnE2jSX&irZOT&@i9&Sj(gUEo}<2XP+i5sBw=%@yZ-mx>=fIm*9M@*j`$ zjQ>hJ^Vew_J&()F{EfxATwTN$pBOzq3(n=b2YO6leYx;#{tq#1EE>@(&PicxvRs;9TC<;qxV)^?WYQdcGGw=aeY_uadtM zymDIfxGwKC;>_P&oXgu!ydGX(2E(~r*Pvf+|4h6N@@#|`LjK<9|HYd{^U?Y* z5@-Ha;ycj}*TR{99bTtKOFZj;QJneT6i>%`;&%pjTmy7w&5of`(Z4c*sQ*b;rTH-n17sNT=`QpnorpbK?8pGsTa3^((R%_V8(+WCT zJ1Wlo$;y^EOw7;y+ca_RS7(WHKYx@sk1uA4^SEZEIFG0Fci4G+SMs?0b@I5fzBrF_ z`8jW!joo;BJy7C#Tt7*i=M(hzlzD!G-`mRkJg=g^^UM9A)Rg@7^YxYAFUmYTuaznB zJa4AIi^}tL`g@~1AE>|A$@7rY z?_=&3=lh|>a2&&WwqszcCC>NX)5ZDzes6JJhmfc{;O^T7-qHN>6LwB z-GRLZ4@}g}x^du*iMl-p3`o>XYR>JEB=2PP>UrlaJ#OuH^X(xp`S*=Id*<{Sgji6{ zjs0%v#pg$seQUp7d`g%p|1|EAynoZ}x82sOUzmTt+Xwcl+p2BHa|aB(@ut4Ge@nkR z>-NvNy??Kqfp=qGy?Xb!Ip@aPdPN)8|Hr?T!*gwj#A?aSl!m{q8N0GMtRtcZa<-a1BE|Wc@ zEp|Z0H@ACvlg8S9WkK`bj~$}z9i!*k{B6_F`Ck)EbJ{b$`PTkTB>4TC(Y^o1_6!dc z^!yb&qGw?7`Skz9b_nlYWJ7e>=^=F6Ld_K3og63_rn}r?O!#ICYKG>NBJpY7XI`#xg gOm7;s-xdpSleVgzHYw=&wW>$;Z+6eMKlSsEwjAr%^n0H7`{TPx-&?;^ zr%s)!I(5#ueQ(c|C1vw`uItF*Iy0OMC8*;Zcr0^0i!Nt5-JNdErv-igy}Y#L{g#c# zo(w$S`1!2dCOGi1Z;P~iCB2iiP)Ib*TYWM?#bF{?0%xW(9jdHlkuHQ z-rm>T6Z&>Cd9!w%*v84^9rS1Tn)h}Q6P~1*9Tz?)hA(YC6mB`%k~+Ap9!;nJ3pqs4ol-}(`NcNgs0YFYjU)HC1(E3&F(YbyXy zidDC5{X2Y?UbpoCo|^ae6w6Y}rQ4Sutt>sg3kgpeQpuwYIH~l7lEWa`f%8#3gPZX5 z(Z`^sH3O2M*WuFUjfb6rE$EZd?Ini`_RMm(>@C>xD9{Ca$RyL;RCimnIE$gl&lYUG zF;l}=uxBrO9=i%6kAldgWjG2Vv!?kAwpM3ovt@6x56HwaGtEtg($`r9TjzNAre&qV zT(%h0+BziDXb9Ep#`N}Cc`YS}m=ijXyka|$(F3I|2TJ$7=PPv&l)8IMTb^ZS7VOFL zp}2R^2v!XcpQNU?FJ1<9r#zeNj3wI_uOO;m>qEc`m(bOxJHRFPml04ykdIm{(A}%Fw4A5*K**^pKdDX`F_{Xr^gMys^FHjZ??kb*1hpd29roQb-qH%YmwW2mJ+4 z?2YgJdC+n89Si{-sEY5uWh%N6<9X{=@c1cPD%jHnf(%;PU)r+Yrt$rh#`kd=-`3^S zszQ{Wx`nD2fJ1z1a26|h8)IPKd#0u2z2=Q?_ed??4i|fSJY53Xvj3)(yq&t-!Y}~Z z%rG#|;B*79T@Zl=CCq78My+#!)WSw@U;f_LlEVr>#J&oX`G72n*jFLEUL##|LHAc} zh`(0w#PZjmDfd82$zL-Wu3$?DRvbugpS7%|9g(+<2Lge1Y2wS<;_|d5&ZI#APEE%3OKX#skNl zf~(&V9WQ3Yx(Dpp)hqF+rIqRsndY9N2>m7GA4Vc_j7v1 z(mLZSWuRAK+0)t+bpH(Ov#sQ_O&dS!TX6NjY71qMl9nN0{*2t}0ad*&Mav1sqdH%@dPoCI?aLdL+*oTsX&@yhHp*`F; z+69bge7c=Sf-NOSME7YuQd!M)M_jCi)9JI2^-nK3;vQ&YAuE0x%o^zcI)W{Hv=ctI zmmJXzChJ)~?(t%oXfCv{cW<(QIdK6trQ}d*x@ZP9abUs>7{rZq!JZ{x=wI1;Ngua7 z3$8sl<=IpLwBCBAcO!KKHd06IMydkbU9e~QLFiMz~hZk~Q(Ba5Nqb!wLD~^}w1~7muQ%;qs=Ycy)cau_2M<8dY(S6OAXLsdy3; z0;XgvQB{uYmEl+-(LY)piC0b^4C<$gEC4OeUc5LweMYz{RUb{p8|uT!1XP5+HHkKk z6K|@lk2J-SkwmIK0v3xoeTO)Xaa>sPIu6|IbDY!g!+V@nn4w^WfvS|PbU3%jt0hf*Jr}X*5@36hG!Yj9ja4FuI1~w2}*i>6F&N+COh4G zETF66iB6xMSf@{F+*qf7_t|hsqOyh%hrK?XSnTzf9>@dBOkgzKLpcyR7(9;YX>fot z(TfOsU)S^|!e<4WKEB@p8wu!PP7AGqrH&QQ&nqD870}-bF!ix&#|$9CZ|e*sBFhqk zh`@Uepw3_-0+tv;L!;L}yEkBcjkWmP4cCiRfZWCJ@op5)+BQn_JMiNknvKi%#|- zOcotxW{2KRTXZh5v3bu7+yhnFR3%ixHke05wy7BJm~Z5wM{`WY1jm%-qI0;P^NDG& zZGQm~L%97iUk&haNGuPX27zMP&LcJ^RuI7P6UTUg~9q+P9BEiHn{AFW2qnO8ubmQQh<7xSm-b5rmDS7)p(nVdz-r0+teC^ z^|`4}rKv)0s@C@{Y08-T&>}F9RkzXG)LL&-32#$P-lmd7WU=U!@3@E_W7dW4ON(Al zY~0QU>v2;t&M}vE#P-?Ymk}2`_HwdUN0z+Nw-We3I7HdTJiLbg(N4qWAJ zWit`%*JdJomTe0W?3S%;D=YeH-(C@&WwwPbOpCt8iZ-?4Bv_AC+Hx95oPo67PH zj`;-<+_zs6!F_w42=3bpM2L0w`*NUBQo5V@Rp_m>1}_sEtMh9jScBgfB1d*&`~0`>T4~B}eis@EGr#TM@4ZdE;ce;X27^nxmopuqd=9__tTU7hVC!tN_dQA0qsAVeusq99PGQFfc7aB6M7$0+wkFFIH%&z1!(m2atROLeqVj-?7Lm20VxrSdG*$x`{2 z>TIcwmMXMVfu*|S(>fz$DZJ+ddUmo@H%oQ4RCh}iTB--+DP-;9R)EF9YmO5zUEPVf zFhZ!HyX9l5hoxLw*3(ixOZBpp-%`CTg*RP6d>>00ZtXPpHE=1l7Bqd`z3JA%mXBNO zZz*nVpryFAL6+jy23v|-8)7N;@=!~$mxo!Z18Xweodb=NCX>wwcT%48d!*%KO-8wP zTFA#ax5&-I0TRr|h1F;`592#8A6Hgm+&qlcg8Yh!jwyEY(2T?KD<(N+tec0uEaGM- zxGzhyS!R;kl5TcNn`Wn4iVbjvrPu(|Eahj3)7`lsgiSibJ(!j_izSlkv)z1biv`ZL zMQo=MOR=5iSxW5m4fkdd?=$n=zWHLOg)H9sxy({7E49cyBDJ#2Vz)6}Ye}10OSx7) ztqzu1io3boQqs+H-4P&!y6Kt~?k#DFD_J79yvn^?_R9J z#n#wpDY3>C?qm=$0*9Dmu5m-B&nw48lDSNxCq@D|(h!^lY!_IbP9ob2dTexIbr7=gzenl;mIzU15oNq`?kLl;->d zTEB(WS>W3v>huVdh3eAkETVSUyl0c>Zd_-vuLRhr3uS>Np`WJfEX%`XH`h6rv>sy{ zJ&&ZZbykqH1uX4+-v*Hu30x5B)>#Bxn1chKrCmec-%B8Xb_0PcbMcy#9u(LX!rNa~*frh=+n$ffn1lB^lFXab!1cZ!P{#_pz5uV` zf5%zx26ohU5n(q{r&;n%Bzc%^=3Cxyy*U@BKpuYIrewcM=Y@`2WJ|5QVP~b-=pCFu_bP&ka)@xcaUw~w#4o{+*!YCi97S~KEh}8 z>_gx#8Y3asQr{={lrnV>`R8n=?#;zid$#1HANpco5wh^G!2O}0rH%5S*TN5x9oWJT zQ`bXQi$_R5zP}TA)ORTeAZcZR$3p)}OMBew{5`pNh~b5F7u~)Xi~V2?jzBcf>SpuRo^jX|F%Y$8=|}KP|vqW3P|o=m%ct;fPoKcz~L60FV}uIA2ST$ zS#Cb21iChEM>ITL2iyX*Azf#?1!xnx&T$Jiz_lF>o7})hyP(I`(yiGzaoNc@kn8%l z0$UDK}Qve~&`?y*6LCbXA-_1fToH5w?05?$JhHd~p*tk?W zflh7!3D&B!8$calC)Ygk}} z`wD!oX6ub~11NQKOWDmtV6>&|vN$ltQg&MyD7KW{2nNPl%5MDv<1A%2 zdx7zmvfI1B1WVZsU0|Z6x>(I7S;}tO0+TJ(!{k=P#iSSC&kmmB zn*^#*CJqLdg+jfhW9O0q+34qa^jcx{vaUIwxcGitaJBEZAS?_Wj8%XjN{_+n≥d zT~mmb>mN^*JHdD%y20WX7otJz^_tG8gmu;|H&}5^TBSN>nzGm zq@yF}Y$CX^oO687N}ZgXrJ+b)X=k~&o%3uvR)ZBpSj*&`PlUBh&PpO|qRP1-_cmzM z-rmkxMMThgBj-ZjXVU1%oJeR|KWVg_1aMEIREOKC^oovoMOWqC1MS!^0&=Q}upy8W zr#g0#m~$}^_AAYtHAL9FkyA@Vq3v895%$h`PCZHMVM`jjpcDF7Vr>_+ZrBn{WYJ;V zxukCm7?C^|%vl%OnC{$q63w04K!hD`IhRs9;*!gJrBJ6BJ%(?gf#MbvJCvff`O8x)IBG{gQ_k{s8{bTy&hjUCjBWuLUq*1sN?}usk#U z5t`dM57%TTpgr57u;_y}%K~L#@HaXma4mdvbH>4^leZv1f7C^%*CYr4TeNn-nE>NIE^3jY{GOyp1dH&)>4iyu5L`GN zo83-YK$2sOA zs~pSt!rj$*fa7#R>X_RbE#li*%j9tMnr~;#1S}l@Y#En3dEaD=f~k|!6U9tKM)!zI zO5rsgv+c=ocde9`j=1z-2DD^Vd!vnNAEztqkqU3PgHd_k&Q+w^8}4YU>56`F=S`P- z>f2d~n*--9w-4GJ)V8u;ag!wQc(SVQQbCmzng7)X?t?N+l@O-iaa2S ztS0h7rN~un6tM{joUtn#;)+_n%I#%aUIi^TyLP78Sw+H{-JmsSHIZASsTv};3R&w6 z#ty#Ey>#A$TRM2SyZ#8R^o~0p+O5UTS-mfIKFqew&B;NQ5A!T_rlq=AY93JsX@K~4 zF7Dk3v+u!<)*H*H>?3w=nWbo8`gWFDs*knL3QG-OYZ3Lge55h~OJFO9#%iJtb;ogw zfif92bn*QMdwjrWcUK;C7AYJzu!H9uy5$bzK0Uf9KCOl0vKcTk^?`B>JK}+>-cr?%n8+w3%LM z_9h8MDX*%_6jYr1@*Ph*7RBd1%TdfwDU`^F= zYVH}iQ*!4QPKNJ$d<+-?{BUP8%>h$kq3iFMn`^7MuvalqA?TG5FwT6yJ8(TSrN0m9 zV7ek8A*`A0Z5w8-@z_v**XrVfxUa&d9FLZ5G&<#b7}oL_J`(1gXRTN zpNg=4h#Kf0ID-%vPq5LV7SbG@i`jOCLB@pc49uvUJEeb~ z^kh)FgCG(6VLLdu4L95<$#iZ=o1zo?KD3iNxMN|izhCcuSStjBVHnr}+&P?`4>v|e zz&6mv9JC7CZ!$)%cy(mD6gmO-k_uf4PhiCk76FMJW^y$5pUE+4S2IvdKp+#|W7{}7 z;5g%ooVFq3IOE$wXcfnqfbN)IIG%hnQQOU$=u-0kB#15?L7>9?LiFV1G&l5UXiu*> zrxd~Pv)W0)rMTR{JC{Bh1F_3*ZrbnKAtd5z(2U?N4s2a zjgwvb+w{_LXQ>!!;GCX_PWUo>5BH-n(~S5P{JN`os*pP!lT%?7xANz-YiF~2vR9yVsP z>AJ<3r0L=KvfPDcES@%-NqA~91FklCn~}52L&(_;I5(S_Shm0vSZh!_;@zi9xmzmR{XaBH7>oku=ml2UZ2FX$ zp-IzWn(1Yg8H%T*8HcAcOcwOcUml$1&zXju3t+(5o~=&z%=Hi1f0pU@K19+d=Cm74 zF`UA_L50-F@Rb06YTV#UShdeH7#lfTOh@4M4eMBN@RQ*C zW*l^OkZ)jDQvi`xZE}*vOgF(A2&b?)ZKWAmWel1o_%{>ys{!K}-{3-%eW&qPncS5I zVmhzdbb8PP7nokn=$?LCP)5J$_}P29>F|IF?lyyd1_SOBGqB9$z^T7=97R#^V>6=6 zjPecbYC3=>U3Qyn-{8)6xGgYY>)YT$Gw2SIFlndB_YLck76^@jzyZkCY{L=+!swa& ze=m1{Z&(k|;S&t7-~(o4H9VOq+O&^pB31+v+TVMt>n+~YMNEqdK4wMC(&CoF>4_!h5=ufP$A$YsV_7~oc z87{ZTbPJ|TAZ13ROxF7*CuIh%GaWaZEO2&>>9Nj?Od8N5dj<}62;r!wju5?&xCE2ahQFKl!7v7FUy}=F>~e&wsJB(%zge&`yrYJ zbpdV1ntm_B03Og8?7R->V&e-=HzRxl3r)YI30Ir!oq)pkIIbIsmZzFxOOpvFvOZNF zfg8>dylY(BP+yI&fH?EvjgF=8O3Cc#8i!s9i6r0!6lZQteeL{8CsL7^TizIfC%o#) zv9!LtJ{pVAJ1S1Jyta060v=?JBw~OhlJn~;o%-a`MtJ%r0uP8$d#Ofh4qI8&kc>O< z{z-WxI1ip{N0zAj-E6PEgNMzpfMRS+UKYLLm;>=A~uNw>Z z-RFY-OW|!BY^NT~)F^Ma)K^B*@9j9Xb&=XN^gd6dcns(?ZfvoWs>kOhYn<}h@XYye4d@8EqHr)lQ`!&kY7ZDO z($t7joZ9jYu|zS7I5XbV2o@l>pmo8JjmZs>a8pzLRTQLvMHi*&P$Is5l<9Z`t2=eEI(XZMltXioyJN-m4eQ}`nnbKJo`@ux$c6CH zkZg!H)H?MbtqzQtenSXfPl_})fH&xcp~|Ecy~sw2gTWM8S8gj-#;fDW2!6d)*%TRr zAH_C~>c&anqLw5LT|F1#0wcGn5gwaQL?h98?IrRpz%cc?}s%PVSQ zO;8BxMc0hN-o>KHhQufcTO2x45Unk5s*z%RX=+qew8}$sKsF^&%Scn@TzG#BEO#-F z0z2fO_b^JFx#$cEZwhA|l^6{a1LMGfjfv_=WvnThaClTsaGFvPPz|E3(g8dctB1I& zbl~0^RkRc!-|9&`goU!oDB9Y-BTHUw>`UXL^vT(W}=Ta!wdtRYEpEZdEVJe&U9$#p|)%y=m9m&>d>`B2)v>YNq1~M4bDUy z#x{f#Wim)&RZb%~g5RD?tAitOT%^KTl1Xy-mL0?(=v=V@5=U(<)+Gg#8yaJz79>y@ zkZc}nN75El1Q#YFl?^yloh6NwH8aL>(wC4xBPqza#Sr%Cmszf>Dl=@_igVS15B~3L|O?6laTE?_T zvj?cqn6T-Vx?c&oG!sj;YsOLqm~pTZ=(UpiwN3?$dzif_K$>d6*_7>RQsYEJ@in_P zmVmy*V1}x6Y8p}rOox!(Awpo7(8NVu!^zjqB~%T>!?1S>$7p}P^7 zL13U^yoo0usxn+FsdIUtSAvB;H7qOp^pA+69He2fD?&)6T&dIaV7AW*&f< zIR>ggieCf+ELsDv@3pNA+S3G17Dj`k(J0WOjZuoP1b4!dOt5Fkac31%RM23d@ehFm zmV=eWVzOea9J?DOOV-7}y`&_qAIMhexd1b9dL@%tszABb1p5sOlSnj~sI@|11_P(y zl8ELUYJGN_1qo(3RFj6Q9nZ)PDU`A$=Bx;&P?*194ks&P$UyF_rIE)20o&!+hg27H z7Ta{^$uJJ2DNLi(x%BK>7q3URkRk1ewa$&!;P8ibs03zRyBb30l&>p~*UE$f-lmM- zn1Cp$av%mHbxxA9dwuK@E5iD`?K-TS;uu#8*m3L^+6b3%d^Lf_G)~lFRZJ9f&RnMz^6|6;QsgiJP%7$!d;~tldHoB-4>=xP)MjYZh2&yg7EinTE<5YeI}2ZB>lggf1*S!PvZ}pct!-Hzj$u zkXas6)_{1#fTHd|A22y!982Z_57?nkYdT3WIQnU9mf>=bt$^!f$bFpiAkZl{N64?~ zaLq(3Bu`i%V-#g_FFBo5p_G7%KxDwWG?Gb1bLY>s8b%-i#TydnRB{PTh_UsN^km!6 z7)#Kq9&$zmUpxZ-x_C0aE=CJcj<7mdI%4o(j^&uPvk&RTa|w2WbpVgqNo8SU2; z*1j-YqcP~31M6c5zDr}Ua&LgGAuK0&VTfZ5SEGRTXn2aA&>;jPtj!Q-!ixTh{7_vNu{i26| z$2I?YXQ|y`(8!?OXL=`VmwcE85_VO@Yf2o-*3mX|!$Jo3`LO!3jY!iRAYjB2w2`OF<#^aGg1BT{9J0$Gp&W37wlA)D? z3}V=Zr)LGZnvljOrmrxt#*TF=8&b4_Pj3h-%ai4HOya)Px}eNX5^=~%>|5*;ZMA7m zO0Kv1+IuOqv2h}mc2b~@@XDI5+s0D@*7Xoi>Ge5GAh6G)%_W5>Eu>`1r`;gU7Pw7c zipzhDT4)~bWhCO1Gi#C!^>{}CZYD%<-hx{ikU!9S;66xJG?~!dlO?h?^~_7vi3S)J zo_(N8?x+jU8}`MmHs*bQww16-Av>GjegfVsv#hIvVa8L?(_O1*0pq zepGdRYIJe&=y-j!HU)QfNDdPxGD4bc;--tzRjev$dUR0{|Bp)nt0oI?mlHbQwq5isGGb%$++mJZyPIsy>K{y(uj2CA-tzTSZ2QmU%e>{jg_Z%alN?wj%lY{DNs7RyEKn8t z?f1NGQ23G_Vj;sXPp2T0pQ5D=J3QQn-%4jW@7+M(9;YStC*1IRKm0@?SM}R3ncE5i z%5Pt^I0=qgop|`2^g}dl3jOd~8v4MOMmnXng9jOyVJ73Vm>$4g$0vD^e-qP!FK2wO z{X(Cf8^x*@GXCDR)(%oH&iLx<+u|v}JA>uKzVbNHm4MURE^zi9TYxwjzP%kBp9MP^ z|6PD%yE|Bac_`}PcK9D}2jABY{wmAw%ZWsu<@!@Q{5VEVrYDX;)bmAp9s!=I1sV^0 ztoUU7eE~=Qhxze2d5ms&JN#4I!56oKU)&CUc{}*E?clrH!5?l1f3_X`wRZ6L0Y^Ku z&{Kx;6g9j#$oSoCJj!ig&s>ND`&e5`5wf7M% zW>@HRP3us&AppBq`yCCTo_oA}1BhVREA#5gdm91Qwy;o))~tbTOh4XNA?C;rS^rUA|fwv#z4Ln4DobT}% zr*M425|3{v9Nx*I<06IkVLYMm0gQjogX7F8{<@oSv@hx?_#O{G_EqqwJ^Wog_-{S@ z-gx+ZJNySd{Ae?gf4Cif`$DX>8>Ud# zj|ImRvvX=Un_)4d)1To3N;Z!P1Zr}X!dc5r-o2@l~HJ3Qi%@3q4M zPF%t-cDR;tZHL?2!9P}VP#zw=dEF-R1)tdtzPcU!YK2?rj`M8~j$M@X$$gBY{$cnh ze*CqEA4B79-rv054*qsKcpfKql#gRV{W*^uuir1^XN|=#9LCO7?cjH{gSRT2r`h9qJi&>4iK~$c7yh#pF8VYx zj`SdpeI8Q$1x!EV;UDbbKj6W=az1NEP8M%Xv0bm6Z!@m@^;3mIH9FpF2hZk-UgU`W zBNZ-krZSHD41s?VZ?io7-gv&)gL~s-y+_Vaj~x6JFFZsaJmc|9JNTyx7ytI*t-Hvv zQs8z=JNU)z;5R8;?6XJVBL5eRYy14l!|%1v5fARQkB=8xD93A`evC`M#6I)e!PhEW z>~pWeMgO2#3~lio$#Hcq{ebn74OPZP-^bj{OS5Kk3&-4?kXt9bWbDd-LQB-rtHoU$Wh{ zFpl!Q{QqnRFXV-^$PxPtQMlyW+dMe->t*J zm%{BYwn91MD1R*c6T40E@S}Xue~!ZGt!F6b>B2!bvB}`d?uqb>IHt5uP%$`IeZny% z;F=E)*-s!prwYPl-+{C&3DAohdc+t`oA z3YVamq43>2IPA}JW#X`r12Cre?N9GGj_gCF-I3g%D;59kEC=uJ;UWA7**@P@ct7U9 zN8#IfzTd0xH@LsQR`|6%2;Nlq=Pc(#h5ym2=NwVE?EhtdD*D?W4}!fUwD){3F)yY=!q_`(L2&fgI;G3Kx5(6fWcCdWDOBZ&SGV_lF93$4-UIymq_7|H66T0firCeV$afmF_sd zRJi!%RfS9Zv?{y{w|i9K_9xxoopz2>>F-+35BL`;@eo|*#c2xP$nxha{5!nfI9K7j zNvh*S6+VjTMup=qlj5;a;a4$zjlzrAkKa+a#K{j7zLv-DqY9tG{d!vAZ*zRVtnjhi zUs*?p-5y}R_Z7eR@wmb#+3q^Iylxdalh_VD6fSZGD_r7XtitWDvpA02-xK-ou^#6u z{yL_s6#fX?r%B<$ca_2ia-3hM@INtrtHPyU_bMF!1S}puQTUC#p4q4H63%;i+z?V zeu?wd3b%i=%5mxx{xhb(sqlBXzc(p-0_(F|;iAuj3SYr-^_0RJ+0OeF{!_NwYYKmf z@joeC`ulf<4`lgYC|u@+AjhxR^F5A}ZVJDb`#V74ud_a*6)yX=X$qJ9+I)q}e(gMk zKg#V!75*n~w^8BpeVgQC>6h%|u2KAAhwms{_HmCYT=sEKD_rKgmlZzJ4pZk%h08wf zpu%Mz_nE?FAD4w4feCI8AiApEkAo2K|>AGbi^vX8UBB9v)Y_Hk8;U-ofH zh08u}v%+N`ce}!6ANPR5WgqvH!et-#qQdd_j`8@N!Vhu${8{1mb6z^EaM^!-sc^Ap z9_I-x#!LCWs+YpI@w_=q;Y&F0O;Y$TS^v2T|D5$-tnl|){zVFxePXS`3%T7(6)yeS zrtl`t5Aywj^mhQ;?FWkgSzaIhSmCpHzSyVm-*SI{t?+*^|CCMl*C<@t{jS1gKXbRjqqh6bj}F$7 zd_KqdTMECH`*l#^B46@>_~jpLfBbzkJOqD(`x{cY$my$a{5^U+Mk)Netp5~+FJn8; zQ@F@qrf?ZY6$+Pe)TnS7M^`Gmfcv#w;Y)elb(g|#MT5Zcu)^j3$al#E((NWqr%s7Jj?T-((Y0o@84GZkF%cNSNJDvuSXOU%+|$h{EML6_@=c`u~gNcU1Ucwr6jJ=P*7@;kR;pPEh!lJl^Lh zyoTj0R`{cw7gi};o`;AlT>7<6;i7-D!ll1E6fXVxp29`{`xRco@$-bjCBOed;iBg& z3Ku=!Rk-Ncs&LWssKR%$K8DA!_*eYWS>XrRU;Pv={T-=r`JR5N!Y8tvc?$o6$Hh{G zi~g$>E_&80{7vrHr3z27e7WB#{hiC>;#-Pe?0KicMW2ThF8cgT;m0{{_bXiPd;U)0 zhgqLLD_q)@eS_$~n8)og#V`6~b6yetfARXJyTX6Xat12=mz{YmYkNdL1Kj41J z{3G@keLhh9qK~YPgkSuKKii3i;Qz3sldtegkO7XK3cr=(V~D~f&x}*}QkFAI;iBgv zg|B6QtyK6X&gWGMpTzOgq;T=$CWVWh*C|}$;Z}wJgzx{{t8mf(CklUz`@2u!GG2b8 z@EchETMC!)dr;xE+~0pHT=KAwAN&^o%D662xWq#rg}=f23|F{3-!oC+lF!dnxWxYw zg-iUeR`@9HSA)Vg@%rR4g>T_}vQ6RQ-U*-F82Ak!tdaD=S79z%YJ`d z;WAGDqVUZ;ZVxM5^!ZZZ&&zrjA0mfC{QE!LZg+)?oWTko#p|?Ug-_u5Wvaq!WS&*{ z<2)XhDtteW-_;5iztk)IK909b6&|KuI?fFWAIAN?P2nq<|6YYZ&-h~szmo0njKW`G zJHMpx*Lhz1y}~!JAOE88n|Yn|4~0L?`ok}H(;h3r|?HufB3!THgZ<7 zA15jNR_@nag`dXj-m?{6#pCM&g)iiBTCMP6)<3E6e=z@53O~;L*DE~A>x%Cwyqx7c zrtlK(?>>dE;(q;B;al0BA1Pe)`CQ>S?BD+UK$rMS-nSd2@aNdSQx!gf=gspJzK`X{ z6#gUYR;Nkf?{j~zQurp0x7`Z=EBE&Sg?Hh2{x5}J$oLBiuVDOl3b%h8!Eyeg@LJ~o zSmA3KKd$g~jOX)upN#lT<)8={KBC4YdZU-qr!j5 z`DB8^Z{&98DEusr^RpFxEzg^)6mEFnU99jM*k9`u-jVIrtniH-Cp#1_&li4A;g7ML zA1Qnr=eH*mzMA#_g~G35{#O;gkmbLt@ISMh&lTQ>?VN=#Kfob=`6b)4lfv)dJlR*_ z(-0cNCt>yLx55k9 z4i754E64v+3V)aPtuH7%!S;Dg;X8SJ{Yl|<94CKQxZDT)Lg7KSPY_?SfNU&eO0Lg9Tm4_u@0 zTiFh`D*OP))x8Se%=qI9m;CUd!sU6gPZj*Iv2p)kF3=n#<2xcFrz`@I|E$j?(U z@%K~wgIU-}4?l|_{t1e|knM1m!k=J0mn;15JRemnyeH?44GOR4akpLJ@_yO(6kf@B z>0yN*WjXs4euT%%+X|n?atXA*S$$ z*$I~`{3zS`TMCCi^h3vPh0owP+^g_B?$@svccC`2{!8+P;@`k>4lBHs?Ri|`Us`pX z>;d)y<>OEsgBNfNV_fX^Z@hqGyoVo~l;8VVsQ6`la)H8s!TQ9MoENyimn(jm$G0o| zAp7xNh5w25d_v(*G5#@K4eV9?qUYNR zZ(=*NDtrk#0gitwT=dKtWXr|Q?{WMTFfRJY?|aQq{N>01N14JUu2w4iC+zoi3Ku(X zQMknUjS7E~`?Xu)KWF?Qh0kL>pJE(IKm3#5&wEbsi@#n`xcuJ1dkSC3dE-Nmd{jk# zN9{|+Fa63N3`}r{{o!xU(b1W4v43Aw7LEyuU*ybHxafb5!bShp3V)5`JkGeZEAQ`Z zQvA~H4GNe2{_P6CjqU%C!gDy@o?u+smEY(4jpCPe&f5x?-;w#7!jE#^`%X-f#YT8f-e?tk*$%H-E$QAsdjPjx+ z{64T#guhnp6ji`)I~OGyEJ3C6GluZv^hNf%yrLozTL)}dnIZZUM_4t3!7neyqzber zmk8ru5pas&Z)4QqubUUa5532V;3tFO4?4l`A2JO;>0AWAJq1gkGblYH&eNZ* z1fTL8NE+Y^-Tp|xQKqiHo1eq@EC2qJ$O+2@pNrv)GBLiqht!{=8kBiJcrmXk7ApEP zb{LKUG7(tv1l}otpUi%{c>>rp-Bv_#=p${v1%REb{j4)=z5U8Cn)kwX>c7kr#uzIm z{i*A(fRdBxAAZtA}lts&1TwO9X^cIp@L#EJ3kJ)~VZ-wB0s z?d4l36R#IM3GbtT;Sx>9|7xxuhBEIV_7m(yxWM*x{Y_l|7Nwl7{|l&lGXK4Siop@) z`shD&h18e)ak93tUJndxIOP3weB1+<-nu@ZNnVlsm^!wWW@4a8o2Qz2= z&f06Oz4qE`Kjxg1&GQ#82>HIJhwmNjWhq5HZ_k6-^BOv>@yfjZ-k(bj|I6~)tuNPJ z{D)}m*7IJe-P*OkcJKW6k)?Lq{8zTs<>Ob$1767kd$#^`>)u!B%GUYs*IsgS04_?_e$=6l4RH9XC-c1{>s*4iwLgeue!+ACu+Cu ztNr%=P_4hO*58AlNNoMKsM=cUvz(%>kJfH|k~yCwP9^|m^B&I$9o9{D=|5Dqno)a2 zKXS$uz1b%}+`2dGhC?*9GOSaAz69ZFMN_0V5}a*!{KJpr@|LuiYxKH-tiP zTWthTu(&%~1D&1wt+YWV1`b8#|9}>$-L~reY^y+{M4(aLhwSwR_~Lzts)IEO@?;wY zsZ6qfzHz_|_7Qkgq#r`QDFxOy9$JBA4%pXFW5(;E|8M3n$Loj6&iw$n51bedy*9QV z{7>|F-+z0&`*4E||4)taYV!ELf5$k_ia7K9Q$5~?Jihqf9{-nld?I=l|2bGhYxnuj!Py@0Q146j!1f&4S)0FY`Op9M2HDo4&}*X) z%C#3ZM6gXsL0#`{Cp_1EgD$f(x24oSs4&>Ln6hpD&t(yOP+4f3 z$>voZsg|~ubj!L#G~U)2ZEWd`*QXjQM*}f?MB^9`+R=h%rMQbXe{sd!gQI@Xa+MdS6!dyL4>}p9iwbKQn(P^=cRC_$j zOL%>2f^9eDRc>bo*Av|)MX6jW(W;V!KD!&8(Jp=h)y-~sXtoxY?&im=EqF%qI}@pO zE%8LGL9NL0eBwITd}W2_1)iUeT(FDpd9<~TCwe?xu4kSX#?zdq%4Wh>aef|B#X0m9 z%`avl#UY0MT)G;fbLl{P)7)vdFLC8&U%h1Ac*58K9Yz+zA}!8A|}QY(VK}%B8r)qKm_JWa7Yyq5hkjMIE;yjMD$@|5)plKp$mKA z$wZX$l_^B@V`3^1{h63XM45PWdgxX4=;-jA$X7BRol9)u-g&t@kc$P(rz_%v1w{19 zZJ6wZk1NC$Ey!({;)QDqv2moH3yEn27eAhek)nTb=qTWmkXRmhBcuORViWx(yt zjR*~i(?budfQs-Lkwp;KtmjNuK+F|z77JjudLkqw8Uiez>fvmt?|$Y zs;WGkh}@r1)$FQT?W$^VRh{jsS`%P-QT4d0>MN>RL(Oy*vX!!JL|oFa=aRpQMe=!} z@xTYd;p4m_JcoatS03IR`3;%~NbnC%iGq**Q%U$N-RLfchzPIybC z3K9{QxtvAkwzkK;@HSWUr&)AvDgjrnV9{dem7&+O(yoe}pOJPAOJmX7U1`^`G`{kg zZqlv~%>n^b?W*wSA}?p8-RMfY$#L$ELacx|_dkeBQpL?g^v-Q;srSM=3sF|FmyZU% z1OF*9^Q02HLYD(XY74`+Ms9|L&DP!Ks{H~H;_cgs5O05x2=VqEL`Y}<5)qOY?;=9- z;%*`&FWyar)Z!~dNM5{$hypS6-VhELWN1 zk3^Qin8bD4!$p|*HW5;{M~RTSJw`-0x3PYs7yb?rQn&9CA$5D42&vm%BGkM4LcdZA z`iH+4xjSRQ4~R|7`7a{Gf*%IRB^EqIS0ph%O+-IVF^>QfHRNI9pC5-}0Fi&f;h#i4 z&ZzpCtLo>js$USH>F}4K@2P;i@UxNAU^c)G`jso-c~`&-EP&be6A`9-{_7&tuX*D) zp+XQwrVR_f6uB`Y`M0j*-?@@sq4c1py&6iWfSmAakykPT{^$yL-4*aBBE*ev5D^wn zy&1Y)rG>+9MaJ~fioWeid&iabE=v;u?}gr00RzJCM{a@{G`rw0u7JO~0zO~?%=RG> zVV+ogM1;iE$3z4$R$w;tiOOZlXDW}W5L5X~g_-KbR1Q-GOa)98meBMfkEtTQmd{jg zrg|||%v1qWB}^4E6=AA~sl%A+%~T(zika%mR0&h1B{a{7Fx8K*9mZ6Drur~d##CRX z$~_1pa7C#<1zHLId0uX~pWmwxdI()8V?LqEnezGC0H#7r4P+|J)F7sKw)S+J-VE+J-YF+A5e5Z6lZxZ6leIRvyKawDM@C^2Cxcem_u7 zmP`+i^$Uu$-s6~0EE(_fuuy_yZlzy@9VEX5Csq^uB8=~%5}a98`9&D3B_$10y>PW( zgl-&N(lE^nPxOnhmX)G*ioa9U=7gvDXJpjQ=%#iiQ{sT5m=XufVk#^WXZ!s@h`97< z|KW_p8j(n*&+&VsE)h7FFNvS#GbMgnz?AywIDfT@4}}-{Z)U_V67k&Xi<$Dps3rbh zEtM0l^XI}HM9jCeTd8GIs)S|-Co?70T+WnM^A!I>mFS08_-ir}PZx=z`3(O=xJ2#< zh0pYF$?%;ed~8QOQ)+L6zg|oE;a2~NOsQmd=^g%VK@hA*hcNt7R21u#`UC%oN% zD5K~z-4uPco1)KkQ*>i@MK}3rl{hlI!!ImR({C1u6kR+0V$>zkwTmxFblu|9fRiij zbF2Tj3JiyD^H0nOyj=ux?Z3#BNW6ookjS{xFN0z<>IFerv!w8N_t9=*WDGktIxwE5M<@j)@8R&ESYrMQK&&8(F0jBj;t5PIi?}B|V~a8d)%z zrA>F0&LBNYMD)y1B}gN0?F(i_iVo8%9PNs(aYfH@MIY;mo?C!(J*m$;s@y4T!TbWu zp(~hJKo(rhL~X&RK>O#!oZ~}V)tvHRaik_=&Jxli?mdx2_m?ttp>klODl86`My|}1 zIk^a@-BRWhvbu_uo=VchJ1a=q@gnWC&|;Mq3sy#6%}85SfE{0?ok;>Dd}0MSwJKxL zXOXlSOw7k288U zxgI@_q=`q*r)n<{0h>cNLm3vfxe(7uSVgcU678!Mz1)qkZM`uWOYmMnl4X$^Tp4;T zBkal&Jg0544gS?Nr7G)MscQu*?pl9{E9=$OM+)3#{j`L{;Cki0wJEKddadPcp+2< zY+U|@5*0W3HpqKbK&hq0_f}W2d6icY0%Z z(doP7R670dK82uxPCw|4sb(bXF?+#>Mc7FQ{;1>yJ^i=@qaFUi;g^il^RV9=(+c4^ zes9bJbRPJ{=x#dC^-Iumbl%G^K~KxF|A&!mDvKYS{% z<@1;r6#3|lQQ@G>58no7G>irV{JcxiG^PeJ#e-@vh^de_8Wu7`{O}JlrH=3m9Ys+; z4=)A0I(`mLX}J8@8w2I~fv_?$e6XL>4p*rXL;W1I!W)a)hxtK?A2|j1V6oEZ1&8^$ zNQhN^{9Lqg0NdD?sew$D`gvEwwLwe`^TViq2wTzwBFGY1$^^rGG=*kAql2;j=U`)< z%Z>AMQHoG7rALY5BX^*o-;sN=Lq-- zgSvZhK79pcaOFrkEy^94e*#bx-MOQJ<54dYqn*v|+%ZJtbJjQ`cUvTHnHFsB6^FSn((Wt=d9e?$WG9c z+tTReE_Br#@2Xiugt%Za5xkw4dqQ7yq3j~%E(xCm!up^@szzyUUF1y_f08SHsVjb& zEB@qithh>C9=-=9q7af;o_lKKOo%A1@oC&0nK+$&kqf^c7QtAz;>r8vO_2CeR4p4r82|d8HAK(-^z+oZ493Eiu4lr#8nEnII&H;|20p{i) z3P~%#3>;wUC6hyW3nIT#lk;i|vcZ|RkO&!^^NtVQ2W(U(KW}m5u)$Kzyd{NbCD%Fc zL?XmLc_)Ql)iMQn%OaO$$}D&FoXUF0PkAed;Ks~5jRIXvzuucO2=qS)hK?bh0R;auU+`tXnYpz0T^X2| zdmUL^3uS(QD4rDcfkaVMiE^k!!J^!kv_#PbfFABqxxDQp`{T?t3_~fhIJXRb`=;w| zk=(9f69LEne2pp*d5xB_# z$f|pYJPTKG-i^SP^`V!)Nib@izFr>`LwYuM(=(DrO4Q>=MbBo{vx4+&_N%^3dg|z> z`wRWSSOu`+Kx#?DN!>KOoY8QrYBKD|$iT0HQtKDQ$S-}oK4=tKJ++(F zyo^M@6bu!=O!Wu2{-5fPxrO|~{vQZzRu5vNr?=M!#gLvsJ?KfPoe`<5 zkVvna$aj5@4u8jYRivjPxk){L)b%8?j$C9+hhf6=e(MHf)*1bVK`Ovt{B4=oSb(wk z+c8%-CXN6m>k7ok6-8bj6hca#KCqH=RLRrblsr9ROV3J3-UA1g_dS*OfI60peqhwa zj=TdoVaI{x4IC~`*fG#`!j3U%N8VUqvQ9vZoKWKRK_O)Hg$Gu$S(RLLxChCyTsYyvw)ka5&=|LoKkt^@BnSh&IA)Z+zo>@Wi z7LDIQ@;Ka#XR0vV{Al1x934iGdLIT`R9wK)qGQ@wS~al@>z0pjfxrmPwr4p}jX#PSt%Y~x(uB<#M8q63PLWX?b zU)UGR^vVc&UFMh#fl_b|UtUQPMA z1JJ~N*~?({CocCVY3fOs0F((oL8AuDA|d5i3)GM?ZU8tb<2BD4*uB)kzFck)mkYSu zG3127go#FmhLB@}nN(Ny?BO^F9C4UGqPTBi_=rJp)+a9lgLf3#4ZJ&4Jedy*bGWsI zn-+}oyy0S)c&8$B6=DVUT*~~yAR7fEr4=ZSVCSK)PcZ^z(RHJNL}nq!NLeAriqV;}r+;5efR> z3~qwp-<^>PNBv-M{_G%faWFC+MAAXdpM&tapdd87Z!mLLP?`?<eY_W1EHaQ*i3RUzA{L{h(l|d+fQIL!7WFqyN9T`OET82nJsqgf0#SU@t3# z?(nmqpeyK0eWqYh5ZT$Sk2XOMNK?-mxGU(L4oaJ$udWF4yWGA3ovt73@&~z1LBZ^x zABh^ZC>WN;&NnMGx^FP{qF{Lb!_a+3^bH2V_0WhuLBrypU3zXs{%+`hBe4Ii`MWd4 zgl?H46dGQNopfBcR!S}oHi<6m?vP}pyZ0D3AeB1%AKPv>$^G=%U}xK+MaBV z;%&_f;r{kzaNG5q_!`o4t5@GU>(Qjdkgba~k2c zV>BL2X!hzmJ6oFJ65b`g6n;>^3;5lVY^VpTVzC9wm&`qR;fYIPF>h|B_*|&LGI+!Q zRV2YT9bRlrMu9Y{!*c;%eQSNHE#BUkV9m)i=xRkDbY|KEZi5GB#yUH&wAWg{F_EgqqVrn7 zlvtda2fYlQ>_~5n)ss8A>QCrw#^%+>6WGaJ(4ed9JHfx{SbgTKA#)Z7Dd5s2U2Q0_ zwI#VGwmJb%J2WJ~+;mG@f~-PsQG0i;Zco8O7!W+EL}LpCOeZxTe6*+AkY*3k|P(1vww6k$s^Mm!9o*t&XXCH6Kyla&l!=bbMR7E18(xoJb~8EpZ_0Q}NZaH%y;8e(L1t_~z*N zruxo}$@uD2d$PT&b9`5FJ;)!Qu5V~fbize2FTQ3xRw@xsx2MKKq++Mh3-Q+a&eeJu zpI{l^6mN29iNVe^niuPAoZH^k0S-G`0^gg9E~hA_sKq{rZB8vc37V-R)f{U~bjDMj z^uZ}!XBR)*0bu}mB9SDAz}_zO*<>@caceA&T4GKwq|l}=jSpiqZR8^Obc(bdG#2-p zW%!VZ*SWDXooHJ)&lCT9v9`|U6Y7&*Q)@f)6!f{oSgHeJ89Ns?AB1JxOM*iIftPaCM`aR_#`smiPFr2AmtTmD3wnsa~Ibb^}6+`G;0|D+G zj%BK}kUAYa85F~yri=y2s)ZTA|O;`Zy@kRL+W>j)`Vs zvrsrvH-bQg3c+w(N0m#|H^Mj@rwX@C5e3|z8X6e^h>Tvr_2q|>GkXCTUs^OLVR)LbvDP^m>Kdq zKdP3dT$oI(XGz?o-CKzspQF(dYm60w&V@szo=t(t!3otAHRwysij7^|Z!x@6>nOar z+Ux=vwjnB@LK5KnZ$)(9Y$(o%o7X?#el!j_K zO*W)x=GNNU62m9n(8=@AP3V&LE=U~GXCWY=ui*2h-n{h5IH>`5wbVn0Xymj9u6E`e zXrG696DKG-pnBkT$S$x)$g!H84pJY7D8u+@T{Dr|6x$A_ff%3=+~i-#E8J&!R)o?L z$!6%R)XNs*%uA|@lR*k39Yz}=SS0M^WQt}C3=Id0aIH57uhAHkct{L}c=^hi#hPpf+J} zP`V@rPGHbVoSPT%gd1llF&G$h^rKF|10jWio=(X!OwFE7gZW=(YJ^FhrT{vaWQH+_ zTbvMJh+qJumO&qZIUj`6ISH7Jw!=cF1)5gJRdJezVC=l~V-FxBxK4m-)QxJ=^u z>NB-#J!o18Ng7E}rF3UZJiPqsHsi^LeH^AvFmU4h4--jyV`D6_4gi|T(OiIHDN}rK9N}hXE-mG!vVxkZ;`Wc&y{gF z#?D8JCbJ&F&Yj{p0gV;72uevja%I-V2j$_yvu&}DHfhNT5fwP2k|i6yo$v$AW4us})JxjkNqb&I36L|eRL zqXaQ8FF3R^i5yjU+Mi&#m&vz!HYI~i&75H%Oq}R7ws+C=lg5z7`gA?@n8lolTVSCt zenSgs4(P=iIoVQ6v6cRME&~cI06x0hb;Vh#?KKw?bSrQ`# z5)Cwes)bS#^saP!3OB(W-GYPUaAu_XPVKRYKO%SIer4pdMi7Fhx^$kRJdDywPF@ z-ph*zwy_WVHG*R-;(_-fAzmjq{H#U?#uVbKjhw}TUtr{{6dYp~5BLd{j8aFYEz7tq1(< z9`N-&;OF;%e;RPKQ|;5cBz6e?2qs-P^yZqc2wo*ktoS2>-%3xgX8C_8cq!cip2eRN z{IY`X@?RDFeF+Jbk9iF3JX=D7@){Jyd&ChxOFFLdv)Eax>PYeHvbi-cu&N&`tc_?;&Zm5LWWp{d_p{osD)t#Qv zot)mCoYtL$HIegEMdH-j zfq+RaZ&A=y*u2UL!+m_*0HiCK^(|4jzRO%Zv&%lbpq4iaJntH%D z2#)m{4*yl}PQ$N${$UUJiw=(Ung{>!c*~LRw)+5Nf&(w3-&Fo_4vwd@r2b0`u6C{x z+_uXm!`}w7@VLU^cm4c`!|&SjjDx%Wf7akQU&Q102B-TC0e{or+U_41yn>{_9d}qE zIPhyY{MY(c3vT^(Ru6cWgQKc>@E?y$1jjG8UB2w_yMB1i!BNg)X_prbu6Dj9IDWbE z;r2f|(0-Jo?J`Vod)&Oe%GJhb@<)-KIh=BKVNd>xc+?0 z!Cik2ka?c1Z*33wDhGG{*($iL?{Q_{ z=QP1>eU~`6>(5ghIj%n&9o+TjHb;(I--mj@f8^kvT+2Y3Cs&ynN$^QR8(`tw6ajw^qhjN8@^a~$0D zXPw}-zUv)+SN?4dj&g7vg~yi-uKs+e2l+oY{OZr&JN&Lc2g!QL)@!1JyZ)RhIM&Pc zXRU*~{%m*Txb?lc2mEUe?)vjlN4^`MuR8p$e0+}%9#}7wbC>vYh{4sL;{>t$(&Ejmqs|a>(9x8+xo6_ z_+9z@cf+#&{HFNxYKI@?t3P-4Apcv2|57&F`;o)%`cpT!Y<%{YtsKN%e-1IYxXT-7 zaGiHeGPusWjx~6N*tyW);{;z}@X3P53_eTnq`~J2-evH`f?r_plLg;u@G}Iz&fsSW zezU54`y@tVmwFe(o#>4t^p(DqYzo7^G3I})n zxx<~sSdyE&t`|;wdZ^Xcl+;U zjvUvY*E#rbuuJWH*pcJP|9ubm#}4lLvsm`^Y<;H)j`elrw>mh=`Gfd#ox#=4Ej`G; z!NDgu^?KgH-F=lnHrUnww?P>^$^=LIUH{K>@F-kUds>VfZO2Uxzbof@hu>|ln+>k{ zcDKPb-+tZTns2{l@CvXMj~pqe{x6kz%-A0AWd{FH_M_GtyhP+&DmePB3jV8qZtsEr zCq3Z5b#RP_x8Xk??+A|a-G16%_J6frYR^i+k>73iHisYO^SeqsZ@t0Qe*UWppX|T8 z9r;m^qx`>d2&zrcstkN8gHL6 zxTH1j8iPx>@^%W2dM7%5c--MfKWKg5=>ad0eR=JV+U^4cxAm%V_+9yJ4vu~shXUb9 z8(jT%aS!ruG5p%Ezvl3}{rV+`-?ism2Y3DdvBA~<1^6r;9B4N3tN%+4uKph;xb^=+ zhu^hlLl5{B4(|559gcjr-#zB=yYglE>tR}uR0L=6+$w#-ej9va7kNS2MeBh$h6cP? zfer~1;@5M$fV%L&VM0U@J(fOMzN895a4f(>_0E+2l-UetaGjUWGx)Kn2#yo@E5m=1 ztd~wU_>(g4S!wXQ1aC0-0;xoY!O>nk*7H|J?>gBxxzpg)Lf>z2T_-$d@IPZC!|^14 zW#r!|f%v?^18Lab8~kR$-!u3G-M13|ssH~fG{5~M+b#>lKSvt=>!kzm%j>fIf%t8{ z;l~)oW2wQP5;-x0@059YtHJRFuXt=U_;u1S+YNr1)OVM`H;SFR4gRdi;g{uQ>-7s( z>+LoCZwmg5!TE*B+21wP&x57Iy>9rIh#&awgO z1J#RvD*%sKQg6kN7yg9?zgg@%#o!N!KjQ{pDR_s$`OP@+LKlNK1#Hi)245@qJqABb z{Ps#qgqk78>ex9^rg~30P zIIlK%Li~BO!CNFw&M^3qXaF3m4gOt*y)J{RofjE=g82U`gMVH8zr)~n;s6K7od%yR z_1bH2epx=;Cu4Bk$JuXi_1hl}u73NA!8MQNiCx+*UzRv8HTd_W{4j&_8~)%aeuFd#t(Yk#RXxVCT7;M%_D8k}Fg;dxsOzC_~cI)ndS@LLS7cHV7pZTE)_uI;|h z;M(p#F}Sw7{w}8e|Frn|PlkVi;@`&JwL5ozDq2CozO#~Zv=;`3C4 zUnq7q8eGRU%};92Ymx^x8~(jw&o+Z|Z-F-q8(iDv3kKKtdBosjMep|wu6}>l;LT_- z93jaoYQNrRSYq()B7d;K|5N5UV+?*Hi}$7)9RIcs9&-);zT~kwgO3(^mBD9AJDzQD zjg$2TZx+3m82m)3*EI%zK;mzw!5gH$UpDwMp&vB3w&T+VAIom=o;P@>_~A8!tDN@@ zuJI6vUD}TLigi5t82m~pKhEGE2|mN%Pl$gO82mlqKiS}U66a?byjJSfW^k?7IR<}R zaqjN{)o{GUe#IDT&M9nybZHh6`|f6L(S%J`_a za;n~&1TPZ5Dz5vm0}QVI8EJ5h^GOEZBYvwf_)B8n=?4EVsc)0Phl+nX4X*ZFU~qbs zIr!}ggLjIYn+(2P{PsnIe_rsf8(i!AZG-E4@`nc3ap75mUnb+=s|GKS_W8xpuIso<46f_A zYYeXA-A;q+I&QbYbshJx!F3(?gu!(k_cMd*I_}Q~*L9pP@vDB&b)4>FDX#0dA%&`j$3YUUB|68xUS==W;D{@XSxYlc>!3RiwXfZhc5fnVu8~pP!KfKi7gTz1A8GNGDcbCC+p10fJ znr|OAxQ_dUQa|1>F7f$OgYT94zG!fj^QOVy5jlF_ zh5Bue^rIrVuK3v!Cj$(w@<$n5`_UAGYd@N6aP3D+4PGGiI@929h(Gl{3bk{GjF%S~ ze%(L0+Tgl>a*MY~whJUT_?=`sIzxa&7)o*_?xbBC1XmH&RDH1(u zkN$pNZg9Q7eT2bP?<9ktCiR+Q@PXpbI)l#;|DR#-$94t!T%uZg1rV`B=$dJ@Vi9*uMPf;#Nq1(4+Q_K!RLtHe5tp#*9+3$ z`x*R9ku%)jTP2@PF!;mLA7>d{>!tUfs9v@I6vMCejT>C+)nRb8|9pebkodXW;DPu- z=hteF+IgGdS3B=DxZ3%M!PU<18~l8+=jR63c6r(0=Zl?h8C>i8vB6)KcIhqoUhDN^ ziK_ty|Ea|DNQ0~WlMJqQ&M~+?cX5Kjmy7(<4UT`j3=h3ON9|O9rVYQ^bD_c2o~sQ0 zA_|1#CWF5w_S|9c_r;$346b?~H8{RI7>^$rT>jc3f(3wKHaLjfYl)<8!unY&5vq zf0@DWllpEqxb~M_2ESJ1>-}BoH|@U<8U7QbzIzR>dH5NFYrp=r!8IOUH~5dmp1&IW zX6e8Aa#MxcsrkIW!8QIX46gA%(cr~WuQ>*vBYFM=gWoImoNjP!-)4hr`=$-9?RcTV z)jwAme1VK#HyK=?qqxK1+E4E@_?Ys z_orz)PR0{BiVUv5)07+hv(g_&82m};zY`6v?NVd#&r7^5Hn@bJ*I@8zQeVA)PwhW} z&G$AK{ylf34Xy%G->7(60z zexy)0D+T|J!Sy+lHw->q_&+juf%v~j?pM@y zDG_|2!Ak`nZSZQrry6{!;QU91viC>L7XL3b{JNe@8eCp;;+<>oA4*(ZZt&9uzro<} z*GK61g2A5={;vv-=83C_|6#+g&$aGz_~n%NpECTNBL8`ZU+?9_0(vJohJSO}j4StQtpJecNgulk%`(@l*V(_bEezMZwXUe*GwZV&} z|8`ki^3_EK?-adv8eE^#zTe=BB_BR!@UMw~o;0|=59WD;Z>83S=j#oQ?}fqRJ%e8$ zc#hndtL^m@nI{}(@Mp#Uha0?9>_5`rpA!408$2fdTww4`B7dpDOJrTT#^8@iJ8m%e z9l(?N|@c)!{KgrCfeyTR+EU3M8<>$Th9x}W@z!Iz6Ydky}C z;LjNRVd*cwHn_&s>jn>toqsj>gA(WY@Mk6Q(Dt1p?c2}bx{o=`;D3l4;wBs^|UqXra&oKN^@k7$!#bW0L2G`%EZZdd6#?9RZe^K(oe;Ite*!i--^}TEK zP#jpSasHmfZMob?qj($D%JZfhe2mz0tl&su6YBfY)*Jr!Mb3o|Kc;?t9$=T@|Dwdh zmmGeC^!;rw82%R}&R;jU>V4mlgL)$(KNJN54z2IA(q2VTf-}zz>AvtX!IfX{tc>F}fc zJtF6E!#`K@#*Z9+l&|kE3=IPU4y~`sFA^NZqWpVA{*i`X?{}H(@P~k3-<#NM_*MQ| zhactd68W19|D7^kT;lMDfM4fb4;X%x|80jK=_Q%GdW|K4th- z{<98$82IbN{+A7ZyNrXcJNzhL-^V$$0th&4{2VE``lm+ZPci&4nK#xr{3u_KcEhiE z<9vf_y|y@VuwJ7@uY?iVDL>JW3K1H_KFIQZHWK%sF4%JHEtUXuKnc_gKIy%&ET3JzGHCB zOD`E*^I?wEL+#N#tnYnPT=Rde;n#6T^MUf~c(=vy>o~6OB~pH!SLpjr6xaETSJ}C- z4gO{re5X_Vy;{%Um7(>OX?U5sSBdY+_bMCUUG$Zyb|&a5y;Yt6PC+G~*Eckz66=5s z3kyVl-V2LnF?ex&0>t7=+3{ugdWta9@CR?&@J|?2!YfD5Wf-XWy?dSOE&pY4-< zbNqP<%gVIbD;Gx0KZs*)bB{i<@8n{5ZuO4?3}xE#Q7OM)H}0@798vnrepJIL%EWka z4=q2>T+sZgyhp={wF$2^$|B_23gzT)%R2+$9Qa?umouL=oA`7CGQffU!#1-1!@Ou^ z0_44W41R)NjAJbCD&VmgmizBx@sr=}!Dswwc~<~@Ap0NuI`daaVYDBop4R@gfLWPX zWXxRr^t@J?hcop_-d4D9ApNh1ex2u`eq0(@{pSIO`qfT2rQbc7otaPdDx#hhVF5#5ggt?b5 z<)hi6bf*4O_z5^cnYR3BDgTO5Xv=>G${wiwK6gKB(0LrTAI@{MyylMs>Bf=~3~V^| vqi{IzXHxwA!R literal 0 HcmV?d00001 diff --git a/omc/plat/isdn/src/.copyarea.db b/omc/plat/isdn/src/.copyarea.db new file mode 100644 index 0000000..2b7d5de --- /dev/null +++ b/omc/plat/isdn/src/.copyarea.db @@ -0,0 +1,12 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\isdn\src +2 +8 +a:isdn_msg.c|1|11d70a4812c|15495|d5960b7|198230587faf11dd8601001c23e19543|0 +c:isdn_debug.c|1|11d70a48071|82b4|7e0a05de|5a7649929a8611dd8b36001c23e19543|0 +9:isdn_rm.c|1|11d70a4815b|3c8b|80917848|1a1230707faf11dd8601001c23e19543|0 +a:isdn_fsm.c|1|11d70a480af|141ee|fc89331e|b79480e9a3cb11dd8e69001c23e19543|0 +7:include|2|0|0|0|71e472a76cf311dd91c7001c23e19543|0 +a:isdn_uif.c|1|11d70a4818a|40ce|b90eb9a0|f20486a66cf311dd91a5001c23e19543|0 +8:Makefile|1|11d70a48013|32f|573eea1a|f2a486be6cf311dd91a5001c23e19543|0 +9:isdn_ie.c|1|11d70a480de|9b7a|b4e1c4e1|198230407faf11dd8601001c23e19543|0 diff --git a/omc/plat/isdn/src/Makefile b/omc/plat/isdn/src/Makefile new file mode 100644 index 0000000..ae09f91 --- /dev/null +++ b/omc/plat/isdn/src/Makefile @@ -0,0 +1,35 @@ +#Create by Chen Gengxin +#2008-03-03 +#WXC2 R9.0 ISDN makefile + +CC = gcc +CFLAG = -g -Wall -c #-fprofile-arcs -ftest-coverage + +ISDN_LIB_OBJ = isdn_msg.o isdn_fsm.o isdn_uif.o isdn_rm.o isdn_ie.o isdn_debug.o + +all: $(ISDN_LIB_OBJ) +# ar -r libfsm.a $(ISDN_LIB_OBJ) + +#test_sdl: $(ISDN_LIB_OBJ) +# $(cc) -o $@ $< ../kernel/sched.o +isdn_msg.o: isdn_msg.c ./include/isdn_msg.h ./include/isdn_ext.h ./include/isdn_const.h + $(CC) $(CFLAG) $< + +isdn_fsm.o: isdn_fsm.c + $(CC) $(CFLAG) $< + +isdn_uif.o: isdn_uif.c ./include/isdn_if.h + $(CC) $(CFLAG) $< + +isdn_rm.o: isdn_rm.c ./include/isdn_rm.h + $(CC) $(CFLAG) $< + +isdn_ie.o: isdn_ie.c ./include/isdn_ie.h + $(CC) $(CFLAG) $< + +isdn_debug.o: isdn_debug.c + $(CC) $(CFLAG) $< + +clean: + rm -f main *.o *.a *.xml *.gcov *.gcda *.gcno test_sdl core + diff --git a/omc/plat/isdn/src/include/.copyarea.db b/omc/plat/isdn/src/include/.copyarea.db new file mode 100644 index 0000000..a01bbf7 --- /dev/null +++ b/omc/plat/isdn/src/include/.copyarea.db @@ -0,0 +1,13 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\isdn\src\include +2 +9 +9:isdn_ie.h|1|11d70a482b3|3a8f|91b37b51|1a1230887faf11dd8601001c23e19543|0 +c:isdn_debug.h|1|11d70a48245|738|b005fcf9|f2a486ee6cf311dd91a5001c23e19543|0 +c:isdn_const.h|1|11d70a48216|2634|d6a2e7c4|f2a486d66cf311dd91a5001c23e19543|0 +d:isdn_public.h|1|11d70a4837e|3c8|5a81eac|f474877e6cf311dd91a5001c23e19543|0 +a:isdn_inc.h|1|11d70a48310|38c|2455f480|f3d4874e6cf311dd91a5001c23e19543|0 +a:isdn_ext.h|1|11d70a48284|4d6|23607792|f34487066cf311dd91a5001c23e19543|0 +9:isdn_if.h|1|11d70a482e1|165d|31bc6c0e|f34487366cf311dd91a5001c23e19543|0 +a:isdn_msg.h|1|11d70a4834f|1e66|d2e1b4da|f3d487666cf311dd91a5001c23e19543|0 +9:isdn_rm.h|1|11d70a483ad|eaf|6da83cb0|f47487966cf311dd91a5001c23e19543|0 diff --git a/omc/plat/isdn/src/include/isdn_const.h b/omc/plat/isdn/src/include/isdn_const.h new file mode 100644 index 0000000..d5b91db --- /dev/null +++ b/omc/plat/isdn/src/include/isdn_const.h @@ -0,0 +1,275 @@ +/*********************************************************** +Copyright (C), LGC Wireless. +File Name: isdn_const.h +Description: ISDN const define +Version: v9.0.0 +Author: Gengxin Chen +Create Date: 2008-1-24 +History: + + +************************************************************/ + +#ifndef _ISDN_CONST_H +#define _ISDN_CONST_H + +//#define PROTO_ISDN 3 + +//user - network interface +#define NETWORK_SIDE 0 +#define USER_SIDE 1 + +#define ISDN_IP_PORT 4958 //4951 4953 + +//NFAS +#define NFAS_DISABLE 0x00 +#define NFAS_ENABLE 0x01 + +//priority +#define REATTEMPT 0x00 +#define DISCARD 0x01 + +//run_mode +#define ISDN_SINGLE_MODE 0x00 /* Single Plat */ +#define ISDN_DUAL_MODE 0x01 /* Dual Plat */ + +//call state +#define IDLE_FLAG 0x00 +#define CALLIN_FLAG 0x01 +#define CALLOUT_FLAG 0x02 +//timer_flag +#define DC_M_FLAG 0x04 +#define BC_M_FLAG 0x08 + +//ansi isdn maintenance state +//D-channel state +#define DS_MOOS 0x00 //In Service +#define DS_IS 0x01 //Maintenance Busy +#define DS_OOS 0x02 //Out Of Service +#define DS_STBY 0x04 //Standby +#define DS_WAIT 0x08 //Wait +#define DS_MB 0x10 //Manual Out Of Service +#define DS_INB 0x12 //Installation Busy +//B-channel state +#define IN_SERVICE 0x00 +#define MAINTENANCE_SERVICE 0x01 +#define OUT_OF_SERVICE 0x02 +//iua link state +#define LK_OOS 0x00 +#define LK_IS 0x01 + +/************************************************************ +ISDN message type +************************************************************/ +#define PROTOCOL_ISDN_LINK_MNG 0xFE +#define PROTOCOL_DISCR 0x08 //Q.931 Protocol discriminator +//Call establishment message +#define MSG_ALERT 0x01 //Alerting +#define MSG_CALL_PROC 0x02 //Call Proceeding +#define MSG_CONN 0x07 //Connect +#define MSG_CONNACK 0x0F //Connect Acknowledge +#define MSG_PROG 0x03 //Progress +#define MSG_SETUP 0x05 //Setup +#define MSG_SETUP_ACK 0x0D //Setup Acknowledge +//Call clearing message +#define MSG_DISC 0x45 //Disconnect +#define MSG_REL 0x4D //Release +#define MSG_REL_COMP 0x5A //Release Complete +#define MSG_RESTART 0x46 //Restart +#define MSG_REST_ACK 0x4E //Restart Acknowledge +//Miscellaneous message +#define MSG_INFORMATION 0x7B //Information +#define MSG_NOTI 0x6E //Notify +#define MSG_STATUS 0x7D //Status +#define MSG_STAT_ENQ 0x75 //Status Enquiry +#define MSG_FAC 0x62 //Facility (connectionless) + +//Maintenance message +#define M_PROTOCOL_DISCR 0x43 //Maintenance messages Protocol discriminator +#define MSG_SERVICE 0x0F //Service +#define MSG_SERVICE_ACK 0x07 //Service Acknowledge + + +/************************************************************ +ISDN information element identifier coding +************************************************************/ +//Single octet information elements +#define IE_SHIFT 0x01 //Shift +#define IE_MORE_DATA 0xA0 //More data +#define IE_SD_COMP 0xA1 //Send Complete +#define IE_RPT_IND 0xD2 //Repeat indicator +//Variable length information element +#define IE_BR_CAP 0x04 //Bearer capability +#define IE_CAUSE 0x08 //Cause +#define IE_CALL_ID 0x10 //Call identifier +#define IE_CALL_STAT 0x14 //Call state +#define IE_CHNL_ID 0x18 //Channel identification +#define IE_PRG_IND 0x1E //Progress indicator +#define IE_NT_SP_FAC 0x20 //Network-specific facilities +#define IE_NOTIFY_IND 0x27 //Notification indicator +#define IE_DISP 0x28 //Display +#define IE_DT_TIME 0x29 //Date/time +#define IE_KPD_FAC 0x2C //Keypad facility +#define IE_SIGN 0x34 //Signal +#define IE_CG_PTY_NUM 0x6C //Calling party number +#define IE_CG_PTY_ADDR 0x6D //Calling party subaddress +#define IE_CD_PTY_NUM 0x70 //Called party number +#define IE_CD_PTY_ADDR 0x71 //Called party subaddress +#define IE_TRAN_NT_SEL 0x78 //Transit network selection +#define IE_RESTART_IND 0x79 //Restart indicator +#define IE_LL_COMP 0x7C //Low layer compatibility +#define IE_HL_COMP 0x7D //High layer compatibility +#define IE_USR_USR 0x7E //User-user +//ansi +#define IE_CHG_STAT 0x01 //Change status +#define IE_FAC 0x1C //Facility +//#define IE_INFO_REQ 0x32 //Information request +//#define IE_ORG_CG_NUM 0x73 //Original called number +#define IE_REDIR_NUM 0x74 //Redirection number +//QSIG +#define IE_CONN_NUM 0x4C //Connected number +//Codeset 6 information element identifiers TO-DO + + +/************************************************************ +ISDN states exist in the user-network interface +************************************************************/ +#define NULL_STATE 0x00 +#define CALL_INIT_STATE 0x01 +#define OVERLAP_SD_STATE 0x02 +#define OUT_CALL_PROC_STATE 0x03 +#define CALL_DV_STATE 0x04 +#define CALL_PRE_STATE 0x06 +#define CALL_RV_STATE 0x07 +#define CONN_REQ_STATE 0x08 +#define IN_CALL_PROC_STATE 0x09 +#define ACTIVE_STATE 0x0A +#define DISC_REQ_STATE 0x0B +#define DISC_IND_STATE 0x0C +#define REL_REQ_STATE 0x13 +#define OVERLAP_RV_STATE 0x19 + +#define GLOBAL_NULL_STATE 0x00 +#define GLOBAL_RESTART_REQ_STATE 0x3D +#define GLOBAL_RESTART_STATE 0x3E +//ansi +#define SERVICE_IDLE 0x00 +#define WAIT_SERVICE_ACK 0x01 +#define RSP_SERVICE 0x02 + + + + +/************************************************************ +ISDN Event/Primitive Definition +************************************************************/ +//Primitive +#define ISDN_SETUP_REQ 0x11 +#define ISDN_SETUP_IND 0x21 +#define ISDN_SETUP_RSP 0x31 +#define ISDN_SETUP_CNF 0x41 + +#define ISDN_DISCONNECT_REQ 0x12 +#define ISDN_DISCONNECT_IND 0x22 +#define ISDN_RELEASE_REQ 0x32 +#define ISDN_RELEASE_IND 0x42 +#define ISDN_RELEASE_CNF 0x52 +#define ISDN_REJECT_REQ 0x62 + +#define ISDN_ALERT_REQ 0x13 +#define ISDN_ALERT_IND 0x23 +#define ISDN_INFO_REQ 0x33 +#define ISDN_INFO_IND 0x43 +#define ISDN_PROG_REQ 0x53 +#define ISDN_PROG_IND 0x63 +#define ISDN_SUSPEND_REQ 0x73 +#define ISDN_SUSPEND_IND 0x83 +#define ISDN_RESUME_REQ 0x93 +#define ISDN_RESUME_IND 0xa3 + +#define ISDN_PROC_REQ 0x14 +#define ISDN_PROC_IND 0x24 +#define ISDN_MORE_INFO_REQ 0x34 +#define ISDN_MORE_INFO_IND 0x44 +#define ISDN_NOTI_REQ 0x54 +#define ISDN_NOTI_IND 0x64 +#define ISDN_STAT_IND 0x74 +#define ISDN_SETUP_COMP_REQ 0x84 +#define ISDN_SETUP_COMP_IND 0x84 + +#define ISDN_TIMEOUT_IND 0x15 +#define ISDN_RESTART_REQ 0x25 +#define ISDN_M_RESTART_REQ 0x35 +#define ISDN_RESTART_CNF 0x45 +#define ISDN_REATTEMPT_IND 0x55 +//ansi +#define ISDN_SERVICE_REQ 0x16 +#define ISDN_SERVICE_IND 0x26 +#define ISDN_SERVICE_CNF 0x36 +#define ISDN_SERVICE_RSP 0x46 +#define ISDN_SER_TIMEOUT_IND 0x56 + + + +/************************************************************ +ISDN Cause Definition +************************************************************/ +#define CAUSE_UNASSIGNED 0x01 //unassigned (unallocated) number +#define CAUSE_NOROUTE_NET 0x02 //no route to specified transit network +#define CAUSE_NOROUTE_DES 0x03 //no route to destination +#define CAUSE_NORMAL 0x10 //normal call clearing +#define CAUSE_INVALID_NUM 0x1C //invalid number format(imcomplete number) +#define CAUSE_STAT_ENQ 0x1E //response to status enquiry +#define CAUSE_TEMP_FAIL 0X29 //temporary failure +#define CAUSE_INVALID_CR 0x51 //invalid call reference value +#define CAUSE_CALLID_INUSE 0x54 //call identity in use +#define CAUSE_M_IE_MISS 0x60 //mandatory information element is missing +#define CAUSE_MSG_NONEXI 0x61 //message type non-existent or not implemented +#define CAUSE_MSG_NOTCOMP_NOTIMPL 0x62 //message not compatible with call state or message type non-existent or not implemented +#define CAUSE_IE_NONEXI 0x63 //information element non-existent or not implemented +#define CAUSE_IE_INVALID 0x64 //invalid information element contents +#define CAUSE_MSG_NOTCOMP 0x65 //message not compatible with call state +#define CAUSE_TIMER_EXPIRY 0x66 //recovery on timer expiry + + +/************************************************************ +ISDN Timer Definition (Time Unit = 1s) +************************************************************/ +#define ISDN_T301 180 /* 180S */ +#define ISDN_T302 15 /* 15S */ +#define ISDN_T303 4 /* 4S */ +#define ISDN_T304 20 /* 20S */ +#define ISDN_T305 30 /* 30S */ +#define ISDN_T306 30 /* 30S */ +#define ISDN_T307 180 /* 180S */ +#define ISDN_T308 4 /* 4S */ +#define ISDN_T309 6 /* 6S*/ +#define ISDN_T310 10 /* 10S */ +#define ISDN_T312 6 /*T303+2S*/ +#define ISDN_T313 4 /* 4S */ +#define ISDN_T316 120 /* 120S */ +#define ISDN_T317 10 /* + +************************************************************/ +#ifndef _ISDN_DEBUG_H +#define _ISDN_DEBUG_H + +#include "isdn_rm.h" +#include "../../../pal/pal.h" +//#include "../../../debug/src/include/debug.h" + +/*Color Set */ +#define COL_WHITE 37 +#define COL_RED 31 +#define COL_YELLOW 33 +#define COL_GREEN 32 +#define COL_BLUE 34 +#define COL_BROWN 35 +#define COL_MEGEN 36 +#define COL_GRAY 38 +#define COL_HI_WHI 58 +#define COL_HI_RED 39 +#define COL_HI_YEL 52 +#define COL_HI_GRE 51 +#define COL_HI_BLU 53 +#define COL_HI_BRO 54 +#define COL_HI_MEG 55 +#define COL_BLACK 30 + +#define COL_ESC '\033' + +typedef struct _isdn_msg_csta //call statistics +{ + //receive and send + u32 rv_setup; + u32 sd_setup; + u32 rv_setupAck; + u32 sd_setupAck; + u32 rv_callProc; + u32 sd_callProc; + u32 rv_alert; + u32 sd_alert; + u32 rv_conn; + u32 sd_conn; + u32 rv_connAck; + u32 sd_connAck; + u32 rv_disc; + u32 sd_disc; + u32 rv_rel; + u32 sd_rel; + u32 rv_relComp; + u32 sd_relComp; + //redirect + u32 rd_setup; + u32 rd_setupAck; + u32 rd_callProc; + u32 rd_alert; + u32 rd_conn; + u32 rd_connAck; + u32 rd_disc; + u32 rd_rel; + u32 rd_relComp; +}ISDN_Msg_Csta; + + +int isdn_debug_init(void); +void isdn_debug_timer(void); +void isdn_log_err(u32 pid,const char *fmt, ...); +void isdn_trace_func(u32 pid,const char *fmt, ...); +void monitor_isdn_msg(u32 pid,u8 *head,IuaMsgStr *msg,u8 col); +void monitor_isdn_port(u32 call_ref,u32 port); +void isdn_msg_csta(u8 msgtype,u8 flag); + +#endif diff --git a/omc/plat/isdn/src/include/isdn_ext.h b/omc/plat/isdn/src/include/isdn_ext.h new file mode 100644 index 0000000..2cf6657 --- /dev/null +++ b/omc/plat/isdn/src/include/isdn_ext.h @@ -0,0 +1,33 @@ +/*********************************************************** +File Name: isdn_ext.h +Description: Public variant definition of ISDN module +Version: v9.0.0 +Author: Gengxin Chen +Create Date: 2008-2-28 +************************************************************/ +#ifndef _ISDN_EXT_H +#define _ISDN_EXT_H + +#include "isdn_if.h" + +/************************************************************ +ISDN +************************************************************/ + + +IsdnMsgStr isdn_sd_msg, isdn_rv_msg; + +extern int isdn_init(u8 systemID, u32 interval_ms); +extern void isdn_timer(); +/*extern int isdn_bind_sap(ISDN_Sap_Attrib_ *attrib_p); +extern int isdn_modify_sap(u8 sap_id, ISDN_Sap_Attrib_ *attrib_ptr); +extern int isdn_unbind_sap(u8 sap_id); +extern int isdn_add_cg(u8 sap_id, Cg_Attrib_struct *attrib_ptr); +extern int isdn_modify_cg(u16 cg_id, Cg_Attrib_struct *attrib_ptr); +extern int isdn_remove_cg(u16 cg_id); +extern int isdn_add_circuit(u16 cg_id, Circuit_Attrib_struct *attrib_ptr); +extern int isdn_modify_circuit(u16 cg_id, u16 circuit_id, Circuit_Attrib_struct *attrib_ptr); +extern int isdn_remove_circuit(u16 cg_id, u16 circuit_id);*/ +extern int isdn_set_run_mode (u8 run_mode, u32 alter_ip); + +#endif diff --git a/omc/plat/isdn/src/include/isdn_ie.h b/omc/plat/isdn/src/include/isdn_ie.h new file mode 100644 index 0000000..0b0d95b --- /dev/null +++ b/omc/plat/isdn/src/include/isdn_ie.h @@ -0,0 +1,491 @@ +/*********************************************************** +Copyright (C), LGC Wireless. +File Name: isdn_ie.h +Description: ISDN information elements structure +Version: v9.0.0 +Author: Gengxin Chen +Create Date: 2008-1-17 +Remark: M:mandatory, O:optional +History: + + +************************************************************/ +#ifndef _ISDN_IE_H +#define _ISDN_IE_H + +#include "isdn_public.h" + + +/************************************************************ +ISDN information elements structure +************************************************************/ + +typedef struct _brCap_b4 //Bearer capability octets 4 +{ + u8 tran_mode; //Transfer mode M + u8 tran_rate; //Information transfer rate M + u8 rate_mul; //Rate multiplier O +}brCap_b4; +typedef struct _brCap_b5 //Bearer capability octets 5 +{ + u8 usr_layer1; //User information layer 1 protocol + u8 has_ext_a; // + u8 syn_asy; //Synch/asynch (0/1) + u8 neg; //Negot + u8 usr_rate; //User rate + u8 has_ext_b; // + u8 inter_rate; //Intermediate rate + u8 nic_tx; //NIC on Tx + u8 nic_rx; //NIC on Rx + u8 ctl_tx; //Flow control on Tx + u8 ctl_rx; //Flow control on Rx +// u8 ext_b; // + u8 hdr; //Hdr/no Hdr + u8 mul_fra; //Multiframe; + u8 mode; //Mode + u8 lli_neg; //LLI negot. + u8 assign; //Assignor/ee + u8 inband; //In-band neg. + u8 has_ext_c; // + u8 stop_bit; //Number of stop bits + u8 data_bit; //Number of data bits + u8 par; //Parity + u8 has_ext_d; + u8 du_mode; //Duplex Mode + u8 mod_type; //Modem type +}brCap_b5; +typedef struct _brCap_b7 //Bearer capability octets 7 +{ + u8 usr_layer3; //User information layer 3 protocol + u8 has_ext_a; // + u8 layer3_a; //Additional layer 3 protocol information (most significant bits) + u8 has_ext_b; // + u8 layer3_b; //Additional layer 3 protocol information (most significant bits) +}brCap_b7; +typedef struct _brCap //Bearer capability +{/*¿ÉÄܵðÑÿ¸ö¿ÉÑ¡°Ë±ÈÌØ·Åµ½Ò»¸ö½á¹¹ÌåÖУ¬¶øÒ»¸ö°Ë±ÈÌØ×éÐèÒªÔÚÁíÍâµÄµØ·½´¦Àí³ÉÒ»¸öÊý×é*/ + u8 pres; //element header + u32 ext_flag; //extension domain flag M + u8 code_stan; //Coding standard (00) M + u8 tran_cap; //Information transfer capability M + brCap_b4 b4; //octets 4 + brCap_b5 b5; //octets 5 group + u8 usr_layer2; //User information layer 2 protocol + u8 usr_layer3; //User information layer 3 protocol +// brCap_b7 b7; //octets 7 +}BrCap; + +typedef struct _callId //Call identity +{ + u8 pres; //element header + u8 call_id_len; + u8 call_id[8]; //Call identity(IA5) +}CallId; + +typedef struct _callStat //Call state +{ + u8 pres; //element header + u8 code_stan; //Coding standard + u8 stat_val; //Call state value/global interface state value(state value is coded in binary) +}CallStat; + +typedef struct _cdPtyNum //Called party number +{ + u8 pres; //element header + u8 num_type; //Type of number + u8 num_plan_id; //Numbering plan identification + u8 num_digit_len; + u8 num_digit[32]; //Number digits(IA5) +}CdPtyNum; + +typedef struct _cdPtyAddr //Called party subaddress +{ + u8 pres; //element header + u8 addr_type; //Type of subaddress + u8 odd_even; //Odd/even indicator + u8 addr_info_len; + u8 addr_info[20]; //Subaddress information +}CdPtyAddr; + +typedef struct _cgPtyNum_b3 +{ + u8 num_type; //Type of number + u8 num_plan_id; //Numbering plan identification + u8 has_ext_a; // + u8 pres_ind; //Presentation indicator + u8 screen_ind; //Screening indicator +}cgPtyNum_b3; +typedef struct _cgPtyNum //Calling party number +{ + u8 pres; //element header + u32 ext_flag; //extension domain flag M + cgPtyNum_b3 b3; + u8 num_digit_len; + u8 num_digit[32]; //Number digits(IA5) +}CgPtyNum, ConnNum; + +typedef struct _cgPtyAddr //Calling party subaddress +{ + u8 pres; //element header + u8 addr_type; //Type of subaddress + u8 odd_even; //Odd/even indicator + u8 addr_info_len; + u8 addr_info[20]; //subaddress information +}CgPtyAddr; + +typedef struct _cause_b3 +{ + u8 code_stan; //Coding standard + u8 loc; //Location + u8 has_ext_a; // + u8 rec; //Recommendation +}cause_b3; +typedef struct _cause_b5 //diagnostic +{ + u8 attrib_num; //attribute number +// u8 has_ext_a; + u8 rej_attrib; //rejected attribute + u8 has_ext_b; + u8 avail_attrib; //available attribute + //Call rejected diagnostic for cause number 21 TODO +}cause_b5; +typedef struct _causeStr //Cause +{ + u8 pres; //element header + u32 ext_flag; // + cause_b3 b3; //octet 3 + u8 cause_val; //Cause value + u8 dia_num; + cause_b5 dia[8]; //diagnostic +}CauseStr; + +typedef struct _chnlId_b3 //Channel identification octets 3 +{ + u8 int_id_pre; //Interface identifier present M + u8 int_type; //Interface type M + u8 pref_excl; //Preferable/Exclusive M + u8 chnl_ind; //D-channel indicator M + u8 info_chnl_sel; //Infomation channel selection M + + u8 int_id; //Interface identifier; + + u8 has_chnl; // 1:wiith 3.2 and 3.3, 0:without 3.2 nor 3.3 + u8 code_stan; //Coding standard + u8 num_map; //Number/Map + u8 chnl_type; //Channel type/Map element type + u8 chnl_num; //Channel number/Slot map ect +}chnlId_b3; +typedef struct _chnlId //Channel identification +{ + u8 pres; //element header + chnlId_b3 b3; //octets 3 +}ChnlId; + +typedef struct _conLev //Congestion level +{ + u8 pres; //element header + u8 con_lev; //Congestion level +}ConLev; + +typedef struct _dtTime //Date/time +{ + u8 pres; //element header + u8 ext_flag; + u8 year; + u8 month; + u8 day; //M + u8 hour; //O + u8 minute; // O + u8 second; //O +}DtTime; + +typedef struct _disp //Display +{ + u8 pres; //element header + u8 disp_info_len; + u8 disp_info[18]; //Display information(IA5) + + //ansi + u8 asso_info; //Associated information + u8 disp_type; //display type +}Disp; + +typedef struct _hLComp_b4 //High layer compatibility octets 4 +{ + u8 hl_ch_id; //High layer characteristies identification + u8 ex_hl_ch_id; //Extended high layer characteristics identification + u8 ex_vid_ch_id; //EXtended videotelephony characteristics identification +}hLComp_b4; +typedef struct _hLComp //High layer compatibility +{ + u8 pres; //element header + u8 code_stan; //Coding standard + u8 intpr; //Interpretation + u8 pre_meth; //Presentation method of protocol profile + hLComp_b4 b4; //octets 4 +}HLComp; + +typedef struct _kpdFac //Keypad facility +{ + u8 pres; //element header + u8 keyfac_info_len; + u8 key_fac_info[32];//Keypad facility information(IA5) +}KpdFac; + +typedef struct _lLComp_b3 //Low layer compatibility octets 3 +{ + u8 code_stan; //Coding standard M + u8 tran_cap; //Information transfer capability M + u8 has_ext_a; + u8 neg_ind; //Negot indicator O +}lLComp_b3; +typedef struct _lLComp_b4 //Low layer compatibility octets 4 +{ + u8 tran_mode; //Transfer mode + u8 tran_rate; //Information transfer rate + u8 rate_mul; //Rate multiplier +}lLComp_b4; +typedef struct _lLComp_b5 //Low layer compatibility octets 5 +{ + u8 layer1_id; //Layer 1 identifier + u8 usr_layer1; //User information layer 1 protocol + u8 has_ext_a; // + u8 syn_asy; //Synch./asynch. + u8 neg; //Negot. + u8 usr_rate; //User Rate + u8 has_ext_b; // + u8 inter_rate; //intermediate rate + u8 nic_tx; //NIC on Tx + u8 nic_rx; //NIC on Rx + u8 ctl_tx; //Flow control on Tx + u8 ctl_rx; //Flow control on Rx +// u8 ext_b; // + u8 hdr; //Hdr/no Hdr + u8 mul_fra; //Multiframe; + u8 mode; //Mode + u8 lli_neg; //LLI negot. + u8 assign; //Assignor/ee + u8 inband; //In-band negot. + u8 has_ext_c; // + u8 stop_bit; //Number of stop bits + u8 data_bit; //Number of data bits + u8 par; //Parity + u8 has_ext_d; + u8 du_mode; //Duplex Mode + u8 mod_type; //Modem type +}lLComp_b5; +typedef struct _lLComp_b6 //Low layer compatibility octets 6 +{ + u8 layer2_id; //layer 2 identifier + u8 usr_layer2; //User information layer 2 protocol + u8 mode; //Mode + u8 q933_use; //Q.933 use + u8 usr_layer2_info; //User specification layer 2 protocol information + u8 win_size; //Window size(k) +}lLComp_b6; +typedef struct _lLComp_b7 //Low layer compatibility octets 7 +{ + u8 layer3_id; //layer 3 identifier + u8 usr_layer3; //User information layer 3 protocol + + u8 usr_layer3_info; //Optional layer 3 protocol information + u8 mode; //Mode + u8 def_pac_size; //Default packet size + u8 pac_win_size; //Packet window size + u8 layer3_a; //Additional layer 3 protocol information (most significant bits) + u8 layer3_b; //Additional layer 3 protocol information (most significant bits) +}lLComp_b7; +typedef struct _lLComp //Low layer compatibility +{ + u8 pres; //element header + u32 ext_flag; + lLComp_b3 b3; //octets 3 M + lLComp_b4 b4; //octets 4 O + lLComp_b5 b5; //octets 5 + lLComp_b6 b6; //octets 6 + lLComp_b7 b7; //octets 7 + + //ansi TODO +}LLComp; + +typedef struct _ntSpFac_b3 //Network-specific facilities octets 3 +{ + u8 len_net_id; //Length of network identification M //²»Îª0Ôòº¬ÓÐÏÂÃæÁ½¸ö±ÈÌØ×é + u8 net_id_type; //Type of network identification O + u8 net_id_plan; //Network identification plan + u8 net_id; //Network identification(IA5) ect +}ntSpFac_b3; +typedef struct _ntSpFac //Network-specific facilities +{ + u8 pres; //element header + ntSpFac_b3 b3; //octets 3 M + + u8 spec; //Network-specific facility specification M + //ansi + u8 fac_val; //Facility coding value + u8 ser_par; //Service parameters +}NtSpFac; + +typedef struct _notifyInd //Notification indicator +{ + u8 pres; //element header + u8 notify_descr; //Notification description + //ansi TODO +}NotifyInd; + +typedef struct _prgInd //Progress indicator +{ + u8 pres; //element header + u8 code_stan; //Coding standard + u8 loc; //Location + u8 prg_descr; //Progress description +}PrgInd; + +typedef struct _rptInd //Repeat indicator +{ + u8 pres; //element header +// u8 rpt_ind; //Repeat indication +}RptInd; + +typedef struct _restartInd //Restart indicator +{ + u8 pres; //element header + u8 clas; //class +}RestartInd; + +typedef struct _segMsg //Segmented message +{ + u8 pres; //element header + u8 seg_ind; //First segment indicator + u8 other_num; //Number of segments remaining + u8 seg_type; //Segmented message type +}SegMsg; + +typedef struct _sdComp //Sending complete +{ + u8 pres; //element header +// u8 sd_comp; //sending complete ³£Á¿ +}SdComp; + +typedef struct _sign //Signal +{ + u8 pres; //element header + u8 sign_val; //Signal value +}Sign; + +typedef struct _tranNtSel //Transit network selection +{ + u8 pres; //element header + u8 net_id_type; //Type of network identification + u8 net_id_plan; //Network identification plan + u8 net_id; //Network identification(IA5) ect +}TranNtSel; + +typedef struct _usrUsr //User-user +{ + u8 pres; //element header + u8 pro_discr; //Protocol discriminator + u8 usr_info_len; + u8 usr_info[258]; //User information +}UsrUsr; + + +//supplementary services ansi +typedef struct _fac //facility +{ + +}Fac; +/* the same to the CgPtyNum +typedef struct _connNum //connected number +{ +}ConnNum;*/ + +typedef struct _redirNum_b3 //redirection number octet 3 +{ + u8 num_type; //Type of number + u8 num_plan_id; //Numbering plan identification + + u8 org_num_stat; //Origin of number and presentation status + + u8 redir_rs; //Reason for redirection +}redirNum_b3; +typedef struct _redirNum //redirection number +{ + u8 pres; //element header + redirNum_b3 b3; //octet 3 + u8 num_digit_len; + u8 num_digit[32]; //Number digits(IA5) +}RedirNum; + +typedef struct _chgStat //change status +{ + u8 pres; //element header + u8 pref; //Preference + u8 new_stat; //New status +}ChgStat; + + +/************************************************************ +ISDN information elements functions interface +************************************************************/ +u8 itu_encode_br_cap(u8 *dst, BrCap *src); +int itu_decode_br_cap(BrCap *dst, u8 *src, u8 len); +u8 isdn_encode_br_cap(u8 *dst, BrCap *src); +int isdn_decode_br_cap(BrCap *dst, u8 *src, u8 len); +u8 isdn_encode_cause(u8 *dst, CauseStr *src); +int isdn_decode_cause(CauseStr *dst, u8 *src, u8 len); +u8 isdn_encode_call_id(u8 *dst, CallId *src); +int isdn_decode_call_id(CallId *dst, u8 *src, u8 len); +u8 isdn_encode_call_stat(u8 *dst, CallStat *src); +int isdn_decode_call_stat(CallStat *dst, u8 *src, u8 len); +u8 qsig_encode_chnl_id(u8 *dst, ChnlId *src); +int qsig_decode_chnl_id(ChnlId *dst, u8 *src, u8 len); +u8 isdn_encode_chnl_id(u8 *dst, ChnlId *src); +int isdn_decode_chnl_id(ChnlId *dst, u8 *src, u8 len); +u8 isdn_encode_prg_ind(u8 *dst, PrgInd *src); +int isdn_decode_prg_ind(PrgInd *dst, u8 *src, u8 len); +u8 ansi_encode_ntsp_fac(u8 *dst, NtSpFac *src); +int ansi_decode_ntsp_fac(NtSpFac *dst, u8 *src, u8 len); +u8 isdn_encode_ntsp_fac(u8 *dst, NtSpFac *src); +int isdn_decode_ntsp_fac(NtSpFac *dst, u8 *src, u8 len); +u8 ansi_encode_notify_ind(u8 *dst, NotifyInd *src); +int ansi_decode_notify_ind(NotifyInd *dst, u8 *src, u8 len); +u8 isdn_encode_notify_ind(u8 *dst, NotifyInd *src); +int isdn_decode_notify_ind(NotifyInd *dst, u8 *src, u8 len); +u8 isdn_encode_disp(u8 *dst, Disp *src); +int isdn_decode_disp(Disp *dst, u8 *src, u8 len); +u8 isdn_encode_dt_time(u8 *dst, DtTime *src); +int isdn_decode_dt_time(DtTime *dst, u8 *src, u8 len); +u8 isdn_encode_kpd_fac(u8 *dst, KpdFac *src); +int isdn_decode_kpd_fac(KpdFac *dst, u8 *src, u8 len); +u8 isdn_encode_sign(u8 *dst, Sign *src); +int isdn_decode_sign(Sign *dst, u8 *src, u8 len); +u8 isdn_encode_cg_num(u8 *dst, CgPtyNum *src); +int isdn_decode_cg_num(CgPtyNum *dst, u8 *src, u8 len); +u8 isdn_encode_cg_addr(u8 *dst, CgPtyAddr *src); +int isdn_decode_cg_addr(CgPtyAddr *dst, u8 *src, u8 len); +u8 isdn_encode_cd_num(u8 *dst, CdPtyNum *src); +int isdn_decode_cd_num(CdPtyNum *dst, u8 *src, u8 len); +u8 isdn_encode_cd_addr(u8 *dst, CdPtyAddr *src); +int isdn_decode_cd_addr(CdPtyAddr *dst, u8 *src, u8 len); +u8 isdn_encode_tran_sel(u8 *dst, TranNtSel *src); +int isdn_decode_tran_sel(TranNtSel *dst, u8 *src, u8 len); +u8 isdn_encode_restart_ind(u8 *dst, RestartInd *src); +int isdn_decode_restart_ind(RestartInd *dst, u8 *src, u8 len); +u8 isdn_encode_ll_comp(u8 *dst, LLComp *src); +int isdn_decode_ll_comp(LLComp *dst, u8 *src, u8 len); +u8 isdn_encode_hl_comp(u8 *dst, HLComp *src); +int isdn_decode_hl_comp(HLComp *dst, u8 *src, u8 len); +u8 isdn_encode_usr_usr(u8 *dst, UsrUsr *src); +int isdn_decode_usr_usr(UsrUsr *dst, u8 *src, u8 len); +//ansi +u8 ansi_encode_chg_stat(u8 *dst, ChgStat *src); +int ansi_decode_chg_stat(ChgStat *dst, u8 *src, u8 len); +u8 ansi_encode_redir_num(u8 *dst, RedirNum *src); +int ansi_decode_redir_num(RedirNum *dst, u8 *src, u8 len); +//QSIG +u8 qsig_encode_conn_num(u8 *dst, ConnNum *src); +int qsig_decode_conn_num(ConnNum *dst, u8 *src, u8 len); + + +#endif diff --git a/omc/plat/isdn/src/include/isdn_if.h b/omc/plat/isdn/src/include/isdn_if.h new file mode 100644 index 0000000..df37e5e --- /dev/null +++ b/omc/plat/isdn/src/include/isdn_if.h @@ -0,0 +1,119 @@ +/*********************************************************** +Copyright (C), LGC Wireless. +File Name: isdn_if.h +Description: ISDN interface declaration for wxc2main +Version: v9.0.0 +Author: Gengxin Chen +Create Date: 2008-1-17 +History: + + +************************************************************/ +#ifndef _ISDN_IF_H +#define _ISDN_IF_H + +#include "isdn_msg.h" +#include "isdn_inc.h" + + +/************************************************************ +ISDN Module parameter structure +************************************************************/ + +//Send to upper layer primitives, save data to structure +typedef int f_isdn_setup_ind(Pst *pst, IsdnSetup *ptr); //Setup indication +typedef int f_isdn_setup_cnf(Pst *pst, IsdnConn *ptr); //Setup confirm +typedef int f_isdn_proc_ind(Pst *pst, IsdnCallProc *ptr); //Proceeding indication +typedef int f_isdn_alert_ind(Pst *pst, IsdnAlert *ptr); //Alerting indication +typedef int f_isdn_disc_ind(Pst *pst, IsdnDisc *ptr); //Disconnect indication +typedef int f_isdn_rel_ind(Pst *pst, IsdnRel *ptr); //Release indication +typedef int f_isdn_rel_cnf(Pst *pst, IsdnRelComp *ptr); //Release confirm +typedef int f_isdn_rel_cnf_err(Pst *pst, IsdnRelComp *ptr); //Release confirm error +typedef int f_isdn_prog_ind(Pst *pst, IsdnProg *ptr); //Progress indication +typedef int f_isdn_info_ind(Pst *pst, IsdnInfo *ptr); //Info indication +typedef int f_isdn_minfo_ind(Pst *pst, IsdnSetupAck *ptr); //More info indication //IsdnSetupAck »ò IsdnInfo +typedef int f_isdn_noti_ind(Pst *pst, IsdnNoti *ptr); //Notify indication +typedef int f_isdn_stat_ind(Pst *pst, IsdnStatus *ptr); //Status indication +typedef int f_isdn_stat_ind_err(Pst *pst, IsdnStatus *ptr); //Status indication(error) +typedef int f_isdn_resu_ind(Pst *pst, IsdnResuRejReq *ptr); //Resume indication +typedef int f_isdn_rej_ind(Pst *pst, IsdnResuRejReq *ptr); //Reject indication +typedef int f_Isdn_susp_ind(Pst *pst, IsdnSusp *ptr); //Suspend indication +typedef int f_isdn_restart_req(Pst *pst, IsdnRestart *ptr); //Restart request +typedef int f_isdn_rest_cnf(Pst *pst, IsdnRestAck *ptr); //Restart confirm +typedef int f_isdn_timeout_ind(Pst *pst); //TIMEOUT +typedef int f_isdn_reattempt_ind(Pst *pst); //REATTEMPT +//ansi +typedef int f_isdn_service_ind(Pst *pst, IsdnService *ptr); //Service +typedef int f_isdn_service_cnf(Pst *pst, IsdnServAck *ptr); //Service Ack +typedef int f_isdn_ser_timeout_ind(Pst *pst); //Service TIMEOUT + +typedef struct _isdn_eventhandle_struct +{ + f_isdn_setup_ind *h_isdn_setup_ind; + f_isdn_setup_cnf *h_isdn_setup_cnf; + f_isdn_proc_ind *h_isdn_proc_ind; + f_isdn_alert_ind *h_isdn_alert_ind; + f_isdn_disc_ind *h_isdn_disc_ind; + f_isdn_rel_ind *h_isdn_rel_ind; + f_isdn_rel_cnf *h_isdn_rel_cnf; + f_isdn_rel_cnf_err *h_isdn_rel_cnf_err; + f_isdn_prog_ind *h_isdn_prog_ind; + f_isdn_info_ind *h_isdn_info_ind; + f_isdn_minfo_ind *h_isdn_minfo_ind; + f_isdn_noti_ind *h_isdn_noti_ind; + f_isdn_stat_ind *h_isdn_stat_ind; + f_isdn_stat_ind_err *h_isdn_stat_ind_err; + f_isdn_resu_ind *h_isdn_resu_ind; + f_isdn_rej_ind *h_isdn_rej_ind; +// f_isdn_susp_ind *h_isdn_susp_ind; + f_isdn_restart_req *h_isdn_restart_req; + f_isdn_rest_cnf *h_isdn_rest_cnf; + f_isdn_timeout_ind *h_isdn_timeout_ind; + f_isdn_reattempt_ind *h_isdn_reattempt_ind; + + //ansi + f_isdn_service_ind *h_isdn_service_ind; + f_isdn_service_cnf *h_isdn_service_cnf; + f_isdn_ser_timeout_ind *h_isdn_ser_timeout_ind; + +}ISDN_EventHandle_struct; + +typedef struct _isdn_sap_attrib_ +{ + ISDN_EventHandle_struct event_handle; +}ISDN_Sap_Attrib_; + + + +/************************************************************ +ISDN Module interface +************************************************************/ + +//Receive upper layer interface primitives +extern int isdn_setup_req(Pst *pst, IsdnSetup *ptr); //Setup request +extern int isdn_setup_resp(Pst *pst, IsdnConn *ptr); //Setup response +//extern int isdn_setup_comp_req(Pst *pst, IsdnConnAck *ptr); //Setup complete request +extern int isdn_call_proc_req(Pst *pst, IsdnCallProc *ptr); //Proceeding request +extern int isdn_alert_req(Pst *pst, IsdnAlert *ptr); //Alerting request +extern int isdn_disc_req(Pst *pst, IsdnDisc *ptr); //Disconnect request +extern int isdn_rel_req(Pst *pst, IsdnRel *ptr); //Release request +extern int isdn_rej_req(Pst *pst, IsdnRelComp *ptr); //Reject request +extern int isdn_prog_req(Pst *pst, IsdnProg *ptr); //Progress request +extern int isdn_info_req(Pst *pst, IsdnInfo *ptr); //Infomation request +extern int isdn_m_info_req(Pst *pst, IsdnSetupAck *ptr); //More Infomation request //IsdnSetupAck »ò IsdnInfo +extern int isdn_noti_req(Pst *pst, IsdnNoti *ptr); //Notify request +extern int isdn_rej_req(Pst *pst, IsdnRelComp *ptr); //Reject request +extern int isdn_resu_resp(Pst *pst, IsdnResuResp *ptr); //Resume response +extern int isdn_resu_rej_req(Pst *pst, IsdnResuRejReq *ptr); //Resume reject request +extern int isdn_susp_resp(Pst *pst, IsdnSusp *ptr); //Suspend response +extern int isdn_susp_rej_req(Pst *pst, IsdnSuspRejReq *ptr); //Suspend reject request +extern int isdn_restart_req(Pst *pst, IsdnRestart *ptr); //Restart request +extern int isdn_m_restart_req(Pst *pst, IsdnRestart *ptr); //Management restart request +extern int isdn_restart_cnf(Pst *pst, IsdnRestAck *ptr); //Restart confirm +extern int isdn_timeout(Pst *pst); //Time out +//ansi +extern int isdn_service_bc_req(Pst *pst, IsdnService *ptr); //maintenance B-channel SERVICE request +extern int isdn_service_bc_rsp(Pst *pst, IsdnServAck *ptr); //maintenance B-channel SERVICE response + + +#endif diff --git a/omc/plat/isdn/src/include/isdn_inc.h b/omc/plat/isdn/src/include/isdn_inc.h new file mode 100644 index 0000000..eb98034 --- /dev/null +++ b/omc/plat/isdn/src/include/isdn_inc.h @@ -0,0 +1,27 @@ +/*********************************************************** +File Name: isdn_inc.h +Description: Public variant definition of ISDN module +Version: v9.0.0 +Author: Gengxin Chen +Create Date: 2008-2-28 +************************************************************/ +#ifndef _ISDN_INC_H +#define _ISDN_INC_H + +#include +#include "../../../public/src/include/license_id.h" +#include "../../../m2ua/src/include/m2ua.h" +//#include "../../../public/src/include/proto_pub.h" +#include "../../../iptrans/src/include/iptrans.h" +#include "../../../debug/src/include/debug.h" +#include "../../../pal/pal.h" +//#include "../../../../mss/msc/mng/param.h" + +/************************************************************ +ISDN +************************************************************/ + +extern int wxc2_get_license(int functionID); +extern int put_xua_msg(xua_up_msg_t *data_ptr); + +#endif diff --git a/omc/plat/isdn/src/include/isdn_msg.h b/omc/plat/isdn/src/include/isdn_msg.h new file mode 100644 index 0000000..52eec37 --- /dev/null +++ b/omc/plat/isdn/src/include/isdn_msg.h @@ -0,0 +1,333 @@ +/*********************************************************** +Copyright (C), LGC Wireless. +File Name: isdn_msg.h +Description: ISDN message structure or correlation +Version: v9.0.0 +Author: Gengxin Chen +Create Date: 2008-1-17 +Remark: M:mandatory, O:optional +History: + + +************************************************************/ +#ifndef _ISDN_MSG_H +#define _ISDN_MSG_H + +#include "isdn_const.h" +#include "isdn_ie.h" + + +/************************************************************ +ISDN mandatory information elements structure +************************************************************/ +typedef struct _msgMan //Message mandatory information elements +{ + u8 proto_Discr; //Protocol discriminator + u8 cr_len; //Length of call reference value(in octets) + u8 call_ref[2]; //Call reference value + u8 msg_type; //Message type +}MsgMan; + + +/************************************************************ +ISDN message structure +************************************************************/ + +typedef struct _isdnAlert //ALERTING +{ + ChnlId chnl_id; //Channel identification O/M + PrgInd prg_ind; //Progress indicator O + + BrCap br_cap; //Bearer capability O + Disp disp; //Display + Sign sign; //Signal + HLComp hl_comp; //High layer compatibility + + //ansi + Fac facility; //facility +}IsdnAlert; + +typedef struct _isdnCallProc //CALL PROCEEDING +{ + ChnlId chnl_id; //Channel identification O/M + + BrCap br_cap; //Bearer capability O + PrgInd prg_ind; //Progress indicator + Disp disp; //Display + HLComp hl_comp; //High layer compatibility +}IsdnCallProc; + +typedef struct _isdnConn //CONNECT +{ + ChnlId chnl_id; //Channel identification O/M + + BrCap br_cap; //Bearer capability O + PrgInd prg_ind; //Progress indicator + Disp disp; //Display + DtTime dt_time; //Date/time + Sign sign; //Signal + LLComp ll_comp; //Low layer compatibility + HLComp hl_comp; //High layer compatibility + //QSIG + ConnNum conn_num; //Connected number + //Connected subaddress +}IsdnConn; + +typedef struct _isdnConnAck //CONNECT ACKNOWLEDGE +{ + Disp disp; //Display O + Sign sign; //Signal +}IsdnConnAck; + +typedef struct _isdnDisc //DISCONNECT +{ + CauseStr cause; //Cause M + + PrgInd prg_ind; //Progress indicator O + Disp disp; //Display + Sign sign; //Signal +}IsdnDisc; + +typedef struct _isdnInfo //INFORMATION +{ + SdComp sd_comp; //Sending complete O + Disp disp; //Display + KpdFac kpd_fac; //Keypad facility + Sign sign; //Signal + CdPtyNum cd_pty_num; //Called party number +}IsdnInfo; + +typedef struct _isdnNoti //NOTIFY +{ + NotifyInd notify_ind; //Notification indicator M + Disp disp; //Display O + + BrCap br_cap; //Bearer capability O +}IsdnNoti; + +typedef struct _isdnProg //PROGRESS +{ + PrgInd prg_ind; //Progress indicator M + + BrCap br_cap; //Bearer capability O + CauseStr cause; //Cause O + Disp disp; //Display + HLComp hl_comp; //High layer compatibility + + //ansi + Fac facility; //facility +}IsdnProg; + +typedef struct _isdnRel //RELEASE +{ + CauseStr cause; //Cause O + + Disp disp; //Display + Sign sign; //Signal +}IsdnRel, IsdnRelComp; + +/*typedef struct _isdnRelComp //RELEASE COMPLETE +{ + CauseStr cause; //Cause O + Disp disp; //Display + Sign sign; //Signal +}IsdnRelComp; +*/ +typedef struct _isdnRestart //Restart +{ + ChnlId chnl_id; //Channel identification O + RestartInd restart_ind; //Restart indicator M + + Disp disp; //Display +}IsdnRestart, IsdnRestAck; + +typedef struct _isdnSetup //SETUP +{ + BrCap br_cap; //Bearer capability M + ChnlId chnl_id; //Channel identification O/M + PrgInd prg_ind; //Progress indicator + NtSpFac nt_sp_fac; //Network specific facilities + Disp disp; //Display + CgPtyNum cg_pty_num; //Calling party number + CdPtyNum cd_pty_num; //Called party number + TranNtSel tran_nt_sel; //Transit network selection + + SdComp sd_comp; //Sending complete O + RptInd rpt_ind; //Repeat indicator O + DtTime dt_time; //Date/time + KpdFac kpd_fac; //Keypad facility + Sign sign; //Signal + CgPtyAddr cg_pty_addr; //Calling party subaddress + CdPtyAddr cd_pty_addr; //Called party subaddress + LLComp ll_comp; //Low layer compatibility + HLComp hl_comp; //High layer compatibility + + //ansi + Fac facility; //facility + RedirNum redir_num; //Redirection number +// OrgCdNum org_cd_num; //original called number +}IsdnSetup; + +typedef struct _isdnSetupAck //SETUP ACKNOWLEDGE +{ + ChnlId chnl_id; //Channel identification O + PrgInd prg_ind; //Progress indicator + Disp disp; //Display + Sign sign; //Signal +}IsdnSetupAck; + +typedef struct _isdnStatus //STATUS +{ + CauseStr cause; //Cause M + CallStat call_stat; //Call state M + + Disp disp; //Display O +}IsdnStatus; + +typedef struct _isdnStatEnq //STATUS ENQUIRY +{ + Disp disp; //Display O +}IsdnStatEnq; + +typedef struct _isdnResuResp +{ + +}IsdnResuResp; + +typedef struct _isdnResuRejReq +{ + +}IsdnResuRejReq; + +typedef struct _isdnSusp +{ + +}IsdnSusp; + +typedef struct _isdnSuspRejReq +{ + +}IsdnSuspRejReq; + +typedef struct _isdnTimeout +{ + +}IsdnTimeout; + + +//ansi +typedef struct _isdnService //Service +{ + ChgStat chg_stat; //change status M + ChnlId chnl_id; //channel identification M +}IsdnService, IsdnServAck; + +typedef struct _isdnFac //Facility +{ + +}IsdnFac; + + + + +typedef struct _isdnMsgStr +{ + MsgMan msg_m; + + union + { + /*******Call establishment messages*******/ + IsdnAlert alert; //alerting + IsdnCallProc callProc; //Call proceeding + IsdnConn conn; //Connect + IsdnConnAck connAck; //Connect acknowledge + IsdnProg prog; //progress + IsdnSetup setup; //setup + IsdnSetupAck setupAck; //Setup acknowledge + + /*******Call information phase messages:*******/ + IsdnResuRejReq resuRejReq; //resume reject require + + /*******Call clearing messages:*******/ + IsdnDisc disc; //disconnect + IsdnRel rel; //release + IsdnRelComp relComp; //release complete + IsdnRestart restart; //restart + IsdnRestAck restAck; //restart Acknowledge + + /*******Miscellaneous messages:*******/ + IsdnInfo info; // + IsdnNoti noti; // + IsdnStatus status; // + IsdnStatEnq statEnq; // + + /*******Maintenance messages*******/ + IsdnService service; //service + IsdnServAck servAck; //service acknowledge + }msg_list; +}IsdnMsgStr; + + +typedef struct _IuaMsgStr +{ + u8 pad[25]; + u8 msg_class; /*xua msg type=0x05*/ + u8 e1_no; /* E1 number */ + u16 msg_length __attribute__((packed)); /* ISDN Message length */ + union + { + struct + { + u8 mtp3_ip; /* reserved */ + u8 opercode; /* 1=Out Of Service 5=In Service 6=Processor Outage*/ + u8 alarmcode; + }lkmsg; + struct + { + MsgMan msg_m; + u8 ie_content[IE_MAX_LEN]; /* information elements Content */ + }isdn_msg; /*isdn message content*/ + }msgcontent; +}IuaMsgStr; + + + +/************************************************************ +ISDN timer structure +************************************************************/ +typedef struct _isdnTimerStr //¼ÆÊý, Óм¸¸öÊ®ºÁÃë +{ + u16 t301; + u16 t302; + u16 t303; + u16 t304; + u16 t305; + u16 t306; + u16 t307; + u16 t308; + u16 t309; + u16 t310; + u16 t312; + u16 t313; + u16 t316; + u16 t317; + u16 t321; + u16 t322; + + u16 t1s; + u16 t40s; + u16 t240s; + //ansi + u16 t3M1; +}IsdnTimerStr; + + +IsdnTimerStr isdn_timer_var; +IuaMsgStr iua_sd_msg, iua_rv_msg; + + + + + + +#endif diff --git a/omc/plat/isdn/src/include/isdn_public.h b/omc/plat/isdn/src/include/isdn_public.h new file mode 100644 index 0000000..806534b --- /dev/null +++ b/omc/plat/isdn/src/include/isdn_public.h @@ -0,0 +1,56 @@ +/*********************************************************** +Copyright (C), LGC Wireless. +File Name: isdn_public.h +Description: Redefine type byname +Version: v9.0.0 +Author: Gengxin Chen +Create Date: 2008-1-18 +History: + + +************************************************************/ + +#ifndef _ISDN_PUBLIC_H_ +#define _ISDN_PUBLIC_H_ + +#include +#include +#include +#include + +#ifndef _T_U8 +#define _T_U8 +typedef unsigned char u8; +#endif + +#ifndef _T_U16 +#define _T_U16 +typedef unsigned short u16; +#endif + +#ifndef _T_U32 +#define _T_U32 +typedef unsigned int u32; +#endif + +#ifndef _T_BYTE +#define _T_BYTE +typedef unsigned char BYTE; +#endif + +#ifndef _T_WORD +#define _T_WORD +typedef unsigned short WORD; +#endif + +#ifndef _T_DWORD +#define _T_DWORD +typedef unsigned int DWORD; +#endif + +#define ISDN_CM_OK 1 //Command request success +#define ISDN_CM_FAILED 0 //Command request failed + +#endif + + diff --git a/omc/plat/isdn/src/include/isdn_rm.h b/omc/plat/isdn/src/include/isdn_rm.h new file mode 100644 index 0000000..61f15aa --- /dev/null +++ b/omc/plat/isdn/src/include/isdn_rm.h @@ -0,0 +1,151 @@ +/*********************************************************** +File Name: isdn_rm.h +Description: ISDN Resource Management declaration +Version: v9.0.0 +Author: Gengxin Chen +Create Date: 2008-1-23 +************************************************************/ +#ifndef _ISDN_RM_H +#define _ISDN_RM_H + +#include "isdn_if.h" +#include "isdn_inc.h" + +/************************************************************ +ISDN Resource structure +************************************************************/ +#define ISDN_MAX_SAP 16 +#define ISDN_MAX_CG 256 +#define ISDN_MAX_CIRCUIT 256 +#define ISDN_MAX_PORT 8192 +#define ISDN_CIRCUIT_CIC 32 +/* +typedef struct _isdn_cg_attrib_ +{ +// u8 variant_type; + u8 priority; //0:reattempt; 1:discard + u8 network_id; //Network identifier + u32 tg_id; +}ISDN_Cg_Attrib_; + +typedef struct _isdn_circuit_attrib_ +{ + u8 plat_id; + u8 cic_range; + u32 head_cic; + u32 circuit_id; +}ISDN_Circuit_Attrib_; + +typedef struct _isdn_sap_struct +{ + u8 enable; + ISDN_Sap_Attrib_ attrib; +}ISDN_Sap_struct; + +typedef struct _isdn_cg_struct +{ + u8 enable; + u8 sap_id; + u8 circuit_num; + u8 circuit_used[ISDN_MAX_CIRCUIT]; + Cg_Attrib_struct attrib; +}ISDN_Cg_struct; + +typedef struct _isdn_circuit_struct +{ + u8 enable; + u16 cg_id; + u8 user_network_if; + u8 interface_id; + u8 restart_clas; //restart indicator class + u8 lk3_status; + u8 lk2_status; + u8 dc_status; //ansi maintenance D-channel status + u8 heartbeat_time; + Circuit_Attrib_struct attrib; +}ISDN_Circuit_struct; +*/ + + +typedef struct _isdn_cic_state_ +{ + u8 call_state; + u8 maintenance_state; //ansi maintenance B-channel state blo_state +}ISDN_CIC_state_; + +typedef struct _isdn_fsm_state_ +{ + int cpc_state; + int m_state; //bls_state and blr_state + +}ISDN_Fsm_state_; + +typedef struct _isdn_link_struct +{ + u8 enable; +// u8 circuit_id; + u8 restart_clas; //restart indicator class + u8 lk3_status; + u8 lk2_status; + u8 dc_status; //ansi maintenance D-channel status + u16 plat_heartbeat_time; //to another plat + u16 link_heartbeat_time; //from iua +}ISDN_Link_struct; + +typedef struct _isdn_port_struct +{ + u8 enable; + + u16 call_ref; + u8 callout_fg; //×î¸ßλ, ±æ±ðÊÇÖ÷½Ð·¢ÆðµÄ»¹ÊDZð½Ð·¢ÆðµÄ + u16 timer_flag; + u32 w_time; + u32 su_proc_id; //for normal call + + u8 pre_send_msg; + u8 msg_cmd; + u8 primitive_cmd; + u8 g_pri_cmd; + u8 timeout_fg; //0:never timeout, 1:once timeout + u32 cic_val; + + ISDN_CIC_state_ cic_state; + ISDN_Fsm_state_ fsm_state; + + int trace_flag; +}ISDN_Port_struct; + +typedef struct _isdn_attrib_struct +{ + u8 systemID; + u8 isdn_run_mode; + u32 isdn_remote_ip; +}ISDN_Attrib_struct; + + +typedef struct _isdn_resource_pond +{ +// ISDN_Sap_struct sap_pond[ISDN_MAX_SAP]; +// ISDN_Cg_struct cg_pond[ISDN_MAX_CG]; +// ISDN_Circuit_struct circuit_pond[ISDN_MAX_CIRCUIT]; + ISDN_Link_struct link_pond[ISDN_MAX_CIRCUIT]; +// u8 e1_start; + ISDN_Port_struct port_pond[ISDN_MAX_PORT]; + ISDN_Attrib_struct attrib; +}ISDN_Resource_Pond; + +ISDN_Resource_Pond isdn_rs; + + + +/************************************************************ +ISDN Resource functions interface +************************************************************/ +u32 find_port_by_callref(u16 cref, u16 circuit_id); +extern int find_port_by_sap(Pst *pst); +extern u32 isdn_assign_port(u16 circuit_id); +extern u32 find_port_by_cic(u32 cic, u16 circuit_id); +extern int find_circuit_by_interfaceId(int cg_id, u8 interface_id); + + +#endif diff --git a/omc/plat/isdn/src/isdn_debug.c b/omc/plat/isdn/src/isdn_debug.c new file mode 100644 index 0000000..eb16750 --- /dev/null +++ b/omc/plat/isdn/src/isdn_debug.c @@ -0,0 +1,1373 @@ +/*********************************************************** +Copyright (C), LGC Wireless. +File Name: isdn_debug.c +Description: ISDN Debug +Version: v9.1.0 +Author: Gengxin Chen +Create Date: 2008-5-27 +History: + + +************************************************************/ + +#include "./include/isdn_debug.h" + +#define DEBUG_ID 24 +#define VER_DEBUG "R9V1_01" +#define IS_PATCH 2 + +//#define PROTO_ISDN 3 +#define PAGE_NUM 5 +#define ISDN_MONITOR_NONE 0x0000 +#define ISDN_MONITOR_ERROR 0x0002 +#define ISDN_MONITOR_MSG 0x0004 +#define ISDN_MONITOR_FUNC 0x0008 +#define ISDN_MONITOR_STATE 0x8000 +#define ISDN_MONITOR_ALL 0x7fff + +static ISDN_Msg_Csta isdn_csta; +static u8 AsciInBuf[4096]; +static u8 AsciOutBuf[4096]; +static u8 AsciTempBuf[4096]; +static u16 MonitorIsdnFg; +static u8 info[4096]; +static int debug_link_id; + +static u8 log_help[] = { + "ISDN Debug Monitor Help:\n\r\ + \n\r\ + 1.[help] display help menu\n\r\ + 2.[log all/none] display all/none logs\n\r\ + 3.[log error on/off] display error logs \n\r\ + 3.[log state on/off] display state logs \n\r\ + 4.[list cg] display all cg (N/A)\n\r\ + 5.[list cg-x] display cg (N/A)\n\r\ + 6.[list circuit-x] display circuit->port (N/A)\n\r\n\r" +}; + + +static u16 disp_page[10]; +static u8 *disp_ptr = (u8 *) disp_page; + +static u32 debug_status_id[20] = +{ + 1,3,6,1,4,1,1373,1,1,2,3,1,2,DEBUG_ID + 2,1 +}; + +static u8 debug_status = 1; + +static u32 debug_name_id[20] = +{ + 1,3,6,1,4,1,1373,1,1,2,3,1,2,DEBUG_ID + 2,2 +}; + +static u32 debug_ascin_id[20] = +{ + 1,3,6,1,4,1,1373,1,1,2,3,1,2,DEBUG_ID + 2,3 +}; + +static u32 debug_ascout_id[20] = +{ + 1,3,6,1,4,1,1373,1,1,2,3,1,2,DEBUG_ID + 2,4 +}; + +static u32 debug_page_title[20] = +{ + 1,3,6,1,4,1,1373,1,1,2,3,1,2,DEBUG_ID + 2,1,1 +}; + +static u32 debug_page_line[20] = +{ + 1,3,6,1,4,1,1373,1,1,2,3,1,2,DEBUG_ID + 2,1,2,1 +}; + +const static u8 BASE_ID_LEN = 15; +const static u8 PAGE_POINT = 14; +const static u8 LINE_POINT = 15; + +static u8 title1_p[] = +{ + " ISDN Page 01 SAP Info\n\r\ + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\ +Subpage\n\r\ +Enable\n\r\ +SystemID\n\r\ +Run mode\n\r\ +Remote IP\n\r" +}; + +static u8 title2_p[] = +{ + " ISDN Page 02 CG Info\n\r\ + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\ +Subpage\n\r\ +Enable\n\r\ +SAP_ID\n\r\ +Circuit_num\n\r\ +Variant\n\r\ +Priority\n\r\ +TG_ID\n\r\ +NFAS\n\r\ +PRI\n\r\ +BACKUP\n\r" +}; + +static u8 title3_p[] = +{ + " ISDN Page 03 Circuit Info\n\r\ + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\ +Subpage\n\r\ +Enable\n\r\ +CG_ID\n\r\ +PLAT_ID\n\r\ +HEAD CIC\n\r\ +CIC RANGE\n\r\ +D-CHANNEL\n\r\ +LINK_ID\n\r\ +LK2_STATUS\n\r\ +LK3_STATUS\n\r\ +DC_STATUS\n\r" +}; + +static u8 title4_p[] = +{ + " ISDN Page 04 Port Info\n\r\ + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\ +Subpage\n\r\ +Enable\n\r\ +Fsm_state\n\r\ +CIC_state\n\r\ +SU_port\n\r\ +Timer_F\n\r\ +Time_W\n\r" +}; + +static u8 title5_p[] = +{ + " ISDN Page 05 Csta Info\n\r\ + 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15\n\r\ +RV-SD-SETUP\n\r\ +RV-SD-SETUPACK\n\r\ +RV-SD-CALLPROC\n\r\ +RV-SD-ALERT\n\r\ +RV-SD-CONN\n\r\ +RV-SD-CONNACK\n\r\ +RV-SD-DISC\n\r\ +RV-SD-REL\n\r\ +RV-SD-RELCOMP\n\r\ +RD-SETUP\n\r\ +RD-SETUPACK\n\r\ +RD-CALLPROC\n\r\ +RD-ALERT\n\r\ +RD-CONN\n\r\ +RD-CONNACK\n\r\ +RD-DISC\n\r\ +RD-REL\n\r\ +RD-RELCOMP\n\r" +}; + + +static void debug_setcol(int color); +static void debug_cancelcol(); + +static void isdn_asciout_proc(const char *fmt, ...) +{ + va_list ap; + char buf[4096]; + + va_start(ap, fmt); + vsprintf(buf, fmt, ap); + if((strlen(AsciOutBuf) + strlen(buf)) < 4096) + strcat(AsciOutBuf, buf); + else + strcpy(AsciOutBuf, buf); + va_end(ap); +} + +static void list_sap(u8 sap_id) +{ + const pal_sap_struct *sap_ptr = pal_sap_ptr(sap_id); + if(sap_ptr == NULL) + { + printf("list sap err!sap_id = %d, can't find sap_ptr!\n", sap_id); + return; + } + + if(sap_id >= ISDN_MAX_SAP) + return; + sprintf(info,"\r\n\ + #ISDN SAP Info\r\n\ + Enable=%d\r\n\ + SystemID(%d)\r\n\ + Run mode(%d)\r\n\ + Remote IP(%lx)\r\n\ + ------------------\r\n", + sap_ptr->enable, + isdn_rs.attrib.systemID, + isdn_rs.attrib.isdn_run_mode, + isdn_rs.attrib.isdn_remote_ip); + isdn_asciout_proc(info); +} + +static void list_cg(u16 cg_id) +{ + const pal_cg_struct *cg_ptr = pal_cg_ptr(cg_id); + if(cg_ptr == NULL) + { + printf("list cg err!cg_id = %d, can't find cg_ptr!\n", cg_id); + return; + } + if(cg_ptr->attrib.protocol != PROTO_ISDN) + return; + + if(cg_id >= ISDN_MAX_CG) + return; + sprintf(info,"\r\n\ + #ISDN CG- %d Info\r\n\ + enable:%d\r\n\ + sap_id:%d\r\n\ + circuit_num:%d\r\n\ + Attrib-->\r\n\ + variant_type(%d)\r\n\ + priority(%d)\r\n\ + tg_id(%ld)\r\n\ + NFAS(%d)\r\n\ + pri_link(%ld)\r\n\ + backup_link(%ld)\r\n\ + ---------------------\r\n", + cg_id, + cg_ptr->enable, + cg_ptr->sap_id, + cg_ptr->circuit_num, + cg_ptr->attrib.variant, + cg_ptr->attrib.priority, + cg_ptr->attrib.tg_id, + cg_ptr->attrib.nfas.flag, + cg_ptr->attrib.nfas.prim_link, + cg_ptr->attrib.nfas.backup_link + ); + isdn_asciout_proc(info); +} +static void list_all_cg(void) +{ + int i; + const pal_cg_struct *cg_ptr = NULL; + + isdn_asciout_proc("CgId\tSapId\tCircirtNum\tVariant\tPrior\tTgId\tNFAS\tPRI\tBackUp\r\n"); + for(i = 0; i < ISDN_MAX_CG; i++) + { + cg_ptr = pal_cg_ptr(i); + if(cg_ptr == NULL) + continue; + if(cg_ptr->attrib.protocol != PROTO_ISDN) + continue; + + if(cg_ptr->enable == 0) + continue; + sprintf(info,"%d\t%d\t%d\t\t%d\t%d\t%ld\t%d\t%ld\t%ld\r\n", + i, + cg_ptr->sap_id, + cg_ptr->circuit_num, + cg_ptr->attrib.variant, + cg_ptr->attrib.priority, + cg_ptr->attrib.tg_id, + cg_ptr->attrib.nfas.flag, + cg_ptr->attrib.nfas.prim_link, + cg_ptr->attrib.nfas.backup_link); + isdn_asciout_proc(info); + } +} + +static void list_circuit(u16 circuit_id) +{ + const pal_cg_struct *cg_ptr = NULL; + const pal_circuit_struct *circuit_ptr = pal_circuit_ptr(circuit_id); + if(circuit_ptr == NULL) + { + printf("list circuit err!circuit_id = %d, can't find circuit_ptr!\n", circuit_id); + return; + } + if(circuit_id >= ISDN_MAX_CIRCUIT) + return; + cg_ptr = pal_cg_ptr(circuit_ptr->cg_id); + if(cg_ptr == NULL) + return; + if(cg_ptr->attrib.protocol != PROTO_ISDN) + return; + sprintf(info,"\r\n\ + #ISDN Circuit-%d Info\r\n\ + enable:%d\r\n\ + cg_id:%d\r\n\ + Attrib->\r\n\ + plat_id(%d)\r\n\ + head_cic(%ld)\r\n\ + cic_range(%d)\r\n\ + d_channel(%d)\r\n\ + link_id(%ld)\r\n\ + lk2_status(%d)\r\n\ + lk3_status(%d)\r\n\ + dc_status(%d)\r\n\ + -------------------\r\n", + circuit_id, + circuit_ptr->enable, + circuit_ptr->cg_id, + circuit_ptr->attrib.plat_id, + circuit_ptr->attrib.head_cic, + circuit_ptr->attrib.cic_range, + circuit_ptr->attrib.d_chnl, + circuit_ptr->attrib.link_id, + isdn_rs.link_pond[circuit_ptr->attrib.link_id].lk2_status, + isdn_rs.link_pond[circuit_ptr->attrib.link_id].lk3_status, + isdn_rs.link_pond[circuit_ptr->attrib.link_id].dc_status); + isdn_asciout_proc(info); +} +static void list_all_circuit() +{ + int i; + const pal_cg_struct *cg_ptr = NULL; + const pal_circuit_struct *circuit_ptr = NULL; + + isdn_asciout_proc("CircuitId\tCgId\tPlatId\tHeatCic\tRange\tD_Chnl\tLinkId\tLk2Status\tLk3Status\tDcStatus\r\n"); + for(i = 0; i < ISDN_MAX_CIRCUIT; i++) + { + circuit_ptr = pal_circuit_ptr(i); + if(circuit_ptr == NULL) + continue; + if(circuit_ptr->enable == 0) + continue; + + cg_ptr = pal_cg_ptr(circuit_ptr->cg_id); + if(cg_ptr == NULL) + continue; + if(cg_ptr->attrib.protocol != PROTO_ISDN) + continue; + + sprintf(info,"%d\t\t%d\t%d\t%ld\t%d\t%d\t%ld\t%d\t\t%d\t\t%d\r\n", + i, + circuit_ptr->cg_id, + circuit_ptr->attrib.plat_id, + circuit_ptr->attrib.head_cic, + circuit_ptr->attrib.cic_range, + circuit_ptr->attrib.d_chnl, + circuit_ptr->attrib.link_id, + isdn_rs.link_pond[circuit_ptr->attrib.link_id].lk2_status, + isdn_rs.link_pond[circuit_ptr->attrib.link_id].lk3_status, + isdn_rs.link_pond[circuit_ptr->attrib.link_id].dc_status); + isdn_asciout_proc(info); + } +} +static void list_all_circuit_by(u16 cg_id) +{ + int i; + const pal_cg_struct *cg_ptr = NULL; + const pal_circuit_struct *circuit_ptr = NULL; + + isdn_asciout_proc("--->circuit:\r\n"); + isdn_asciout_proc("CircuitId\tCgId\tPlatId\tHeatCic\tRange\tD_Chnl\tLinkId\tLk2Status\tLk3Status\tDcStatus\r\n"); + for(i = 0; i < ISDN_MAX_CIRCUIT; i++) + { + circuit_ptr = pal_circuit_ptr(i); + if(circuit_ptr == NULL) + continue; + if(circuit_ptr->enable == 0 && + circuit_ptr->cg_id != cg_id) + continue; + cg_ptr = pal_cg_ptr(circuit_ptr->cg_id); + if(cg_ptr == NULL) + continue; + if(cg_ptr->attrib.protocol != PROTO_ISDN) + continue; + + sprintf(info,"%d\t\t%d\t%d\t%ld\t%d\t%d\t%ld\t%d\t\t%d\t\t%d\r\n", + i, + circuit_ptr->cg_id, + circuit_ptr->attrib.plat_id, + circuit_ptr->attrib.head_cic, + circuit_ptr->attrib.cic_range, + circuit_ptr->attrib.d_chnl, + circuit_ptr->attrib.link_id, + isdn_rs.link_pond[circuit_ptr->attrib.link_id].lk2_status, + isdn_rs.link_pond[circuit_ptr->attrib.link_id].lk3_status, + isdn_rs.link_pond[circuit_ptr->attrib.link_id].dc_status); + isdn_asciout_proc(info); + } +} + +static void list_port(u32 pid) +{ + if(pid >= ISDN_MAX_PORT) + return; + sprintf(info,"\r\n\ + #ISDN Port-%ld Info\r\n\ + enable:%d\r\n\ + su_proc_id:%ld\r\n\ + msg_cmd:%d\r\n\ + primitive_cmd:%d\r\n\ + ------------------------\r\n\ + call_state:%d\r\n\ + maintenance_state:%d\r\n\ + ------------------------\r\n\ + cpc_state:%d\r\n\ + m_state:%d\r\n\ + ------------------------\r\n", + pid, + isdn_rs.port_pond[pid].enable, + isdn_rs.port_pond[pid].su_proc_id, + isdn_rs.port_pond[pid].msg_cmd, + isdn_rs.port_pond[pid].primitive_cmd, + isdn_rs.port_pond[pid].cic_state.call_state, + isdn_rs.port_pond[pid].cic_state.maintenance_state, + isdn_rs.port_pond[pid].fsm_state.cpc_state, + isdn_rs.port_pond[pid].fsm_state.m_state); + isdn_asciout_proc(info); +} +static void list_all_port() +{ + int i, j = 0; + isdn_asciout_proc("index\tPort\tSuID\tcall_state\tmain_state\tcpc_state\tm_state\r\n"); + for(i = 0; i < ISDN_MAX_PORT; i++) + { + if(isdn_rs.port_pond[i].enable == 0) + continue; + sprintf(info,"%d\t%d\t%ld\t%d\t\t%d\t\t%d\t\t%d\r\n", + j++, + i, + isdn_rs.port_pond[i].su_proc_id, + isdn_rs.port_pond[i].cic_state.call_state, + isdn_rs.port_pond[i].cic_state.maintenance_state, + isdn_rs.port_pond[i].fsm_state.cpc_state, + isdn_rs.port_pond[i].fsm_state.m_state); + isdn_asciout_proc(info); + } +} +static void list_all_port_by(u16 circuit_id) +{ + int i,cic,pid; + const pal_cg_struct *cg_ptr = NULL; + const pal_circuit_struct *circuit_ptr = pal_circuit_ptr(circuit_id); + if(circuit_ptr == NULL) + { + printf("list all port by circuit_id err!circuit_id = %d, can't find circuit_ptr!\n", circuit_id); + return; + } + cg_ptr = pal_cg_ptr(circuit_ptr->cg_id); + if(cg_ptr == NULL) + return; + if(cg_ptr->attrib.protocol != PROTO_ISDN) + return; + + pid = ISDN_CIRCUIT_CIC * circuit_id; + cic = circuit_ptr->attrib.head_cic; + + isdn_asciout_proc("-->port:\r\n"); + isdn_asciout_proc("CIC\tPort\tSuID\tcall_state\tmain_state\tcpc_state\tm_state\r\n"); + + for(i = 0; i < circuit_ptr->attrib.cic_range; i++) + { + isdn_asciout_proc("%d\t%d\t%d\t%d\t\t%d\t\t%d\t\t%d\r\n", + cic, + pid, + isdn_rs.port_pond[pid].su_proc_id, + isdn_rs.port_pond[pid].cic_state.call_state, + isdn_rs.port_pond[pid].cic_state.maintenance_state, + isdn_rs.port_pond[pid].fsm_state.cpc_state, + isdn_rs.port_pond[pid].fsm_state.m_state); + cic++; + pid++; + } +} + +static int list_cic(u8 link_id, u32 cic_val) +{ + int i,pid; + u32 head_cic; + const pal_circuit_struct *circuit_ptr = NULL; + const pal_cg_struct *cg_ptr = NULL; + + for(i = 0; i < ISDN_MAX_CIRCUIT; i++) + { + circuit_ptr = pal_circuit_ptr(i); + if(circuit_ptr == NULL) + continue; + + if(circuit_ptr->enable == 0) + continue; + + if((cic_val < circuit_ptr->attrib.head_cic) || + ((cic_val - circuit_ptr->attrib.head_cic ) >= + circuit_ptr->attrib.cic_range)) + continue; + cg_ptr = pal_cg_ptr(circuit_ptr->cg_id); + if(cg_ptr == NULL) + continue; + if(cg_ptr->attrib.protocol != PROTO_ISDN) + continue; + + if(cg_ptr->attrib.nfas.flag) + { + if(cg_ptr->attrib.nfas.prim_link != link_id && + cg_ptr->attrib.nfas.backup_link != link_id) + continue; + } + else + { + if(circuit_ptr->attrib.link_id != link_id) + continue; + } + + head_cic = circuit_ptr->attrib.head_cic; + if(circuit_ptr->attrib.cic_range == 24) + head_cic--; + pid = ISDN_CIRCUIT_CIC * i + (cic_val - head_cic); + + list_sap(cg_ptr->sap_id); + list_cg(circuit_ptr->cg_id); + list_circuit(i); + list_port(pid); + + return 1; + } + sprintf(info, "illegal cic value! link_id=%d,cic=%ld\r\n", link_id, cic_val); + isdn_asciout_proc(info); + + return -1; +} + +static void debug_setcol(int color) +{ + isdn_asciout_proc("%c[%dm",COL_ESC , color); +} + +static void debug_cancelcol() +{ + isdn_asciout_proc("%c[m",COL_ESC); +} + +static u16 debug_disp_line(u8 page, u8 line) +{ + u16 disp_length; + + disp_length = 0; + disp_ptr = (u8 *)disp_page; + const pal_sap_struct *sap_ptr = pal_sap_ptr(disp_page[page]); + if(sap_ptr == NULL) + return ISDN_CM_FAILED; + const pal_circuit_struct *circuit_ptr = pal_circuit_ptr(disp_page[page]); + if(circuit_ptr == NULL) + return ISDN_CM_FAILED; + const pal_cg_struct *cg_ptr = pal_cg_ptr(disp_page[page]); + if(cg_ptr == NULL) + return ISDN_CM_FAILED; + if(cg_ptr->attrib.protocol != PROTO_ISDN) + return ISDN_CM_FAILED; + + switch(page) + { + case 1: // Page 1: sap Info + switch(line) + { + case 0: + disp_ptr = (u8 *)&disp_page[page]; //Subpage + disp_length = 2; + break; + case 1: //enable + disp_ptr = (u8 *)&(sap_ptr->enable); + disp_length = 1; + break; + case 2: //systemID + disp_ptr = (u8 *)&(isdn_rs.attrib.systemID); + disp_length = 1; + break; + case 3: //run_mode + disp_ptr = (u8 *)&(isdn_rs.attrib.isdn_run_mode); + disp_length = 1; + break; + case 4: //isdn_remote_ip + disp_ptr = (u8 *)&(isdn_rs.attrib.isdn_remote_ip); + disp_length = 4; + break; + default: + break; + } + break; + case 2: // Page 2: cg Info + switch(line) + { + case 0: + disp_ptr = (u8 *)&disp_page[page]; //Subpage + disp_length = 2; + break; + case 1: //enable + disp_ptr = (u8 *)&(cg_ptr->enable); + disp_length = 1; + break; + case 2: //sap_id + disp_ptr = (u8 *)&(cg_ptr->sap_id); + disp_length = 1; + break; + case 3: //circuit_num + disp_ptr = (u8 *)&(cg_ptr->circuit_num); + disp_length = 1; + break; + case 4: //variant_type + disp_ptr = (u8 *)&(cg_ptr->attrib.variant); + disp_length = 1; + break; + case 5: //priority + disp_ptr = (u8 *)&(cg_ptr->attrib.priority); + disp_length = 1; + break; + case 6: //tg_id + disp_ptr = (u8 *)&(cg_ptr->attrib.tg_id); + disp_length = 4; + break; + case 7: //nfas + disp_ptr = (u8 *)&(cg_ptr->attrib.nfas.flag); + disp_length = 1; + break; + case 8: //pri + disp_ptr = (u8 *)&(cg_ptr->attrib.nfas.prim_link); + disp_length = 1; + break; + case 9: //backup + disp_ptr = (u8 *)&(cg_ptr->attrib.nfas.backup_link); + disp_length = 1; + break; + default: + break; + } + break; + case 3: // Page 3: circuit Info + switch(line) + { + case 0: + disp_ptr = (u8 *)&disp_page[page]; //Subpage + disp_length = 2; + break; + case 1: //enable + disp_ptr = (u8 *)&(circuit_ptr->enable); + disp_length = 1; + break; + case 2: //cg_id + disp_ptr = (u8 *)&(circuit_ptr->cg_id); + disp_length = 2; + break; + case 3: //plat_id + disp_ptr = (u8 *)&(circuit_ptr->attrib.plat_id); + disp_length = 1; + break; + case 4: //head_cic + disp_ptr = (u8 *)&(circuit_ptr->attrib.head_cic); + disp_length = 4; + break; + case 5: //cic_range + disp_ptr = (u8 *)&(circuit_ptr->attrib.cic_range); + disp_length = 1; + break; + case 6: //d-channel + disp_ptr = (u8 *)&(circuit_ptr->attrib.d_chnl); + disp_length = 4; + break; + case 7: //link_id + disp_ptr = (u8 *)&(circuit_ptr->attrib.link_id); + disp_length = 1; + break; + case 8: //lk2_status + disp_ptr = (u8 *)&(isdn_rs.link_pond[circuit_ptr->attrib.link_id].lk2_status); + disp_length = 1; + break; + case 9: //lk3_status + disp_ptr = (u8 *)&(isdn_rs.link_pond[circuit_ptr->attrib.link_id].lk3_status); + disp_length = 1; + break; + case 10: //dc_status + disp_ptr = (u8 *)&(isdn_rs.link_pond[circuit_ptr->attrib.link_id].dc_status); + disp_length = 1; + break; + default: + break; + } + break; + case 4: // Page 4: port Info + switch(line) + { + case 0: + disp_ptr = (u8 *)&disp_page[page]; //Subpage + disp_length = 2; + break; + case 1: //enable + disp_ptr = (u8 *)&(isdn_rs.port_pond[disp_page[page]].enable); + disp_length = 1; + break; + case 2: //fsm_state + disp_ptr = (u8 *)&(isdn_rs.port_pond[disp_page[page]].fsm_state); + disp_length = 2; + break; + case 3: //cic_state + disp_ptr = (u8 *)&(isdn_rs.port_pond[disp_page[page]].cic_state); + disp_length = 2; + break; + case 4: //su_proc_id + disp_ptr = (u8 *)&(isdn_rs.port_pond[disp_page[page]].su_proc_id); + disp_length = 4; + break; + case 5: //timer_flag + disp_ptr = (u8 *)&(isdn_rs.port_pond[disp_page[page]].timer_flag); + disp_length = 2; + break; + case 6: //w_time + disp_ptr = (u8 *)&(isdn_rs.port_pond[disp_page[page]].w_time); + disp_length = 4; + break; + default: + break; + } + break; + case 5: // Page 5: call statistics Info + switch(line) + { + //receive and send + case 0: + disp_ptr = (u8 *)&isdn_csta.rv_setup; + disp_length = 8; + break; + case 1: + disp_ptr = (u8 *)&isdn_csta.rv_setupAck; + disp_length = 8; + break; + case 2: + disp_ptr = (u8 *)&isdn_csta.rv_callProc; + disp_length = 8; + break; + case 3: + disp_ptr = (u8 *)&isdn_csta.rv_alert; + disp_length = 8; + break; + case 4: + disp_ptr = (u8 *)&isdn_csta.rv_conn; + disp_length = 8; + break; + case 5: + disp_ptr = (u8 *)&isdn_csta.rv_connAck; + disp_length = 8; + break; + case 6: + disp_ptr = (u8 *)&isdn_csta.rv_disc; + disp_length = 8; + break; + case 7: + disp_ptr = (u8 *)&isdn_csta.rv_rel; + disp_length = 8; + break; + case 8: + disp_ptr = (u8 *)&isdn_csta.rv_relComp; + disp_length = 8; + break; + //redirect + case 9: + disp_ptr = (u8 *)&isdn_csta.rd_setup; + disp_length = 4; + break; + case 10: + disp_ptr = (u8 *)&isdn_csta.rd_setupAck; + disp_length = 4; + break; + case 11: + disp_ptr = (u8 *)&isdn_csta.rd_callProc; + disp_length = 4; + break; + case 12: + disp_ptr = (u8 *)&isdn_csta.rd_alert; + disp_length = 4; + break; + case 13: + disp_ptr = (u8 *)&isdn_csta.rd_conn; + disp_length = 4; + break; + case 14: + disp_ptr = (u8 *)&isdn_csta.rd_connAck; + disp_length = 4; + break; + case 15: + disp_ptr = (u8 *)&isdn_csta.rd_disc; + disp_length = 4; + break; + case 16: + disp_ptr = (u8 *)&isdn_csta.rd_rel; + disp_length = 4; + break; + case 17: + disp_ptr = (u8 *)&isdn_csta.rd_relComp; + disp_length = 4; + break; + default: + break; + } + break; + default: + disp_length = 0; + break; + } + + return disp_length; +} + +static void debug_disp_page(u8 page) +{ + u8 disp_line; + u16 disp_length; + + debug_page_line[PAGE_POINT] = page + 5; + + for (disp_line = 0; disp_line < 22; disp_line++) + { + disp_length = debug_disp_line(page, disp_line); + debug_page_line[LINE_POINT] = disp_line + 2; + debug_page_line[LINE_POINT + 1] = 2; // Data Pointer + debug_set_response(BASE_ID_LEN + 2, debug_page_line, disp_ptr, disp_length); + } +} + +int isdn_debug_init(void) +{ + u8 page; + u8 data[10]; + u8 *ptr; + + strcpy(AsciInBuf, "\0"); + strcpy(AsciOutBuf, "\0"); + MonitorIsdnFg = ISDN_MONITOR_NONE; + bzero(disp_page, 20); + memset(&isdn_csta, 0, sizeof(ISDN_Msg_Csta)); + ptr = data; + + debug_set_response(BASE_ID_LEN, debug_status_id, &debug_status, 1); + debug_set_response(BASE_ID_LEN, debug_name_id, VER_DEBUG, 10); + debug_set_response(BASE_ID_LEN, debug_ascin_id, AsciInBuf, 4096); + debug_set_response(BASE_ID_LEN, debug_ascout_id, AsciOutBuf, 4096); + + for (page = 1; page <= PAGE_NUM; page++) + { + switch (page) + { + case 1: //page 1 + ptr = title1_p; + break; + case 2: //page 2 + ptr = title2_p; + break; + case 3: //page 3 + ptr = title3_p; + break; + case 4: //page 4 + ptr = title4_p; + break; + case 5: //page 5 + ptr = title5_p; + break; + default: + break; + } + debug_page_title[PAGE_POINT] = 5 + page; + debug_set_response(BASE_ID_LEN + 1, debug_page_title, ptr, strlen(ptr)); + debug_disp_page(page); + } + return ISDN_CM_OK; +} + +void isdn_debug_timer(void) +{ + u8 in_page, err_fg = 0; + u8 *ascii_in_ptr = NULL; + u8 *str_start = NULL; + u16 str_len, num; + + if((str_len = strlen(AsciInBuf)) > 0) + { + in_page = AsciInBuf[0] - 1; + ascii_in_ptr = AsciInBuf + 1; + + if (in_page > PAGE_NUM) + err_fg = 1; + else if (strcmp(ascii_in_ptr,"log error on") == 0) + { + MonitorIsdnFg = MonitorIsdnFg | ISDN_MONITOR_ERROR; + } + else if (strcmp(ascii_in_ptr,"log error off") == 0) + { + MonitorIsdnFg = MonitorIsdnFg & (~ISDN_MONITOR_ERROR); + } + else if (strcmp(ascii_in_ptr,"log all") == 0) + { + MonitorIsdnFg = ISDN_MONITOR_ALL; + } + else if (strcmp(ascii_in_ptr,"log none") == 0) + { + MonitorIsdnFg = ISDN_MONITOR_NONE; + } + else if (strcmp(ascii_in_ptr,"log state on") == 0) + { + MonitorIsdnFg = MonitorIsdnFg | ISDN_MONITOR_STATE; + } + else if (strcmp(ascii_in_ptr,"log state off") == 0) + { + MonitorIsdnFg = MonitorIsdnFg & (~ISDN_MONITOR_STATE); + } + + else if (strcmp(ascii_in_ptr,"help") == 0) + { + isdn_asciout_proc(log_help); + isdn_asciout_proc("Ver.%sp%02d\r\n",VER_DEBUG,IS_PATCH); + } + else if (isdigit(ascii_in_ptr[0])) + { + num = strtoul(ascii_in_ptr, NULL, 10); + disp_page[in_page] = num; + debug_disp_page(in_page); + } + else if ((str_start = strstr(ascii_in_ptr, ">")) != NULL) + { + num = strtoul(str_start + 1, NULL, 10); + disp_page[in_page] += num; + debug_disp_page(in_page); + } + else if ((str_start = strstr(ascii_in_ptr, "<"))!= NULL) + { + num = strtoul(str_start + 1, NULL, 10); + disp_page[in_page] -= num; + debug_disp_page(in_page); + } + else if (strcmp(ascii_in_ptr,"reset csta") == 0) + { + memset(&isdn_csta,0,sizeof(ISDN_Msg_Csta)); + } + else if (strcmp(ascii_in_ptr,"test color") == 0) + { + debug_setcol(COL_WHITE); + isdn_asciout_proc("COL_WHITE\n\r"); + debug_setcol(COL_RED); + isdn_asciout_proc("COL_RED\n\r"); + debug_setcol(COL_YELLOW); + isdn_asciout_proc("COL_YELLOW\n\r"); + debug_setcol(COL_GREEN); + isdn_asciout_proc("COL_GREEN\n\r"); + debug_setcol(COL_BLUE); + isdn_asciout_proc("COL_BLUE\n\r"); + debug_setcol(COL_BROWN); + isdn_asciout_proc("COL_BROWN\n\r"); + debug_setcol(COL_MEGEN); + isdn_asciout_proc("COL_MEGEN\n\r"); + debug_setcol(COL_GRAY); + isdn_asciout_proc("COL_GRAY\n\r"); + debug_setcol(COL_HI_WHI); + isdn_asciout_proc("COL_HI_WHI\n\r"); + debug_setcol(COL_HI_RED); + isdn_asciout_proc("COL_HI_RED\n\r"); + debug_setcol(COL_HI_YEL); + isdn_asciout_proc("COL_HI_YEL\n\r"); + debug_setcol(COL_HI_GRE); + isdn_asciout_proc("COL_HI_GRE\n\r"); + debug_setcol(COL_HI_BLU); + isdn_asciout_proc("COL_HI_BLU\n\r"); + debug_setcol(COL_HI_BRO); + isdn_asciout_proc("COL_HI_BRO\n\r"); + debug_setcol(COL_HI_MEG); + isdn_asciout_proc("COL_HI_MEG\n\r"); + debug_setcol(COL_BLACK); + isdn_asciout_proc("COL_BLACK\n\r"); + debug_cancelcol(); + } + else if (strstr(ascii_in_ptr, "reset port") != NULL) + { + if ((str_start = strstr(ascii_in_ptr, "-")) != NULL) + { + num = strtoul(str_start + 1, NULL, 10); + if (num >= ISDN_MAX_PORT) + err_fg = 1; + else + { + memset(&(isdn_rs.port_pond[num]),0,sizeof(ISDN_Port_struct)); + } + } + } + else if (strstr(ascii_in_ptr, "set link_id") != NULL) + { + if ((str_start = strstr(ascii_in_ptr, "=")) != NULL) + { + num = strtoul(str_start + 1, NULL, 10); + debug_link_id = num; + } + } + else if (strstr(ascii_in_ptr, "list sap") != NULL) + { + if ((str_start = strstr(ascii_in_ptr, "-")) != NULL) + { + num = strtoul(str_start + 1, NULL, 10); + list_sap(num); + } + } + else if (strstr(ascii_in_ptr, "list cg") != NULL) + { + if ((str_start = strstr(ascii_in_ptr, "-")) != NULL) + { + num = strtoul(str_start + 1, NULL, 10); + list_cg(num); + list_all_circuit_by(num); + } + else + list_all_cg(); + } + else if (strstr(ascii_in_ptr, "list circuit") != NULL) + { + if ((str_start = strstr(ascii_in_ptr, "-")) != NULL) + { + num = strtoul(str_start + 1, NULL, 10); + list_circuit(num); + list_all_port_by(num); + } + else + list_all_circuit(); + } + else if (strstr(ascii_in_ptr, "list debug link") != NULL) + { + isdn_asciout_proc("debug_link_id = %d\n\r",debug_link_id); + } + else if (strstr(ascii_in_ptr, "list cic") != NULL) + { + if((str_start = strstr(ascii_in_ptr, "-")) != NULL) + { + num = strtoul(str_start + 1, NULL, 10); + list_cic(debug_link_id, num); + } + } + else if (strstr(ascii_in_ptr, "trace on") != NULL) + { + if((str_start = strstr(ascii_in_ptr, "-")) != NULL) + { + num = strtoul(str_start + 1, NULL, 10); + isdn_rs.port_pond[num].trace_flag = 1; + } + } + else if (strstr(ascii_in_ptr, "trace off") != NULL) + { + if((str_start = strstr(ascii_in_ptr, "-")) != NULL) + { + num = strtoul(str_start + 1, NULL, 10); + isdn_rs.port_pond[num].trace_flag = 0; + } + else + { + int i; + for(i = 0; i < ISDN_MAX_PORT; i++) + isdn_rs.port_pond[i].trace_flag = 0; + } + } + else + err_fg = 1; + + if (err_fg == 0) + isdn_asciout_proc("Command OK!\n\r"); + else + isdn_asciout_proc("Command Error!\n\r"); + + strcpy(AsciInBuf, "\0"); + } +} + +static void display_isdn_msgtype(u8 msgtype, u8 proto_discr) +{ + if(proto_discr == PROTOCOL_DISCR) + { + switch(msgtype) + { + case MSG_ALERT: + isdn_asciout_proc("Alerting"); + break; + case MSG_CALL_PROC: + isdn_asciout_proc("Call proceeding"); + break; + case MSG_CONN: + isdn_asciout_proc("Connect"); + break; + case MSG_CONNACK: + isdn_asciout_proc("Connect acknowledge"); + break; + case MSG_PROG: + isdn_asciout_proc("Progress"); + break; + case MSG_SETUP: + isdn_asciout_proc("Setup"); + break; + case MSG_SETUP_ACK: + isdn_asciout_proc("Setup acknowledge"); + break; + case MSG_DISC: + isdn_asciout_proc("Disconnect"); + break; + case MSG_REL: + isdn_asciout_proc("Release"); + break; + case MSG_REL_COMP: + isdn_asciout_proc("Release complete"); + break; + case MSG_RESTART: + isdn_asciout_proc("Restart"); + break; + case MSG_REST_ACK: + isdn_asciout_proc("Restart acknowledge"); + break; + case MSG_INFORMATION: + isdn_asciout_proc("Information"); + break; + case MSG_NOTI: + isdn_asciout_proc("Notify"); + break; + case MSG_STATUS: + isdn_asciout_proc("Status"); + break; + case MSG_STAT_ENQ: + isdn_asciout_proc("Status enquiry"); + break; + case MSG_FAC: + isdn_asciout_proc("Facility (connectionless)"); + break; + default: + isdn_asciout_proc("Unknown message"); + break; + } + } + else if(proto_discr == M_PROTOCOL_DISCR) + { + switch(msgtype) + { + case MSG_SERVICE: + isdn_asciout_proc("Service"); + break; + case MSG_SERVICE_ACK: + isdn_asciout_proc("Service acknowledge"); + break; + default: + isdn_asciout_proc("Unknown message"); + break; + } + } + isdn_asciout_proc("(message type=0x%x)\r\n",msgtype); +} + +void isdn_log_err(u32 pid,const char *fmt, ...) +{ + va_list ap; + struct timeval tv; + struct timezone tz; + struct tm *t; + char timestr[1024]; + + if((MonitorIsdnFg & ISDN_MONITOR_ERROR) != ISDN_MONITOR_ERROR) + return; + + gettimeofday(&tv, &tz); + t = localtime(&tv.tv_sec); + sprintf(timestr, "[%d:%d:%d.%ld]", t->tm_hour, t->tm_min, t->tm_sec, tv.tv_usec); + + va_start(ap, fmt); + vsprintf(AsciTempBuf, fmt, ap); + debug_setcol(COL_RED); + isdn_asciout_proc("%s%s (pid=%d)", timestr, AsciTempBuf, pid); + debug_cancelcol(); + isdn_asciout_proc("\r\n"); + va_end(ap); +} + +void isdn_trace_func(u32 pid,const char *fmt, ...) +{ + va_list ap; + struct timeval tv; + struct timezone tz; + struct tm *t; + char timestr[1024]; + + if (((MonitorIsdnFg & ISDN_MONITOR_FUNC) != ISDN_MONITOR_FUNC) || + (isdn_rs.port_pond[pid%ISDN_MAX_PORT].trace_flag != 1)) + return; + + gettimeofday(&tv, &tz); + t = localtime(&tv.tv_sec); + sprintf(timestr, "[%d:%d:%d.%ld]", t->tm_hour, t->tm_min, t->tm_sec, tv.tv_usec ); + + va_start(ap, fmt); + vsprintf(AsciTempBuf, fmt, ap); + debug_setcol(COL_YELLOW); + isdn_asciout_proc("%s%s (pid=%d)",timestr,AsciTempBuf,pid); + debug_cancelcol(); + isdn_asciout_proc("\r\n"); + va_end(ap); +} + +void monitor_isdn_msg(u32 pid,u8 *head,IuaMsgStr *msg,u8 col) +{ + int i, len; + u32 cic; + struct timeval tv; + struct timezone tz; + struct tm *t; + char timestr[1024]; + int circuit_id = pid / ISDN_CIRCUIT_CIC; + const pal_circuit_struct *circuit_ptr = pal_circuit_ptr(circuit_id); + if(circuit_ptr == NULL) + { + printf("monitor isdn msg err!pid=%ld, circuit_id = %d, can't find circuit_ptr!\n", pid, circuit_id); + return; + } + + if((MonitorIsdnFg & ISDN_MONITOR_MSG) != ISDN_MONITOR_MSG) + return; + + if(circuit_ptr->attrib.cic_range == 32) + cic = circuit_ptr->attrib.head_cic + (pid % ISDN_CIRCUIT_CIC); + else + + cic = circuit_ptr->attrib.head_cic + (pid % ISDN_CIRCUIT_CIC) - 1; + gettimeofday(&tv, &tz); + t = localtime(&tv.tv_sec); + sprintf(timestr, "[%d:%d:%d.%ld]", t->tm_hour, t->tm_min, t->tm_sec, tv.tv_usec); + + debug_setcol(col); + isdn_asciout_proc("%s%s ",timestr,head); + if(msg->msgcontent.isdn_msg.msg_m.call_ref[0] & 0x80) + isdn_asciout_proc("msg send to originating side\n\r"); + else + isdn_asciout_proc("msg send from originating side\n\r"); + display_isdn_msgtype(msg->msgcontent.isdn_msg.msg_m.msg_type, msg->msgcontent.isdn_msg.msg_m.proto_Discr); + isdn_asciout_proc("--cic=0x%04x,cref=0x%02x%02x,link=%d,proto=%d,pid=%d->\n\r", + cic, + msg->msgcontent.isdn_msg.msg_m.call_ref[0]&0x7F, + msg->msgcontent.isdn_msg.msg_m.call_ref[1], + msg->e1_no, + msg->msgcontent.isdn_msg.msg_m.proto_Discr, + pid); + len = msg->msg_length - 5; + debug_cancelcol(); + for (i = 0; i < len; i ++) + { + sprintf(&AsciTempBuf[3*i]," %02x", msg->msgcontent.isdn_msg.ie_content[i]); + } + sprintf(&AsciTempBuf[3*i],"\n\r"); + isdn_asciout_proc(AsciTempBuf); + return; +} + +void monitor_isdn_port(u32 call_ref,u32 port) +{ + if ((MonitorIsdnFg & ISDN_MONITOR_STATE) != ISDN_MONITOR_STATE) + return; + + isdn_asciout_proc("-->port:\r\n"); + isdn_asciout_proc("CallRef\tPort\tSuID\tcall_state\tmain_state\tcpc_state\tm_state\r\n"); + sprintf(info,"%lx\t%ld\t%ld\t%d\t\t%d\t\t%d\t\t%d\r\n", + call_ref, + port, + isdn_rs.port_pond[port].su_proc_id, + isdn_rs.port_pond[port].cic_state.call_state, + isdn_rs.port_pond[port].cic_state.maintenance_state, + isdn_rs.port_pond[port].fsm_state.cpc_state, + isdn_rs.port_pond[port].fsm_state.m_state); + isdn_asciout_proc(info); +} + +void isdn_msg_csta(u8 msgtype,u8 flag) +{ + switch(msgtype) + { + case MSG_ALERT: + if(flag==0) //receive + isdn_csta.rv_alert++; + else if(flag == 1) //send + isdn_csta.sd_alert++; + else //redirect + isdn_csta.rd_alert++; + break; + case MSG_CALL_PROC: + if(flag==0) //receive + isdn_csta.rv_callProc++; + else if(flag == 1) //send + isdn_csta.sd_callProc++; + else //redirect + isdn_csta.rd_callProc++; + break; + case MSG_CONN: + if(flag==0) //receive + isdn_csta.rv_conn++; + else if(flag == 1) //send + isdn_csta.sd_conn++; + else //redirect + isdn_csta.rd_conn++; + break; + case MSG_CONNACK: + if(flag==0) //receive + isdn_csta.rv_connAck++; + else if(flag == 1) //send + isdn_csta.sd_connAck++; + else //redirect + isdn_csta.rd_connAck++; + break; + case MSG_PROG: + break; + case MSG_SETUP: + if(flag==0) //receive + isdn_csta.rv_setup++; + else if(flag == 1) //send + isdn_csta.sd_setup++; + else //redirect + isdn_csta.rd_setup++; + break; + case MSG_SETUP_ACK: + if(flag==0) //receive + isdn_csta.rv_setupAck++; + else if(flag == 1) //send + isdn_csta.sd_setupAck++; + else //redirect + isdn_csta.rd_setupAck++; + break; + case MSG_DISC: + if(flag==0) //receive + isdn_csta.rv_disc++; + else if(flag == 1) //send + isdn_csta.sd_disc++; + else //redirect + isdn_csta.rd_disc++; + break; + case MSG_REL: + if(flag==0) //receive + isdn_csta.rv_rel++; + else if(flag == 1) //send + isdn_csta.sd_rel++; + else //redirect + isdn_csta.rd_rel++; + break; + case MSG_REL_COMP: + if(flag==0) //receive + isdn_csta.rv_relComp++; + else if(flag == 1) //send + isdn_csta.sd_relComp++; + else //redirect + isdn_csta.rd_relComp++; + break; + case MSG_RESTART: + break; + case MSG_REST_ACK: + break; + case MSG_INFORMATION: + break; + case MSG_NOTI: + break; + case MSG_STATUS: + break; + case MSG_STAT_ENQ: + break; + case MSG_FAC: + break; + default: + break; + } +} + diff --git a/omc/plat/isdn/src/isdn_fsm.c b/omc/plat/isdn/src/isdn_fsm.c new file mode 100644 index 0000000..979520c --- /dev/null +++ b/omc/plat/isdn/src/isdn_fsm.c @@ -0,0 +1,3124 @@ +/*********************************************************** +Copyright (C), LGC Wireless. +File Name: isdn_fsm.c +Description: ISDN FSM +Version: v9.0.0 +Author: Gengxin Chen +Create Date: 2008-2-19 +History: + + +************************************************************/ + +#include "./include/isdn_const.h" +#include "./include/isdn_rm.h" +#include "./include/isdn_debug.h" +#include "./include/isdn_ext.h" +#include "./include/isdn_inc.h" + + +#define USR 0x00 +#define LN 0x02 +#define TN 0x03 +#define RLN 0x04 +#define DF RLN +u8 cause_to_loc[128]={ + DF, LN, LN, LN, DF, DF, LN, LN, DF, DF, + DF, DF, DF, DF, DF, DF, USR,USR,RLN,RLN, + DF, USR,LN, DF, DF, RLN,LN, RLN,RLN,RLN, + LN, RLN,DF, DF, RLN,DF, DF, DF, USR,DF, + DF, RLN,RLN,LN, LN, DF, DF, USR,DF, DF, + RLN,DF, DF, DF, DF, RLN,DF, LN, LN, DF, + DF, DF, DF, LN, DF, LN, DF, DF, DF, RLN, + DF, DF, DF, DF, DF, DF, DF, DF, DF, DF, + DF, LN, DF, LN, LN, LN, LN, RLN,USR,DF, + DF, LN, DF, DF, DF, LN, LN, RLN,LN, RLN, + LN, LN, RLN,DF, DF, DF, DF, DF, DF, DF, + DF, RLN,DF, DF, DF, DF, DF, DF, DF, DF, + DF, DF, DF, DF, DF, DF, DF, DF +}; + +u16 cr_start[ISDN_MAX_CG] = {0}; +u8 cr_state[4096] = {0}; + +void isdn_cpc_proc(u32 pid); +int isdn_event_handle(u32 pid, u8 primitive);//, u8 eventType) +static int isdn_cc_nt(u32 pid); +static int isdn_cc_lt(u32 pid); +extern int isdn_send_msg(u32 pid, u8 msg_type); +extern int isdn_send_maintenance_msg(u32 pid, u8 msg_type); + + +/************************************************************* +Function: cr_sel +Description: according to port id, selection the idle call reference +Input: pid:port id, indicate the cic of the IUA link +Return: ISDN_CM_OK:success + ISDN_CM_FAILED:failed +*************************************************************/ +int cr_sel(u32 pid) +{ + u16 tmp_cr, i, byte_offset, circuit_id, cg_id; + u8 bit_offset, key; + const pal_circuit_struct *circuit_ptr = NULL; + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + circuit_id = pid / ISDN_CIRCUIT_CIC; + circuit_ptr = pal_circuit_ptr(circuit_id); + if(circuit_ptr == NULL) + return ISDN_CM_FAILED; + + cg_id = circuit_ptr->cg_id; + tmp_cr = (cr_start[cg_id] & 0x3FFF); + + for(i = 0; i < 0x3FFF; i++) + { + tmp_cr++; + tmp_cr &= 0x3FFF; + if(tmp_cr != 0) + { + tmp_cr = (tmp_cr | ((circuit_ptr->attrib.plat_id & 0x01) << 14)); + byte_offset = tmp_cr / 8; + bit_offset = tmp_cr % 8; + key = ((cr_state[byte_offset] >> bit_offset) & 0x01); + if(key == 0) + { + pPort->call_ref = (tmp_cr | 0x8000); //call_ref[pid] + cr_start[cg_id] = tmp_cr; + cr_state[byte_offset] = (cr_state[byte_offset] | (0x01 << bit_offset)); + return ISDN_CM_OK; + } + } + } + + return ISDN_CM_FAILED; +} + +/************************************************************* +Function: rel_cr +Description: release the call reference +Input: pid:port id +Return: ISDN_CM_OK:success +*************************************************************/ +int rel_cr(u32 pid) +{ + u16 tmp_cr, byte_offset; + u8 bit_offset; + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + tmp_cr = (pPort->call_ref & 0x7FFF); + + if(pPort->call_ref & 0x8000) + { + byte_offset = tmp_cr / 8; + bit_offset = tmp_cr % 8; + cr_state[byte_offset] = (cr_state[byte_offset] ^ (0x01 << bit_offset)); + } + pPort->call_ref = 0; + pPort->callout_fg = 0; + //msg_cref[pid] = 0; + + return ISDN_CM_OK; +} + +/************************************************************* +Function: rel_B_chnl +Description: release B-channel link +Input: pid:port id +Return: ISDN_CM_OK:success +*************************************************************/ +int rel_B_chnl(u32 pid) +{ + u8 flag; + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + flag = pPort->enable; + if (flag != 0) + { + pPort->enable = 0; + pPort->su_proc_id = 0; + pPort->cic_val = 0; + pPort->pre_send_msg = 0; + } + + return ISDN_CM_OK; +} + +/************************************************************* +Function: isdn_cpc_clear +Description: clearing the interrelated state of the call at call processing control +Output: pPort:port structure pointer +Return: NULL +*************************************************************/ +inline void isdn_cpc_clear(ISDN_Port_struct *pPort) +{ + pPort->timer_flag = 0; + pPort->cic_state.call_state = IDLE_FLAG; + pPort->fsm_state.cpc_state = NULL_STATE; +} + +/************************************************************* +Function: isdn_rel_proc +Description: release isdn module process, include rel_B_chnl() and rel_cr() +Input: pid:port id, cause:release reason value +Return: ISDN_CM_OK:success +*************************************************************/ +int isdn_rel_proc(u32 pid, u32 cause) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + isdn_event_handle(pid, ISDN_RELEASE_IND); + pPort->w_time = 0; + rel_B_chnl(pid); + isdn_send_msg(pid, MSG_REL_COMP); + rel_cr(pid); + isdn_cpc_clear(pPort); + return ISDN_CM_OK; +} + +/************************************************************* +Function: nr_proc +Description: processing nr, nr is the interval state identifier in the SDL diagrams +Input: pid:port id +Return: if LT side, successfully enter the state u19 + if NT side, successfully enter the state n19 +*************************************************************/ +int nr_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + pPort->w_time = 0; //start t308 + pPort->timeout_fg = 0; + isdn_send_msg(pid, MSG_REL); + return REL_REQ_STATE; +} + +/************************************************************* +Function: nd_proc +Description: processing nd, nd is the interval state identifier in the SDL diagrams +Input: pid:port id +Return: if LT side, successfully enter the state u12 + if NT side, successfully enter the state n11 +*************************************************************/ +int nd_proc(u32 pid) +{ + int circuit_id; + const pal_circuit_struct *circuit_ptr = NULL; + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + circuit_id = pid / ISDN_CIRCUIT_CIC; + circuit_ptr = pal_circuit_ptr(circuit_id); + if(circuit_ptr == NULL) + { + isdn_log_err(pid, "nd_proc err!circuit_id %d can't find circuit_ptr", circuit_id); + return ISDN_CM_FAILED; + } + + /*disconnect B-channel*/ + pPort->w_time = 0; //stop all + isdn_event_handle(pid, ISDN_DISCONNECT_IND); + if(circuit_ptr->attrib.user_network_if) + return DISC_IND_STATE; + else + return DISC_REQ_STATE; +} + +/************************************************************* +Function: nc_proc +Description: processing nc, nc is the interval state identifier in the SDL diagrams +Input: pid:port id +Return: if LT side, successfully enter the state u11 + if NT side, successfully enter the state n12 +*************************************************************/ +int nc_proc(u32 pid) +{ + int circuit_id; + const pal_circuit_struct *circuit_ptr = NULL; + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + circuit_id = pid / ISDN_CIRCUIT_CIC; + circuit_ptr = pal_circuit_ptr(circuit_id); + if(circuit_ptr == NULL) + { + isdn_log_err(pid, "nc_proc err!circuit_id %d can't find circuit_ptr", circuit_id); + return ISDN_CM_FAILED; + } + + /*disconnect B-channel*/ + pPort->w_time = 0; //stop all and start t305 + isdn_send_msg(pid, MSG_DISC); + if(circuit_ptr->attrib.user_network_if) + return DISC_REQ_STATE; + else + return DISC_IND_STATE; +} + +/************************************************************* +Function: isdn_set_cause +Description: set the reason value, and keep into cause_ptr +Input: val:reason value +Output: cause_ptr:cause structure pointer +Return: NULL +*************************************************************/ +void isdn_set_cause(CauseStr *cause_ptr, u8 val) +{ + cause_ptr->pres = 1; + cause_ptr->ext_flag = 0x0; + cause_ptr->b3.has_ext_a = 1; + cause_ptr->b3.code_stan = 0x0; //CCITT standardized coding + cause_ptr->b3.loc = cause_to_loc[val]; + cause_ptr->cause_val = val; +} + +/************************************************************* +Function: isdn_set_status +Description: set the call state, and keep into status_ptr +Input: state:call state, cause_val:reason value +Output: status_ptr:status structure pointer +Return: NULL +*************************************************************/ +void isdn_set_status(IsdnStatus *status_ptr, u8 state, u8 cause_val) +{ + isdn_set_cause(&status_ptr->cause, cause_val); + status_ptr->call_stat.code_stan = 0x0; + status_ptr->call_stat.stat_val = (state & 0x3F); +} + + +/************************************************************* +Function: n0_proc +Description: Null State, no call exists. + Handling the process and entering into next call state +Input: pid:port id +Return: state value:success + -1:failed +*************************************************************/ +int n0_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->primitive_cmd == ISDN_SETUP_REQ) + { + pPort->primitive_cmd = 0; + if(cr_sel(pid) != 1) + { + isdn_log_err(pid, "cr_sel error!\r\n"); + return NULL_STATE; + } + isdn_send_msg(pid, MSG_SETUP); + pPort->timer_flag = CALLIN_FLAG; + pPort->w_time = 0; //start t303 + pPort->timeout_fg = 0; + return CALL_PRE_STATE; + } + else if(pPort->msg_cmd == MSG_SETUP) + { + pPort->msg_cmd = 0; + //pPort->call_ref = msg_cref[pid]; + isdn_event_handle(pid, ISDN_SETUP_IND); + return CALL_INIT_STATE; + } + //MSG_REL, MSG_REL_COMP, MSG_STATUS, and MSG_STAT_ENQ are doing in n0_ext_proc() + + return -1; +} + +/************************************************************* +Function: n1_proc +Description: Call initiated state, this state exists for an outgoing call + when the network has received a call establishment request + but has not yet responded. + Handling the process and entering into next call state. +Input: pid:port id +Return: state value:success + -1:failed +*************************************************************/ +int n1_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->primitive_cmd == ISDN_PROC_REQ) + { + pPort->primitive_cmd = 0; + /*Connect B-channel*/ + isdn_send_msg(pid, MSG_CALL_PROC); + return OUT_CALL_PROC_STATE; + } + else if(pPort->primitive_cmd == ISDN_MORE_INFO_REQ) + { + pPort->primitive_cmd = 0; + pPort->w_time = 0; //start t302 + /*Connect B-channel*/ + isdn_send_msg(pid, MSG_SETUP_ACK); + return OVERLAP_SD_STATE; + } + else if(pPort->primitive_cmd == ISDN_REJECT_REQ) + { + pPort->primitive_cmd = 0; + rel_B_chnl(pid); + isdn_send_msg(pid, MSG_REL_COMP); + rel_cr(pid); + return NULL_STATE; + } + + return -1; +} + +/************************************************************* +Function: n2_proc +Description: Overlap sending state, this state exists for an outgoing call + when the network has acknowledged the call establishment request + and is prepared to receive additional call information (if any) + in overlap mode. + Handling the process and entering into next call state. +Input: pid:port id +Return: state value:success + -1:failed +*************************************************************/ +int n2_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->primitive_cmd == ISDN_PROC_REQ) + { + pPort->primitive_cmd = 0; + pPort->w_time = 0; //stop t302 + isdn_send_msg(pid, MSG_CALL_PROC); + return OUT_CALL_PROC_STATE; + } + else if(pPort->msg_cmd == MSG_INFORMATION) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //start or restart t302 + isdn_event_handle(pid, ISDN_INFO_IND); + return OVERLAP_SD_STATE; + } + else if(pPort->primitive_cmd == ISDN_ALERT_REQ) + { + pPort->primitive_cmd = 0; + pPort->w_time = 0; //stop t302 + isdn_send_msg(pid, MSG_ALERT); + return CALL_DV_STATE; + } + else if(pPort->primitive_cmd == ISDN_SETUP_RSP) + { + pPort->primitive_cmd = 0; + pPort->w_time = 0; //stop t302 + /* Connect Backwards B-channel Here */ + isdn_send_msg(pid, MSG_CONN); + return ACTIVE_STATE; + } + else if(pPort->primitive_cmd == ISDN_PROG_REQ) + { + pPort->primitive_cmd = 0; + pPort->w_time = 0; //stop t302 + isdn_send_msg(pid, MSG_PROG); + return OVERLAP_SD_STATE; + } + + return -1; +} + +/************************************************************* +Function: n3_proc +Description: Outgoing call proceeding state, this state exists for an outgoing call + when the network has sent acknowledgement that the network has received + all call information necessary to effect call establishment. + Handling the process and entering into next call state. +Input: pid:port id +Return: state value:success + -1:failed +*************************************************************/ +int n3_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->primitive_cmd == ISDN_ALERT_REQ) + { + pPort->primitive_cmd = 0; + isdn_send_msg(pid, MSG_ALERT); + return CALL_DV_STATE; + } + else if(pPort->primitive_cmd == ISDN_SETUP_RSP) + { + pPort->primitive_cmd = 0; + /* Connect Backwards B-channel Here */ + isdn_send_msg(pid, MSG_CONN); + return ACTIVE_STATE; + } + else if(pPort->primitive_cmd == ISDN_PROG_REQ) + { + pPort->primitive_cmd = 0; + isdn_send_msg(pid, MSG_PROG); + return OUT_CALL_PROC_STATE; + } + + return -1; +} + +/************************************************************* +Function: n4_proc +Description: Call delivered state, this state exists for an outgoing call + when the network has indicated that remote user alerting + has been initiated. + Handling the process and entering into next call state. +Input: pid:port id +Return: state value:success + -1:failed +*************************************************************/ +int n4_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->primitive_cmd == ISDN_SETUP_RSP) + { + pPort->primitive_cmd = 0; + /* Connect Backwards B-channel Here */ + isdn_send_msg(pid, MSG_CONN); + return ACTIVE_STATE; + } + else if(pPort->primitive_cmd == ISDN_PROG_REQ) + { + pPort->primitive_cmd = 0; + isdn_send_msg(pid, MSG_PROG); + return CALL_DV_STATE; + } + + return -1; +} + +/************************************************************* +Function: n6_proc +Description: Call present state, this state exists for an incoming call + when the network has sent a call establishment request + but has not yet received a satisfactory response. + Handling the process and entering into next call state. +Input: pid:port id +Return: state value:success + -1:failed +*************************************************************/ +int n6_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->msg_cmd == MSG_CALL_PROC) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t303 and start t310 + isdn_event_handle(pid, ISDN_PROC_IND); + return IN_CALL_PROC_STATE; + } + else if(pPort->msg_cmd == MSG_ALERT) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t303 and start t301 + isdn_event_handle(pid, ISDN_ALERT_IND); + return CALL_RV_STATE; + } + else if(pPort->msg_cmd == MSG_CONN) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t303 + pPort->primitive_cmd = ISDN_SETUP_CNF; //msc does not provide ISDN_SETUP_COMP_REQ to isdn + isdn_event_handle(pid, ISDN_SETUP_CNF); + return CONN_REQ_STATE; + } + else if(pPort->msg_cmd == MSG_SETUP_ACK) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t303 and start t304 + isdn_event_handle(pid, ISDN_MORE_INFO_IND); + return OVERLAP_RV_STATE; + } + else if(pPort->msg_cmd == MSG_REL_COMP) //do it temporarily in isdn_comm_ctrl() + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t303 +// isdn_event_handle(pid, ISDN_REJ_IND); + rel_B_chnl(pid); + rel_cr(pid); + return NULL_STATE; + } + + return -1; +} + +/************************************************************* +Function: n7_proc +Description: Call received state, this state exists for an incoming call + when the network has received an indication that the user is alerting + but has not yet received an answer. + Handling the process and entering into next call state. +Input: pid:port id +Return: state value:success + -1:failed +*************************************************************/ +int n7_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->msg_cmd == MSG_CONN) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t301 + pPort->primitive_cmd = ISDN_SETUP_CNF; //msc does not provide ISDN_SETUP_COMP_REQ to isdn + isdn_event_handle(pid, ISDN_SETUP_CNF); + return CONN_REQ_STATE; + } + else if(pPort->msg_cmd == MSG_PROG) //support U04_09 + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t310 + isdn_event_handle(pid, ISDN_PROG_IND); + return CALL_DV_STATE; + } + + return -1; +} + +/************************************************************* +Function: n8_proc +Description: Connect request state, this state exists for an incoming call + when the network has received an answer but the network has not yet + awarded the call. + Handling the process and entering into next call state. +Input: pid:port id +Return: state value:success + -1:failed +*************************************************************/ +int n8_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->primitive_cmd == ISDN_SETUP_COMP_REQ) + { + pPort->primitive_cmd = 0; + /* Connect Backwards B-channel Here */ + isdn_send_msg(pid, MSG_CONNACK); + return ACTIVE_STATE; + } + + return -1; +} + +/************************************************************* +Function: n9_proc +Description: Incoming call proceeding state, this state exists for an incoming call + when the network has received acknowledgement that the user has received + all call information necessary to effect call establishment. + Handling the process and entering into next call state. +Input: pid:port id +Return: state value:success + -1:failed +*************************************************************/ +int n9_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->msg_cmd == MSG_ALERT) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t310 and start t301 + isdn_event_handle(pid, ISDN_ALERT_IND); + return CALL_RV_STATE; + } + else if(pPort->msg_cmd == MSG_CONN) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t310 + pPort->primitive_cmd = ISDN_SETUP_CNF; //msc does not provide ISDN_SETUP_COMP_REQ to isdn + isdn_event_handle(pid, ISDN_SETUP_CNF); + return CONN_REQ_STATE; + } + else if(pPort->msg_cmd == MSG_PROG) + { + pPort->msg_cmd = 0; + isdn_event_handle(pid, ISDN_PROG_IND); + return IN_CALL_PROC_STATE; + } + + return -1; +} + +/************************************************************* +Function: n10_proc +Description: Active state, this state exists for an incoming call + when the network has awarded the call to the called user, and + this state exists for an outgoing call when the network has indicated + that the remote user has answered the call. + Handling the process and entering into next call state. +Input: pid:port id +Return: state value:success + -1:failed +*************************************************************/ +int n10_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->msg_cmd == MSG_CONNACK) + { + pPort->msg_cmd = 0; + return ACTIVE_STATE; + } + else if(pPort->msg_cmd == MSG_NOTI) + { + pPort->msg_cmd = 0; + isdn_event_handle(pid, ISDN_NOTI_IND); + return ACTIVE_STATE; + } + else if(pPort->primitive_cmd == ISDN_NOTI_REQ) + { + pPort->primitive_cmd = 0; + isdn_send_msg(pid, MSG_NOTI); + return ACTIVE_STATE; + } + + return -1; +} + +/************************************************************* +Function: n11_proc +Description: Disconnect request state, this state exists when the network has received + a request from the user to clear the end-to-end connection (if any). + Handling the process and entering into next call state. +Input: pid:port id +Return: state value:success + -1:failed +*************************************************************/ +int n11_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->primitive_cmd == ISDN_RELEASE_REQ) + { + pPort->primitive_cmd = 0; + return nr_proc(pid); //REL_REQ_STATE; + } + else if(pPort->msg_cmd == MSG_REL) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop all + memcpy(&isdn_sd_msg.msg_list.relComp.cause, &isdn_rv_msg.msg_list.rel.cause, sizeof(CauseStr)); + isdn_event_handle(pid, ISDN_RELEASE_CNF); + rel_B_chnl(pid); + isdn_send_msg(pid, MSG_REL_COMP); + rel_cr(pid); + isdn_cpc_clear(pPort); + return NULL_STATE; + } + + return -1; +} + +/************************************************************* +Function: n12_proc +Description: Disconnect indication state, this state exists when the network has + disconnected the end-to-end connection (if any) and has sent an + invitation to disconnect the user-network connection. + Handling the process and entering into next call state. +Input: pid:port id +Return: state value:success + -1:failed +*************************************************************/ +int n12_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->msg_cmd == MSG_DISC) + { + pPort->msg_cmd = 0; + memcpy(&isdn_sd_msg.msg_list.rel.cause, &isdn_rv_msg.msg_list.disc.cause, sizeof(CauseStr)); + return nr_proc(pid); //REL_REQ_STATE + } + else if(pPort->msg_cmd == MSG_REL) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t305 or t306 + memcpy(&isdn_sd_msg.msg_list.relComp.cause, &isdn_rv_msg.msg_list.rel.cause, sizeof(CauseStr)); +// isdn_event_handle(pid, ISDN_RELEASE_IND); + isdn_event_handle(pid, ISDN_RELEASE_CNF); + rel_B_chnl(pid); + isdn_send_msg(pid, MSG_REL_COMP); + rel_cr(pid); + isdn_cpc_clear(pPort); + return NULL_STATE; + } + + return -1; +} + +/************************************************************* +Function: n19_proc +Description: Release request state, this state exists when the network has + requested the user to release and is waiting for a response. + Handling the process and entering into next call state. +Input: pid:port id +Return: state value:success + -1:failed +*************************************************************/ +int n19_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if((pPort->msg_cmd == MSG_REL_COMP) + || (pPort->msg_cmd == MSG_REL)) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t308 + isdn_event_handle(pid, ISDN_RELEASE_CNF); + rel_B_chnl(pid); + rel_cr(pid); + isdn_cpc_clear(pPort); + return NULL_STATE; + } + else if(pPort->msg_cmd == MSG_STATUS) + { + pPort->msg_cmd = 0; + if(isdn_rv_msg.msg_list.status.call_stat.stat_val != 0) + return REL_REQ_STATE; + pPort->w_time = 0; //stop t308 + isdn_event_handle(pid, ISDN_STAT_IND); + rel_B_chnl(pid); + rel_cr(pid); + isdn_cpc_clear(pPort); + return NULL_STATE; + } + + return -1; +} + +/************************************************************* +Function: n25_proc +Description: Overlap receiving state, this state exists for an incoming call + when the network has received acknowledgement of the call + establishment request which permits the network to send + additional call information (if any) in the overlap mode + Handling the process and entering into next call state. +Input: pid:port id +Return: state value:success + -1:failed +*************************************************************/ +int n25_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->primitive_cmd == ISDN_INFO_REQ) //ISDN_MORE_INFO_REQ + { + pPort->primitive_cmd = 0; + pPort->w_time = 0; //start or restart t304 + isdn_send_msg(pid, MSG_INFORMATION); + return OVERLAP_RV_STATE; + } + else if(pPort->msg_cmd == MSG_ALERT) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t304 and start t301 + isdn_event_handle(pid, ISDN_ALERT_IND); + return CALL_RV_STATE; + } + else if(pPort->msg_cmd == MSG_CONN) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t304 + pPort->primitive_cmd = ISDN_SETUP_CNF; //msc does not provide ISDN_SETUP_COMP_REQ to isdn + isdn_event_handle(pid, ISDN_SETUP_CNF); + return CONN_REQ_STATE; + } + else if(pPort->msg_cmd == MSG_CALL_PROC) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t304 and start t310 + isdn_event_handle(pid, ISDN_PROC_IND); + return IN_CALL_PROC_STATE; + } + else if(pPort->msg_cmd == MSG_PROG) + { + pPort->msg_cmd = 0; + isdn_event_handle(pid, ISDN_PROG_IND); + return OVERLAP_RV_STATE; + } + + return -1; +} + + +/*user side state processing*/ +int u0_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->primitive_cmd == ISDN_SETUP_REQ) + { + pPort->primitive_cmd = 0; + if(cr_sel(pid) != 1) + { + isdn_log_err(pid, "cr_sel error!\r\n"); + return NULL_STATE; + } + isdn_send_msg(pid, MSG_SETUP); + pPort->timer_flag = CALLOUT_FLAG; + pPort->w_time = 0; //start t303 + pPort->timeout_fg = 0; + return CALL_INIT_STATE; + } + else if(pPort->msg_cmd == MSG_SETUP) + { + pPort->msg_cmd = 0; + //pPort->call_ref = msg_cref[pid]; + isdn_event_handle(pid, ISDN_SETUP_IND); + return CALL_PRE_STATE; + } + + return -1; +} + +int u1_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->msg_cmd == MSG_SETUP_ACK) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t303 and start t304 + isdn_event_handle(pid, ISDN_MORE_INFO_IND); + return OVERLAP_SD_STATE; + } + else if(pPort->msg_cmd == MSG_CALL_PROC) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t303 and start t310 + isdn_event_handle(pid, ISDN_PROC_IND); + return OUT_CALL_PROC_STATE; + } + else if(pPort->msg_cmd == MSG_ALERT) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t303 + isdn_event_handle(pid, ISDN_ALERT_IND); + return CALL_DV_STATE; + } + else if(pPort->msg_cmd == MSG_CONN) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t303 + isdn_event_handle(pid, ISDN_SETUP_CNF); + isdn_send_msg(pid, MSG_CONNACK); + return ACTIVE_STATE; + } + else if(pPort->msg_cmd == MSG_REL_COMP) //do it temporarily in isdn_comm_ctrl() + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t303 + //isdn_event_handle(pid, ISDN_REJ_IND); + rel_cr(pid); + return NULL_STATE; + } + + return -1; +} + +int u2_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->msg_cmd == MSG_CALL_PROC) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t304 and start t310 + isdn_event_handle(pid, ISDN_PROC_IND); + return OUT_CALL_PROC_STATE; + } + else if(pPort->msg_cmd == MSG_ALERT) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t304 + isdn_event_handle(pid, ISDN_ALERT_IND); + return CALL_DV_STATE; + } + else if(pPort->msg_cmd == MSG_CONN) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t304 + isdn_event_handle(pid, ISDN_SETUP_CNF); + isdn_send_msg(pid, MSG_CONNACK); + return ACTIVE_STATE; + } + else if(pPort->msg_cmd == MSG_PROG) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t304 + isdn_event_handle(pid, ISDN_PROG_IND); + return OVERLAP_SD_STATE; + } + else if(pPort->primitive_cmd == ISDN_INFO_REQ) + { + pPort->primitive_cmd = 0; + pPort->w_time = 0; //start or restart t304 + isdn_send_msg(pid, MSG_INFORMATION); + return OVERLAP_SD_STATE; + } + + return -1; +} + +int u3_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->msg_cmd == MSG_ALERT) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t310 and start t301 + isdn_event_handle(pid, ISDN_ALERT_IND); + return CALL_DV_STATE; + } + else if(pPort->msg_cmd == MSG_CONN) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t310 + isdn_event_handle(pid, ISDN_SETUP_CNF); + isdn_send_msg(pid, MSG_CONNACK); + return ACTIVE_STATE; + } + else if(pPort->msg_cmd == MSG_PROG) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t310 + isdn_event_handle(pid, ISDN_PROG_IND); + return OUT_CALL_PROC_STATE; + } + + return -1; +} + +int u4_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->msg_cmd == MSG_CONN) + { + pPort->msg_cmd = 0; + isdn_event_handle(pid, ISDN_SETUP_CNF); + isdn_send_msg(pid, MSG_CONNACK); + return ACTIVE_STATE; + } + else if(pPort->msg_cmd == MSG_PROG) //support U04_09 + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t310 + isdn_event_handle(pid, ISDN_PROG_IND); + return CALL_DV_STATE; + } + + return -1; +} + +int u6_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->primitive_cmd == ISDN_MORE_INFO_REQ) + { + pPort->primitive_cmd = 0; + pPort->w_time = 0; //start t302 + isdn_send_msg(pid, MSG_SETUP_ACK); + return OVERLAP_RV_STATE; + } + else if(pPort->primitive_cmd == ISDN_PROC_REQ) + { + pPort->primitive_cmd = 0; + isdn_send_msg(pid, MSG_CALL_PROC); + return IN_CALL_PROC_STATE; + } + else if(pPort->primitive_cmd == ISDN_ALERT_REQ) + { + pPort->primitive_cmd = 0; + isdn_send_msg(pid, MSG_ALERT); + return CALL_RV_STATE; + } + else if(pPort->primitive_cmd == ISDN_SETUP_RSP) + { + pPort->primitive_cmd = 0; + pPort->w_time = 0; //start t313 + isdn_send_msg(pid, MSG_CONN); + return CONN_REQ_STATE; + } + else if(pPort->primitive_cmd == ISDN_REJECT_REQ) + { + pPort->primitive_cmd = 0; + rel_B_chnl(pid); + isdn_send_msg(pid, MSG_REL_COMP); + rel_cr(pid); + return NULL_STATE; + } + + return -1; +} + +int u7_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->primitive_cmd == ISDN_SETUP_RSP) + { + pPort->primitive_cmd = 0; + pPort->w_time = 0; //start t313 + isdn_send_msg(pid, MSG_CONN); + return CONN_REQ_STATE; + } + else if(pPort->primitive_cmd == ISDN_PROG_REQ) + { + pPort->primitive_cmd = 0; + isdn_send_msg(pid, MSG_PROG); + return CALL_DV_STATE; + } + + return -1; +} + +int u8_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->msg_cmd == MSG_CONNACK) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t313 + isdn_event_handle(pid, ISDN_SETUP_COMP_IND); + return ACTIVE_STATE; + } + + return -1; +} + +int u9_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->primitive_cmd == ISDN_ALERT_REQ) + { + pPort->primitive_cmd = 0; + isdn_send_msg(pid, MSG_ALERT); + return CALL_RV_STATE; + } + else if(pPort->primitive_cmd == ISDN_SETUP_RSP) + { + pPort->primitive_cmd = 0; + pPort->w_time = 0; //start t313 + isdn_send_msg(pid, MSG_CONN); + return CONN_REQ_STATE; + } + else if(pPort->primitive_cmd == ISDN_PROG_REQ) + { + pPort->primitive_cmd = 0; + isdn_send_msg(pid, MSG_PROG); + return IN_CALL_PROC_STATE; + } + + return -1; +} + +int u10_proc(u32 pid) //?? add by gengxin +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->msg_cmd == MSG_NOTI) + { + pPort->msg_cmd = 0; + isdn_event_handle(pid, ISDN_NOTI_IND); + return ACTIVE_STATE; + } + else if(pPort->primitive_cmd == ISDN_NOTI_REQ) + { + pPort->primitive_cmd = 0; + isdn_send_msg(pid, MSG_NOTI); + return ACTIVE_STATE; + } + + return -1; +} + +int u11_proc(u32 pid) //0911 +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->msg_cmd == MSG_DISC) + { + pPort->msg_cmd = 0; + memcpy(&isdn_sd_msg.msg_list.rel.cause, &isdn_rv_msg.msg_list.disc.cause, sizeof(CauseStr)); + return nr_proc(pid); + } + else if(pPort->msg_cmd == MSG_REL) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t305 + memcpy(&isdn_sd_msg.msg_list.relComp.cause, &isdn_rv_msg.msg_list.rel.cause, sizeof(CauseStr)); +// isdn_event_handle(pid, ISDN_RELEASE_IND); + isdn_event_handle(pid, ISDN_RELEASE_CNF); + rel_B_chnl(pid); + isdn_send_msg(pid, MSG_REL_COMP); + rel_cr(pid); + isdn_cpc_clear(pPort); + return NULL_STATE; + } + + return -1; +} + +int u12_proc(u32 pid) //0911 +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->msg_cmd == MSG_REL) + { + pPort->msg_cmd = 0; + memcpy(&isdn_sd_msg.msg_list.relComp.cause, &isdn_rv_msg.msg_list.rel.cause, sizeof(CauseStr)); +// isdn_event_handle(pid, ISDN_RELEASE_IND); + isdn_event_handle(pid, ISDN_RELEASE_CNF); + rel_B_chnl(pid); + isdn_send_msg(pid, MSG_REL_COMP); + rel_cr(pid); + isdn_cpc_clear(pPort); + return NULL_STATE; + } + else if(pPort->primitive_cmd == ISDN_RELEASE_REQ) + { + pPort->primitive_cmd = 0; + return nr_proc(pid); + } + + return -1; +} + +int u19_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if((pPort->msg_cmd == MSG_REL_COMP) || + (pPort->msg_cmd == MSG_REL)) + { + pPort->msg_cmd = 0; + isdn_event_handle(pid, ISDN_RELEASE_CNF); + rel_B_chnl(pid); + rel_cr(pid); + isdn_cpc_clear(pPort); + return NULL_STATE; + } + else if(pPort->msg_cmd == MSG_STATUS) + { + pPort->msg_cmd = 0; + if(isdn_rv_msg.msg_list.status.call_stat.stat_val != 0) + return REL_REQ_STATE; + isdn_event_handle(pid, ISDN_STAT_IND); + rel_B_chnl(pid); + rel_cr(pid); + isdn_cpc_clear(pPort); + return NULL_STATE; + } + + return -1; +} + +int u25_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->msg_cmd == MSG_INFORMATION) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //start t302 + isdn_event_handle(pid, ISDN_INFO_IND); + return OVERLAP_RV_STATE; + } + else if(pPort->primitive_cmd == ISDN_PROC_REQ) + { + pPort->primitive_cmd = 0; + pPort->w_time = 0; //stop t302 + isdn_send_msg(pid, MSG_CALL_PROC); + return IN_CALL_PROC_STATE; + } + else if(pPort->primitive_cmd == ISDN_ALERT_REQ) + { + pPort->primitive_cmd = 0; + pPort->w_time = 0; //stop t302 + isdn_send_msg(pid, MSG_ALERT); + return CALL_RV_STATE; + } + else if(pPort->primitive_cmd == ISDN_SETUP_RSP) + { + pPort->primitive_cmd = 0; + pPort->w_time = 0; //stop t302 and start t313 + isdn_send_msg(pid, MSG_CONN); + return CONN_REQ_STATE; + } + else if(pPort->primitive_cmd == ISDN_PROG_REQ) + { + pPort->primitive_cmd = 0; + isdn_send_msg(pid, MSG_PROG); + return OVERLAP_RV_STATE; + } + + return -1; +} + + +/* Global Call Reference Procedures */ +/************************************************************* +Function: trans_callref_sd_rest_req +Description: +Input: +Output: +Return: +*************************************************************/ +int trans_callref_sd_rest_req(u32 pid, u8 g_pri_cmd) //isdn_restart_req() +{ + int i, link_id, cic_range; + u16 circuit_id; + const pal_circuit_struct *circuit_ptr = NULL; + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + circuit_id = pid / ISDN_CIRCUIT_CIC; + circuit_ptr = pal_circuit_ptr(circuit_id); + if(circuit_ptr == NULL) + return ISDN_CM_FAILED; + + link_id = circuit_ptr->attrib.link_id; + cic_range = circuit_ptr->attrib.cic_range; + if(cic_range == 24) //T1 + cic_range++; + if(isdn_rs.link_pond[link_id].restart_clas == 0) //indicated channels + { + if(pPort->cic_val != 0) + { + pid = find_port_by_cic(pPort->cic_val, circuit_id); + pPort = &isdn_rs.port_pond[pid]; + if(g_pri_cmd == ISDN_RESTART_REQ) + { + pPort->g_pri_cmd = ISDN_RESTART_REQ; + isdn_cpc_proc(pid); + if(pPort->g_pri_cmd != 0 && pPort->g_pri_cmd != ISDN_RESTART_CNF) + { + isdn_trace_func(pid, "[waring]primitive cmd discard.(cmd=%d)\r\n", pPort->primitive_cmd); + pPort->g_pri_cmd = 0; + } + return circuit_ptr->attrib.cic_range; + } + else if(g_pri_cmd == ISDN_RESTART_CNF) + { + if(pPort->g_pri_cmd != g_pri_cmd) + { + pPort->g_pri_cmd = 0; + isdn_trace_func(pid, "[waring]primitive cmd is not ISDN_RESTART_CNF.(cmd=%d)\r\n", pPort->primitive_cmd); + return ISDN_CM_FAILED; + } + pPort->g_pri_cmd = 0; + return circuit_ptr->attrib.cic_range; + } + } + } + else if(isdn_rs.link_pond[link_id].restart_clas == 6) //single interface + { + for(i = 1; i < cic_range; i++) + { + pid = circuit_id * ISDN_CIRCUIT_CIC + i; + pPort = &isdn_rs.port_pond[pid]; + if(pPort->enable != 0) + { + if(g_pri_cmd == ISDN_RESTART_REQ) + { + pPort->g_pri_cmd = ISDN_RESTART_REQ; + isdn_cpc_proc(pid); + if(pPort->g_pri_cmd != 0 && pPort->g_pri_cmd != ISDN_RESTART_CNF) + { + isdn_trace_func(pid, "[waring]primitive cmd discard.(cmd=%d)\r\n", pPort->primitive_cmd); + pPort->g_pri_cmd = 0; + } + } + else if(g_pri_cmd == ISDN_RESTART_CNF) + { + if(pPort->g_pri_cmd != g_pri_cmd) + { + pPort->g_pri_cmd = 0; + isdn_trace_func(pid, "[waring]primitive cmd is not ISDN_RESTART_CNF.(cmd=%d)\r\n", pPort->primitive_cmd); + return ISDN_CM_FAILED; + } + pPort->g_pri_cmd = 0; + } + } + } +// isdn_rs.link_pond[link_id].restart_clas = 0; + return circuit_ptr->attrib.cic_range; + } + + return ISDN_CM_FAILED; +} + +static inline void restart_clear(u32 pid) +{ + int i, link_id, cic_range; + u16 circuit_id = pid / ISDN_CIRCUIT_CIC; + const pal_circuit_struct *circuit_ptr = pal_circuit_ptr(circuit_id); + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + if(circuit_ptr == NULL) + return; + + link_id = circuit_ptr->attrib.link_id; + cic_range = circuit_ptr->attrib.cic_range; + if(cic_range == 24) //T1 + cic_range++; + if(isdn_rs.link_pond[link_id].restart_clas == 0) //indicated channels + { + pid = find_port_by_cic(pPort->cic_val, circuit_id); + pPort->cic_val = 0; + rel_B_chnl(pid); + isdn_cpc_clear(pPort); + } + else + { + isdn_rs.link_pond[link_id].restart_clas = 0; + for(i = 1; i < cic_range; i++) + { + pid = circuit_id * ISDN_CIRCUIT_CIC + i; + pPort = &isdn_rs.port_pond[pid]; + if(pPort->enable != 0) + { + rel_B_chnl(pid); + isdn_cpc_clear(pPort); + } + } + } +} + +int rest0_proc(u32 pid, IsdnRestart *restart) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->msg_cmd == MSG_RESTART) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //start t317 + memcpy(restart, &isdn_rv_msg.msg_list.restart, sizeof(IsdnRestart)); + trans_callref_sd_rest_req(pid, ISDN_RESTART_REQ); + return GLOBAL_RESTART_STATE; + } + else if(pPort->g_pri_cmd == ISDN_M_RESTART_REQ) + { + pPort->g_pri_cmd = 0; + pPort->timeout_fg = 0; + pPort->w_time = 0; //start t316 + isdn_send_msg(pid, MSG_RESTART); + trans_callref_sd_rest_req(pid, ISDN_RESTART_REQ); + return GLOBAL_RESTART_REQ_STATE; + } + + return -1; +} + +int rest1_proc(u32 pid) +{ + static int rest_resp_on = 0; //?? + static int rest_ack_on = 0; + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->msg_cmd == MSG_REST_ACK) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t316 + if(rest_resp_on) + { + rest_resp_on = 0; + restart_clear(pid); + return GLOBAL_NULL_STATE; + } + else + rest_ack_on = 1; + } + else if(pPort->g_pri_cmd == ISDN_RESTART_CNF) + { + pPort->g_pri_cmd = 0; + if(rest_ack_on) + { + rest_ack_on = 0; + restart_clear(pid); + return GLOBAL_NULL_STATE; + } + else + rest_resp_on = 1; + } + else if(pPort->msg_cmd == MSG_RESTART) + { + pPort->msg_cmd = 0; + trans_callref_sd_rest_req(pid, ISDN_RESTART_REQ); + return GLOBAL_RESTART_STATE; + } + + return -1; +} + +int rest2_proc(u32 pid, IsdnRestart restart) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + if(pPort->g_pri_cmd == ISDN_RESTART_CNF) + { + pPort->g_pri_cmd = 0; + pPort->w_time = 0; + memcpy(&isdn_sd_msg.msg_list.restAck, (IsdnRestAck *)&restart, sizeof(IsdnRestAck)); + isdn_send_msg(pid, MSG_REST_ACK); + restart_clear(pid); + return GLOBAL_NULL_STATE; + } + else if(pPort->msg_cmd == MSG_RESTART) + { + pPort->msg_cmd = 0; + trans_callref_sd_rest_req(pid, ISDN_RESTART_REQ); + return GLOBAL_RESTART_STATE; + } + + return -1; +} + +void isdn_restart_ctrl(u32 pid) +{ + int num = 0; + static IsdnRestart restart; + ISDN_Port_struct *pPort = &(isdn_rs.port_pond[pid]); + const pal_circuit_struct *circuit_ptr = pal_circuit_ptr(pid / ISDN_CIRCUIT_CIC); + if(circuit_ptr == NULL) + return; + + switch(pPort->cic_state.call_state) + { + case CALLOUT_FLAG: + case CALLIN_FLAG: + case GLOBAL_NULL_STATE: + switch(rest0_proc(pid, &restart)) + { + case GLOBAL_RESTART_REQ_STATE: + pPort->cic_state.call_state = GLOBAL_RESTART_REQ_STATE; + break; + case GLOBAL_RESTART_STATE: + pPort->cic_state.call_state = GLOBAL_RESTART_STATE; + break; + default: + break; + } + break; + case GLOBAL_RESTART_REQ_STATE: + switch(rest1_proc(pid)) + { + case GLOBAL_NULL_STATE: + pPort->cic_state.call_state = GLOBAL_NULL_STATE; + break; + case GLOBAL_RESTART_STATE: + pPort->cic_state.call_state = GLOBAL_RESTART_STATE; + break; + default: + break; + } + break; + case GLOBAL_RESTART_STATE: + switch(rest2_proc(pid, restart)) + { + case GLOBAL_NULL_STATE: + pPort->cic_state.call_state = GLOBAL_NULL_STATE; + break; + case GLOBAL_RESTART_STATE: + pPort->cic_state.call_state = GLOBAL_RESTART_STATE; + break; + default: + break; + } + break; + default: + break; + } + +// printf("global state = 0x%02x\n",pPort->cic_state.call_state); + if(pPort->g_pri_cmd == ISDN_RESTART_REQ) + { + pPort->g_pri_cmd = 0; + if(pPort->cic_state.call_state == GLOBAL_RESTART_STATE) + memcpy(&isdn_sd_msg.msg_list.restAck, &isdn_rv_msg.msg_list.restart, sizeof(IsdnRestart)); + if((num = trans_callref_sd_rest_req(pid, ISDN_RESTART_CNF)) == circuit_ptr->attrib.cic_range) + pPort->g_pri_cmd = ISDN_RESTART_CNF; +// isdn_restart_ctrl(pid); + } + else if(pPort->g_pri_cmd != 0) + { + isdn_log_err(pid, "global g_pri_cmd = 0x%x\r\n", pPort->g_pri_cmd); + pPort->g_pri_cmd = 0; + } + + if(pPort->msg_cmd != 0) + { + isdn_log_err(pid, "global msg_cmd = 0x%x\r\n", pPort->msg_cmd); + pPort->msg_cmd = 0; + isdn_set_status(&isdn_sd_msg.msg_list.status, pPort->cic_state.call_state, CAUSE_INVALID_CR); //cause 81 + isdn_send_msg(pid, MSG_STATUS); + } + +} + + +/************************************************************* +Function: not_isdn_rel_st +Description: Handling state is isdn release state or not +Input: state:call state +Return: ISDN_CM_OK:success + ISDN_CM_FAILED:failed +*************************************************************/ +static int not_isdn_rel_st(u8 state) +{ + if((state != NULL_STATE) && + (state != DISC_REQ_STATE) && + (state != DISC_IND_STATE) && + (state != REL_REQ_STATE)) + return ISDN_CM_OK; + else + return ISDN_CM_FAILED; +} + +/************************************************************* +Function: isdn_comm_ctrl +Description: ISDN Protocol Common Control +Input: pid:port id +Return: state value:success +*************************************************************/ +u8 isdn_comm_ctrl(u32 pid) +{ + u8 state, msg_cmd, pri_cmd, g_pri_cmd; + ISDN_Port_struct *pPort = &(isdn_rs.port_pond[pid]); + const pal_circuit_struct *circuit_ptr = pal_circuit_ptr(pid / ISDN_CIRCUIT_CIC); + if(circuit_ptr == NULL) + { + isdn_log_err(pid, "isdn_comm_ctrl err! circuit_id %d can't find circuit_ptr!\r\n",pid/ISDN_CIRCUIT_CIC); + return ISDN_CM_FAILED; + } + + state = pPort->fsm_state.cpc_state; + msg_cmd = pPort->msg_cmd; + pri_cmd = pPort->primitive_cmd; + g_pri_cmd = pPort->g_pri_cmd; + if(not_isdn_rel_st(state)) + { + if(msg_cmd == MSG_DISC) + { + pPort->msg_cmd = 0; + if(state != ACTIVE_STATE) + { + isdn_log_err(pid, "isdn_comm_ctrl err1!\r\n"); + } + return nd_proc(pid); + } + else if(pri_cmd == ISDN_DISCONNECT_REQ) + { + pPort->primitive_cmd = 0; + if(state != ACTIVE_STATE) + { + isdn_log_err(pid, "isdn_comm_ctrl err2!\r\n"); + } + return nc_proc(pid); + } + else if(pri_cmd == ISDN_RELEASE_REQ) + { + pPort->primitive_cmd = 0; + isdn_log_err(pid, "isdn_comm_ctrl err3, rv release req!\r\n"); + return nr_proc(pid); + } + else if(msg_cmd == MSG_REL) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop all + isdn_log_err(pid, "isdn_comm_ctrl err4, rv rel!\r\n"); + isdn_event_handle(pid, ISDN_RELEASE_IND); + rel_B_chnl(pid); +// memcpy(&isdn_sd_msg.msg_list.relComp, &isdn_rv_msg.msg_list.rel, sizeof(IsdnRel)); + isdn_send_msg(pid, MSG_REL_COMP); + rel_cr(pid); + isdn_cpc_clear(pPort); + return NULL_STATE; + } + } + + if((state != NULL_STATE) && (state != REL_REQ_STATE)) + { + if(msg_cmd == MSG_STATUS) + { + pPort->msg_cmd = 0; + if(isdn_rv_msg.msg_list.status.call_stat.stat_val == 0) + { + isdn_log_err(pid, "isdn_comm_ctrl err5, rv status with null state!\r\n"); + isdn_event_handle(pid, ISDN_STAT_IND); + rel_B_chnl(pid); + rel_cr(pid); + isdn_cpc_clear(pPort); + return NULL_STATE; + } + else if(isdn_rv_msg.msg_list.status.call_stat.stat_val != state) + { + isdn_log_err(pid, "isdn_comm_ctrl err5, rv status with no compatible state!\r\n"); + if(state == ACTIVE_STATE) + { + isdn_send_msg(pid, MSG_STAT_ENQ); + return ACTIVE_STATE; + } + isdn_set_cause(&isdn_rv_msg.msg_list.rel.cause, CAUSE_MSG_NOTCOMP_NOTIMPL); + isdn_set_cause(&isdn_sd_msg.msg_list.relComp.cause, CAUSE_MSG_NOTCOMP_NOTIMPL); + isdn_event_handle(pid, ISDN_RELEASE_IND); + rel_B_chnl(pid); + isdn_send_msg(pid, MSG_REL_COMP); + rel_cr(pid); + isdn_cpc_clear(pPort); + return NULL_STATE; + } + //cs != 0 discard msg + } + else if(msg_cmd == MSG_REL_COMP) + { + pPort->msg_cmd = 0; + isdn_log_err(pid, "isdn_comm_ctrl err6, rv rel comp!\r\n"); + isdn_event_handle(pid, ISDN_RELEASE_IND); + rel_B_chnl(pid); + rel_cr(pid); + isdn_cpc_clear(pPort); + return NULL_STATE; + } + else if(msg_cmd == MSG_INFORMATION) + { + if(state != CALL_INIT_STATE && + state != CALL_PRE_STATE && + ((state != OVERLAP_RV_STATE && circuit_ptr->attrib.user_network_if == USER_SIDE) || + (state != OVERLAP_SD_STATE && circuit_ptr->attrib.user_network_if == NETWORK_SIDE))) + { + pPort->msg_cmd = 0; + isdn_event_handle(pid, ISDN_INFO_IND); + } + } + else if(pri_cmd == ISDN_INFO_REQ) + { + if(state != CALL_INIT_STATE && + state != CALL_PRE_STATE && + ((state != OVERLAP_SD_STATE && circuit_ptr->attrib.user_network_if == USER_SIDE) || + (state != OVERLAP_RV_STATE && circuit_ptr->attrib.user_network_if == NETWORK_SIDE))) + { + pPort->primitive_cmd = 0; + isdn_send_msg(pid, MSG_INFORMATION); + } + } + } + + if(msg_cmd == MSG_STAT_ENQ) + { + pPort->msg_cmd = 0; + isdn_log_err(pid, "isdn_comm_ctrl err7, rv status enq!\r\n"); + isdn_set_status(&isdn_sd_msg.msg_list.status, state, CAUSE_STAT_ENQ); + isdn_send_msg(pid, MSG_STATUS); + } + + if(g_pri_cmd == ISDN_RESTART_REQ) //restart_request + { + pPort->g_pri_cmd = 0; + pPort->w_time = 0; + isdn_log_err(pid, "isdn_comm_ctrl err8, rv restart req!\r\n"); + isdn_set_cause(&isdn_rv_msg.msg_list.rel.cause, CAUSE_TEMP_FAIL); + isdn_event_handle(pid, ISDN_RELEASE_IND); + rel_cr(pid); + pPort->g_pri_cmd = ISDN_RESTART_CNF; +// isdn_event_handle(pid, ISDN_RESTART_CNF); //0411 + return NULL_STATE; + } + + /* DL Primitive -- Not Implemented Yet */ + return state; +} + +static void isdn_cpc_nt_proc(u32 pid) +/* +isdn״̬»ú£¬°üº¬n1 ...n25״̬ +*/ +{ + int state; + ISDN_Port_struct *pPort = &(isdn_rs.port_pond[pid]); + + state = isdn_comm_ctrl(pid); + if(state == pPort->fsm_state.cpc_state) + { + switch(state) + { + case NULL_STATE: + switch(n0_proc(pid)) + { + case CALL_INIT_STATE: + state = CALL_INIT_STATE; + break; + case CALL_PRE_STATE: + state = CALL_PRE_STATE; + break; + default: + break; + } + break; + case CALL_INIT_STATE: + switch(n1_proc(pid)) + { + case NULL_STATE: + state = NULL_STATE; + break; + case OVERLAP_SD_STATE: + state = OVERLAP_SD_STATE; + break; + case OUT_CALL_PROC_STATE: + state = OUT_CALL_PROC_STATE; + break; + default: + break; + } + break; + case OVERLAP_SD_STATE: + switch(n2_proc(pid)) + { + case OUT_CALL_PROC_STATE: + state = OUT_CALL_PROC_STATE; + break; + case CALL_DV_STATE: + state = CALL_DV_STATE; + break; + case ACTIVE_STATE: + state = ACTIVE_STATE; + break; + default: + break; + } + break; + case OUT_CALL_PROC_STATE: + switch(n3_proc(pid)) + { + case CALL_DV_STATE: + state = CALL_DV_STATE; + break; + case ACTIVE_STATE: + state = ACTIVE_STATE; + break; + default: + break; + } + break; + case CALL_DV_STATE: + switch(n4_proc(pid)) + { + case ACTIVE_STATE: + state = ACTIVE_STATE; + break; + default: + break; + } + break; + case CALL_PRE_STATE: + switch(n6_proc(pid)) + { + case NULL_STATE: + state = NULL_STATE; + break; + case CALL_RV_STATE: + state = CALL_RV_STATE; + break; + case CONN_REQ_STATE: + state = CONN_REQ_STATE; + break; + case IN_CALL_PROC_STATE: + state = IN_CALL_PROC_STATE; + break; + case OVERLAP_RV_STATE: + state = OVERLAP_RV_STATE; + break; + default: + break; + } + break; + case CALL_RV_STATE: + switch(n7_proc(pid)) + { + case CONN_REQ_STATE: + state = CONN_REQ_STATE; + break; + default: + break; + } + break; + case CONN_REQ_STATE: + switch(n8_proc(pid)) + { + case ACTIVE_STATE: + state = ACTIVE_STATE; + break; + default: + break; + } + break; + case IN_CALL_PROC_STATE: + switch(n9_proc(pid)) + { + case CALL_RV_STATE: + state = CALL_RV_STATE; + break; + case CONN_REQ_STATE: + state = CONN_REQ_STATE; + break; + default: + break; + } + break; + case ACTIVE_STATE: + switch(n10_proc(pid)) + { + case -1: + break; + default: + break; + } + break; + case DISC_REQ_STATE: + switch(n11_proc(pid)) + { + case REL_REQ_STATE: + state = REL_REQ_STATE; + break; + default: + break; + } + break; + case DISC_IND_STATE: + switch(n12_proc(pid)) + { + case NULL_STATE: + state = NULL_STATE; + break; + case REL_REQ_STATE: + state = REL_REQ_STATE; + break; + default: + break; + } + break; + case REL_REQ_STATE: + switch(n19_proc(pid)) + { + case NULL_STATE: + state = NULL_STATE; + break; + default: + break; + } + break; + case OVERLAP_RV_STATE: + switch(n25_proc(pid)) + { + case CALL_RV_STATE: + state = CALL_RV_STATE; + break; + case CONN_REQ_STATE: + state = CONN_REQ_STATE; + break; + case IN_CALL_PROC_STATE: + state = IN_CALL_PROC_STATE; + break; + default: + break; + } + break; + + default: + break; + } + } + +// printf("nt state = 0x%02x\n",state); + pPort->fsm_state.cpc_state = state; + + isdn_cc_nt(pid); + + //unexpected message and send_isdn_msg(status) //u03-04 u03-05 u01-03 + if(pPort->msg_cmd != 0) + { + pPort->msg_cmd = 0; + isdn_log_err(pid, "isdn_cpc_nt_proc, receive msg=0x02%x, not handle!\r\n"); + isdn_set_status(&isdn_sd_msg.msg_list.status, pPort->fsm_state.cpc_state, CAUSE_MSG_NOTCOMP); //cause 98 101 + isdn_send_msg(pid, MSG_STATUS); + } + + return; +} + +static void isdn_cpc_lt_proc(u32 pid) +{ + int state; + ISDN_Port_struct *pPort = &(isdn_rs.port_pond[pid]); + + state = isdn_comm_ctrl(pid); + if(state == pPort->fsm_state.cpc_state) + { + switch(state) + { + case NULL_STATE: + switch(u0_proc(pid)) + { + case CALL_INIT_STATE: + state = CALL_INIT_STATE; + break; + case CALL_PRE_STATE: + state = CALL_PRE_STATE; + default: + break; + } + break; + case CALL_INIT_STATE: + switch(u1_proc(pid)) + { + case NULL_STATE: + state = NULL_STATE; + break; + case OVERLAP_SD_STATE: + state = OVERLAP_SD_STATE; + break; + case OUT_CALL_PROC_STATE: + state = OUT_CALL_PROC_STATE; + break; + case CALL_DV_STATE: + state = CALL_DV_STATE; + break; + case ACTIVE_STATE: + state = ACTIVE_STATE; + break; + default: + break; + } + break; + case OVERLAP_SD_STATE: + switch(u2_proc(pid)) + { + case OUT_CALL_PROC_STATE: + state = OUT_CALL_PROC_STATE; + break; + case CALL_DV_STATE: + state = CALL_DV_STATE; + break; + case ACTIVE_STATE: + state = ACTIVE_STATE; + break; + default: + break; + } + break; + case OUT_CALL_PROC_STATE: + switch(u3_proc(pid)) + { + case CALL_DV_STATE: + state = CALL_DV_STATE; + break; + case ACTIVE_STATE: + state = ACTIVE_STATE; + break; + default: + break; + } + break; + case CALL_DV_STATE: + switch(u4_proc(pid)) + { + case ACTIVE_STATE: + state = ACTIVE_STATE; + break; + default: + break; + } + break; + case CALL_PRE_STATE: + switch(u6_proc(pid)) + { + case NULL_STATE: + state = NULL_STATE; + break; + case CALL_RV_STATE: + state = CALL_RV_STATE; + break; + case CONN_REQ_STATE: + state = CONN_REQ_STATE; + break; + case IN_CALL_PROC_STATE: + state = IN_CALL_PROC_STATE; + break; + case OVERLAP_RV_STATE: + state = OVERLAP_RV_STATE; + break; + default: + break; + } + break; + case CALL_RV_STATE: + switch(u7_proc(pid)) + { + case CONN_REQ_STATE: + state = CONN_REQ_STATE; + break; + default: + break; + } + break; + case CONN_REQ_STATE: + switch(u8_proc(pid)) + { + case ACTIVE_STATE: + state = ACTIVE_STATE; + break; + default: + break; + } + break; + case IN_CALL_PROC_STATE: + switch(u9_proc(pid)) + { + case CALL_RV_STATE: + state = CALL_RV_STATE; + break; + case CONN_REQ_STATE: + state = CONN_REQ_STATE; + break; + default: + break; + } + break; + case ACTIVE_STATE: + switch(u10_proc(pid)) + { + case -1: + break; + default: + break; + } + break; + case DISC_REQ_STATE: + switch(u11_proc(pid)) + { + case NULL_STATE: + state = NULL_STATE; + break; + case REL_REQ_STATE: + state = REL_REQ_STATE; + break; + default: + break; + } + break; + case DISC_IND_STATE: + switch(u12_proc(pid)) + { + case NULL_STATE: + state = NULL_STATE; + break; + case REL_REQ_STATE: + state = REL_REQ_STATE; + break; + default: + break; + } + break; + case REL_REQ_STATE: + switch(u19_proc(pid)) + { + case NULL_STATE: + state = NULL_STATE; + break; + default: + break; + } + break; + case OVERLAP_RV_STATE: + switch(u25_proc(pid)) + { + case CALL_RV_STATE: + state = CALL_RV_STATE; + break; + case CONN_REQ_STATE: + state = CONN_REQ_STATE; + break; + case IN_CALL_PROC_STATE: + state = IN_CALL_PROC_STATE; + break; + default: + break; + } + break; + default: + break; + } + } + +// printf("lt state = 0x%02x\n",state); + pPort->fsm_state.cpc_state = state; + + isdn_cc_lt(pid); + + //unexpected message and send_isdn_msg(status) //u03-04 u01-03 + if(pPort->msg_cmd != 0) + { + pPort->msg_cmd = 0; + isdn_log_err(pid, "isdn_cpc_lt_proc, receive msg=0x02%x, not handle!\r\n"); + isdn_set_status(&isdn_sd_msg.msg_list.status, pPort->fsm_state.cpc_state, CAUSE_MSG_NOTCOMP); //cause 98 101 + isdn_send_msg(pid, MSG_STATUS); + } + + return; +} + +void isdn_cpc_proc(u32 pid) +{ + int circuit_id = pid / ISDN_CIRCUIT_CIC; + const pal_circuit_struct *circuit_ptr = pal_circuit_ptr(circuit_id); + if(circuit_ptr == NULL) + return; + + if(circuit_ptr->attrib.user_network_if) + isdn_cpc_lt_proc(pid); + else + isdn_cpc_nt_proc(pid); +} + +static int isdn_cc_nt(u32 pid) +{ + ISDN_Port_struct *pPort = &(isdn_rs.port_pond[pid]); + + switch(pPort->fsm_state.cpc_state) + { + case CONN_REQ_STATE: + if(pPort->primitive_cmd == ISDN_SETUP_CNF) //msc does not provide ISDN_SETUP_COMP_REQ to isdn + { + pPort->primitive_cmd = ISDN_SETUP_COMP_REQ; + isdn_cpc_nt_proc(pid); + } + break; + case DISC_REQ_STATE: + break; + default: + break; + } + if(pPort->primitive_cmd != 0) + { + pPort->primitive_cmd = 0; + isdn_log_err(pid, "isdn_cc_nt, primitive err!\r\n"); + return ISDN_CM_FAILED; + } + + return ISDN_CM_OK; +} + +static int isdn_cc_lt(u32 pid) +{ + ISDN_Port_struct *pPort = &(isdn_rs.port_pond[pid]); + + switch(pPort->fsm_state.cpc_state) + { + case DISC_IND_STATE: + break; + default: + break; + } + if(pPort->primitive_cmd != 0) + { + pPort->primitive_cmd = 0; + isdn_log_err(pid, "isdn_cc_lt, primitive err!\r\n"); + return ISDN_CM_FAILED; + } + + return ISDN_CM_OK; +} + +static void isdn_cpc_nt_timer(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + switch(pPort->fsm_state.cpc_state) + { + case OVERLAP_SD_STATE: +// if((++(pPort->w_time)) % (isdn_timer_var.t302) == 0) +// { +// pPort->w_time = 0; +// isdn_log_err(pid, "[timeout]: NT OVERLAP SD STATE\r\n"); +// isdn_event_handle(pid, ISDN_TIMEOUT_IND); +// } + break; + case CALL_PRE_STATE: + if((++(pPort->w_time)) % (isdn_timer_var.t303) == 0) + { + pPort->w_time = 0; + if(pPort->timeout_fg == 0) + { + pPort->timeout_fg = 1; + isdn_log_err(pid, "[timeout]:t303 NT CALL PRE STATE first timeout, resend SETUP\r\n"); + isdn_send_msg(pid, MSG_SETUP); + } + else + { + isdn_log_err(pid, "[timeout]:t303 NT CALL PRE STATE second timeout, clear call!\r\n"); + isdn_set_cause(&isdn_rv_msg.msg_list.rel.cause, CAUSE_TIMER_EXPIRY); + isdn_event_handle(pid, ISDN_RELEASE_IND); + rel_B_chnl(pid); + isdn_set_cause(&isdn_sd_msg.msg_list.relComp.cause, CAUSE_TIMER_EXPIRY); + isdn_send_msg(pid, MSG_REL_COMP); + rel_cr(pid); + isdn_cpc_clear(pPort); + } + } + break; + case CALL_RV_STATE: + if((++(pPort->w_time)) % (isdn_timer_var.t301) == 0) + { + pPort->w_time = 0; + isdn_log_err(pid, "[timeout]:t301 NT CALL RV STATE\r\n"); + isdn_event_handle(pid, ISDN_TIMEOUT_IND); + } + break; + case IN_CALL_PROC_STATE: + if((++(pPort->w_time)) % (isdn_timer_var.t310) == 0) + { + pPort->w_time = 0; + isdn_log_err(pid, "[timeout]:t310 NT IN CALL PROC STATE\r\n"); + isdn_event_handle(pid, ISDN_TIMEOUT_IND); + } + break; + case DISC_IND_STATE: + if((++(pPort->w_time)) % (isdn_timer_var.t305) == 0) + { + isdn_log_err(pid, "[timeout]:t305 NT DISC IND STATE\r\n"); + isdn_set_cause(&isdn_sd_msg.msg_list.rel.cause, CAUSE_TIMER_EXPIRY); + nr_proc(pid); + pPort->fsm_state.cpc_state = REL_REQ_STATE; + } + break; + case REL_REQ_STATE: + if((++(pPort->w_time)) % (isdn_timer_var.t308) == 0) + { + pPort->w_time = 0; + if(pPort->timeout_fg == 0) + { + pPort->timeout_fg = 1; + isdn_log_err(pid, "[timeout]:t308 NT REL REQ STATE first timeout, resend REL\r\n"); + isdn_set_cause(&isdn_sd_msg.msg_list.rel.cause, CAUSE_TIMER_EXPIRY); + isdn_send_msg(pid, MSG_REL); + } + else + { + isdn_log_err(pid, "[timeout]:t308 NT REL REQ STATE\r\n"); + isdn_set_cause(&isdn_rv_msg.msg_list.relComp.cause, CAUSE_TIMER_EXPIRY); + isdn_event_handle(pid, ISDN_RELEASE_CNF); //error + rel_B_chnl(pid); + rel_cr(pid); + isdn_cpc_clear(pPort); + } + } + break; + case OVERLAP_RV_STATE: + if((++(pPort->w_time)) % (isdn_timer_var.t304) == 0) + { + pPort->w_time = 0; + isdn_log_err(pid, "[timeout]:t304 NT OVERLAP RV STATE\r\n"); + isdn_event_handle(pid, ISDN_TIMEOUT_IND); + } + break; + default: + break; + } + + return; +} + +static void isdn_cpc_lt_timer(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + switch(pPort->fsm_state.cpc_state) + { + case CALL_INIT_STATE: + if((++(pPort->w_time)) % (isdn_timer_var.t303) == 0) + { + pPort->w_time = 0; + if(pPort->timeout_fg == 0) + { + pPort->timeout_fg = 1; + isdn_log_err(pid, "[timeout]:t303 LT CALL INIT STATE, resend SETUP\r\n"); + isdn_send_msg(pid, MSG_SETUP); + } + else + { + isdn_log_err(pid, "[timeout]:t303 LT CALL INIT STATE, second timeout, clear call!\r\n"); + isdn_set_cause(&isdn_rv_msg.msg_list.rel.cause, CAUSE_TIMER_EXPIRY); + isdn_event_handle(pid, ISDN_RELEASE_IND); + rel_B_chnl(pid); + isdn_set_cause(&isdn_sd_msg.msg_list.relComp.cause, CAUSE_TIMER_EXPIRY); + isdn_send_msg(pid, MSG_REL_COMP); + rel_cr(pid); + isdn_cpc_clear(pPort); + } + } + break; + case OVERLAP_SD_STATE: + if((++(pPort->w_time)) % (isdn_timer_var.t304) == 0) + { + pPort->w_time = 0; //stop t304 and start t305 + isdn_log_err(pid, "[timeout]:t304 LT OVERLAP SD STATE\r\n"); + isdn_event_handle(pid, ISDN_TIMEOUT_IND); + } + break; + case OUT_CALL_PROC_STATE: + if((++(pPort->w_time)) % (isdn_timer_var.t310) == 0) + { + pPort->w_time = 0; //stop t310 and start t305 + isdn_log_err(pid, "[timeout]:t310 LT OUT CALL PROC STATE\r\n"); + isdn_event_handle(pid, ISDN_TIMEOUT_IND); + } + break; + case CALL_DV_STATE: + if((++(pPort->w_time)) % (isdn_timer_var.t301) == 0) + { + pPort->w_time = 0; + isdn_log_err(pid, "[timeout]:t301 LT CALL DV STATE\r\n"); + isdn_event_handle(pid, ISDN_TIMEOUT_IND); + } + break; + case CONN_REQ_STATE: + if((++(pPort->w_time)) % (isdn_timer_var.t313) == 0) + { + pPort->w_time = 0; //stop t313 and start t305 + isdn_log_err(pid, "[timeout]:t313 LT CONN REQ STATE\r\n"); + isdn_event_handle(pid, ISDN_TIMEOUT_IND); + } + break; + case DISC_REQ_STATE: + if((++(pPort->w_time)) % (isdn_timer_var.t305) == 0) + { + isdn_log_err(pid, "[timeout]:t305 LT DISC REQ STATE\r\n"); + isdn_set_cause(&isdn_sd_msg.msg_list.rel.cause, CAUSE_TIMER_EXPIRY); + nr_proc(pid); + pPort->fsm_state.cpc_state = REL_REQ_STATE; + } + break; + case REL_REQ_STATE: + if((++(pPort->w_time)) % (isdn_timer_var.t308) == 0) + { + pPort->w_time = 0; + if(pPort->timeout_fg == 0) + { + pPort->timeout_fg = 1; + isdn_log_err(pid, "[timeout]:t308 LT REL REQ STATE, resend REL\r\n"); + isdn_set_cause(&isdn_sd_msg.msg_list.rel.cause, CAUSE_TIMER_EXPIRY); + isdn_send_msg(pid, MSG_REL); + } + else + { + isdn_log_err(pid, "[timeout]:t308 LT REL REQ STATE\r\n"); + isdn_set_cause(&isdn_rv_msg.msg_list.relComp.cause, CAUSE_TIMER_EXPIRY); + isdn_event_handle(pid, ISDN_RELEASE_CNF); //error + rel_B_chnl(pid); + rel_cr(pid); + isdn_cpc_clear(pPort); + } + } + break; + case OVERLAP_RV_STATE: +// if((++(pPort->w_time)) % (isdn_timer_var.t302) == 0) +// { +// pPort->w_time = 0; +// isdn_log_err(pid, "[timeout]:t302 LT OVERLAP RV STATE\r\n"); +// isdn_event_handle(pid, ISDN_TIMEOUT_IND); +// } + break; + default: + break; + } + + return; +} + +void isdn_cpc_timer(u32 pid) +{ + int circuit_id = pid / ISDN_CIRCUIT_CIC; + const pal_circuit_struct *circuit_ptr = pal_circuit_ptr(circuit_id); + if(circuit_ptr == NULL) + return; + + if(!(isdn_rs.port_pond[pid].timer_flag & CALLIN_FLAG) && + !(isdn_rs.port_pond[pid].timer_flag & CALLOUT_FLAG)) + return; + if(circuit_ptr->attrib.user_network_if) + isdn_cpc_lt_timer(pid); + else + isdn_cpc_nt_timer(pid); +} + +void isdn_restart_timer(u32 pid) +{ + int circuit_id, i, link_id, cic_range; + const pal_circuit_struct *circuit_ptr = NULL; + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + circuit_id = pid / ISDN_CIRCUIT_CIC; + circuit_ptr = pal_circuit_ptr(circuit_id); + if(circuit_ptr == NULL) + return; + + link_id = circuit_ptr->attrib.link_id; + cic_range = circuit_ptr->attrib.cic_range; + if(cic_range == 24) //T1 + cic_range++; + switch(pPort->cic_state.call_state) + { + case GLOBAL_RESTART_REQ_STATE: + if((++(pPort->w_time)) % (isdn_timer_var.t316) == 0) + { + pPort->w_time = 0; + if(pPort->timeout_fg == 2) + { + if(isdn_rs.link_pond[link_id].restart_clas == 0) + { + pid = find_port_by_cic(pPort->cic_val, circuit_id); + isdn_log_err(pid, "[timeout]:t316 GLOBAL RESTART REQ STATE\r\n"); + isdn_event_handle(pid, ISDN_TIMEOUT_IND); + rel_B_chnl(pid); + rel_cr(pid); + isdn_cpc_clear(pPort); + } + else + { + for(i = 1; i < cic_range; i++) + { + pid = circuit_id * ISDN_CIRCUIT_CIC + i; + pPort = &isdn_rs.port_pond[pid]; + if(pPort->cic_val != 0) + { + isdn_log_err(pid, "[timeout]:t316 GLOBAL RESTART REQ STATE\r\n"); + isdn_event_handle(pid, ISDN_TIMEOUT_IND); + rel_B_chnl(pid); + rel_cr(pid); + isdn_cpc_clear(pPort); + } + } + } + } + else + { + pPort->timeout_fg++; + isdn_log_err(pid, "[timeout]:t316 GLOBAL RESTART REQ STATE, resend RESTART\r\n"); + isdn_send_msg(pid, MSG_RESTART); + } + } + break; + case GLOBAL_RESTART_STATE: + if((++(pPort->w_time)) % (isdn_timer_var.t317) == 0) + { + pPort->w_time = 0; + if(isdn_rs.link_pond[link_id].restart_clas == 0) + { + pid = find_port_by_cic(pPort->cic_val, circuit_id); + isdn_log_err(pid, "[timeout]:t317 GLOBAL RESTART STATE\r\n"); + isdn_event_handle(pid, ISDN_TIMEOUT_IND); + rel_B_chnl(pid); + rel_cr(pid); + isdn_cpc_clear(pPort); + } + else + { + for(i = 1; i < cic_range; i++) + { + pid = circuit_id * ISDN_CIRCUIT_CIC + i; + pPort = &isdn_rs.port_pond[pid]; + if(pPort->cic_val != 0) + { + isdn_log_err(pid, "[timeout]:t317 GLOBAL RESTART STATE\r\n"); + isdn_event_handle(pid, ISDN_TIMEOUT_IND); + rel_B_chnl(pid); + rel_cr(pid); + isdn_cpc_clear(pPort); + } + } + } + } + break; + default: + break; + } +} + +int isdn_event_handle(u32 pid, u8 primitive) +/* +´¦ÀímscÉϲãµÄ״̬»ú +*/ +{ + int offset, circuit_id; + Pst pst; + ISDN_EventHandle_struct *event_handle = NULL; + const pal_circuit_struct *circuit_ptr = NULL; + const pal_cg_struct *cg_ptr = NULL; + + pst.sp_proc_id = pid; + pst.su_proc_id = isdn_rs.port_pond[pid].su_proc_id; + + circuit_id = pid / ISDN_CIRCUIT_CIC; + offset = pid % ISDN_CIRCUIT_CIC; + circuit_ptr = pal_circuit_ptr(circuit_id); + if(circuit_ptr == NULL) + return ISDN_CM_FAILED; + + if(circuit_ptr->attrib.cic_range == 32) + pst.cic = circuit_ptr->attrib.head_cic + offset; + else + pst.cic = circuit_ptr->attrib.head_cic + offset - 1; + pst.cg_id = circuit_ptr->cg_id; + cg_ptr = pal_cg_ptr(pst.cg_id); + if(cg_ptr == NULL) + return ISDN_CM_FAILED; + if(cg_ptr->attrib.protocol != PROTO_ISDN) + return ISDN_CM_FAILED; + + pst.tg_id = cg_ptr->attrib.tg_id; + event_handle = (ISDN_EventHandle_struct *)pal_get_handler(pst.cg_id); + if(event_handle == NULL) + return ISDN_CM_FAILED; + + switch(primitive) + { + case ISDN_SETUP_IND: + if(event_handle->h_isdn_setup_ind == NULL) + { + isdn_log_err(pid,"Setup indication handle is not registered@%s\r\n", __FUNCTION__); + return ISDN_CM_FAILED; + } + isdn_trace_func(pid,"APP => function trace: isdn_setup_ind\r\n"); + event_handle->h_isdn_setup_ind(&pst, &(isdn_rv_msg.msg_list.setup)); + isdn_rs.port_pond[pid].su_proc_id = pst.su_proc_id; + isdn_rs.port_pond[pid].trace_flag = pst.trace_flag; + break; + case ISDN_MORE_INFO_IND: + if(event_handle->h_isdn_minfo_ind == NULL) + { + isdn_log_err(pid,"More information indication handle is not registered@%s\r\n", __FUNCTION__); + return ISDN_CM_FAILED; + } + isdn_trace_func(pid,"APP => function trace: isdn_minfo_ind\r\n"); + event_handle->h_isdn_minfo_ind(&pst, &(isdn_rv_msg.msg_list.setupAck)); + break; + case ISDN_ALERT_IND: + if(event_handle->h_isdn_alert_ind == NULL) + { + isdn_log_err(pid,"Alert indication handle is not registered@%s\r\n", __FUNCTION__); + return ISDN_CM_FAILED; + } + isdn_trace_func(pid,"APP => function trace: isdn_alert_ind\r\n"); + event_handle->h_isdn_alert_ind(&pst, &(isdn_rv_msg.msg_list.alert)); + break; + case ISDN_SETUP_CNF: + if(event_handle->h_isdn_setup_cnf == NULL) + { + isdn_log_err(pid,"Setup confirm handle is not registered@%s\r\n", __FUNCTION__); + return ISDN_CM_FAILED; + } + isdn_trace_func(pid,"APP => function trace: isdn_setup_cnf\r\n"); + event_handle->h_isdn_setup_cnf(&pst, &(isdn_rv_msg.msg_list.conn)); + break; + case ISDN_RELEASE_IND: + if(event_handle->h_isdn_rel_ind == NULL) + { + isdn_log_err(pid,"Release indication handle is not registered@%s\r\n", __FUNCTION__); + return ISDN_CM_FAILED; + } + isdn_trace_func(pid,"APP => function trace: isdn_rel_ind\r\n"); + event_handle->h_isdn_rel_ind(&pst, &(isdn_rv_msg.msg_list.rel)); + break; + case ISDN_RELEASE_CNF: + if(event_handle->h_isdn_rel_cnf == NULL) + { + isdn_log_err(pid,"Release confirm handle is not registered@%s\r\n", __FUNCTION__); + return ISDN_CM_FAILED; + } + isdn_trace_func(pid,"APP => function trace: isdn_rel_cnf\r\n"); + event_handle->h_isdn_rel_cnf(&pst, &(isdn_rv_msg.msg_list.relComp)); + break; + case ISDN_STAT_IND: + if(event_handle->h_isdn_stat_ind == NULL) + { + isdn_log_err(pid,"Status indication handle is not registered@%s\r\n", __FUNCTION__); + return ISDN_CM_FAILED; + } + isdn_trace_func(pid,"APP => function trace: isdn_stat_ind\r\n"); + event_handle->h_isdn_stat_ind(&pst, &(isdn_rv_msg.msg_list.status)); + break; + case ISDN_RESTART_REQ: + if(event_handle->h_isdn_restart_req == NULL) + { + isdn_log_err(pid,"Restart request handle is not registered@%s\r\n", __FUNCTION__); + return ISDN_CM_FAILED; + } + isdn_trace_func(pid,"APP => function trace: isdn_restart_req\r\n"); + event_handle->h_isdn_restart_req(&pst, &(isdn_rv_msg.msg_list.restart)); + break; + case ISDN_RESTART_CNF: + if(event_handle->h_isdn_rest_cnf == NULL) + { + isdn_log_err(pid,"Restart confirm handle is not registered@%s\r\n", __FUNCTION__); + return ISDN_CM_FAILED; + } + isdn_trace_func(pid,"APP => function trace: isdn_rest_cnf\r\n"); + event_handle->h_isdn_rest_cnf(&pst, &(isdn_rv_msg.msg_list.restAck)); + break; + case ISDN_INFO_IND: + if(event_handle->h_isdn_info_ind == NULL) + { + isdn_log_err(pid,"Information indication handle is not registered@%s\r\n", __FUNCTION__); + return ISDN_CM_FAILED; + } + isdn_trace_func(pid,"APP => function trace: isdn_info_ind\r\n"); + event_handle->h_isdn_info_ind(&pst, &(isdn_rv_msg.msg_list.info)); + break; + case ISDN_PROG_IND: + if(event_handle->h_isdn_prog_ind == NULL) + { + isdn_log_err(pid,"Progress indication handle is not registered@%s\r\n", __FUNCTION__); + return ISDN_CM_FAILED; + } + isdn_trace_func(pid,"APP => function trace: isdn_prog_ind\r\n"); + event_handle->h_isdn_prog_ind(&pst, &(isdn_rv_msg.msg_list.prog)); + break; + case ISDN_NOTI_IND: + if(event_handle->h_isdn_noti_ind == NULL) + { + isdn_log_err(pid,"Notify indication handle is not registered@%s\r\n", __FUNCTION__); + return ISDN_CM_FAILED; + } + isdn_trace_func(pid,"APP => function trace: isdn_noti_ind\r\n"); + event_handle->h_isdn_noti_ind(&pst, &(isdn_rv_msg.msg_list.noti)); + break; + case ISDN_TIMEOUT_IND: + if(event_handle->h_isdn_timeout_ind == NULL) + { + isdn_log_err(pid,"Timeout indication handle is not registered@%s\r\n", __FUNCTION__); + return ISDN_CM_FAILED; + } + isdn_trace_func(pid,"APP => function trace: isdn_timeout_ind\r\n"); + event_handle->h_isdn_timeout_ind(&pst); + break; + case ISDN_REATTEMPT_IND: + if(event_handle->h_isdn_reattempt_ind == NULL) + { + isdn_log_err(pid,"Reattempt indication handle is not registered@%s\r\n", __FUNCTION__); + return ISDN_CM_FAILED; + } + isdn_trace_func(pid,"APP => function trace: isdn_reattempt_ind\r\n"); + event_handle->h_isdn_reattempt_ind(&pst); + break; + + case ISDN_PROC_IND: //msc does not handle +/* if(event_handle->h_isdn_proc_ind == NULL) + { + isdn_log_err(pid,"Call proceeding indication handle is not registered@%s\r\n", __FUNCTION__); + return ISDN_CM_FAILED; + } + isdn_trace_func(pid,"APP => function trace: isdn_proc_ind\r\n"); + event_handle->h_isdn_proc_ind(&pst, &(isdn_rv_msg.msg_list.callProc)); +*/ break; + case ISDN_SETUP_COMP_IND: + break; + case ISDN_DISCONNECT_IND: //msc does not handle + if(event_handle->h_isdn_disc_ind == NULL) + { + isdn_log_err(pid,"Disconnect indication handle is not registered@%s\r\n", __FUNCTION__); + return ISDN_CM_FAILED; + } + isdn_trace_func(pid,"APP => function trace: isdn_disc_ind\r\n"); + event_handle->h_isdn_disc_ind(&pst, &(isdn_rv_msg.msg_list.disc)); + break; + + case ISDN_SERVICE_IND: + if(event_handle->h_isdn_service_ind == NULL) + { + isdn_log_err(pid,"Service indication handle is not registered@%s\r\n", __FUNCTION__); + return ISDN_CM_FAILED; + } + isdn_trace_func(pid,"APP => function trace: isdn_service_ind\r\n"); + event_handle->h_isdn_service_ind(&pst, &(isdn_rv_msg.msg_list.service)); + isdn_rs.port_pond[pid].su_proc_id = pst.su_proc_id; + isdn_rs.port_pond[pid].trace_flag = pst.trace_flag; + break; + case ISDN_SERVICE_CNF: + if(event_handle->h_isdn_service_cnf == NULL) + { + isdn_log_err(pid,"Service confirm handle is not registered@%s\r\n", __FUNCTION__); + return ISDN_CM_FAILED; + } + isdn_trace_func(pid,"APP => function trace: isdn_service_cnf\r\n"); + event_handle->h_isdn_service_cnf(&pst, &(isdn_rv_msg.msg_list.servAck)); + break; + case ISDN_SER_TIMEOUT_IND: + if(event_handle->h_isdn_ser_timeout_ind == NULL) + { + isdn_log_err(pid,"Service timeout indication handle is not registered@%s\r\n", __FUNCTION__); + return ISDN_CM_FAILED; + } + isdn_trace_func(pid,"APP => function trace: isdn_ser_timeout_ind\r\n"); + event_handle->h_isdn_ser_timeout_ind(&pst); + break; + default: + break; + } + + return ISDN_CM_OK; +} + + +void stuff_encode_m(u32 pid, IsdnMsgStr *ptr, int type) +{ + ChgStat chg_stat; + ChnlId chnl_id; + + chg_stat.pres = 1; + chg_stat.pref = 1; + chg_stat.new_stat = isdn_rs.port_pond[pid].cic_state.maintenance_state; + chnl_id.pres = 1; + chnl_id.b3.int_id_pre = 1; + chnl_id.b3.int_type = 1; + chnl_id.b3.pref_excl = 1; + chnl_id.b3.chnl_ind = 1; + chnl_id.b3.info_chnl_sel = 1; + chnl_id.b3.int_id = pid / ISDN_CIRCUIT_CIC; + chnl_id.b3.has_chnl = 1; + chnl_id.b3.code_stan = 0; + chnl_id.b3.num_map = 0; + chnl_id.b3.chnl_type = 3; + chnl_id.b3.chnl_num = pid % ISDN_CIRCUIT_CIC; + if(type == MSG_SERVICE) + { + memcpy(&ptr->msg_list.service.chg_stat, &chg_stat, sizeof(ChgStat)); + memcpy(&ptr->msg_list.service.chnl_id, &chnl_id, sizeof(ChnlId)); + } + else if(type == MSG_SERVICE_ACK) + { + memcpy(&ptr->msg_list.servAck.chg_stat, &chg_stat, sizeof(ChgStat)); + memcpy(&ptr->msg_list.servAck.chnl_id, &chnl_id, sizeof(ChnlId)); + } +} + +//ansi isdn maintenance D-channel and B-channel +void service_dc_proc(u32 pid) +{ + int circuit_id, link_id, cg_id, ds_0, ds_1; + int far_status; + const pal_circuit_struct *circuit_ptr = NULL; + const pal_cg_struct *cg_ptr = NULL; + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + circuit_id = pid / ISDN_CIRCUIT_CIC; + circuit_ptr = pal_circuit_ptr(circuit_id); + if(circuit_ptr == NULL) + return; + + link_id = circuit_ptr->attrib.link_id; + cg_id = circuit_ptr->cg_id; + cg_ptr = pal_cg_ptr(cg_id); + if(cg_ptr == NULL) + return; + if(cg_ptr->attrib.protocol != PROTO_ISDN) + return; + + ds_0 = cg_ptr->attrib.nfas.prim_link; + ds_1 = cg_ptr->attrib.nfas.backup_link; + far_status = isdn_rv_msg.msg_list.service.chg_stat.new_stat; + + if(cg_ptr->attrib.variant == VARIANT_ANSI) //ANSI + { + switch(pPort->fsm_state.m_state) + { + case SERVICE_IDLE: + if(pPort->g_pri_cmd == ISDN_SERVICE_REQ) + { + pPort->g_pri_cmd = 0; + isdn_rs.link_pond[link_id].dc_status = DS_WAIT; + pPort->w_time = 0; //start t321 + pPort->timer_flag |= DC_M_FLAG; + pPort->cic_state.maintenance_state = IN_SERVICE; + stuff_encode_m(pid, &isdn_sd_msg, MSG_SERVICE); + isdn_send_maintenance_msg(pid, MSG_SERVICE); + pPort->cic_state.maintenance_state = OUT_OF_SERVICE; + pPort->fsm_state.m_state = WAIT_SERVICE_ACK; + printf("service_dc_proc: wait service ack!\n"); + } + else if(pPort->msg_cmd == MSG_SERVICE) + { + pPort->msg_cmd = 0; + pPort->callout_fg = 1; + if(link_id == ds_0) + { + if((isdn_rs.link_pond[ds_1].dc_status != DS_IS) && + (isdn_rs.link_pond[link_id].lk3_status == LK_IS) && + (far_status == IN_SERVICE)) + { + isdn_rs.link_pond[link_id].dc_status = DS_IS; + pPort->cic_state.maintenance_state = IN_SERVICE; + stuff_encode_m(pid, &isdn_sd_msg, MSG_SERVICE_ACK); + isdn_send_maintenance_msg(pid, MSG_SERVICE_ACK); + pPort->fsm_state.m_state = SERVICE_IDLE; + } + } + else if(link_id == ds_1) + { + if(((isdn_rs.link_pond[ds_0].dc_status) == DS_OOS || + (isdn_rs.link_pond[ds_0].dc_status == DS_STBY)) && + (isdn_rs.link_pond[link_id].lk3_status == LK_IS) && + (far_status == IN_SERVICE)) + { + isdn_rs.link_pond[link_id].dc_status = DS_IS; + pPort->cic_state.maintenance_state = IN_SERVICE; + stuff_encode_m(pid, &isdn_sd_msg, MSG_SERVICE_ACK); + isdn_send_maintenance_msg(pid, MSG_SERVICE_ACK); + pPort->fsm_state.m_state = SERVICE_IDLE; + } + } + printf("service_dc_proc: receive service!\n"); + } + if(pPort->msg_cmd == MSG_SERVICE_ACK) //timeout t321 TODO + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t321 + if(far_status == IN_SERVICE) + { + isdn_rs.link_pond[link_id].dc_status = DS_IS; + pPort->cic_state.maintenance_state = IN_SERVICE; + } + else + { + isdn_rs.link_pond[link_id].dc_status = DS_STBY; + pPort->cic_state.maintenance_state = OUT_OF_SERVICE; + } + pPort->fsm_state.m_state = SERVICE_IDLE; + printf("service_dc_proc: receive service ack in service idle!\n"); + } + break; + case WAIT_SERVICE_ACK: + if(pPort->msg_cmd == MSG_SERVICE_ACK) + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t321 + if(far_status == IN_SERVICE) + { + isdn_rs.link_pond[link_id].dc_status = DS_IS; + pPort->cic_state.maintenance_state = IN_SERVICE; + } + else + { + isdn_rs.link_pond[link_id].dc_status = DS_STBY; + pPort->cic_state.maintenance_state = OUT_OF_SERVICE; + } + pPort->fsm_state.m_state = SERVICE_IDLE; + printf("service_dc_proc: receive service ack!and enter service idle state\n"); + } + else if(pPort->msg_cmd == MSG_SERVICE) //collision + { + if(!cg_ptr->attrib.priority) + { + pPort->w_time = 0; //stop t321 + pPort->fsm_state.m_state = SERVICE_IDLE; + service_dc_proc(pid); + printf("service_dc_proc: collision, and renew the state with service idle to receive msg!\n"); + } + else + { + pPort->msg_cmd = 0; + isdn_log_err(pid, "service_dc_proc: discard receive msg!\r\n"); + return; + } + } + break; + case RSP_SERVICE: + break; + default: + break; + } + } + else //ITU + { + if(pPort->g_pri_cmd == ISDN_SERVICE_REQ) + { + pPort->g_pri_cmd = 0; + isdn_rs.link_pond[link_id].dc_status = DS_IS; + } + else if(isdn_rs.link_pond[link_id].lk3_status == LK_IS && isdn_rs.link_pond[link_id].dc_status != DS_IS) + { + isdn_rs.link_pond[link_id].dc_status = DS_STBY; + } + } + +// if(isdn_rs.link_pond[link_id].dc_status == DS_OOS && isdn_rs.link_pond[link_id].lk3_status == LK_IS) +// isdn_rs.link_pond[link_id].dc_status = DS_STBY; + + if(isdn_rs.link_pond[ds_0].dc_status == DS_IS && isdn_rs.link_pond[ds_1].dc_status == DS_IS) + isdn_rs.link_pond[ds_1].dc_status = DS_STBY; + else if(isdn_rs.link_pond[ds_0].dc_status == DS_STBY && isdn_rs.link_pond[ds_1].dc_status == DS_STBY) + isdn_rs.link_pond[ds_0].dc_status = DS_IS; + else if(isdn_rs.link_pond[ds_0].dc_status == DS_OOS && isdn_rs.link_pond[ds_1].dc_status == DS_STBY) + isdn_rs.link_pond[ds_1].dc_status = DS_IS; + else if(isdn_rs.link_pond[ds_0].dc_status == DS_STBY && isdn_rs.link_pond[ds_1].dc_status == DS_OOS) + isdn_rs.link_pond[ds_0].dc_status = DS_IS; + else if(isdn_rs.link_pond[ds_0].dc_status == DS_OOS && isdn_rs.link_pond[ds_1].dc_status == DS_OOS) + { + isdn_rs.link_pond[ds_0].dc_status = DS_MOOS; + isdn_rs.link_pond[ds_1].dc_status = DS_MOOS; + } + + return; +} + +void service_bc_proc(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + const pal_cg_struct *cg_ptr = NULL; + const pal_circuit_struct *circuit_ptr = pal_circuit_ptr(pid / ISDN_CIRCUIT_CIC); + if(circuit_ptr == NULL) + return; + + cg_ptr = pal_cg_ptr(circuit_ptr->cg_id); + if(cg_ptr == NULL) + return; + if(cg_ptr->attrib.protocol != PROTO_ISDN) + return; + + switch(pPort->fsm_state.m_state) + { + case SERVICE_IDLE: + if(pPort->g_pri_cmd == ISDN_SERVICE_REQ) + { + pPort->g_pri_cmd = 0; + if(isdn_sd_msg.msg_list.service.chg_stat.new_stat != IN_SERVICE) + { + pPort->primitive_cmd = ISDN_RELEASE_REQ; + isdn_cpc_proc(pid); + } + pPort->w_time = 0; //start t3M1 + pPort->timer_flag |= BC_M_FLAG; + isdn_send_maintenance_msg(pid, MSG_SERVICE); + pPort->cic_state.maintenance_state = isdn_sd_msg.msg_list.service.chg_stat.new_stat; + pPort->fsm_state.m_state = WAIT_SERVICE_ACK; + printf("service_bc_proc: wait service ack!\n"); + } + else if(pPort->msg_cmd == MSG_SERVICE) + { + pPort->msg_cmd = 0; + pPort->callout_fg = 1; + pPort->cic_state.maintenance_state = isdn_rv_msg.msg_list.service.chg_stat.new_stat; + pPort->fsm_state.m_state = RSP_SERVICE; + printf("service_bc_proc: receive service!\n"); + isdn_event_handle(pid, ISDN_SERVICE_IND); //indicate + } + else if(pPort->msg_cmd == MSG_SERVICE_ACK) //timeout t3M1 + { + pPort->msg_cmd = 0; + pPort->w_time = 0; //stop t3M1 + pPort->cic_state.maintenance_state = isdn_rv_msg.msg_list.service.chg_stat.new_stat; + isdn_event_handle(pid, ISDN_SERVICE_CNF); //confirm + pPort->fsm_state.m_state = SERVICE_IDLE; + printf("service_bc_proc: receive service ack in service idle!\n"); + } + break; + case WAIT_SERVICE_ACK: + if(pPort->msg_cmd == MSG_SERVICE_ACK) + { + pPort->msg_cmd = 0; + isdn_event_handle(pid, ISDN_SERVICE_CNF); //confirm + pPort->fsm_state.m_state = SERVICE_IDLE; + printf("service_bc_proc: receive service ack!\n"); + } + if(pPort->msg_cmd == MSG_SERVICE) //½ÓÊÕservice³åÍ» TODO + { + if(!cg_ptr->attrib.priority) + { + pPort->w_time = 0; + pPort->cic_state.maintenance_state = ((pPort->cic_state.maintenance_state & 0x1) | (pPort->cic_state.maintenance_state >> 1)) ^ 0x1; //run back initial + pPort->fsm_state.m_state = SERVICE_IDLE; + isdn_event_handle(pid, ISDN_REATTEMPT_IND); //indicate + service_bc_proc(pid); + printf("service_bc_proc: collision, and renew the state with service idle to receive msg!\n"); + } + else + { + pPort->msg_cmd = 0; + isdn_log_err(pid, "service_dc_proc: discard receive msg!\r\n"); + return; + } + } + break; + case RSP_SERVICE: + if(pPort->g_pri_cmd == ISDN_SERVICE_RSP) + { + pPort->g_pri_cmd = 0; + pPort->fsm_state.m_state = SERVICE_IDLE; + pPort->cic_state.maintenance_state = isdn_sd_msg.msg_list.servAck.chg_stat.new_stat; + isdn_send_maintenance_msg(pid, MSG_SERVICE_ACK); + printf("service_bc_proc: response service!\n"); + } + break; + default: + break; + } +} + +void service_dc_timer(u32 pid) +{ + int link_id; + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + const pal_circuit_struct *circuit_ptr = pal_circuit_ptr(pid / ISDN_CIRCUIT_CIC); + if(circuit_ptr == NULL) + return; + + link_id = circuit_ptr->attrib.link_id; + switch(pPort->fsm_state.m_state) + { + case WAIT_SERVICE_ACK: + if((++(pPort->w_time)) % (isdn_timer_var.t321) == 0) + { + pPort->w_time = 0; //stop t3M1 + pPort->fsm_state.m_state = SERVICE_IDLE; + pPort->cic_state.maintenance_state = OUT_OF_SERVICE; + isdn_rs.link_pond[link_id].dc_status = DS_OOS; + isdn_log_err(pid, "service_dc_timer: t321 timeout!\r\n"); + } + break; + default: + break; + } +} + +void service_bc_timer(u32 pid) +{ + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + + switch(pPort->fsm_state.m_state) + { + case WAIT_SERVICE_ACK: + if((++(pPort->w_time)) % (isdn_timer_var.t3M1) == 0) + { + pPort->w_time = 0; //stop t3M1 + isdn_event_handle(pid, ISDN_SER_TIMEOUT_IND); + pPort->fsm_state.m_state = SERVICE_IDLE; + pPort->cic_state.maintenance_state = OUT_OF_SERVICE; + isdn_log_err(pid, "service_bc_timer: t3M1 timeout!\r\n"); + } + break; + default: + break; + } +} + +void maintenance_timer(u32 pid) +{ + if(isdn_rs.port_pond[pid].timer_flag & BC_M_FLAG) + service_bc_timer(pid); + if(isdn_rs.port_pond[pid].timer_flag & DC_M_FLAG) + service_dc_timer(pid); +} + diff --git a/omc/plat/isdn/src/isdn_ie.c b/omc/plat/isdn/src/isdn_ie.c new file mode 100644 index 0000000..6e64ba4 --- /dev/null +++ b/omc/plat/isdn/src/isdn_ie.c @@ -0,0 +1,1665 @@ +/*********************************************************** +Copyright (C), LGC Wireless. +File Name: isdn_ie.c +Description: ISDN information elements +Version: v9.0.0 +Author: Gengxin Chen +Create Date: 2008-2-19 +History: + + +************************************************************/ + +#include "./include/isdn_const.h" +#include "./include/isdn_msg.h" +#include "./include/isdn_ie.h" + + +u16 find_ie_para(u8 *start, u8 ie_type, u8 **target) +/* +*/ +{ + u16 offset = 0; + u8 ie_ind, len, ie_num = 0; + + while ((offset < IE_MAX_LEN) && (ie_num < IE_COUNT)) + { + ie_num++; + ie_ind = (((*start) >> 7) & 0x01); + if (ie_ind == 1) + len = 1; + else + len = (*(start + 1)) + 2; + + if ((*start) == ie_type) + { + (*target) = start; + return len; + } + else + { + if (ie_ind == 1) + { + offset++; + start++; + } + else + { + offset += len; + start += len; + } + } + } + + return 0; +} + +u8 IA5_to_Hex(u8 digit) +{ + if ((digit >= '0') && (digit <= '9')) + return (digit - '0'); + else if ((digit == '*') || (digit == 0x3A)) + return 0x0B; + else if ((digit == '#') || (digit == 0x3B)) + return 0x0C; + else + return 0xFF; +} + +u8 Hex_to_IA5(u8 digit) +{ + if (digit == 0x0B) + return ('*'); + else if (digit == 0x0C) + return ('#'); + else if (digit == 0x0A) + return ('0'); + else if (digit < 0x0A) + return ('0' + digit); + else + return 0xFF; +} + + +u8 itu_encode_br_cap(u8 *dst, BrCap *src) +{ + u8 offset = 0; + dst[offset++] = 0x80 | (src->code_stan << 5) | (src->tran_cap); + dst[offset++] = 0x80 | (src->b4.tran_mode << 5) | (src->b4.tran_rate); + + if((src->b4.tran_rate & 0x1F) == 0x18) //Multirate octet4 and 4.1 + { + dst[offset++] = 0x80 | (src->b4.rate_mul); + } + + if(src->ext_flag & 0x01) //octet5 + { + dst[offset++] = (src->b5.has_ext_a << 7) | (0x1 << 5) | (src->b5.usr_layer1); + if(!src->b5.has_ext_a) //octet5 and 5a + { + dst[offset++] = (src->b5.has_ext_b << 7) | (src->b5.syn_asy << 6) | + (src->b5.neg << 5) | (src->b5.usr_rate); + + if(!src->b5.has_ext_b) //5b + { + if((src->b5.usr_layer1 & 0x1F) == 0x1) + { + dst[offset++] = (src->b5.has_ext_c << 7) | (src->b5.inter_rate << 5) | + (src->b5.nic_tx << 4) | (src->b5.nic_rx << 3) | + (src->b5.ctl_tx << 2) | (src->b5.ctl_rx <<1); + } + else if((src->b5.usr_layer1 & 0x1F) == 0x8) + { + dst[offset++] = (src->b5.has_ext_c << 7) | (src->b5.hdr << 6) | + (src->b5.mul_fra << 5) | (src->b5.mode << 4) | + (src->b5.lli_neg << 3) | (src->b5.assign << 2) | + (src->b5.inband << 1); + } + + if(!src->b5.has_ext_c) //5c + { + dst[offset++] = (src->b5.has_ext_d << 7) | (src->b5.stop_bit << 5) | + (src->b5.data_bit << 3) | (src->b5.par); + + if(!src->b5.has_ext_d) //5d + { + dst[offset++] = 0x80 | (src->b5.du_mode << 6) | (src->b5.mod_type); + } + } + } + } + } + + if(src->ext_flag & 0x02) //octet6 + { + dst[offset++] = 0x80 | (0x2 << 5) | (src->usr_layer2); + } + + if(src->ext_flag & 0x04) //octet7 + { + dst[offset++] = 0x80 | (0x3 << 5) | (src->usr_layer3); + } + + return offset; +} + +int itu_decode_br_cap(BrCap *dst, u8 *src, u8 len) // +{ + u8 offset = 0; + dst->pres = 1; + if((len < 2) || (len > 13)) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + + if(!(src[offset] & 0x80)) + { + printf("encode ie err!\n"); + return ISDN_CM_FAILED; + } + dst->code_stan = ((src[offset] & 0x60) >> 5); + dst->tran_cap = (src[offset++] & 0x1F); + + dst->b4.tran_mode = ((src[offset] & 0x60) >> 5); + dst->b4.tran_rate = (src[offset++] & 0x1F); + + if((dst->b4.tran_rate & 0x1F) == 0x18) //Multirate with 4.1 + { + dst->b4.rate_mul = (src[offset++] & 0x7F); + } + + if(offset < len) //octet at offside + { + if(((src[offset] & 0x60) >> 5) == 0x1) //octet 5 + { + dst->ext_flag |= 0x01; + dst->b5.has_ext_a = ((src[offset] & 0x80) >> 7); + dst->b5.usr_layer1 = (src[offset++] & 0x1F); + if(!dst->b5.has_ext_a) //with 5a + { + dst->b5.has_ext_b = ((src[offset] & 0x80) >> 7); + dst->b5.syn_asy = ((src[offset] & 0x40) >> 6); + dst->b5.neg = ((src[offset] & 0x20) >> 5); + dst->b5.usr_rate = (src[offset++] & 0x1F); + if(!dst->b5.has_ext_b) //with 5b + { + dst->b5.has_ext_c = ((src[offset] & 0x80) >> 7); + if((dst->b5.usr_layer1 & 0x1F) == 0x1) //V.110/X.30 + { + dst->b5.inter_rate = ((src[offset] & 0x60) >> 5); + dst->b5.nic_tx = ((src[offset] & 0x10) >> 4); + dst->b5.nic_rx = ((src[offset] & 0x08) >> 3); + dst->b5.ctl_tx = ((src[offset] & 0x04) >> 2); + dst->b5.ctl_rx = ((src[offset++] & 0x02) >> 1); + } + else if((dst->b5.usr_layer1 & 0x1F) == 0x8) //V.120 + { + dst->b5.hdr = ((src[offset] & 0x40) >> 6); + dst->b5.mul_fra = ((src[offset] & 0x20) >> 5); + dst->b5.mode = ((src[offset] & 0x10) >> 4); + dst->b5.lli_neg = ((src[offset] & 0x08) >> 3); + dst->b5.assign = ((src[offset] & 0x04) >> 2); + dst->b5.inband =((src[offset++] & 0x02) >> 1); + } + + if(!dst->b5.has_ext_c) //with 5c + { + dst->b5.has_ext_d = ((src[offset] & 0x80) >> 7); + dst->b5.stop_bit = ((src[offset] & 0x60) >> 5); + dst->b5.data_bit = ((src[offset] & 0x18) >> 3); + dst->b5.par = (src[offset++] & 0x07); + + if(!dst->b5.has_ext_d) //with 5d + { + dst->b5.du_mode = ((src[offset] & 0x40) >> 6); + dst->b5.mod_type =(src[offset++] & 0x3F); + } + } + } + } + } + } + if(offset < len) //octet at offside + { + if(((src[offset] & 0x60) >> 5) == 0x2) //octet 6 + { + dst->ext_flag |= 0x02; + dst->usr_layer2 = (src[offset++] & 0x1F); + } + } + if(offset < len) //octet at offside + { + if(((src[offset] & 0x60) >> 5) == 0x3) //octet 7 + { + dst->ext_flag |= 0x04; + dst->usr_layer3 = (src[offset] & 0x1F); + } + } + + return ISDN_CM_OK; +} + +u8 isdn_encode_br_cap(u8 *dst, BrCap *src) +{ + u8 offset = 0; + dst[offset++] = 0x80 | (src->code_stan << 5) | (src->tran_cap); + dst[offset++] = 0x80 | (src->b4.tran_mode << 5) | (src->b4.tran_rate); + + if((src->b4.tran_rate & 0x1F) == 0x18) //Multirate octet4 and 4.1 + { + dst[offset++] = 0x80 | (src->b4.rate_mul); + } + + if(src->ext_flag & 0x01) //octet5 + { + dst[offset++] = (src->b5.has_ext_a << 7) | (0x1 << 5) | (src->b5.usr_layer1); + if((!src->b5.has_ext_a) && (src->b5.usr_layer1 == 0x1)) //with 5a when V.110/X.30 + { + dst[offset++] = 0x80 | (src->b5.usr_rate); + } + } + + return offset; +} + +int isdn_decode_br_cap(BrCap *dst, u8 *src, u8 len) // +{ + u8 offset = 0; + dst->pres = 1; + if((len < 2) || (len > 5)) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + + if(!(src[offset] & 0x80)) + { + printf("encode ie err!\n"); + return ISDN_CM_FAILED; + } + dst->code_stan = ((src[offset] & 0x60) >> 5); + dst->tran_cap = (src[offset++] & 0x1F); + + dst->b4.tran_mode = ((src[offset] & 0x60) >> 5); + dst->b4.tran_rate = (src[offset++] & 0x1F); + + if((dst->b4.tran_rate & 0x1F) == 0x18) //Multirate with 4.1 + { + dst->b4.rate_mul = (src[offset++] & 0x7F); + } + + if(offset < len) //octet at offside + { + if(((src[offset] & 0x60) >> 5) == 0x1) //octet 5 + { + dst->ext_flag |= 0x01; + dst->b5.has_ext_a = ((src[offset] & 0x80) >> 7); + dst->b5.usr_layer1 = (src[offset++] & 0x1F); + if((!dst->b5.has_ext_a) && (dst->b5.usr_layer1 == 0x1)) //with 5a when V.110/X.30 + { + dst->b5.syn_asy = ((src[offset] & 0x40) >> 6); + dst->b5.neg = ((src[offset] & 0x20) >> 5); + dst->b5.usr_rate = (src[offset++] & 0x1F); + } + } + } + + return ISDN_CM_OK; +} + +u8 isdn_encode_cause(u8 *dst, CauseStr *src) +{ + u8 offset = 0; + int i = 0; + dst[offset++] = (src->b3.has_ext_a << 7) | (src->b3.code_stan << 5) | (src->b3.loc); + if(!src->b3.has_ext_a) //with 3a + { + dst[offset++] = 0x80 | (src->b3.rec); + } + dst[offset++] = 0x80 | (src->cause_val); + if(src->ext_flag & 0x01) //octet 5 + { + for(i=0; idia_num; i++) + { + dst[offset++] = src->dia[i].attrib_num; + dst[offset++] = (src->dia[i].has_ext_b << 7) | (src->dia[i].rej_attrib); + if(!src->dia[i].has_ext_b) //with 5b + { + dst[offset++] = 0x80 | (src->dia[i].avail_attrib); + } + } + } + + return offset; +} + +int isdn_decode_cause(CauseStr *dst, u8 *src, u8 len) +{ + u8 offset = 0; + int i = 0; + dst->pres = 1; + if((len < 2) || (len > 30)) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + + dst->b3.has_ext_a = ((src[offset] & 0x80) >> 7); + dst->b3.code_stan = ((src[offset] & 0x60) >> 5); + dst->b3.loc = (src[offset++] & 0x0F); + if(!dst->b3.has_ext_a) //with 3a + { + dst->b3.rec = (src[offset++] & 0x7F); + } + + if(!(src[offset] & 0x80)) + { + printf("encode ie err!\n"); + return ISDN_CM_FAILED; + } + dst->cause_val = (src[offset++] & 0x7F); + if(offset < len) + { + dst->ext_flag |= 0x01; + while(offset < len && i < 8) + { +// dst->dia[i].has_ext_a = ((src[offset] & 0x80) >> 7); + dst->dia[i].attrib_num = (src[offset++] & 0x7F); + dst->dia[i].has_ext_b = ((src[offset] & 0x80) >> 7); + dst->dia[i].rej_attrib = (src[offset++] & 0x7F); + if(!dst->dia[i].has_ext_b) + dst->dia[i].avail_attrib = (src[offset++] & 0x7F); + i++; + } + dst->dia_num = i; + } + + return ISDN_CM_OK; +} + +u8 isdn_encode_call_id(u8 *dst, CallId *src) +{ + u8 offset = 0; + + return offset; +} + +int isdn_decode_call_id(CallId *dst, u8 *src, u8 len) +{ +// u8 offset = 0; + dst->pres = 1; + + return ISDN_CM_OK; +} + +u8 isdn_encode_call_stat(u8 *dst, CallStat *src) +{ + u8 offset = 0; + dst[offset++] = (src->code_stan << 6) | (src->stat_val & 0x3F); + + return offset; +} + +int isdn_decode_call_stat(CallStat *dst, u8 *src, u8 len) +{ + u8 offset = 0; + dst->pres = 1; + if(len != 1) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + dst->code_stan = ((src[offset] & 0xC0) >> 6); + dst->stat_val = (src[offset++] & 0x3F); + + return ISDN_CM_OK; +} + +u8 qsig_encode_chnl_id(u8 *dst, ChnlId *src) +{ + u8 offset = 0; + dst[offset++] = 0x80 | (src->b3.pref_excl << 3) | (src->b3.chnl_ind << 2) | (src->b3.info_chnl_sel); + + if(src->b3.has_chnl) + { + dst[offset++] = 0x80 | (src->b3.code_stan << 5) | (src->b3.num_map << 4) | (src->b3.chnl_type); //with 3.2 + dst[offset++] = 0x80 | (src->b3.chnl_num & 0x1F); //with 3.3 + } + + return offset; +} + +int qsig_decode_chnl_id(ChnlId *dst, u8 *src, u8 len) +{ + int i; + u8 offset = 0; + dst->pres = 1; + if((len < 1) || (len > 32)) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + + if(!(src[offset] & 0x80)) + { + printf("encode ie err!\n"); + return ISDN_CM_FAILED; + } + dst->b3.int_id_pre = ((src[offset] & 0x40) >> 6); + dst->b3.int_type = ((src[offset] & 0x20) >> 5); + dst->b3.pref_excl = ((src[offset] & 0x08) >> 3); + dst->b3.chnl_ind = ((src[offset] & 0x04) >> 2); + dst->b3.info_chnl_sel = (src[offset++] & 0x03); + if(dst->b3.int_id_pre || (!dst->b3.int_type)) //with 3.1 err + { + printf("encode ie err!\n"); + return ISDN_CM_FAILED; + } + if((dst->b3.int_type & 0x1) && (offset < len)) //with 3.2 and 3.3 + { + dst->b3.has_chnl = 1; + dst->b3.code_stan = ((src[offset] & 0x60) >> 5); + dst->b3.num_map = ((src[offset] & 0x10) >> 4); + dst->b3.chnl_type = (src[offset++] & 0x0F); + if(dst->b3.num_map) + { + dst->b3.num_map = 0; + switch(len - offset) + { + case 4: //E1 + for(i = 0; i < 4; i++) + { + if(src[offset]) + { + switch(src[offset]) + { + case 0x01: + dst->b3.chnl_num = (3 - i) * 8 + 0; + break; + case 0x02: + dst->b3.chnl_num = (3 - i) * 8 + 1; + break; + case 0x04: + dst->b3.chnl_num = (3 - i) * 8 + 2; + break; + case 0x08: + dst->b3.chnl_num = (3 - i) * 8 + 3; + break; + case 0x10: + dst->b3.chnl_num = (3 - i) * 8 + 4; + break; + case 0x20: + dst->b3.chnl_num = (3 - i) * 8 + 5; + break; + case 0x40: + dst->b3.chnl_num = (3 - i) * 8 + 6; + break; + case 0x80: + dst->b3.chnl_num = (3 - i) * 8 + 7; + break; + default: + break; + } + } + offset++; + } + break; + case 3: //T1 + for(i = 0; i < 3; i++) + { + if(src[offset]) + { + switch(src[offset]) + { + case 0x01: + dst->b3.chnl_num = (2 - i) * 8 + 0; + break; + case 0x02: + dst->b3.chnl_num = (2 - i) * 8 + 1; + break; + case 0x04: + dst->b3.chnl_num = (2 - i) * 8 + 2; + break; + case 0x08: + dst->b3.chnl_num = (2 - i) * 8 + 3; + break; + case 0x10: + dst->b3.chnl_num = (2 - i) * 8 + 4; + break; + case 0x20: + dst->b3.chnl_num = (2 - i) * 8 + 5; + break; + case 0x40: + dst->b3.chnl_num = (2 - i) * 8 + 6; + break; + case 0x80: + dst->b3.chnl_num = (2 - i) * 8 + 7; + break; + default: + break; + } + } + offset++; + } + break; + case 1: + break; + default: + break; + } + } + else + dst->b3.chnl_num = (src[offset++] & 0x1F); + } + + return ISDN_CM_OK; +} + +u8 isdn_encode_chnl_id(u8 *dst, ChnlId *src) +{ + u8 offset = 0; + dst[offset++] = 0x80 | (src->b3.int_id_pre << 6) | (src->b3.int_type << 5) | + (src->b3.pref_excl << 3) | (src->b3.chnl_ind << 2) | (src->b3.info_chnl_sel); + if((src->b3.int_id_pre & 0x1) == 1) //with 3.1 + { + if((src->b3.int_type & 0x1) && (src->b3.has_chnl)) //with3.1, 3.2 and 3.3 + { + dst[offset++] = 0x80 | (src->b3.int_id); + dst[offset++] = 0x80 | (src->b3.code_stan << 5) | (src->b3.num_map << 4) | + (src->b3.chnl_type); + dst[offset++] = 0x80 | (src->b3.chnl_num & 0x1F); + } + else //without 3.2 and 3.3 but with 3.1 + { + dst[offset++] = 0x80 | (src->b3.int_id); + } + } + else //without 3.1 + { + if((src->b3.int_type & 0x1) && (src->b3.has_chnl)) //with 3.2 and 3.3 but without 3.1 + { + dst[offset++] = 0x80 | (src->b3.code_stan << 5) | (src->b3.num_map << 4) | + (src->b3.chnl_type); + dst[offset++] = 0x80 | (src->b3.chnl_num & 0x1F); + } + } + + return offset; +} + +int isdn_decode_chnl_id(ChnlId *dst, u8 *src, u8 len) +{ + int i; + u8 offset = 0; + dst->pres = 1; + if((len < 1) || (len > 32)) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + + if(!(src[offset] & 0x80)) + { + printf("encode ie err!\n"); + return ISDN_CM_FAILED; + } + dst->b3.int_id_pre = ((src[offset] & 0x40) >> 6); + dst->b3.int_type = ((src[offset] & 0x20) >> 5); + dst->b3.pref_excl = ((src[offset] & 0x08) >> 3); + dst->b3.chnl_ind = ((src[offset] & 0x04) >> 2); + dst->b3.info_chnl_sel = (src[offset++] & 0x03); + if((dst->b3.int_id_pre & 0x1) == 0x1) //with 3.1 + { + dst->b3.int_id = (src[offset++] & 0x7F); + } + if((dst->b3.int_type & 0x1) && (offset < len)) //with 3.2 and 3.3 + { + dst->b3.has_chnl = 1; + dst->b3.code_stan = ((src[offset] & 0x60) >> 5); + dst->b3.num_map = ((src[offset] & 0x10) >> 4); + dst->b3.chnl_type = (src[offset++] & 0x0F); + if(dst->b3.num_map) + { + dst->b3.num_map = 0; + switch(len - offset) + { + case 4: //E1 + for(i = 0; i < 4; i++) + { + if(src[offset]) + { + switch(src[offset]) + { + case 0x01: + dst->b3.chnl_num = (3 - i) * 8 + 0; + break; + case 0x02: + dst->b3.chnl_num = (3 - i) * 8 + 1; + break; + case 0x04: + dst->b3.chnl_num = (3 - i) * 8 + 2; + break; + case 0x08: + dst->b3.chnl_num = (3 - i) * 8 + 3; + break; + case 0x10: + dst->b3.chnl_num = (3 - i) * 8 + 4; + break; + case 0x20: + dst->b3.chnl_num = (3 - i) * 8 + 5; + break; + case 0x40: + dst->b3.chnl_num = (3 - i) * 8 + 6; + break; + case 0x80: + dst->b3.chnl_num = (3 - i) * 8 + 7; + break; + default: + break; + } + } + offset++; + } + break; + case 3: //T1 + for(i = 0; i < 3; i++) + { + if(src[offset]) + { + switch(src[offset]) + { + case 0x01: + dst->b3.chnl_num = (2 - i) * 8 + 0; + break; + case 0x02: + dst->b3.chnl_num = (2 - i) * 8 + 1; + break; + case 0x04: + dst->b3.chnl_num = (2 - i) * 8 + 2; + break; + case 0x08: + dst->b3.chnl_num = (2 - i) * 8 + 3; + break; + case 0x10: + dst->b3.chnl_num = (2 - i) * 8 + 4; + break; + case 0x20: + dst->b3.chnl_num = (2 - i) * 8 + 5; + break; + case 0x40: + dst->b3.chnl_num = (2 - i) * 8 + 6; + break; + case 0x80: + dst->b3.chnl_num = (2 - i) * 8 + 7; + break; + default: + break; + } + } + offset++; + } + break; + case 1: + break; + default: + break; + } + } + else + dst->b3.chnl_num = (src[offset++] & 0x1F); + } + + return ISDN_CM_OK; +} + +u8 isdn_encode_prg_ind(u8 *dst, PrgInd *src) +{ + u8 offset = 0; + dst[offset++] = 0x80 | (src->code_stan << 5) | (src->loc); + dst[offset++] = 0x80 | (src->prg_descr & 0x7F); + + return offset; +} + +int isdn_decode_prg_ind(PrgInd *dst, u8 *src, u8 len) +{ + u8 offset = 0; + dst->pres = 1; + if(len != 2) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + + if(!(src[offset] & 0x80)) + { + printf("encode ie err!\n"); + return ISDN_CM_FAILED; + } + dst->code_stan = ((src[offset] & 0x60) >> 5); + dst->loc = (src[offset++] & 0x0F); + + if(!(src[offset] & 0x80)) + { + printf("encode ie err!\n"); + return ISDN_CM_FAILED; + } + dst->prg_descr = (src[offset++] & 0x7F); + + return ISDN_CM_OK; +} + +u8 ansi_encode_ntsp_fac(u8 *dst, NtSpFac *src) +{ + u8 offset = 0; + dst[offset++] = src->b3.len_net_id; + if((src->b3.len_net_id) != 0) //with 3.1 and 3.2 + { + dst[offset++] = 0x80 | (src->b3.net_id_type << 4) | (src->b3.net_id_plan); + dst[offset++] = 0x80 | (src->b3.net_id); + } + dst[offset++] = 0xE0 | (src->fac_val); + dst[offset++] = 0x80 | (src->ser_par); + + return offset; +} + +int ansi_decode_ntsp_fac(NtSpFac *dst, u8 *src, u8 len) +{ + u8 offset = 0; + dst->pres = 1; + if(len < 2) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + + dst->b3.len_net_id = (src[offset++] & 0xFF); + if((dst->b3.len_net_id) != 0) //with 3.1 and 3.2 + { + dst->b3.net_id_type = ((src[offset] & 0x70) >> 4); + dst->b3.net_id_plan = (src[offset++] & 0x0F); + + dst->b3.net_id = (src[offset++] & 0x7F); + } + dst->fac_val = (src[offset++] & 0x1F); + dst->ser_par = (src[offset++] & 0x7F); + + return ISDN_CM_OK; +} + +u8 isdn_encode_ntsp_fac(u8 *dst, NtSpFac *src) +{ + u8 offset = 0; + dst[offset++] = src->b3.len_net_id; + if((src->b3.len_net_id) != 0) //with 3.1 and 3.2 + { + dst[offset++] = 0x80 | (src->b3.net_id_type << 4) | (src->b3.net_id_plan); + dst[offset++] = 0x80 | (src->b3.net_id); + } + dst[offset++] = src->spec; + + return offset; +} + +int isdn_decode_ntsp_fac(NtSpFac *dst, u8 *src, u8 len) +{ + u8 offset = 0; + dst->pres = 1; + if(len < 2) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + + dst->b3.len_net_id = (src[offset++] & 0xFF); + if((dst->b3.len_net_id) != 0) //with 3.1 and 3.2 + { + dst->b3.net_id_type = ((src[offset] & 0x70) >> 4); + dst->b3.net_id_plan = (src[offset++] & 0x0F); + + dst->b3.net_id = (src[offset++] & 0x7F); + } + dst->spec = (src[offset++] & 0xFF); + + return ISDN_CM_OK; +} + +u8 ansi_encode_notify_ind(u8 *dst, NotifyInd *src) //TODO +{ + u8 offset = 0; + dst[offset++] = 0x80 | (src->notify_descr & 0x7F); + + return offset; +} + +int ansi_decode_notify_ind(NotifyInd *dst, u8 *src, u8 len) //TODO +{ + dst->pres = 1; + if(len != 1) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + + if(!(src[0] & 0x80)) + { + printf("encode ie err!\n"); + return ISDN_CM_FAILED; + } + dst->notify_descr = (src[0] & 0x7F); + + return ISDN_CM_OK; +} + +u8 isdn_encode_notify_ind(u8 *dst, NotifyInd *src) +{ + u8 offset = 0; + dst[offset++] = 0x80 | (src->notify_descr & 0x7F); + + return offset; +} + +int isdn_decode_notify_ind(NotifyInd *dst, u8 *src, u8 len) +{ + dst->pres = 1; + if(len != 1) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + + if(!(src[0] & 0x80)) + { + printf("encode ie err!\n"); + return ISDN_CM_FAILED; + } + dst->notify_descr = (src[0] & 0x7F); + + return ISDN_CM_OK; +} + +u8 isdn_encode_disp(u8 *dst, Disp *src) +{ + u8 offset = 0; + memcpy(dst,src->disp_info,src->disp_info_len); + offset += src->disp_info_len; + + return offset; +} + +int isdn_decode_disp(Disp *dst, u8 *src, u8 len) +{ + dst->pres = 1; + if(len < 1) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + + if(len > 18) + { + len = 18; + printf("len is truncated!\n"); + } + dst->disp_info_len = len; + memcpy(dst->disp_info, src, dst->disp_info_len); + + return ISDN_CM_OK; +} + +u8 isdn_encode_dt_time(u8 *dst, DtTime *src) +{ + u8 offset = 0; + dst[offset++] = src->year; + dst[offset++] = src->month; + dst[offset++] = src->day; + if(src->ext_flag & 0x01) //with octet 6, 7 and 8 + { + dst[offset++] = src->hour; + dst[offset++] = src->minute; + dst[offset++] = src->second; + } + + return offset; +} + +int isdn_decode_dt_time(DtTime *dst, u8 *src, u8 len) +{ + u8 offset = 0; + dst->pres = 1; + if((len < 3) || (len > 6)) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + + dst->year = (src[offset++]); + dst->month = (src[offset++]); + dst->day = (src[offset++]); + if(offset < len) + { + dst->ext_flag |= 0x01; + dst->hour = (src[offset++]); + dst->minute = (src[offset++]); + dst->second = (src[offset++]); + } + + return ISDN_CM_OK; +} + +u8 isdn_encode_kpd_fac(u8 *dst, KpdFac *src) +{ + u8 offset = 0; + int i = 0; +// memcpy(dst+offset, src->key_fac_info, src->keyfac_info_len); +// offset += src->keyfac_info_len; + while(i < src->keyfac_info_len) + { + dst[offset++] = Hex_to_IA5(src->key_fac_info[i]); + i++; + } + + return offset; +} + +int isdn_decode_kpd_fac(KpdFac *dst, u8 *src, u8 len) +{ + u8 offset = 0, digit; + int i = 0; + dst->pres = 1; + if((len < 1) || (len > 32)) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } +// dst->keyfac_info_len = len; +// memcpy(dst->key_fac_info, src, dst->keyfac_info_len); + dst->keyfac_info_len = len - offset; + while((offset < len) && ((digit = IA5_to_Hex(src[offset])) < 0x0D)) + { + dst->key_fac_info[i] = digit; + offset++; + i++; + } + + return ISDN_CM_OK; +} + +u8 isdn_encode_sign(u8 *dst, Sign *src) +{ + u8 offset = 0; + dst[offset++] = src->sign_val; + + return offset; +} + +int isdn_decode_sign(Sign *dst, u8 *src, u8 len) +{ + dst->pres = 1; + if(len != 1) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + dst->sign_val = (src[0]); + + return ISDN_CM_OK; +} + + +u8 isdn_encode_cg_num(u8 *dst, CgPtyNum *src) +{ + u8 offset = 0; + int i = 0; + dst[offset++] = (src->b3.has_ext_a << 7) | (src->b3.num_type << 4) | (src->b3.num_plan_id); + if(!src->b3.has_ext_a) //with 3a + { + dst[offset++] = 0x80 | (src->b3.pres_ind << 5) | (src->b3.screen_ind); + } + + if(src->ext_flag & 0x01) //octet 4 + { + while(i < src->num_digit_len) + { + dst[offset++] = Hex_to_IA5(src->num_digit[i]); + i++; + } + } + + return offset; +} + +int isdn_decode_cg_num(CgPtyNum *dst, u8 *src, u8 len) +{ + u8 offset = 0, digit; + int i = 0; + dst->pres = 1; + if((len < 1) || (len > 34)) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + dst->b3.has_ext_a = ((src[offset] & 0x80) >> 7); + dst->b3.num_type = ((src[offset] & 0x70) >> 4); + dst->b3.num_plan_id = (src[offset++] & 0x0F); + if(!dst->b3.has_ext_a) //with 3a + { + dst->b3.pres_ind = ((src[offset] & 0x60) >> 5); + dst->b3.screen_ind = (src[offset++] & 0x03); + } + + if(offset < len) + { + dst->ext_flag |= 0x01; + dst->num_digit_len = len - offset; + while((offset < len) && ((digit = IA5_to_Hex(src[offset])) < 0x0D)) //octet 4 + { + dst->num_digit[i] = digit; + offset++; + i++; + } + } + + return ISDN_CM_OK; +} + +u8 isdn_encode_cg_addr(u8 *dst, CgPtyAddr *src) +{ + u8 offset = 0; + dst[offset++] = 0x80 | (src->addr_type << 4) | (src->odd_even << 3); + memcpy(dst+offset, src->addr_info, src->addr_info_len); + offset += src->addr_info_len; + + return offset; +} + +int isdn_decode_cg_addr(CgPtyAddr *dst, u8 *src, u8 len) +{ + u8 offset = 0; + dst->pres = 1; + if((len < 2) || (len > 21)) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + + if(!(src[offset] & 0x80)) + { + printf("encode ie err!\n"); + return ISDN_CM_FAILED; + } + dst->addr_type = ((src[offset] & 0x70) >> 4); + dst->odd_even = ((src[offset++] & 0x08) >> 3); + dst->addr_info_len = len - 1; + memcpy(dst->addr_info, src+offset, dst->addr_info_len); + + return ISDN_CM_OK; +} + +u8 isdn_encode_cd_num(u8 *dst, CdPtyNum *src) +{ + u8 offset = 0; + int i = 0; + dst[offset++] = 0x80 | (src->num_type << 4) | (src->num_plan_id); + while(i < src->num_digit_len) + { + dst[offset++] = Hex_to_IA5(src->num_digit[i]); + i++; + } + + return offset; +} + +int isdn_decode_cd_num(CdPtyNum *dst, u8 *src, u8 len) +{ + u8 offset = 0, digit; + int i = 0; + dst->pres = 1; + if((len < 2) || (len > 33)) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + + if(!(src[offset] & 0x80)) + { + printf("encode ie err!\n"); + return ISDN_CM_FAILED; + } + dst->num_type = ((src[offset] & 0x70) >> 4); + dst->num_plan_id = (src[offset++] & 0x0F); + dst->num_digit_len = len - offset; + while((offset < len) && ((digit = IA5_to_Hex(src[offset])) < 0x0D)) + { + dst->num_digit[i] = digit; + offset++; + i++; + } + + return ISDN_CM_OK; +} + +u8 isdn_encode_cd_addr(u8 *dst, CdPtyAddr *src) +{ + u8 offset = 0; + dst[offset++] = 0x80 | (src->addr_type << 4) | (src->odd_even); + memcpy(dst+offset, src->addr_info, src->addr_info_len); + offset += src->addr_info_len; + + return offset; +} + +int isdn_decode_cd_addr(CdPtyAddr *dst, u8 *src, u8 len) +{ + u8 offset = 0; + dst->pres = 1; + if((len < 2) || (len > 21)) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + + if(!(src[offset] & 0x80)) + { + printf("encode ie err!\n"); + return ISDN_CM_FAILED; + } + dst->addr_type = ((src[offset] & 0x70) >> 4); + dst->odd_even = ((src[offset++] & 0x08) >> 3); + dst->addr_info_len = len - 1; + memcpy(dst->addr_info, src+offset, dst->addr_info_len); + + return ISDN_CM_OK; +} + +u8 isdn_encode_tran_sel(u8 *dst, TranNtSel *src) +{ + u8 offset = 0; + dst[offset++] = 0x80 | (src->net_id_type << 4) | (src->net_id_plan); + dst[offset++] = src->net_id & 0x7F; + + return offset; +} + +int isdn_decode_tran_sel(TranNtSel *dst, u8 *src, u8 len) +{ + u8 offset = 0; + dst->pres = 1; + if(len < 2) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + + if(!(src[offset] & 0x80)) + { + printf("encode ie err!\n"); + return ISDN_CM_FAILED; + } + dst->net_id_type = ((src[offset] & 0x70) >> 4); + dst->net_id_plan = (src[offset++] & 0x0F); + dst->net_id = (src[offset++] & 0x7F); + + return ISDN_CM_OK; +} + +u8 isdn_encode_restart_ind(u8 *dst, RestartInd *src) +{ + u8 offset = 0; + dst[offset++] = 0x80 | (src->clas); + + return offset; +} + +int isdn_decode_restart_ind(RestartInd *dst, u8 *src, u8 len) +{ + u8 offset = 0; + dst->pres = 1; + if(len != 1) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + + if(!(src[offset] & 0x80)) + { + printf("encode ie err!\n"); + return ISDN_CM_FAILED; + } + dst->clas = (src[offset++] & 0x07); + + return ISDN_CM_OK; +} + +u8 isdn_encode_ll_comp(u8 *dst, LLComp *src) +{ + u8 offset = 0; + dst[offset++] = (src->b3.has_ext_a << 7) | (src->b3.code_stan << 5) | (src->b3.tran_cap); + if(!src->b3.has_ext_a) //octet 3 with 3a + { + dst[offset++] = 0x80 | (src->b3.neg_ind << 6); + } + dst[offset++] = 0x80 | (src->b4.tran_mode << 5) | (src->b4.tran_rate); + if((src->b4.tran_rate & 0x1F) == 0x18) //with 4.1 multirate + { + dst[offset++] = 0x80 | (src->b4.rate_mul); + } + if(src->ext_flag & 0x01) //octet 5 + { + dst[offset++] = (src->b5.has_ext_a << 7) | (0x1 << 5) | (src->b5.usr_layer1); + if(!src->b5.has_ext_a) //with 5a + { + dst[offset++] = (src->b5.has_ext_b << 7) | (src->b5.syn_asy << 6) | + (src->b5.neg << 5) | (src->b5.usr_rate); + + if(!src->b5.has_ext_b) //with 5b + { + if((src->b5.usr_layer1 & 0xFF) == 0x1) + { + dst[offset++] = (src->b5.has_ext_c << 7) | (src->b5.inter_rate << 5) | + (src->b5.nic_tx << 4) | (src->b5.nic_rx << 3) | + (src->b5.ctl_tx << 2) | (src->b5.ctl_rx <<1); + } + else if((src->b5.usr_layer1 & 0xFF) == 0x8) + { + dst[offset++] = (src->b5.has_ext_c << 7) | (src->b5.hdr << 6) | + (src->b5.mul_fra << 5) | (src->b5.mode << 4) | + (src->b5.lli_neg << 3) | (src->b5.assign << 2) | + (src->b5.inband << 1); + } + + if(!src->b5.has_ext_c) //5c + { + dst[offset++] = (src->b5.has_ext_d << 7) | (src->b5.stop_bit << 5) | + (src->b5.data_bit << 3) | (src->b5.par); + + if(!src->b5.has_ext_d) //5d + { + dst[offset++] = 0x80 | (src->b5.du_mode << 6) | (src->b5.mod_type); + } + } + } + } + } + else if(src->ext_flag & 0x02) //octet 6 + { + if((src->b6.usr_layer2 & 0x1F) == 0x10) //with 6a for user specified layer 2 protocol + { + dst[offset++] = (0x2 << 5) | (src->b6.usr_layer2); + dst[offset++] = 0x80 | (src->b6.usr_layer2_info); + } + else if(((src->b6.usr_layer2 & 0x1F) == 0x02) || ((src->b6.usr_layer2 & 0x1F) == 0x06) || + ((src->b6.usr_layer2 & 0x1F) == 0x07) || ((src->b6.usr_layer2 & 0x1F) == 0x09) || + ((src->b6.usr_layer2 & 0x1F) == 0x0A) || ((src->b6.usr_layer2 & 0x1F) == 0x0B) || + ((src->b6.usr_layer2 & 0x1F) == 0x0D) || ((src->b6.usr_layer2 & 0x1F) == 0x0E) || + ((src->b6.usr_layer2 & 0x1F) == 0x11)) //with 6a and 6b HDLC elements + { + dst[offset++] = (0x2 << 5) | (src->b6.usr_layer2); + dst[offset++] = (src->b6.mode << 5) | (src->b6.q933_use); + dst[offset++] = 0x80 | (src->b6.win_size); + } + else + { + dst[offset++] = 0x80 | (0x2 << 5) | (src->b6.usr_layer2); + } + } + else if(src->ext_flag & 0x04) //octet 7 + { + if((src->b7.usr_layer3 & 0x1F) == 0x10) //with 7a for user specified layer 3 protocol + { + dst[offset++] = (0x3 << 5) | (src->b7.usr_layer3); + dst[offset++] = 0x80 | (src->b7.usr_layer3_info); + } + else if(((src->b7.usr_layer3 & 0x1F) == 0x6) || ((src->b7.usr_layer3 & 0x1F) == 0x7) || + ((src->b7.usr_layer3 & 0x1F) == 0x8)) //with 7a, 7b and 7c + { + dst[offset++] = (0x3 << 5) | (src->b7.usr_layer3); + dst[offset++] = (src->b7.mode); + dst[offset++] = (src->b7.def_pac_size); + dst[offset++] = 0x80 | (src->b7.pac_win_size); + } + else + { + dst[offset++] = 0x80 | (0x3 << 5) | (src->b7.usr_layer3); + } + } + + return offset; +} + +int isdn_decode_ll_comp(LLComp *dst, u8 *src, u8 len) +{ + u8 offset = 0; + dst->pres = 1; + if((len < 2) || (len > 16)) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + dst->b3.has_ext_a = ((src[offset] & 0x80) >> 7); + dst->b3.code_stan = ((src[offset] & 0x60) >> 5); + dst->b3.tran_cap = (src[offset++] & 0x1F); + if(!dst->b3.has_ext_a) //with 3a + { + dst->b3.neg_ind = ((src[offset++] & 0x40) >> 6); + } + + if(!(src[offset] & 0x80)) + { + printf("encode ie err!\n"); + return ISDN_CM_FAILED; + } + dst->b4.tran_mode = ((src[offset] & 0x60) >> 5); + dst->b4.tran_rate = (src[offset++] & 0x1F); + if((dst->b4.tran_rate & 0x1F) == 0x18) //with 4.1 + { + dst->b4.rate_mul = (src[offset++] & 0x7F); + } + + if(offset < len) //octet at offside + { + if(((src[offset] & 0x60) >> 5) == 0x1) //octet 5 + { + dst->ext_flag |= 0x01; + dst->b5.has_ext_a = ((src[offset] & 0x80) >> 7); + dst->b5.usr_layer1 = (src[offset++] & 0x1F); + if(!dst->b5.has_ext_a) //with 5a + { + dst->b5.has_ext_b = ((src[offset] & 0x80) >> 7); + dst->b5.syn_asy = ((src[offset] & 0x40) >> 6); + dst->b5.neg = ((src[offset] & 0x20) >> 5); + dst->b5.usr_rate = (src[offset++] & 0x1F); + if(!dst->b5.has_ext_b) //with 5b + { + dst->b5.has_ext_c = ((src[offset] & 0x80) >> 7); + if((dst->b5.usr_layer1 & 0x1F) == 0x1) //V.110/X.30 + { + dst->b5.inter_rate = ((src[offset] & 0x60) >> 5); + dst->b5.nic_tx = ((src[offset] & 0x10) >> 4); + dst->b5.nic_rx = ((src[offset] & 0x08) >> 3); + dst->b5.ctl_tx = ((src[offset] & 0x04) >> 2); + dst->b5.ctl_rx = ((src[offset++] & 0x02) >> 1); + } + else if((dst->b5.usr_layer1 & 0x1F) == 0x8) //V.120 + { + dst->b5.hdr = ((src[offset] & 0x40) >> 6); + dst->b5.mul_fra = ((src[offset] & 0x20) >> 5); + dst->b5.mode = ((src[offset] & 0x10) >> 4); + dst->b5.lli_neg = ((src[offset] & 0x08) >> 3); + dst->b5.assign = ((src[offset] & 0x04) >> 2); + dst->b5.inband =((src[offset++] & 0x02) >> 1); + } + + if(!dst->b5.has_ext_c) //with 5c + { + dst->b5.has_ext_d = ((src[offset] & 0x80) >> 7); + dst->b5.stop_bit = ((src[offset] & 0x60) >> 5); + dst->b5.data_bit = ((src[offset] & 0x18) >> 3); + dst->b5.par = (src[offset++] & 0x07); + + if(!dst->b5.has_ext_d) //with 5d + { + dst->b5.du_mode = ((src[offset] & 0x40) >> 6); + dst->b5.mod_type =(src[offset++] & 0x3F); + } + } + } + } + } + } + if(offset < len) //octet at offside + { + if(((src[offset] & 0x60) >> 5) == 0x2) //octet 6 + { + dst->ext_flag |= 0x02; + dst->b6.usr_layer2 = (src[offset++] & 0x1F); + if((dst->b6.usr_layer2 & 0x1F) == 0x10) //with 6a for user specified layer 2 protocol + { + dst->b6.usr_layer2_info = (src[offset++] & 0x7F); + } + else if(((dst->b6.usr_layer2 & 0x1F) == 0x02) || ((dst->b6.usr_layer2 & 0x1F) == 0x06) || + ((dst->b6.usr_layer2 & 0x1F) == 0x07) || ((dst->b6.usr_layer2 & 0x1F) == 0x09) || + ((dst->b6.usr_layer2 & 0x1F) == 0x0A) || ((dst->b6.usr_layer2 & 0x1F) == 0x0B) || + ((dst->b6.usr_layer2 & 0x1F) == 0x0D) || ((dst->b6.usr_layer2 & 0x1F) == 0x0E) || + ((dst->b6.usr_layer2 & 0x1F) == 0x11)) //with 6a and 6b HDLC elements + { + dst->b6.mode = ((src[offset] & 0x60) >> 5); + dst->b6.q933_use = (src[offset++] & 0x03); + } + } + } + if(offset < len) //octet at offside + { + if(((src[offset] & 0x60) >> 5) == 0x3) //octet 7 + { + dst->ext_flag |= 0x04; + dst->b7.usr_layer3 = (src[offset] & 0x1F); + if((dst->b7.usr_layer3 & 0x1F) == 0x10) //with 7a for user specified layer 3 protocol + { + dst->b7.usr_layer3_info = (src[offset++] & 0x7F); + } + else if(((dst->b7.usr_layer3 & 0x1F) == 0x6) || ((dst->b7.usr_layer3 & 0x1F) == 0x7) || + ((dst->b7.usr_layer3 & 0x1F) == 0x8)) //with 7a, 7b and 7c + { + dst->b7.mode = ((src[offset++] & 0x60) >> 5); + dst->b7.def_pac_size = (src[offset++] & 0x0F); + dst->b7.pac_win_size = (src[offset++] & 0x7F); + } + } + } + + return ISDN_CM_OK; +} + +u8 isdn_encode_hl_comp(u8 *dst, HLComp *src) +{ + u8 offset = 0; + dst[offset++] = 0x80 | (src->code_stan << 5) | (src->intpr << 2) | (src->pre_meth); + if(((src->b4.hl_ch_id & 0x7F) == 0x5E) || ((src->b4.hl_ch_id & 0x7F) == 0x5F)) //with 4a maintenance or management + { + dst[offset++] = src->b4.hl_ch_id; + dst[offset++] = 0x80 | (src->b4.ex_hl_ch_id); + } + else if(((src->b4.hl_ch_id & 0x7F) >= 0x60) && ((src->b4.hl_ch_id & 0x7F) <= 0x6F)) //with 4a audio visual + { + dst[offset++] = src->b4.hl_ch_id; + dst[offset++] = 0x80 | (src->b4.ex_vid_ch_id); + } + else + { + dst[offset++] = 0x80 | (src->b4.hl_ch_id); + } + + return offset; +} + +int isdn_decode_hl_comp(HLComp *dst, u8 *src, u8 len) +{ + u8 offset = 0; + dst->pres = 1; + if((len < 2) || (len > 3)) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + + if(!(src[offset] & 0x80)) + { + printf("encode ie err!\n"); + return ISDN_CM_FAILED; + } + dst->code_stan = ((src[offset] & 0x60) >> 5); + dst->intpr = ((src[offset] & 0x1C) >> 2); + dst->pre_meth = (src[offset++] & 0x03); + dst->b4.hl_ch_id = (src[offset++] & 0x7F); + if(((dst->b4.hl_ch_id & 0x7F) == 0x5E) || ((dst->b4.hl_ch_id & 0x7F) == 0x5F)) //with 4a maintenance or management + { + dst->b4.ex_hl_ch_id = (src[offset++] & 0x7F); + } + else if(((dst->b4.hl_ch_id & 0x7F) >= 0x60) && ((dst->b4.hl_ch_id & 0x7F) <= 0x6F)) //with 4a audio visual + { + dst->b4.ex_vid_ch_id = (src[offset++] & 0x7F); + } + + return ISDN_CM_OK; +} + +u8 isdn_encode_usr_usr(u8 *dst, UsrUsr *src) +{ + u8 offset = 0; + dst[offset++] = src->pro_discr; + memcpy(dst+offset, src->usr_info, src->usr_info_len); + offset += src->usr_info_len; + + return offset; +} + +int isdn_decode_usr_usr(UsrUsr *dst, u8 *src, u8 len) +{ + u8 offset = 0; + dst->pres = 1; + if((len < 2) || (len > 129)) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + dst->pro_discr = (src[offset++] & 0xFF); + dst->usr_info_len = len - 1; + memcpy(dst->usr_info, src+offset, dst->usr_info_len); + + return ISDN_CM_OK; +} + + +//ie exist only in ansi +u8 ansi_encode_chg_stat(u8 *dst, ChgStat *src) +{ + u8 offset = 0; + dst[offset++] = 0x80 | (src->pref << 6) | (src->new_stat); + + return offset; +} + +int ansi_decode_chg_stat(ChgStat *dst, u8 *src, u8 len) +{ + dst->pres = 1; + if(len != 1) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + + if(!(src[0] & 0x80)) + { + printf("encode ie err!\n"); + return ISDN_CM_FAILED; + } + dst->pref = ((src[0] & 0x40) >> 6); + dst->new_stat = (src[0] & 0x07); + + return ISDN_CM_OK; +} + +u8 ansi_encode_redir_num(u8 *dst, RedirNum *src) +{ + u8 offset = 0; + int i = 0; + dst[offset++] = 0x80 | (src->b3.num_type << 4) | (src->b3.num_plan_id); + dst[offset++] = 0x80 | (src->b3.org_num_stat); // 3a + dst[offset++] = 0x80 | (src->b3.redir_rs); // 3b + + while(i < src->num_digit_len) + { + dst[offset++] = Hex_to_IA5(src->num_digit[i]); + i++; + } + + return offset; +} + +int ansi_decode_redir_num(RedirNum *dst, u8 *src, u8 len) +{ + u8 offset = 0, digit; + int i = 0; + dst->pres = 1; + if((len < 4) || (len > 35)) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + dst->b3.num_type = ((src[offset] & 0x70) >> 4); + dst->b3.num_plan_id = (src[offset++] & 0x0F); + dst->b3.org_num_stat = (src[offset++] & 0x7F); // 3a + dst->b3.redir_rs= (src[offset++] & 0x0F); // 3b + + dst->num_digit_len = len - offset; + while((offset < len) && ((digit = IA5_to_Hex(src[offset])) < 0x0D)) //octet 4 + { + dst->num_digit[i] = digit; + offset++; + i++; + } + + return ISDN_CM_OK; +} + + +//QSIG +u8 qsig_encode_conn_num(u8 *dst, ConnNum *src) +{ + u8 offset = 0; + int i = 0; + dst[offset++] = (src->b3.has_ext_a << 7) | (src->b3.num_type << 4) | (src->b3.num_plan_id); + if(!src->b3.has_ext_a) //with 3a + { + dst[offset++] = 0x80 | (src->b3.pres_ind << 5) | (src->b3.screen_ind); + } + + if(src->ext_flag & 0x01) //octet 4 + { + while(i < src->num_digit_len) + { + dst[offset++] = Hex_to_IA5(src->num_digit[i]); + i++; + } + } + + return offset; +} + +int qsig_decode_conn_num(ConnNum *dst, u8 *src, u8 len) +{ + u8 offset = 0, digit; + int i = 0; + dst->pres = 1; + if((len < 1) || (len > 34)) + { + printf("len err!\n"); + return ISDN_CM_FAILED; + } + dst->b3.has_ext_a = ((src[offset] & 0x80) >> 7); + dst->b3.num_type = ((src[offset] & 0x70) >> 4); + dst->b3.num_plan_id = (src[offset++] & 0x0F); + if(!dst->b3.has_ext_a) //with 3a + { + dst->b3.pres_ind = ((src[offset] & 0x60) >> 5); + dst->b3.screen_ind = (src[offset++] & 0x03); + } + + if(offset < len) + { + dst->ext_flag |= 0x01; + dst->num_digit_len = len - offset; + while((offset < len) && ((digit = IA5_to_Hex(src[offset])) < 0x0D)) //octet 4 + { + dst->num_digit[i] = digit; + offset++; + i++; + } + } + + return ISDN_CM_OK; +} + diff --git a/omc/plat/isdn/src/isdn_msg.c b/omc/plat/isdn/src/isdn_msg.c new file mode 100644 index 0000000..a0059b1 --- /dev/null +++ b/omc/plat/isdn/src/isdn_msg.c @@ -0,0 +1,3439 @@ +/*********************************************************** +Copyright (C), LGC Wireless. +File Name: isdn_rm.c +Description: ISDN Resource Management +Version: v9.0.0 +Author: Gengxin Chen +Create Date: 2008-2-19 +History: + + +************************************************************/ +#include "./include/isdn_const.h" +#include "../../m2ua/src/include/m2ua_const.h" +#include "./include/isdn_rm.h" +#include "./include/isdn_debug.h" +#include "./include/isdn_ext.h" +#include "./include/isdn_inc.h" + + +extern void isdn_cpc_proc(u32 pid); +extern void service_bc_proc(u32 pid); +extern void service_dc_proc(u32 pid); +extern void isdn_restart_ctrl(u32 pid); +extern int isdn_rel_proc(u32 pid, u32 cause); +extern int rel_cr(u32 pid); +extern inline void isdn_cpc_clear(ISDN_Port_struct *pPort); +extern int isdn_event_handle(u32 pid, u8 primitive); +extern void isdn_set_cause(CauseStr *cause_ptr, u8 val); +extern void isdn_set_status(IsdnStatus *status_ptr, u8 state, u8 cause_val); +//msc +extern int msc_give_cic_value(u32 tg_id, int head_cic); + +static int isdn_encode_alert(u8 *dst, IsdnMsgStr *src, int variant) +{ + IsdnAlert *ptr = &src->msg_list.alert; + u8 *flw_ptr = dst; + + //Optional + if(variant == VARIANT_ITU) + { + if(ptr->br_cap.pres == 1) + { + flw_ptr[0] = IE_BR_CAP; + flw_ptr[1] = itu_encode_br_cap(flw_ptr+2, &ptr->br_cap); + flw_ptr += flw_ptr[1] + 2; + } + } + + if(ptr->chnl_id.pres == 1) + { + flw_ptr[0] = IE_CHNL_ID; + if(variant == VARIANT_QSIG) + flw_ptr[1] = qsig_encode_chnl_id(flw_ptr+2, &ptr->chnl_id); + else + flw_ptr[1] = isdn_encode_chnl_id(flw_ptr+2, &ptr->chnl_id); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->prg_ind.pres == 1) + { + flw_ptr[0] = IE_PRG_IND; + flw_ptr[1] = isdn_encode_prg_ind(flw_ptr+2, &ptr->prg_ind); + flw_ptr += flw_ptr[1] + 2; + } + + if(variant == VARIANT_ITU) + { + if(ptr->disp.pres == 1) + { + flw_ptr[0] = IE_DISP; + flw_ptr[1] = isdn_encode_disp(flw_ptr+2, &ptr->disp); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->sign.pres == 1) + { + flw_ptr[0] = IE_SIGN; + flw_ptr[1] = isdn_encode_sign(flw_ptr+2, &ptr->sign); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->hl_comp.pres == 1) + { + flw_ptr[0] = IE_HL_COMP; + flw_ptr[1] = isdn_encode_hl_comp(flw_ptr+2, &ptr->hl_comp); + flw_ptr += flw_ptr[1] + 2; + } + } + + return flw_ptr - dst; +} + +int isdn_decode_alert(IsdnMsgStr *dst, u8 *src, int variant, u8 len) +{ + IsdnAlert *ptr = &dst->msg_list.alert; + u8 *flw_ptr = src; + + while(flw_ptr+2-src <= len) + { + if(*flw_ptr == 0) + { + break; + } + switch(*flw_ptr) + { + case IE_BR_CAP: + if(variant == VARIANT_ITU) + itu_decode_br_cap(&ptr->br_cap, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_CHNL_ID: + if(variant == VARIANT_QSIG) + qsig_decode_chnl_id(&ptr->chnl_id, flw_ptr+2, flw_ptr[1]); + else + isdn_decode_chnl_id(&ptr->chnl_id, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_PRG_IND: + isdn_decode_prg_ind(&ptr->prg_ind, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_DISP: + if(variant == VARIANT_ITU) + isdn_decode_disp(&ptr->disp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_SIGN: + if(variant == VARIANT_ITU) + isdn_decode_sign(&ptr->sign, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_HL_COMP: + if(variant == VARIANT_ITU) + isdn_decode_hl_comp(&ptr->hl_comp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + if(*flw_ptr >= 0x80) //single octet IE + flw_ptr += 1; + else + flw_ptr += flw_ptr[1] + 2; + break; + } + } + + return ISDN_CM_OK; +} + +static int isdn_encode_call_proc(u8 *dst, IsdnMsgStr *src, int variant) +{ + IsdnCallProc *ptr = &src->msg_list.callProc; + u8 *flw_ptr = dst; + + //Optional + if(variant == VARIANT_ITU) + { + if(ptr->br_cap.pres == 1) + { + flw_ptr[0] = IE_BR_CAP; + flw_ptr[1] = itu_encode_br_cap(flw_ptr+2, &ptr->br_cap); + flw_ptr += flw_ptr[1] + 2; + } + } + + //if(ptr->chnl_id.pres == 1) + { + flw_ptr[0] = IE_CHNL_ID; + if(variant == VARIANT_QSIG) + flw_ptr[1] = qsig_encode_chnl_id(flw_ptr+2, &ptr->chnl_id); + else + flw_ptr[1] = isdn_encode_chnl_id(flw_ptr+2, &ptr->chnl_id); + flw_ptr += flw_ptr[1] + 2; + } + + if(variant == VARIANT_ITU) + { + if(ptr->prg_ind.pres == 1) + { + flw_ptr[0] = IE_PRG_IND; + flw_ptr[1] = isdn_encode_prg_ind(flw_ptr+2, &ptr->prg_ind); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->disp.pres == 1) + { + flw_ptr[0] = IE_DISP; + flw_ptr[1] = isdn_encode_disp(flw_ptr+2, &ptr->disp); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->hl_comp.pres == 1) + { + flw_ptr[0] = IE_HL_COMP; + flw_ptr[1] = isdn_encode_hl_comp(flw_ptr+2, &ptr->hl_comp); + flw_ptr += flw_ptr[1] + 2; + } + } + + return flw_ptr - dst; +} + +int isdn_decode_call_proc(IsdnMsgStr *dst, u8 *src, int variant, u8 len) +{ + IsdnCallProc *ptr = &dst->msg_list.callProc; + u8 *flw_ptr = src; + u8 ie_m = 0; + int ret = 0; + + while(flw_ptr+2-src <= len) + { + if(*flw_ptr == 0) + { + if(ie_m != 1) + { + printf("mandatory ie is absent!\n"); + return 3; + } + break; + } + switch(*flw_ptr) + { + case IE_BR_CAP: + if(variant == VARIANT_ITU) + itu_decode_br_cap(&ptr->br_cap, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_CHNL_ID: //M + if(variant == VARIANT_QSIG) + ret = qsig_decode_chnl_id(&ptr->chnl_id, flw_ptr+2, flw_ptr[1]); + else + ret = isdn_decode_chnl_id(&ptr->chnl_id, flw_ptr+2, flw_ptr[1]); + if(!ret) + { + printf("mandatory ie is err!\n"); + return 2; + } + ie_m++; + flw_ptr += flw_ptr[1] + 2; + break; + case IE_PRG_IND: + if(variant == VARIANT_ITU) + isdn_decode_prg_ind(&ptr->prg_ind, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_DISP: + if(variant == VARIANT_ITU) + isdn_decode_disp(&ptr->disp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_HL_COMP: + if(variant == VARIANT_ITU) + isdn_decode_hl_comp(&ptr->hl_comp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + if(*flw_ptr >= 0x80) //single octet IE + flw_ptr += 1; + else + flw_ptr += flw_ptr[1] + 2; + break; + } + } + if(ie_m != 1) + { + printf("mandatory ie is absent!\n"); + return 3; + } + + return ISDN_CM_OK; +} + +static int isdn_encode_conn(u8 *dst, IsdnMsgStr *src, int variant) +{ + IsdnConn *ptr = &src->msg_list.conn; + u8 *flw_ptr = dst; + + //Optional + if(variant == VARIANT_ITU) + { + if(ptr->br_cap.pres == 1) + { + flw_ptr[0] = IE_BR_CAP; + flw_ptr[1] = itu_encode_br_cap(flw_ptr+2, &ptr->br_cap); + flw_ptr += flw_ptr[1] + 2; + } + } + + if(ptr->chnl_id.pres == 1) + { + flw_ptr[0] = IE_CHNL_ID; + if(variant == VARIANT_QSIG) + flw_ptr[1] = qsig_encode_chnl_id(flw_ptr+2, &ptr->chnl_id); + else + flw_ptr[1] = isdn_encode_chnl_id(flw_ptr+2, &ptr->chnl_id); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->prg_ind.pres == 1) + { + flw_ptr[0] = IE_PRG_IND; + flw_ptr[1] = isdn_encode_prg_ind(flw_ptr+2, &ptr->prg_ind); + flw_ptr += flw_ptr[1] + 2; + } + + if(variant == VARIANT_ITU) + { + if(ptr->disp.pres == 1) + { + flw_ptr[0] = IE_DISP; + flw_ptr[1] = isdn_encode_disp(flw_ptr+2, &ptr->disp); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->dt_time.pres == 1) + { + flw_ptr[0] = IE_DT_TIME; + flw_ptr[1] = isdn_encode_dt_time(flw_ptr+2, &ptr->dt_time); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->sign.pres == 1) + { + flw_ptr[0] = IE_SIGN; + flw_ptr[1] = isdn_encode_sign(flw_ptr+2, &ptr->sign); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->ll_comp.pres == 1) + { + flw_ptr[0] = IE_LL_COMP; + flw_ptr[1] = isdn_encode_ll_comp(flw_ptr+2, &ptr->ll_comp); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->hl_comp.pres == 1) + { + flw_ptr[0] = IE_HL_COMP; + flw_ptr[1] = isdn_encode_hl_comp(flw_ptr+2, &ptr->hl_comp); + flw_ptr += flw_ptr[1] + 2; + } + } + else if(variant == VARIANT_QSIG) + { + if(ptr->conn_num.pres == 1) + { + flw_ptr[0] = IE_CONN_NUM; + flw_ptr[1] = qsig_encode_conn_num(flw_ptr+2, &ptr->conn_num); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->ll_comp.pres == 1) + { + flw_ptr[0] = IE_LL_COMP; + flw_ptr[1] = isdn_encode_ll_comp(flw_ptr+2, &ptr->ll_comp); + flw_ptr += flw_ptr[1] + 2; + } + } + + return flw_ptr - dst; +} + +int isdn_decode_conn(IsdnMsgStr *dst, u8 *src, int variant, u8 len) +{ + IsdnConn *ptr = &dst->msg_list.conn; + u8 *flw_ptr = src; + + while(flw_ptr+2-src <= len) + { + if(*flw_ptr == 0) + { + break; + } + switch(*flw_ptr) + { + case IE_BR_CAP: + if(variant == VARIANT_ITU) + itu_decode_br_cap(&ptr->br_cap, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_CHNL_ID: + if(variant == VARIANT_QSIG) + qsig_decode_chnl_id(&ptr->chnl_id, flw_ptr+2, flw_ptr[1]); + else + isdn_decode_chnl_id(&ptr->chnl_id, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_PRG_IND: + isdn_decode_prg_ind(&ptr->prg_ind, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_DISP: + if(variant == VARIANT_ITU) + isdn_decode_disp(&ptr->disp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_DT_TIME: + if(variant == VARIANT_ITU) + isdn_decode_dt_time(&ptr->dt_time, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_SIGN: + if(variant == VARIANT_ITU) + isdn_decode_sign(&ptr->sign, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_CONN_NUM: + if(variant == VARIANT_QSIG) + qsig_decode_conn_num(&ptr->conn_num, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_LL_COMP: + if(variant == VARIANT_ITU || variant == VARIANT_QSIG) + isdn_decode_ll_comp(&ptr->ll_comp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_HL_COMP: + if(variant == VARIANT_ITU) + isdn_decode_hl_comp(&ptr->hl_comp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + if(*flw_ptr >= 0x80) //single octet IE + flw_ptr += 1; + else + flw_ptr += flw_ptr[1] + 2; + break; + } + } + + return ISDN_CM_OK; +} + +static int isdn_encode_conn_ack(u8 *dst, IsdnMsgStr *src, int variant) +{ + IsdnConnAck *ptr = &src->msg_list.connAck; + u8 *flw_ptr = dst; + + //Optional + if(variant == VARIANT_ITU) + { + if(ptr->disp.pres == 1) + { + flw_ptr[0] = IE_DISP; + flw_ptr[1] = isdn_encode_disp(flw_ptr+2, &ptr->disp); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->sign.pres == 1) + { + flw_ptr[0] = IE_SIGN; + flw_ptr[1] = isdn_encode_sign(flw_ptr+2, &ptr->sign); + flw_ptr += flw_ptr[1] + 2; + } + } + + return flw_ptr - dst; +} + +int isdn_decode_conn_ack(IsdnMsgStr *dst, u8 *src, int variant, u8 len) +{ + IsdnConnAck *ptr = &dst->msg_list.connAck; + u8 *flw_ptr = src; + + while(flw_ptr+2-src <= len) + { + if(*flw_ptr == 0) + { + break; + } + switch(*flw_ptr) + { + case IE_DISP: + if(variant == VARIANT_ITU) + isdn_decode_disp(&ptr->disp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_SIGN: + if(variant == VARIANT_ITU) + isdn_decode_sign(&ptr->sign, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + if(*flw_ptr >= 0x80) //single octet IE + flw_ptr += 1; + else + flw_ptr += flw_ptr[1] + 2; + break; + } + } + + return ISDN_CM_OK; +} + +static int isdn_encode_prog(u8 *dst, IsdnMsgStr *src, int variant) +{ + IsdnProg *ptr = &src->msg_list.prog; + u8 *flw_ptr = dst; + + //Optional + if(variant == VARIANT_ITU) + { + if(ptr->br_cap.pres == 1) + { + flw_ptr[0] = IE_BR_CAP; + flw_ptr[1] = itu_encode_br_cap(flw_ptr+2, &ptr->br_cap); + flw_ptr += flw_ptr[1] + 2; + } + } + + if(ptr->cause.pres == 1) + { + flw_ptr[0] = IE_CAUSE; + flw_ptr[1] = isdn_encode_cause(flw_ptr+2, &ptr->cause); + flw_ptr += flw_ptr[1] + 2; + } + + //Mandatory if(ptr->prg_ind.pres == 1) + { + flw_ptr[0] = IE_PRG_IND; + flw_ptr[1] = isdn_encode_prg_ind(flw_ptr+2, &ptr->prg_ind); + flw_ptr += flw_ptr[1] + 2; + } + + //Optional + if(variant == VARIANT_ITU) + { + if(ptr->disp.pres == 1) + { + flw_ptr[0] = IE_DISP; + flw_ptr[1] = isdn_encode_disp(flw_ptr+2, &ptr->disp); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->hl_comp.pres == 1) + { + flw_ptr[0] = IE_HL_COMP; + flw_ptr[1] = isdn_encode_hl_comp(flw_ptr+2, &ptr->hl_comp); + flw_ptr += flw_ptr[1] + 2; + } + } + + return flw_ptr - dst; +} + +int isdn_decode_prog(IsdnMsgStr *dst, u8 *src, int variant, u8 len) +{ + IsdnProg *ptr = &dst->msg_list.prog; + u8 *flw_ptr = src; + u8 ie_m = 0; + + while(flw_ptr+2-src <= len) + { + if(*flw_ptr == 0) + { + if(ie_m != 1) + { + printf("mandatory ie is absent!\n"); + return 3; + } + break; + } + switch(*flw_ptr) + { + case IE_BR_CAP: + if(variant == VARIANT_ITU) + itu_decode_br_cap(&ptr->br_cap, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_CAUSE: + isdn_decode_cause(&ptr->cause, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_PRG_IND: //M + if(!(isdn_decode_prg_ind(&ptr->prg_ind, flw_ptr+2, flw_ptr[1]))) + { + printf("mandatory ie is err!\n"); + return 2; + } + ie_m++; + flw_ptr += flw_ptr[1] + 2; + break; + case IE_DISP: + if(variant == VARIANT_ITU) + isdn_decode_disp(&ptr->disp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_HL_COMP: + if(variant == VARIANT_ITU) + isdn_decode_hl_comp(&ptr->hl_comp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + if(*flw_ptr >= 0x80) //single octet IE + flw_ptr += 1; + else + flw_ptr += flw_ptr[1] + 2; + break; + } + } + if(ie_m != 1) + { + printf("mandatory ie is absent!\n"); + return 3; + } + + return ISDN_CM_OK; +} + +static int isdn_encode_setup(u8 *dst, IsdnMsgStr *src, int variant) +{ + IsdnSetup *ptr = &src->msg_list.setup; + u8 *flw_ptr = dst; + + //Optional + if(variant == VARIANT_ITU || variant == VARIANT_QSIG) + { + if(ptr->sd_comp.pres == 1) + { + flw_ptr[0] = IE_SD_COMP; + flw_ptr += 1; + } + } + + if(variant == VARIANT_ITU) + { + if(ptr->rpt_ind.pres == 1) + { + flw_ptr[0] = IE_RPT_IND; + flw_ptr += 1; + } + } + + //Mandatory if(ptr->br_cap.pres == 1) + { + flw_ptr[0] = IE_BR_CAP; + if(variant == VARIANT_ITU) + flw_ptr[1] = itu_encode_br_cap(flw_ptr+2, &ptr->br_cap); + else + flw_ptr[1] = isdn_encode_br_cap(flw_ptr+2, &ptr->br_cap); + flw_ptr += flw_ptr[1] + 2; + } + //if(ptr->chnl_id.pres == 1) //user side is optional but network side is mandatory + { + flw_ptr[0] = IE_CHNL_ID; + if(variant == VARIANT_QSIG) + flw_ptr[1] = qsig_encode_chnl_id(flw_ptr+2, &ptr->chnl_id); + else + flw_ptr[1] = isdn_encode_chnl_id(flw_ptr+2, &ptr->chnl_id); + flw_ptr += flw_ptr[1] + 2; + } + + //Optional + if(ptr->prg_ind.pres == 1) + { + flw_ptr[0] = IE_PRG_IND; + flw_ptr[1] = isdn_encode_prg_ind(flw_ptr+2, &ptr->prg_ind); + flw_ptr += flw_ptr[1] + 2; + } + + if(variant == VARIANT_ITU || variant == VARIANT_ANSI) + { + if(ptr->nt_sp_fac.pres == 1) + { + flw_ptr[0] = IE_NT_SP_FAC; + flw_ptr[1] = isdn_encode_ntsp_fac(flw_ptr+2, &ptr->nt_sp_fac); + flw_ptr += flw_ptr[1] + 2; + } + } + + if(variant == VARIANT_ITU) + { + if(ptr->disp.pres == 1) + { + flw_ptr[0] = IE_DISP; + flw_ptr[1] = isdn_encode_disp(flw_ptr+2, &ptr->disp); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->dt_time.pres == 1) + { + flw_ptr[0] = IE_DT_TIME; + flw_ptr[1] = isdn_encode_dt_time(flw_ptr+2, &ptr->dt_time); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->kpd_fac.pres == 1) + { + flw_ptr[0] = IE_KPD_FAC; + flw_ptr[1] = isdn_encode_kpd_fac(flw_ptr+2, &ptr->kpd_fac); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->sign.pres == 1) + { + flw_ptr[0] = IE_SIGN; + flw_ptr[1] = isdn_encode_sign(flw_ptr+2, &ptr->sign); + flw_ptr += flw_ptr[1] + 2; + } + } + + if(ptr->cg_pty_num.pres == 1) + { + flw_ptr[0] = IE_CG_PTY_NUM; + flw_ptr[1] = isdn_encode_cg_num(flw_ptr+2, &ptr->cg_pty_num); + flw_ptr += flw_ptr[1] + 2; + } + + if(variant == VARIANT_ITU || variant == VARIANT_QSIG) + { + if(ptr->cg_pty_addr.pres == 1) + { + flw_ptr[0] = IE_CG_PTY_ADDR; + flw_ptr[1] = isdn_encode_cg_addr(flw_ptr+2, &ptr->cg_pty_addr); + flw_ptr += flw_ptr[1] + 2; + } + } + + if(ptr->cd_pty_num.pres == 1) + { + flw_ptr[0] = IE_CD_PTY_NUM; + flw_ptr[1] = isdn_encode_cd_num(flw_ptr+2, &ptr->cd_pty_num); + flw_ptr += flw_ptr[1] + 2; + } + + if(variant == VARIANT_ITU || variant == VARIANT_QSIG) + { + if(ptr->cd_pty_addr.pres == 1) + { + flw_ptr[0] = IE_CD_PTY_ADDR; + flw_ptr[1] = isdn_encode_cd_addr(flw_ptr+2, &ptr->cd_pty_addr); + flw_ptr += flw_ptr[1] + 2; + } + } + + if(variant == VARIANT_ANSI) + { + if(ptr->redir_num.pres == 1) + { + flw_ptr[0] = IE_REDIR_NUM; + flw_ptr[1] = ansi_encode_redir_num(flw_ptr+2, &ptr->redir_num); + flw_ptr += flw_ptr[1] + 2; + } + } + + if(variant == VARIANT_ITU || variant == VARIANT_ANSI) + { + if(ptr->tran_nt_sel.pres == 1) + { + flw_ptr[0] = IE_TRAN_NT_SEL; + flw_ptr[1] = isdn_encode_tran_sel(flw_ptr+2, &ptr->tran_nt_sel); + flw_ptr += flw_ptr[1] + 2; + } + } + + if(variant == VARIANT_ITU || variant == VARIANT_QSIG) + { + if(ptr->ll_comp.pres == 1) + { + flw_ptr[0] = IE_LL_COMP; + flw_ptr[1] = isdn_encode_ll_comp(flw_ptr+2, &ptr->ll_comp); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->hl_comp.pres == 1) + { + flw_ptr[0] = IE_HL_COMP; + flw_ptr[1] = isdn_encode_hl_comp(flw_ptr+2, &ptr->hl_comp); + flw_ptr += flw_ptr[1] + 2; + } + } + + return flw_ptr - dst; +} + +int isdn_decode_setup(IsdnMsgStr *dst, u8 *src, int variant, u8 len) +{ + IsdnSetup *ptr = &dst->msg_list.setup; + u8 *flw_ptr = src; + u8 ie_m = 0; + int ret = 0; + int qsig_ie_m = 0; + + while(flw_ptr+1-src <= len) + { + if(*flw_ptr == 0) + { + if(ie_m != 1) + { + printf("mandatory ie is absent!\n"); + return 3; + } + if(qsig_ie_m != 2 && variant != VARIANT_ITU) + { + printf("mandatory ie is absent!\n"); + return 3; + } + break; + } + switch(*flw_ptr) + { + case IE_SD_COMP: + if(variant == VARIANT_ITU || variant == VARIANT_QSIG) + ptr->sd_comp.pres = 1; + flw_ptr += 1; + break; + case IE_RPT_IND: + if(variant == VARIANT_ITU) + ptr->rpt_ind.pres = 1; + flw_ptr += 1; + break; + case IE_BR_CAP: //M + if(!itu_decode_br_cap(&ptr->br_cap, flw_ptr+2, flw_ptr[1])) + { + printf("mandatory ie is err!\n"); + return 2; + } + ie_m++; + flw_ptr += flw_ptr[1] + 2; + break; + case IE_CHNL_ID: //M + if(variant == VARIANT_QSIG) + ret = qsig_decode_chnl_id(&ptr->chnl_id, flw_ptr+2, flw_ptr[1]); + else + ret = isdn_decode_chnl_id(&ptr->chnl_id, flw_ptr+2, flw_ptr[1]); + if(!ret) + { + printf("channel identification ie is err!\n"); + return 2; + } + qsig_ie_m++; + flw_ptr += flw_ptr[1] + 2; + break; + case IE_PRG_IND: + isdn_decode_prg_ind(&ptr->prg_ind, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_NT_SP_FAC: + if(variant == VARIANT_ITU || variant == VARIANT_ANSI) + isdn_decode_ntsp_fac(&ptr->nt_sp_fac, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_DISP: + if(variant == VARIANT_ITU) + isdn_decode_disp(&ptr->disp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_DT_TIME: + if(variant == VARIANT_ITU) + isdn_decode_dt_time(&ptr->dt_time, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_KPD_FAC: + if(variant == VARIANT_ITU) + isdn_decode_kpd_fac(&ptr->kpd_fac, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_SIGN: + if(variant == VARIANT_ITU) + isdn_decode_sign(&ptr->sign, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_CG_PTY_NUM: + isdn_decode_cg_num(&ptr->cg_pty_num, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_CG_PTY_ADDR: + if(variant == VARIANT_ITU || variant == VARIANT_QSIG) + isdn_decode_cg_addr(&ptr->cg_pty_addr, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_CD_PTY_NUM: + ret = isdn_decode_cd_num(&ptr->cd_pty_num, flw_ptr+2, flw_ptr[1]); + if((!ret) && (variant != VARIANT_ITU)) + { + printf("called number ie is err!\n"); + return 2; + } + qsig_ie_m++; + flw_ptr += flw_ptr[1] + 2; + break; + case IE_CD_PTY_ADDR: + if(variant == VARIANT_ITU || variant == VARIANT_QSIG) + isdn_decode_cd_addr(&ptr->cd_pty_addr, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_REDIR_NUM: + if(variant == VARIANT_ANSI) + ansi_decode_redir_num(&ptr->redir_num, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_TRAN_NT_SEL: + if(variant == VARIANT_ITU || variant == VARIANT_ANSI) + isdn_decode_tran_sel(&ptr->tran_nt_sel, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_LL_COMP: + if(variant == VARIANT_ITU || variant == VARIANT_QSIG) + isdn_decode_ll_comp(&ptr->ll_comp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_HL_COMP: + if(variant == VARIANT_ITU || variant == VARIANT_QSIG) + isdn_decode_hl_comp(&ptr->hl_comp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + if(*flw_ptr >= 0x80) //single octet IE + flw_ptr += 1; + else + flw_ptr += flw_ptr[1] + 2; + break; + } + } + if(ie_m != 1) + { + printf("mandatory ie is absent!\n"); + return 3; + } + if(qsig_ie_m != 2 && variant != VARIANT_ITU) + { + printf("mandatory ie is absent!\n"); + return 3; + } + + return ISDN_CM_OK; +} + +static int isdn_encode_setup_ack(u8 *dst, IsdnMsgStr *src, int variant) +{ + IsdnSetupAck *ptr = &src->msg_list.setupAck; + u8 *flw_ptr = dst; + + //Optional + if(variant == VARIANT_ITU) + { + //if(ptr->chnl_id.pres == 1) + { + flw_ptr[0] = IE_CHNL_ID; + flw_ptr[1] = isdn_encode_chnl_id(flw_ptr+2, &ptr->chnl_id); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->prg_ind.pres == 1) + { + flw_ptr[0] = IE_PRG_IND; + flw_ptr[1] = isdn_encode_prg_ind(flw_ptr+2, &ptr->prg_ind); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->disp.pres == 1) + { + flw_ptr[0] = IE_DISP; + flw_ptr[1] = isdn_encode_disp(flw_ptr+2, &ptr->disp); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->sign.pres == 1) + { + flw_ptr[0] = IE_SIGN; + flw_ptr[1] = isdn_encode_sign(flw_ptr+2, &ptr->sign); + flw_ptr += flw_ptr[1] + 2; + } + } + else if(variant == VARIANT_QSIG) + { + //if(ptr->chnl_id.pres == 1) + { + flw_ptr[0] = IE_CHNL_ID; + flw_ptr[1] = qsig_encode_chnl_id(flw_ptr+2, &ptr->chnl_id); + flw_ptr += flw_ptr[1] + 2; + } + } + else + { + printf("encode: there isnot msg setup ack in ansi!\n"); + return -1; + } + + return flw_ptr - dst; +} + +int isdn_decode_setup_ack(IsdnMsgStr *dst, u8 *src, int variant, u8 len) +{ + IsdnSetupAck *ptr = &dst->msg_list.setupAck; + u8 *flw_ptr = src; + u8 ie_m = 0; + int ret; + + while(flw_ptr+2-src <= len) + { + if(*flw_ptr == 0) + { + if(ie_m != 1) + { + printf("mandatory ie is absent!\n"); + return 3; + } + break; + } + switch(*flw_ptr) + { + case IE_CHNL_ID: //M + if(variant == VARIANT_QSIG) + ret = qsig_decode_chnl_id(&ptr->chnl_id, flw_ptr+2, flw_ptr[1]); + else + ret = isdn_decode_chnl_id(&ptr->chnl_id, flw_ptr+2, flw_ptr[1]); + if(!ret) + { + printf("mandatory ie is err!\n"); + return 2; + } + ie_m++; + flw_ptr += flw_ptr[1] + 2; + break; + case IE_PRG_IND: + if(variant == VARIANT_ITU) + isdn_decode_prg_ind(&ptr->prg_ind, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_DISP: + if(variant == VARIANT_ITU) + isdn_decode_disp(&ptr->disp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_SIGN: + if(variant == VARIANT_ITU) + isdn_decode_sign(&ptr->sign, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + if(*flw_ptr >= 0x80) //single octet IE + flw_ptr += 1; + else + flw_ptr += flw_ptr[1] + 2; + break; + } + } + if(ie_m != 1) + { + printf("mandatory ie is absent!\n"); + return 3; + } + + return ISDN_CM_OK; +} + +static int isdn_encode_disc(u8 *dst, IsdnMsgStr *src, int variant) +{ + IsdnDisc *ptr = &src->msg_list.disc; + u8 *flw_ptr = dst; + + //Mandatory if(ptr->cause.pres == 1) + { + flw_ptr[0] = IE_CAUSE; + flw_ptr[1] = isdn_encode_cause(flw_ptr+2, &ptr->cause); + flw_ptr += flw_ptr[1] + 2; + } + + //Optional + if(variant == VARIANT_ITU) + { + if(ptr->prg_ind.pres == 1) + { + flw_ptr[0] = IE_PRG_IND; + flw_ptr[1] = isdn_encode_prg_ind(flw_ptr+2, &ptr->prg_ind); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->disp.pres == 1) + { + flw_ptr[0] = IE_DISP; + flw_ptr[1] = isdn_encode_disp(flw_ptr+2, &ptr->disp); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->sign.pres == 1) + { + flw_ptr[0] = IE_SIGN; + flw_ptr[1] = isdn_encode_sign(flw_ptr+2, &ptr->sign); + flw_ptr += flw_ptr[1] + 2; + } + } + + return flw_ptr - dst; +} + +int isdn_decode_disc(IsdnMsgStr *dst, u8 *src, int variant, u8 len) +{ + IsdnDisc *ptr = &dst->msg_list.disc; + u8 *flw_ptr = src; + u8 ie_m = 0; + + while(flw_ptr+2-src <= len) + { + if(*flw_ptr == 0) + { + if(ie_m != 1) + { + printf("mandatory ie is absent!\n"); + return 3; + } + break; + } + switch(*flw_ptr) + { + case IE_CAUSE: + if(!isdn_decode_cause(&ptr->cause, flw_ptr+2, flw_ptr[1])) + { + printf("mandatory ie is err!\n"); + return 2; + } + ie_m++; + flw_ptr += flw_ptr[1] + 2; + break; + case IE_PRG_IND: + if(variant == VARIANT_ITU) + isdn_decode_prg_ind(&ptr->prg_ind, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_DISP: + if(variant == VARIANT_ITU) + isdn_decode_disp(&ptr->disp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_SIGN: + if(variant == VARIANT_ITU) + isdn_decode_sign(&ptr->sign, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + if(*flw_ptr >= 0x80) //single octet IE + flw_ptr += 1; + else + flw_ptr += flw_ptr[1] + 2; + break; + } + } + if(ie_m != 1) + { + printf("mandatory ie is absent!\n"); + return 3; + } + + return ISDN_CM_OK; +} + +static int isdn_encode_rel(u8 *dst, IsdnMsgStr *src, int variant) +{ + IsdnRel *ptr = &src->msg_list.rel; + u8 *flw_ptr = dst; + + //Optional +// if(ptr->cause.pres == 1) + { + flw_ptr[0] = IE_CAUSE; + flw_ptr[1] = isdn_encode_cause(flw_ptr+2, &ptr->cause); + flw_ptr += flw_ptr[1] + 2; + } + + if(variant == VARIANT_ITU) + { + if(ptr->disp.pres == 1) + { + flw_ptr[0] = IE_DISP; + flw_ptr[1] = isdn_encode_disp(flw_ptr+2, &ptr->disp); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->sign.pres == 1) + { + flw_ptr[0] = IE_SIGN; + flw_ptr[1] = isdn_encode_sign(flw_ptr+2, &ptr->sign); + flw_ptr += flw_ptr[1] + 2; + } + } + + return flw_ptr - dst; +} + +int isdn_decode_rel(IsdnMsgStr *dst, u8 *src, int variant, u8 len) +{ + IsdnRel *ptr = &dst->msg_list.rel; + u8 *flw_ptr = src; + u8 ie_m = 0; + + while(flw_ptr+2-src <= len) + { + if(*flw_ptr == 0) + { + if(ie_m != 1) + { + printf("mandatory ie is absent!\n"); + return 3; + } + break; + } + switch(*flw_ptr) + { + case IE_CAUSE: + if(!isdn_decode_cause(&ptr->cause, flw_ptr+2, flw_ptr[1])) + { + printf("mandatory ie is err!\n"); + return 2; + } + ie_m++; + flw_ptr += flw_ptr[1] + 2; + break; + case IE_DISP: + if(variant == VARIANT_ITU) + isdn_decode_disp(&ptr->disp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_SIGN: + if(variant == VARIANT_ITU) + isdn_decode_sign(&ptr->sign, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + if(*flw_ptr >= 0x80) //single octet IE + flw_ptr += 1; + else + flw_ptr += flw_ptr[1] + 2; + break; + } + } + + return ISDN_CM_OK; +} + +static int isdn_encode_rel_comp(u8 *dst, IsdnMsgStr *src, int variant) +{ + IsdnRelComp *ptr = &src->msg_list.relComp; + u8 *flw_ptr = dst; + + //Optional + if(ptr->cause.pres == 1) + { + flw_ptr[0] = IE_CAUSE; + flw_ptr[1] = isdn_encode_cause(flw_ptr+2, &ptr->cause); + flw_ptr += flw_ptr[1] + 2; + } + if(variant == VARIANT_ITU) + { + if(ptr->disp.pres == 1) + { + flw_ptr[0] = IE_DISP; + flw_ptr[1] = isdn_encode_disp(flw_ptr+2, &ptr->disp); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->sign.pres == 1) + { + flw_ptr[0] = IE_SIGN; + flw_ptr[1] = isdn_encode_sign(flw_ptr+2, &ptr->sign); + flw_ptr += flw_ptr[1] + 2; + } + } + + return flw_ptr - dst; +} + +int isdn_decode_rel_comp(IsdnMsgStr *dst, u8 *src, int variant, u8 len) +{ + IsdnRelComp *ptr = &dst->msg_list.relComp; + u8 *flw_ptr = src; + + while(flw_ptr+2-src <= len) + { + if(*flw_ptr == 0) + { + break; + } + switch(*flw_ptr) + { + case IE_CAUSE: + isdn_decode_cause(&ptr->cause, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_DISP: + if(variant == VARIANT_ITU) + isdn_decode_disp(&ptr->disp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_SIGN: + if(variant == VARIANT_ITU) + isdn_decode_sign(&ptr->sign, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + if(*flw_ptr >= 0x80) //single octet IE + flw_ptr += 1; + else + flw_ptr += flw_ptr[1] + 2; + break; + } + } + + return ISDN_CM_OK; +} + +static int isdn_encode_restart(u8 *dst, IsdnMsgStr *src, int variant) +{ + IsdnRestart *ptr = &src->msg_list.restart; + u8 *flw_ptr = dst; + + //Optional + if(ptr->chnl_id.pres == 1) + { + flw_ptr[0] = IE_CHNL_ID; + flw_ptr[1] = isdn_encode_chnl_id(flw_ptr+2, &ptr->chnl_id); + flw_ptr += flw_ptr[1] + 2; + } + + if(variant == VARIANT_ITU) + { + if(ptr->disp.pres == 1) + { + flw_ptr[0] = IE_DISP; + flw_ptr[1] = isdn_encode_disp(flw_ptr+2, &ptr->disp); + flw_ptr += flw_ptr[1] + 2; + } + } + + //Mandatory if(ptr->restart_ind.pres == 1) + { + flw_ptr[0] = IE_RESTART_IND; + flw_ptr[1] = isdn_encode_restart_ind(flw_ptr+2, &ptr->restart_ind); + flw_ptr += flw_ptr[1] + 2; + } + + return flw_ptr - dst; +} + +int isdn_decode_restart(IsdnMsgStr *dst, u8 *src, int variant, u8 len) +{ + IsdnRestart *ptr = &dst->msg_list.restart; + u8 *flw_ptr = src; + u8 ie_m = 0; + + while(flw_ptr+2-src <= len) + { + if(*flw_ptr == 0) + { + if(ie_m != 1) + { + printf("mandatory ie is absent!\n"); + return 3; + } + break; + } + switch(*flw_ptr) + { + case IE_CHNL_ID: + isdn_decode_chnl_id(&ptr->chnl_id, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_DISP: + if(variant == VARIANT_ITU) + isdn_decode_disp(&ptr->disp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_RESTART_IND: + if(!isdn_decode_restart_ind(&ptr->restart_ind, flw_ptr+2, flw_ptr[1])) + { + printf("mandatory ie is err!\n"); + return 2; + } + ie_m++; + flw_ptr += flw_ptr[1] + 2; + break; + default: + if(*flw_ptr >= 0x80) //single octet IE + flw_ptr += 1; + else + flw_ptr += flw_ptr[1] + 2; + break; + } + } + if(ie_m != 1) + { + printf("mandatory ie is absent!\n"); + return 3; + } + + return ISDN_CM_OK; +} + +static int isdn_encode_rest_ack(u8 *dst, IsdnMsgStr *src, int variant) +{ + IsdnRestAck *ptr = &src->msg_list.restAck; + u8 *flw_ptr = dst; + + //Optional + if(ptr->chnl_id.pres == 1) + { + flw_ptr[0] = IE_CHNL_ID; + flw_ptr[1] = isdn_encode_chnl_id(flw_ptr+2, &ptr->chnl_id); + flw_ptr += flw_ptr[1] + 2; + } + + if(variant == VARIANT_ITU) + { + if(ptr->disp.pres == 1) + { + flw_ptr[0] = IE_DISP; + flw_ptr[1] = isdn_encode_disp(flw_ptr+2, &ptr->disp); + flw_ptr += flw_ptr[1] + 2; + } + } + + //Mandatory if(ptr->restart_ind.pres == 1) + { + flw_ptr[0] = IE_RESTART_IND; + flw_ptr[1] = isdn_encode_restart_ind(flw_ptr+2, &ptr->restart_ind); + flw_ptr += flw_ptr[1] + 2; + } + + return flw_ptr - dst; +} + +int isdn_decode_rest_ack(IsdnMsgStr *dst, u8 *src, int variant, u8 len) +{ + IsdnRestAck *ptr = &dst->msg_list.restAck; + u8 *flw_ptr = src; + u8 ie_m = 0; + + while(flw_ptr+2-src <= len) + { + if(*flw_ptr == 0) + { + if(ie_m != 1) + { + printf("mandatory ie is absent!\n"); + return 3; + } + break; + } + switch(*flw_ptr) + { + case IE_CHNL_ID: + isdn_decode_chnl_id(&ptr->chnl_id, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_DISP: + if(variant == VARIANT_ITU) + isdn_decode_disp(&ptr->disp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_RESTART_IND: + if(!isdn_decode_restart_ind(&ptr->restart_ind, flw_ptr+2, flw_ptr[1])) + { + printf("mandatory ie is err!\n"); + return 2; + } + ie_m++; + flw_ptr += flw_ptr[1] + 2; + break; + default: + if(*flw_ptr >= 0x80) //single octet IE + flw_ptr += 1; + else + flw_ptr += flw_ptr[1] + 2; + break; + } + } + if(ie_m != 1) + { + printf("mandatory ie is absent!\n"); + return 3; + } + + return ISDN_CM_OK; +} + +static int isdn_encode_info(u8 *dst, IsdnMsgStr *src, int variant) +{ + IsdnInfo *ptr = &src->msg_list.info; + u8 *flw_ptr = dst; + + //Optional + if(ptr->sd_comp.pres == 1) + { + flw_ptr[0] = IE_SD_COMP; + flw_ptr += 1; + } + + if(variant == VARIANT_ITU) + { + if(ptr->disp.pres == 1) + { + flw_ptr[0] = IE_DISP; + flw_ptr[1] = isdn_encode_disp(flw_ptr+2, &ptr->disp); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->kpd_fac.pres == 1) + { + flw_ptr[0] = IE_KPD_FAC; + flw_ptr[1] = isdn_encode_kpd_fac(flw_ptr+2, &ptr->kpd_fac); + flw_ptr += flw_ptr[1] + 2; + } + if(ptr->sign.pres == 1) + { + flw_ptr[0] = IE_SIGN; + flw_ptr[1] = isdn_encode_sign(flw_ptr+2, &ptr->sign); + flw_ptr += flw_ptr[1] + 2; + } + } + + if(ptr->cd_pty_num.pres == 1) + { + flw_ptr[0] = IE_CD_PTY_NUM; + flw_ptr[1] = isdn_encode_cd_num(flw_ptr+2, &ptr->cd_pty_num); + flw_ptr += flw_ptr[1] + 2; + } + + return flw_ptr - dst; +} + +int isdn_decode_info(IsdnMsgStr *dst, u8 *src, int variant, u8 len) +{ + IsdnInfo *ptr = &dst->msg_list.info; + u8 *flw_ptr = src; + + while(flw_ptr+1-src <= len) + { + if(*flw_ptr == 0) + { + break; + } + switch(*flw_ptr) + { + case IE_SD_COMP: + ptr->sd_comp.pres = 1; + flw_ptr += 1; + break; + case IE_DISP: + if(variant == VARIANT_ITU) + isdn_decode_disp(&ptr->disp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_KPD_FAC: + if(variant == VARIANT_ITU) + isdn_decode_kpd_fac(&ptr->kpd_fac, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_SIGN: + if(variant == VARIANT_ITU) + isdn_decode_sign(&ptr->sign, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_CD_PTY_NUM: + isdn_decode_cd_num(&ptr->cd_pty_num, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + if(*flw_ptr >= 0x80) //single octet IE + flw_ptr += 1; + else + flw_ptr += flw_ptr[1] + 2; + break; + } + } + + return ISDN_CM_OK; +} + +static int isdn_encode_noti(u8 *dst, IsdnMsgStr *src, int variant) +{ + IsdnNoti *ptr = &src->msg_list.noti; + u8 *flw_ptr = dst; + + //Mandatory + + //Optional + if(variant == VARIANT_ITU) + { + if(ptr->br_cap.pres == 1) + { + flw_ptr[0] = IE_BR_CAP; + flw_ptr[1] = itu_encode_br_cap(flw_ptr+2, &ptr->br_cap); + flw_ptr += flw_ptr[1] + 2; + } + } + + //Mandatory if(ptr->notify_ind.pres == 1) + { + flw_ptr[0] = IE_NOTIFY_IND; + flw_ptr[1] = isdn_encode_notify_ind(flw_ptr+2, &ptr->notify_ind); + flw_ptr += flw_ptr[1] + 2; + } + + //Optional + if(variant == VARIANT_ITU) + { + if(ptr->disp.pres == 1) + { + flw_ptr[0] = IE_DISP; + flw_ptr[1] = isdn_encode_disp(flw_ptr+2, &ptr->disp); + flw_ptr += flw_ptr[1] + 2; + } + } + + return flw_ptr - dst; +} + +int isdn_decode_noti(IsdnMsgStr *dst, u8 *src, int variant, u8 len) +{ + IsdnNoti *ptr = &dst->msg_list.noti; + u8 *flw_ptr = src; + u8 ie_m = 0; + + while(flw_ptr+2-src <= len) + { + if(*flw_ptr == 0) + { + if(ie_m != 1) + { + printf("mandatory ie is absent!\n"); + return 3; + } + break; + } + switch(*flw_ptr) + { + case IE_BR_CAP: + if(variant == VARIANT_ITU) + itu_decode_br_cap(&ptr->br_cap, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + case IE_NOTIFY_IND: + if(!isdn_decode_notify_ind(&ptr->notify_ind, flw_ptr+2, flw_ptr[1])) + { + printf("mandatory ie is err!\n"); + return 2; + } + ie_m++; + flw_ptr += flw_ptr[1] + 2; + break; + case IE_DISP: + if(variant == VARIANT_ITU) + isdn_decode_disp(&ptr->disp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + if(*flw_ptr >= 0x80) //single octet IE + flw_ptr += 1; + else + flw_ptr += flw_ptr[1] + 2; + break; + } + } + if(ie_m != 1) + { + printf("mandatory ie is absent!\n"); + return 3; + } + + return ISDN_CM_OK; +} + +static int isdn_encode_status(u8 *dst, IsdnMsgStr *src, int variant) +{ + IsdnStatus *ptr = &src->msg_list.status; + u8 *flw_ptr = dst; + + //Mandatory if(ptr->cause.pres == 1) + { + flw_ptr[0] = IE_CAUSE; + flw_ptr[1] = isdn_encode_cause(flw_ptr+2, &ptr->cause); + flw_ptr += flw_ptr[1] + 2; + } + //if(ptr->call_stat.pres == 1) + { + flw_ptr[0] = IE_CALL_STAT; + flw_ptr[1] = isdn_encode_call_stat(flw_ptr+2, &ptr->call_stat); + flw_ptr += flw_ptr[1] + 2; + } + + //Optional + if(variant == VARIANT_ITU) + { + if(ptr->disp.pres == 1) + { + flw_ptr[0] = IE_DISP; + flw_ptr[1] = isdn_encode_disp(flw_ptr+2, &ptr->disp); + flw_ptr += flw_ptr[1] + 2; + } + } + + return flw_ptr - dst; +} + +int isdn_decode_status(IsdnMsgStr *dst, u8 *src, int variant, u8 len) +{ + IsdnStatus *ptr = &dst->msg_list.status; + u8 *flw_ptr = src; + u8 ie_m = 0; + + while(flw_ptr+2-src <= len) + { + if(*flw_ptr == 0) + { + if(ie_m != 2) + { + printf("mandatory ie is absent!\n"); + return 3; + } + break; + } + switch(*flw_ptr) + { + case IE_CAUSE: + if(!isdn_decode_cause(&ptr->cause, flw_ptr+2, flw_ptr[1])) + { + printf("mandatory ie is err!\n"); + return 2; + } + ie_m++; + flw_ptr += flw_ptr[1] + 2; + break; + case IE_CALL_STAT: + if(!isdn_decode_call_stat(&ptr->call_stat, flw_ptr+2, flw_ptr[1])) + { + printf("mandatory ie is err!\n"); + return 2; + } + ie_m++; + flw_ptr += flw_ptr[1] + 2; + break; + case IE_DISP: + if(variant == VARIANT_ITU) + isdn_decode_disp(&ptr->disp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + if(*flw_ptr >= 0x80) //single octet IE + flw_ptr += 1; + else + flw_ptr += flw_ptr[1] + 2; + break; + } + } + if(ie_m != 2) + { + printf("mandatory ie is absent!\n"); + return 3; + } + + return ISDN_CM_OK; +} + +static int isdn_encode_stat_enq(u8 *dst, IsdnMsgStr *src, int variant) +{ + IsdnStatEnq *ptr = &src->msg_list.statEnq; + u8 *flw_ptr = dst; + + //Optional + if(variant == VARIANT_ITU) + { + if(ptr->disp.pres == 1) + { + flw_ptr[0] = IE_DISP; + flw_ptr[1] = isdn_encode_disp(flw_ptr+2, &ptr->disp); + flw_ptr += flw_ptr[1] + 2; + } + } + + return flw_ptr - dst; +} + +int isdn_decode_stat_enq(IsdnMsgStr *dst, u8 *src, int variant, u8 len) +{ + IsdnStatEnq *ptr = &dst->msg_list.statEnq; + u8 *flw_ptr = src; + + while(flw_ptr+2-src <= len) + { + if(*flw_ptr == 0) + { + break; + } + switch(*flw_ptr) + { + case IE_DISP: + if(variant == VARIANT_ITU) + isdn_decode_disp(&ptr->disp, flw_ptr+2, flw_ptr[1]); + flw_ptr += flw_ptr[1] + 2; + break; + default: + if(*flw_ptr >= 0x80) //single octet IE + flw_ptr += 1; + else + flw_ptr += flw_ptr[1] + 2; + break; + } + } + + return ISDN_CM_OK; +} + + +//maintenance messages ansi +static int isdn_encode_service(u8 *dst, IsdnMsgStr *src) +{ + IsdnService *ptr = &src->msg_list.service; + u8 *flw_ptr = dst; + + //Mandatory if(ptr->chg_stat.pres) + { + flw_ptr[0] = IE_CHG_STAT; + flw_ptr[1] = ansi_encode_chg_stat(flw_ptr+2, &ptr->chg_stat); + flw_ptr += flw_ptr[1] + 2; + } + //if(ptr->chnl_id.pres) + { + flw_ptr[0] = IE_CHNL_ID; + flw_ptr[1] = isdn_encode_chnl_id(flw_ptr+2, &ptr->chnl_id); + flw_ptr += flw_ptr[1] + 2; + } + + return flw_ptr - dst; +} + +int isdn_decode_service(IsdnMsgStr *dst, u8 *src, u8 len) +{ + IsdnService *ptr = &dst->msg_list.service; + u8 *flw_ptr = src; + u8 ie_m = 0; + + while(flw_ptr+2-src <= len) + { + if(*flw_ptr == 0) + { + if(ie_m != 2) + { + printf("mandatory ie is absent!\n"); + return 3; + } + break; + } + switch(*flw_ptr) + { + case IE_CHG_STAT: + if(!ansi_decode_chg_stat(&ptr->chg_stat, flw_ptr+2, flw_ptr[1])) + { + printf("mandatory ie is err!\n"); + return 2; + } + ie_m++; + flw_ptr += flw_ptr[1] + 2; + break; + case IE_CHNL_ID: + if(!isdn_decode_chnl_id(&ptr->chnl_id, flw_ptr+2, flw_ptr[1])) + { + printf("mandatory ie is err!\n"); + return 2; + } + ie_m++; + flw_ptr += flw_ptr[1] + 2; + break; + default: + if(*flw_ptr >= 0x80) //single octet IE + flw_ptr += 1; + else + flw_ptr += flw_ptr[1] + 2; + break; + } + } + if(ie_m != 2) + { + printf("mandatory ie is absent!\n"); + return 3; + } + + return ISDN_CM_OK; +} + +static int isdn_encode_servAck(u8 *dst, IsdnMsgStr *src) +{ + IsdnServAck *ptr = &src->msg_list.servAck; + u8 *flw_ptr = dst; + + //Mandatory if(ptr->chg_stat.pres) + { + flw_ptr[0] = IE_CHG_STAT; + flw_ptr[1] = ansi_encode_chg_stat(flw_ptr+2, &ptr->chg_stat); + flw_ptr += flw_ptr[1] + 2; + } + //if(ptr->chnl_id.pres) + { + flw_ptr[0] = IE_CHNL_ID; + flw_ptr[1] = isdn_encode_chnl_id(flw_ptr+2, &ptr->chnl_id); + flw_ptr += flw_ptr[1] + 2; + } + + return flw_ptr - dst; +} + +int isdn_decode_servAck(IsdnMsgStr *dst, u8 *src, u8 len) +{ + IsdnServAck *ptr = &dst->msg_list.servAck; + u8 *flw_ptr = src; + u8 ie_m = 0; + + while(flw_ptr+2-src <= len) + { + if(*flw_ptr == 0) + { + if(ie_m != 2) + { + printf("mandatory ie is absent!\n"); + return 3; + } + break; + } + switch(*flw_ptr) + { + case IE_CHG_STAT: + if(!ansi_decode_chg_stat(&ptr->chg_stat, flw_ptr+2, flw_ptr[1])) + { + printf("mandatory ie is err!\n"); + return 2; + } + ie_m++; + flw_ptr += flw_ptr[1] + 2; + break; + case IE_CHNL_ID: + if(!isdn_decode_chnl_id(&ptr->chnl_id, flw_ptr+2, flw_ptr[1])) + { + printf("mandatory ie is err!\n"); + return 2; + } + ie_m++; + flw_ptr += flw_ptr[1] + 2; + break; + default: + if(*flw_ptr >= 0x80) //single octet IE + flw_ptr += 1; + else + flw_ptr += flw_ptr[1] + 2; + break; + } + } + if(ie_m != 2) + { + printf("mandatory ie is absent!\n"); + return 3; + } + + return ISDN_CM_OK; +} + + +/************************************************************* +Function: itu_msg_encode +Description: encode ITU isdn message +Output: dst:preserving destination, src:source msg structure +Return: isdn msg length:success + ISDN_CM_FAILED:failed +*************************************************************/ +int itu_msg_encode(u8 *dst, IsdnMsgStr *src) //msg from isdn to iua +{ + switch(src->msg_m.msg_type) + { + // + case MSG_ALERT: + return isdn_encode_alert(dst, src, VARIANT_ITU); + case MSG_CALL_PROC: + return isdn_encode_call_proc(dst, src, VARIANT_ITU); + case MSG_CONN: + return isdn_encode_conn(dst, src, VARIANT_ITU); + case MSG_CONNACK: + return isdn_encode_conn_ack(dst, src, VARIANT_ITU); + case MSG_PROG: + return isdn_encode_prog(dst, src, VARIANT_ITU); + case MSG_SETUP: + return isdn_encode_setup(dst, src, VARIANT_ITU); + case MSG_SETUP_ACK: + return isdn_encode_setup_ack(dst, src, VARIANT_ITU); + // + case MSG_DISC: + return isdn_encode_disc(dst, src, VARIANT_ITU); + case MSG_REL: + return isdn_encode_rel(dst, src, VARIANT_ITU); + case MSG_REL_COMP: + return isdn_encode_rel_comp(dst, src, VARIANT_ITU); + case MSG_RESTART: + return isdn_encode_restart(dst, src, VARIANT_ITU); + case MSG_REST_ACK: + return isdn_encode_rest_ack(dst, src, VARIANT_ITU); + // + case MSG_INFORMATION: + return isdn_encode_info(dst, src, VARIANT_ITU); + case MSG_NOTI: + return isdn_encode_noti(dst, src, VARIANT_ITU); + case MSG_STATUS: + return isdn_encode_status(dst, src, VARIANT_ITU); + case MSG_STAT_ENQ: + return isdn_encode_stat_enq(dst, src, VARIANT_ITU); + default: + break; + } + + return -1; +} + +/************************************************************* +Function: itu_msg_decode +Description: decode ITU isdn message +Input: msgtype:msg type, len:msg length +Output: dst:preserving destination structure, src:source msg code stream +Return: ISDN_CM_OK:success + ISDN_CM_FAILED or 2 or 3:failed +*************************************************************/ +int itu_msg_decode(IsdnMsgStr *dst, u8 *src, u8 msgtype, u8 len) //msg from iua to isdn +{ + u8 msg_clas, msg_type; + + msg_clas = (msgtype & 0x60) >> 5; + msg_type = (msgtype & 0x1F); + + switch(msg_clas) + { + case 0x0: // + switch(msg_type) + { + case (MSG_ALERT & 0x1F): + return isdn_decode_alert(dst, src, VARIANT_ITU, len); + case (MSG_CALL_PROC & 0x1F): + return isdn_decode_call_proc(dst, src, VARIANT_ITU, len); + case (MSG_CONN & 0x1F): + return isdn_decode_conn(dst, src, VARIANT_ITU, len); + case (MSG_CONNACK & 0x1F): + return isdn_decode_conn_ack(dst, src, VARIANT_ITU, len); + case (MSG_PROG & 0x1F): + return isdn_decode_prog(dst, src, VARIANT_ITU, len); + case (MSG_SETUP & 0x1F): + return isdn_decode_setup(dst, src, VARIANT_ITU, len); + case (MSG_SETUP_ACK & 0x1F): + return isdn_decode_setup_ack(dst, src, VARIANT_ITU, len); + default: + break; + } + break; + case 0x1: // + break; + case 0x2: // + switch(msg_type) + { + case (MSG_DISC & 0x1F): + return isdn_decode_disc(dst, src, VARIANT_ITU, len); + case (MSG_REL & 0x1F): + return isdn_decode_rel(dst, src, VARIANT_ITU, len); + case (MSG_REL_COMP & 0x1F): + return isdn_decode_rel_comp(dst, src, VARIANT_ITU, len); + case (MSG_RESTART & 0x1F): + return isdn_decode_restart(dst, src, VARIANT_ITU, len); + case (MSG_REST_ACK & 0x1F): + return isdn_decode_rest_ack(dst, src, VARIANT_ITU, len); + default: + break; + } + break; + case 0x3: // + switch(msg_type) + { + case (MSG_INFORMATION & 0x1F): + return isdn_decode_info(dst, src, VARIANT_ITU, len); + case (MSG_NOTI & 0x1F): + return isdn_decode_noti(dst, src, VARIANT_ITU, len); + case (MSG_STATUS & 0x1F): + return isdn_decode_status(dst, src, VARIANT_ITU, len); + case (MSG_STAT_ENQ & 0x1F): + return isdn_decode_stat_enq(dst, src, VARIANT_ITU, len); + default: + break; + } + break; + + default: + break; + } + + return ISDN_CM_FAILED; +} + +int ansi_msg_encode(u8 *dst, IsdnMsgStr *src) //msg from isdn to iua +{ + switch(src->msg_m.msg_type) + { + // + case MSG_ALERT: + return isdn_encode_alert(dst, src, VARIANT_ANSI); + case MSG_CALL_PROC: + return isdn_encode_call_proc(dst, src, VARIANT_ANSI); + case MSG_CONN: + return isdn_encode_conn(dst, src, VARIANT_ANSI); + case MSG_CONNACK: + return isdn_encode_conn_ack(dst, src, VARIANT_ANSI); + case MSG_PROG: + return isdn_encode_prog(dst, src, VARIANT_ANSI); + case MSG_SETUP: + return isdn_encode_setup(dst, src, VARIANT_ANSI); + // + case MSG_DISC: + return isdn_encode_disc(dst, src, VARIANT_ANSI); + case MSG_REL: + return isdn_encode_rel(dst, src, VARIANT_ANSI); + case MSG_REL_COMP: + return isdn_encode_rel_comp(dst, src, VARIANT_ANSI); + case MSG_RESTART: + return isdn_encode_restart(dst, src, VARIANT_ANSI); + case MSG_REST_ACK: + return isdn_encode_rest_ack(dst, src, VARIANT_ANSI); + // + case MSG_NOTI: + return isdn_encode_noti(dst, src, VARIANT_ANSI); + case MSG_STATUS: + return isdn_encode_status(dst, src, VARIANT_ANSI); + case MSG_STAT_ENQ: + return isdn_encode_stat_enq(dst, src, VARIANT_ANSI); + default: + break; + } + + return -1; +} + +int ansi_msg_decode(IsdnMsgStr *dst, u8 *src, u8 msgtype, u8 len) //msg from iua to isdn +{ + u8 msg_clas, msg_type; + + msg_clas = (msgtype & 0x60) >> 5; + msg_type = (msgtype & 0x1F); + + switch(msg_clas) + { + case 0x0: // + switch(msg_type) + { + case (MSG_ALERT & 0x1F): + return isdn_decode_alert(dst, src, VARIANT_ANSI, len); + case (MSG_CALL_PROC & 0x1F): + return isdn_decode_call_proc(dst, src, VARIANT_ANSI, len); + case (MSG_CONN & 0x1F): + return isdn_decode_conn(dst, src, VARIANT_ANSI, len); + case (MSG_CONNACK & 0x1F): + return isdn_decode_conn_ack(dst, src, VARIANT_ANSI, len); + case (MSG_PROG & 0x1F): + return isdn_decode_prog(dst, src, VARIANT_ANSI, len); + case (MSG_SETUP & 0x1F): + return isdn_decode_setup(dst, src, VARIANT_ANSI, len); + default: + break; + } + break; + case 0x1: // + break; + case 0x2: // + switch(msg_type) + { + case (MSG_DISC & 0x1F): + return isdn_decode_disc(dst, src, VARIANT_ANSI, len); + case (MSG_REL & 0x1F): + return isdn_decode_rel(dst, src, VARIANT_ANSI, len); + case (MSG_REL_COMP & 0x1F): + return isdn_decode_rel_comp(dst, src, VARIANT_ANSI, len); + case (MSG_RESTART & 0x1F): + return isdn_decode_restart(dst, src, VARIANT_ANSI, len); + case (MSG_REST_ACK & 0x1F): + return isdn_decode_rest_ack(dst, src, VARIANT_ANSI, len); + default: + break; + } + break; + case 0x3: // + switch(msg_type) + { + case (MSG_NOTI & 0x1F): + return isdn_decode_noti(dst, src, VARIANT_ANSI, len); + case (MSG_STATUS & 0x1F): + return isdn_decode_status(dst, src, VARIANT_ANSI, len); + case (MSG_STAT_ENQ & 0x1F): + return isdn_decode_stat_enq(dst, src, VARIANT_ANSI, len); + default: + break; + } + break; + + default: + break; + } + + return ISDN_CM_FAILED; +} + +int qsig_msg_encode(u8 *dst, IsdnMsgStr *src) //msg from isdn to iua +{ + switch(src->msg_m.msg_type) + { + // + case MSG_ALERT: + return isdn_encode_alert(dst, src, VARIANT_QSIG); + case MSG_CALL_PROC: + return isdn_encode_call_proc(dst, src, VARIANT_QSIG); + case MSG_CONN: + return isdn_encode_conn(dst, src, VARIANT_QSIG); + case MSG_CONNACK: + return isdn_encode_conn_ack(dst, src, VARIANT_QSIG); + case MSG_PROG: + return isdn_encode_prog(dst, src, VARIANT_QSIG); + case MSG_SETUP: + return isdn_encode_setup(dst, src, VARIANT_QSIG); + case MSG_SETUP_ACK: + return isdn_encode_setup_ack(dst, src, VARIANT_QSIG); + // + case MSG_DISC: + return isdn_encode_disc(dst, src, VARIANT_QSIG); + case MSG_REL: + return isdn_encode_rel(dst, src, VARIANT_QSIG); + case MSG_REL_COMP: + return isdn_encode_rel_comp(dst, src, VARIANT_QSIG); + case MSG_RESTART: + return isdn_encode_restart(dst, src, VARIANT_QSIG); + case MSG_REST_ACK: + return isdn_encode_rest_ack(dst, src, VARIANT_QSIG); + // + case MSG_INFORMATION: + return isdn_encode_info(dst, src, VARIANT_QSIG); + case MSG_STATUS: + return isdn_encode_status(dst, src, VARIANT_QSIG); + case MSG_STAT_ENQ: + return isdn_encode_stat_enq(dst, src, VARIANT_QSIG); + default: + break; + } + + return -1; +} + +int qsig_msg_decode(IsdnMsgStr *dst, u8 *src, u8 msgtype, u8 len) //msg from iua to isdn +{ + u8 msg_clas, msg_type; + + msg_clas = (msgtype & 0x60) >> 5; + msg_type = (msgtype & 0x1F); + + switch(msg_clas) + { + case 0x0: // + switch(msg_type) + { + case (MSG_ALERT & 0x1F): + return isdn_decode_alert(dst, src, VARIANT_QSIG, len); + case (MSG_CALL_PROC & 0x1F): + return isdn_decode_call_proc(dst, src, VARIANT_QSIG, len); + case (MSG_CONN & 0x1F): + return isdn_decode_conn(dst, src, VARIANT_QSIG, len); + case (MSG_CONNACK & 0x1F): + return isdn_decode_conn_ack(dst, src, VARIANT_QSIG, len); + case (MSG_PROG & 0x1F): + return isdn_decode_prog(dst, src, VARIANT_QSIG, len); + case (MSG_SETUP & 0x1F): + return isdn_decode_setup(dst, src, VARIANT_QSIG, len); + default: + break; + } + break; + case 0x1: // + break; + case 0x2: // + switch(msg_type) + { + case (MSG_DISC & 0x1F): + return isdn_decode_disc(dst, src, VARIANT_QSIG, len); + case (MSG_REL & 0x1F): + return isdn_decode_rel(dst, src, VARIANT_QSIG, len); + case (MSG_REL_COMP & 0x1F): + return isdn_decode_rel_comp(dst, src, VARIANT_QSIG, len); + case (MSG_RESTART & 0x1F): + return isdn_decode_restart(dst, src, VARIANT_QSIG, len); + case (MSG_REST_ACK & 0x1F): + return isdn_decode_rest_ack(dst, src, VARIANT_QSIG, len); + default: + break; + } + break; + case 0x3: // + switch(msg_type) + { + case (MSG_INFORMATION & 0x1F): + return isdn_decode_info(dst, src, VARIANT_QSIG, len); + case (MSG_STATUS & 0x1F): + return isdn_decode_status(dst, src, VARIANT_QSIG, len); + case (MSG_STAT_ENQ & 0x1F): + return isdn_decode_stat_enq(dst, src, VARIANT_QSIG, len); + default: + break; + } + break; + + default: + break; + } + + return ISDN_CM_FAILED; +} + + + +/************************************************************* +Function: maintenance_msg_encode +Description: encode ansi isdn maintenance message +Output: dst:preserving destination, src:source msg structure +Return: isdn msg length:success + ISDN_CM_FAILED:failed +*************************************************************/ +int maintenance_msg_encode(u8 *dst, IsdnMsgStr *src) //msg from isdn to iua +{ + switch(src->msg_m.msg_type) + { + case MSG_SERVICE: + return isdn_encode_service(dst, src); + case MSG_SERVICE_ACK: + return isdn_encode_servAck(dst, src); + default: + break; + } + + return -1; +} + +/************************************************************* +Function: maintenance_msg_decode +Description: decode ansi isdn maintenance message +Input: msgtype:msg type, len:msg length +Output: dst:preserving destination structure, src:source msg code stream +Return: ISDN_CM_OK:success + ISDN_CM_FAILED or 2 or 3:failed +*************************************************************/ +int maintenance_msg_decode(IsdnMsgStr *dst, u8 *src, u8 msgtype, u8 len) //msg from iua to isdn +{ + switch(msgtype) + { + case MSG_SERVICE: + return isdn_decode_service(dst, src, len); + case MSG_SERVICE_ACK: + return isdn_decode_servAck(dst, src, len); + default: + break; + } + + return ISDN_CM_FAILED; +} + + +void isdn_send_heartbeat(int link_id) +{ + message_list msg_trans; + + memset(&msg_trans, 0, sizeof(message_list)); + msg_trans.msgSrcPort = ISDN_IP_PORT; + msg_trans.msgDstIP = isdn_rs.attrib.isdn_remote_ip; + msg_trans.msgDstPort = ISDN_IP_PORT; + msg_trans.msgLength = 3; + msg_trans.msgContent[0] = 1; //type + msg_trans.msgContent[1] = link_id; + msg_trans.msgContent[2] = isdn_rs.link_pond[link_id].dc_status; + + if(iptrPlatPutMessage(msg_trans) == 0) + isdn_log_err(0, "send heartbeat err!link id =%d, remote ip =%d, link status =%d \r\n", + link_id, isdn_rs.attrib.isdn_remote_ip, isdn_rs.link_pond[link_id].dc_status); +} +void isdn_redirect_send(IuaMsgStr *iua_src, int type) +{ + message_list msg_trans; + + memset(&msg_trans, 0, sizeof(message_list)); + msg_trans.msgSrcPort = ISDN_IP_PORT; + msg_trans.msgDstIP = isdn_rs.attrib.isdn_remote_ip; + msg_trans.msgDstPort = ISDN_IP_PORT; + msg_trans.msgLength = iua_src->msg_length + 5; + msg_trans.msgContent[0] = type; + memcpy(msg_trans.msgContent+1, &iua_src->msg_class, msg_trans.msgLength-1); + monitor_isdn_msg(0, "RD=>", iua_src, COL_BLUE); + if(iua_src->msgcontent.isdn_msg.msg_m.proto_Discr == PROTOCOL_DISCR) + isdn_msg_csta(iua_src->msgcontent.isdn_msg.msg_m.msg_type, 2); + if(iptrPlatPutMessage(msg_trans) == 0) + isdn_log_err(0, "redirect send err! msg type =0x%02x\r\n",iua_src->msgcontent.isdn_msg.msg_m.msg_type); +} + + +int isdn_msg_encode(u8 *dst, IsdnMsgStr *src, int variant) //msg from isdn to iua +{ + switch(variant) + { + case VARIANT_ITU: + return itu_msg_encode(dst, src); + case VARIANT_ANSI: + return ansi_msg_encode(dst, src); + case VARIANT_QSIG: + return qsig_msg_encode(dst, src); + default: + break; + } + + return -1; +} + +/************************************************************* +Function: isdn_msg_decode +Description: decode isdn message +Input: msgtype:msg type, len:msg length, variant:proto variant +Output: dst:preserving destination structure, src:source msg code stream +Return: ISDN_CM_OK:success + ISDN_CM_FAILED or 2 or 3:failed +*************************************************************/ +int isdn_msg_decode(IsdnMsgStr *dst, u8 *src, u8 msgtype, int variant, u8 len) //msg from iua to isdn +{ + switch(variant) + { + case VARIANT_ITU: + return itu_msg_decode(dst, src, msgtype, len); + case VARIANT_ANSI: + return ansi_msg_decode(dst, src, msgtype, len); + case VARIANT_QSIG: + return qsig_msg_decode(dst, src, msgtype, len); + default: + break; + } + + return -1; +} + +/************************************************************* +Function: isdn_msdc_proc +Description: isdn Message Sending Control, msg from isdn to iua +Input: pid:port id +Output: iua_src:iua msg structure +Return: NULL +*************************************************************/ +void isdn_msdc_proc(u32 pid, IuaMsgStr *iua_src) +{ + int circuit_id, cg_id, ds_0, ds_1, d_chnl, i; + const pal_circuit_struct *circuit_ptr = NULL; + const pal_cg_struct *cg_ptr = NULL; + + circuit_id = pid /ISDN_CIRCUIT_CIC; + circuit_ptr = pal_circuit_ptr(circuit_id); + if(circuit_ptr == NULL) + return; + + d_chnl = pid % ISDN_CIRCUIT_CIC; + cg_id = circuit_ptr->cg_id; + cg_ptr = pal_cg_ptr(cg_id); + if(cg_ptr == NULL) + return; + if(cg_ptr->attrib.protocol != PROTO_ISDN) + return; + + ds_0 = cg_ptr->attrib.nfas.prim_link; + ds_1 = cg_ptr->attrib.nfas.backup_link; + + iua_src->msg_class = IUA_QPTM_MSG; + if((cg_ptr->attrib.nfas.flag == NFAS_ENABLE) && + (circuit_ptr->attrib.d_chnl != d_chnl)) + { + if(isdn_rs.link_pond[ds_0].dc_status == DS_IS) + { + iua_src->e1_no = ds_0; + for(i = 0; i < PAL_MAX_CIRCUIT; i++) + { + circuit_ptr = pal_circuit_ptr(i); + if(circuit_ptr == NULL) + continue; + if(circuit_ptr->cg_id != cg_id) + continue; + + if((circuit_ptr->attrib.link_id == ds_0) && + (isdn_rs.attrib.isdn_run_mode == ISDN_DUAL_MODE) && + (isdn_rs.attrib.systemID != circuit_ptr->attrib.plat_id)) + { + monitor_isdn_msg(pid, "SD<=", iua_src, COL_WHITE); + isdn_redirect_send(iua_src, 2); //send to another plat + return; + } + } + } + else if(isdn_rs.link_pond[ds_1].dc_status == DS_IS) + { + iua_src->e1_no = ds_1; + for(i = 0; i < PAL_MAX_CIRCUIT; i++) + { + circuit_ptr = pal_circuit_ptr(i); + if(circuit_ptr == NULL) + continue; + if(circuit_ptr->cg_id != cg_id) + continue; + + if((circuit_ptr->attrib.link_id == ds_1) && + (isdn_rs.attrib.isdn_run_mode == ISDN_DUAL_MODE) && + (isdn_rs.attrib.systemID != circuit_ptr->attrib.plat_id)) + { + monitor_isdn_msg(pid, "SD<=", iua_src, COL_WHITE); + isdn_redirect_send(iua_src, 2); //send to another plat + return; + } + } + } + else + { + isdn_log_err(pid, "no link is ds_is state!ds_0=%d, ds_0_status=%d, ds_1=%d, ds_1_status=%d\n", + ds_0, isdn_rs.link_pond[ds_0].dc_status, ds_1, isdn_rs.link_pond[ds_1].dc_status); + return; + } + } + else + iua_src->e1_no = circuit_ptr->attrib.link_id; + + monitor_isdn_msg(pid, "SD<=", iua_src, COL_WHITE); + iua_src->msg_length = htons(iua_src->msg_length); + if(iua_src->msgcontent.isdn_msg.msg_m.proto_Discr == PROTOCOL_DISCR) + isdn_msg_csta(iua_src->msgcontent.isdn_msg.msg_m.msg_type, 1); + if(put_xua_msg((xua_up_msg_t*)&iua_src->msg_class) == -1) + isdn_log_err(pid, "send msg to iua err!msg class=%d,msg type=0x%02x\r\n", + iua_src->msg_class, iua_src->msgcontent.isdn_msg.msg_m.msg_type); + else + isdn_rs.port_pond[pid].pre_send_msg = iua_src->msgcontent.isdn_msg.msg_m.msg_type; +} + +/************************************************************* +Function: isdn_send_msg +Description: isdn send msg to iua, include encode msg +Input: pid:port id, msg_type:msg type +Return: ISDN_CM_OK:success + ISDN_CM_FAILED:failed +*************************************************************/ +int isdn_send_msg(u32 pid, u8 msg_type) +{ + u16 call_ref; + u8 callout_fg; + int ret, variant; + IuaMsgStr *src = &iua_sd_msg; + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + u8 *flw_ptr = src->msgcontent.isdn_msg.ie_content; //message flow pointer + const pal_circuit_struct *circuit_ptr = NULL; + const pal_cg_struct *cg_ptr = NULL; + + memset(src, 0, sizeof(IuaMsgStr)); + call_ref = pPort->call_ref; + callout_fg = pPort->callout_fg; + circuit_ptr = pal_circuit_ptr(pid /ISDN_CIRCUIT_CIC); + if(circuit_ptr == NULL) + return ISDN_CM_FAILED; + + cg_ptr = pal_cg_ptr(circuit_ptr->cg_id); + if(cg_ptr == NULL) + return ISDN_CM_FAILED; + if(cg_ptr->attrib.protocol != PROTO_ISDN) + return ISDN_CM_FAILED; + + variant = cg_ptr->attrib.variant; + + isdn_sd_msg.msg_m.proto_Discr = PROTOCOL_DISCR; + isdn_sd_msg.msg_m.cr_len = 2; + isdn_sd_msg.msg_m.call_ref[0] = ((call_ref & 0x7F00) >> 8) | (callout_fg << 7); //High + isdn_sd_msg.msg_m.call_ref[1] = (call_ref & 0xFF); //Low + isdn_sd_msg.msg_m.msg_type = msg_type; + + ret = isdn_msg_encode(flw_ptr, &isdn_sd_msg, variant); + if(ret == -1) + { + isdn_log_err(pid, "unknown msg encode, msg=0x%02x\r\n", msg_type); + return ISDN_CM_FAILED; + } + + memcpy(&src->msgcontent.isdn_msg.msg_m, &isdn_sd_msg.msg_m, sizeof(MsgMan)); + src->msg_length = ret + 0x0005; + isdn_msdc_proc(pid, src); + + return ISDN_CM_OK; +} + +/************************************************************* +Function: isdn_send_maintenance_msg +Description: isdn send ansi isdn maintenance msg to iua, include encode msg +Input: pid:port id, msg_type:msg type +Return: ISDN_CM_OK:success + ISDN_CM_FAILED:failed +*************************************************************/ +int isdn_send_maintenance_msg(u32 pid, u8 msg_type) +{ + u16 call_ref; + u8 callout_fg; + int ret; + IuaMsgStr *src = &iua_sd_msg; + ISDN_Port_struct *pPort = &isdn_rs.port_pond[pid]; + u8 *flw_ptr = src->msgcontent.isdn_msg.ie_content; //message flow pointer + + memset(src, 0, sizeof(IuaMsgStr)); + call_ref = pPort->call_ref; + callout_fg = pPort->callout_fg; + + isdn_sd_msg.msg_m.proto_Discr = M_PROTOCOL_DISCR; + isdn_sd_msg.msg_m.cr_len = 2; + isdn_sd_msg.msg_m.call_ref[0] = ((call_ref & 0x7F00) >> 8) | (callout_fg << 7); //High + isdn_sd_msg.msg_m.call_ref[1] = (call_ref & 0xFF); //Low + isdn_sd_msg.msg_m.msg_type = msg_type; + + ret = maintenance_msg_encode(flw_ptr, &isdn_sd_msg); + if(ret == -1) + { + isdn_log_err(pid, "unknown msg encode, msg=0x%02x\r\n", msg_type); + return ISDN_CM_FAILED; + } + + memcpy(&src->msgcontent.isdn_msg.msg_m, &isdn_sd_msg.msg_m, sizeof(MsgMan)); + src->msg_length = ret + 0x0005; + isdn_msdc_proc(pid, src); + + return ISDN_CM_OK; +} + + +/************************************************************* +Function: n0_ext_proc +Description: reinforce to receive abnormity msg at null state +Input: pid:port id, msg_type:msg type +Return: NULL +*************************************************************/ +static inline void n0_ext_proc(u32 pid, u8 msg_type) +{ + if(msg_type == MSG_REL_COMP) + { + isdn_log_err(pid, "receive rel_comp at null state , invalid call reference!\r\n"); + return; + } + else if(msg_type == MSG_STAT_ENQ) + { + isdn_set_status(&isdn_sd_msg.msg_list.status, 0, CAUSE_STAT_ENQ); + isdn_send_msg(pid, MSG_STATUS); + isdn_log_err(pid, "receive stat_enq at null state, response status msg!\r\n"); + return; + } + else if(msg_type == MSG_STATUS) + { + if(isdn_rv_msg.msg_list.status.call_stat.stat_val == 0) + { + isdn_log_err(pid, "receive status at null state, and indicate state value is 0!\r\n"); + return; + } + isdn_set_cause(&isdn_sd_msg.msg_list.relComp.cause, CAUSE_MSG_NOTCOMP); //cause 101 + } + else //unknown or unexpected msg + isdn_set_cause(&isdn_sd_msg.msg_list.relComp.cause, CAUSE_INVALID_CR); //cause 81, invalid call reference + isdn_send_msg(pid, MSG_REL_COMP); + isdn_log_err(pid, "invalid call reference!\r\n"); + return; +} + +/************************************************************* +Function: setup_abn_ie +Description: decode setup with abnormity information elements +Input: pid:port id, ret:decode result +Return: NULL +*************************************************************/ +static inline void setup_abn_ie(u32 pid, int ret) +{ + if(ret == 3) + { + isdn_log_err(pid, "setup mandatory information element is absent!\r\n"); + isdn_set_cause(&isdn_sd_msg.msg_list.relComp.cause, CAUSE_M_IE_MISS); + } + else if(ret == 2) + { + isdn_log_err(pid, "setup mandatory information element is err!\r\n"); + isdn_set_cause(&isdn_sd_msg.msg_list.relComp.cause, CAUSE_IE_INVALID); + } + isdn_send_msg(pid, MSG_REL_COMP); + rel_cr(pid); +} + +/************************************************************* +Function: isdn_mdsc_proc +Description: isdn Message Distribution Control, msg from iua to isdn +Input: NULL +Return: ISDN_CM_OK:success + ISDN_CM_FAILED:failed +*************************************************************/ +static int isdn_mdsc_proc() +{ + u32 pid, cic, head_cic; + u16 cref = 0; + int msg_type, variant, cg_id, circuit_newId, link_id; + u8 global_flag; + int ret, len, i; + const pal_circuit_struct *circuit_ptr = NULL; + const pal_cg_struct *cg_ptr = NULL; + u8 *flw_ptr; + + flw_ptr = iua_rv_msg.msgcontent.isdn_msg.ie_content; + len = iua_rv_msg.msg_length - 5; + + isdn_msg_csta(iua_rv_msg.msgcontent.isdn_msg.msg_m.msg_type, 0); + if(iua_rv_msg.msgcontent.isdn_msg.msg_m.cr_len != 2) + { + isdn_log_err(0, "call reference len is not 2!\r\n"); //dummy call reference + monitor_isdn_msg(0, "RV=>", &iua_rv_msg,COL_YELLOW); + return ISDN_CM_FAILED; + } + + link_id = iua_rv_msg.e1_no; + if((circuit_ptr = pal_isdn_find_circuit_of_link(link_id)) == NULL) + { + isdn_log_err(0, "mdsc: link_id %d is unknown link!\r\n", link_id); + monitor_isdn_msg(0, "RV=>", &iua_rv_msg,COL_YELLOW); + return ISDN_CM_FAILED; + } +// circuit_id = circuit_ptr->id; + cg_id = circuit_ptr->cg_id; + cg_ptr = pal_cg_ptr(cg_id); + if(cg_ptr == NULL) + return ISDN_CM_FAILED; + if(cg_ptr->attrib.protocol != PROTO_ISDN) + return ISDN_CM_FAILED; + if(!(cg_ptr->attrib.variant == VARIANT_ITU || cg_ptr->attrib.variant == VARIANT_ANSI || cg_ptr->attrib.variant == VARIANT_QSIG) || + (cg_ptr->attrib.variant == VARIANT_QSIG && (cg_ptr->attrib.nfas.flag || circuit_ptr->attrib.user_network_if == NETWORK_SIDE))) + return ISDN_CM_FAILED; + + variant = cg_ptr->attrib.variant; + + cref = iua_rv_msg.msgcontent.isdn_msg.msg_m.call_ref[0]; + cref = (cref << 8) | (iua_rv_msg.msgcontent.isdn_msg.msg_m.call_ref[1]); + msg_type = iua_rv_msg.msgcontent.isdn_msg.msg_m.msg_type; + memset(&isdn_sd_msg, 0, sizeof(IsdnMsgStr)); + memset(&isdn_rv_msg, 0, sizeof(IsdnMsgStr)); + + if((cref & 0x7FFF) == 0) //Global call reference message + { + global_flag = 1; + pid = circuit_ptr->id * ISDN_CIRCUIT_CIC; + isdn_rs.port_pond[pid].call_ref = cref; + isdn_rs.port_pond[pid].callout_fg = ((cref >> 15) ^ 0x01); + if((msg_type != MSG_RESTART) && + (msg_type != MSG_REST_ACK) && + (msg_type != MSG_STATUS)) + { + isdn_log_err(0, "invalid call reference, cr = 0!\r\n"); + isdn_set_status(&isdn_sd_msg.msg_list.status, 0, CAUSE_INVALID_CR); //cause 81, state? + isdn_send_msg(pid, MSG_STATUS); + return ISDN_CM_FAILED; + } + else if(msg_type == MSG_STATUS) + { + isdn_log_err(0, "receive status in cr=0, reserved in current state!\r\n"); + return ISDN_CM_FAILED; + } + } + else + { + global_flag = 0; + if(cg_ptr->attrib.nfas.flag == NFAS_ENABLE) + { + if(isdn_rs.link_pond[link_id].dc_status != DS_IS) + { + isdn_log_err(0, "the link %d is not DS_IS state!\r\n", link_id); + return ISDN_CM_FAILED; + } + + for(i = 0; i < PAL_MAX_CIRCUIT; i++) + { + circuit_ptr = pal_circuit_ptr(i); + if(circuit_ptr == NULL) + continue; + if(circuit_ptr->cg_id != cg_id) + continue; + + if((circuit_ptr->enable) && + (pid = find_port_by_callref(cref, i))) + { +// circuit_id = i; + break; + } + } + if((pid == 0) && (msg_type != MSG_SETUP) && + (isdn_rs.attrib.isdn_run_mode == ISDN_DUAL_MODE) && + (circuit_ptr->attrib.plat_id == isdn_rs.attrib.systemID)) + { + monitor_isdn_msg(0, "RV=>", &iua_rv_msg, COL_YELLOW); + isdn_redirect_send(&iua_rv_msg, 3); //send to another plat + return ISDN_CM_FAILED; + } + } + else + pid = find_port_by_callref(cref, circuit_ptr->id); + } + + memcpy(&isdn_rv_msg.msg_m, &iua_rv_msg.msgcontent.isdn_msg.msg_m, sizeof(MsgMan)); + ret = isdn_msg_decode(&isdn_rv_msg, flw_ptr, msg_type, variant, len); + if((pid == 0) && (global_flag == 0)) + { + if(msg_type != MSG_SETUP) //NULL STATE of other proc + { + isdn_log_err(0, "receice msg=0x%02x, when port id is 0!\r\n", msg_type); + pid = circuit_ptr->id * ISDN_CIRCUIT_CIC; + isdn_rs.port_pond[pid].call_ref = cref; + isdn_rs.port_pond[pid].callout_fg = ((cref >> 15) ^ 0x01); + n0_ext_proc(pid, msg_type); + return ISDN_CM_FAILED; + } + else if((cref & 0x8000) != 0) + { + isdn_log_err(0, "the call reference is not from the original call!\r\n"); + return ISDN_CM_FAILED; + } + //else goto setup to find port id + } + + if(ret == 0) + { + isdn_log_err(pid, "decode isdn msg is unknown! msg=0x%02x\r\n",msg_type); + isdn_set_status(&isdn_sd_msg.msg_list.status, isdn_rs.port_pond[pid].fsm_state.cpc_state, CAUSE_MSG_NOTCOMP_NOTIMPL); //cause 97 or 98 u01-04 + isdn_send_msg(pid, MSG_STATUS); + return ISDN_CM_FAILED; + } + else if(ret == -1) + { + isdn_log_err(pid, "unknown protocol discriminator! proto_discr=%d\r\n", iua_rv_msg.msgcontent.isdn_msg.msg_m.proto_Discr); + return ISDN_CM_FAILED; + } + + switch(msg_type) + { + case MSG_SETUP: + if(pid != 0) + { + isdn_log_err(0, "setup has reveived! pid=%d\r\n", pid); + return ISDN_CM_FAILED; + } + if(ret != 1) + { + pid = circuit_ptr->id * ISDN_CIRCUIT_CIC; + isdn_rs.port_pond[pid].call_ref = cref; + isdn_rs.port_pond[pid].callout_fg = ((cref >> 15) ^ 0x01); + setup_abn_ie(pid, ret); + return ISDN_CM_FAILED; + } + if(cg_ptr->attrib.nfas.flag) + { + if((isdn_rv_msg.msg_list.setup.chnl_id.pres) && + (isdn_rv_msg.msg_list.setup.chnl_id.b3.int_id_pre)) + { + if((circuit_newId = find_circuit_by_interfaceId(cg_id, isdn_rv_msg.msg_list.setup.chnl_id.b3.int_id)) == -1) + { + if(circuit_ptr->attrib.plat_id == isdn_rs.attrib.systemID) + { + monitor_isdn_msg(0, "RV=>", &iua_rv_msg, COL_YELLOW); + isdn_redirect_send(&iua_rv_msg, 3); //send to another plat + return ISDN_CM_FAILED; + } + else + { + isdn_log_err(0, "not find current circuit! circuit id=%d\r\n", circuit_ptr->id); + return ISDN_CM_FAILED; + } + } + else + { + circuit_ptr = pal_circuit_ptr(circuit_newId); + if(circuit_ptr == NULL) + { + isdn_log_err(0, "receive setup err! circuit_id=%d, can't find circuit_ptr!\r\n", circuit_newId); + return ISDN_CM_FAILED; + } + if(circuit_ptr->cg_id != cg_id) + return ISDN_CM_FAILED; + } + } + else + { + isdn_log_err(0, "err!\n"); + return ISDN_CM_FAILED; + } + } + if((isdn_rv_msg.msg_list.setup.chnl_id.pres) && + (isdn_rv_msg.msg_list.setup.chnl_id.b3.int_type)) + { + head_cic = circuit_ptr->attrib.head_cic; + if(circuit_ptr->attrib.cic_range == 24) + head_cic--; + cic = head_cic + isdn_rv_msg.msg_list.setup.chnl_id.b3.chnl_num; + if((cic < circuit_ptr->attrib.head_cic) || (cic - circuit_ptr->attrib.head_cic) >= (circuit_ptr->attrib.cic_range)) + { + pid = circuit_ptr->id * ISDN_CIRCUIT_CIC; + isdn_rs.port_pond[pid].call_ref = cref; + isdn_rs.port_pond[pid].callout_fg = ((cref >> 15) ^ 0x01); + isdn_set_cause(&isdn_sd_msg.msg_list.relComp.cause, CAUSE_IE_INVALID); + isdn_send_msg(pid, MSG_REL_COMP); + isdn_log_err(0, "decode cic err!cic=0x%04x\r\n",cic); + return ISDN_CM_FAILED; + } + else //find pid by cic + { + pid = find_port_by_cic(cic, circuit_ptr->id); + if(isdn_rs.port_pond[pid].cic_state.maintenance_state != IN_SERVICE) + { + isdn_log_err(pid, "this cic is not in service in receive setup!\n"); + return ISDN_CM_FAILED; + } + if(isdn_rs.port_pond[pid].enable == 1) //priority + { + if(!cg_ptr->attrib.priority) + { + isdn_event_handle(pid, ISDN_REATTEMPT_IND); + rel_cr(pid); + isdn_cpc_clear(&isdn_rs.port_pond[pid]); + } + else + return ISDN_CM_FAILED; + } + } + } + if(pid == 0) //assign new pid + { + if(cg_ptr->attrib.nfas.flag) + { + if(!isdn_rv_msg.msg_list.setup.chnl_id.b3.int_id_pre) + { + cic = msc_give_cic_value(cg_ptr->attrib.tg_id, -1); + if((circuit_ptr = pal_locate_circuit(cg_id, cic)) == NULL) + { + isdn_log_err(0, "the assign cic is not found the adscription of circuit! cic=%, cg_id=%d\n",cic, cg_id); + return ISDN_CM_FAILED; + } + } + else + cic = msc_give_cic_value(cg_ptr->attrib.tg_id, circuit_ptr->attrib.head_cic); + } + else + cic = msc_give_cic_value(cg_ptr->attrib.tg_id, circuit_ptr->attrib.head_cic); + pid = find_port_by_cic(cic, circuit_ptr->id); + } + isdn_rs.port_pond[pid].call_ref = cref; + //msg_cref[pid] = cref; + if(circuit_ptr->attrib.user_network_if) + { + isdn_rs.port_pond[pid].timer_flag |= CALLIN_FLAG; + isdn_rs.port_pond[pid].cic_state.call_state = CALLIN_FLAG; + } + else + { + isdn_rs.port_pond[pid].timer_flag |= CALLOUT_FLAG; + isdn_rs.port_pond[pid].cic_state.call_state = CALLOUT_FLAG; + } + isdn_rs.port_pond[pid].callout_fg = 1; + isdn_rs.port_pond[pid].enable = 1; + break; + case MSG_DISC: + if(ret == 3) + { + isdn_log_err(pid, "disc mandatory information element is absent!\r\n"); + isdn_set_cause(&isdn_rv_msg.msg_list.disc.cause, CAUSE_M_IE_MISS); + } + else if(ret == 2) + { + isdn_log_err(pid, "disc mandatory information element is err!\r\n"); + isdn_set_cause(&isdn_rv_msg.msg_list.disc.cause, CAUSE_IE_INVALID); + } + memcpy(&isdn_sd_msg.msg_list.rel.cause, &isdn_rv_msg.msg_list.disc.cause, sizeof(CauseStr)); + break; + case MSG_REL: + if(ret == 3) //u03-18 u00-13 u07-12 + { + isdn_log_err(pid, "rel mandatory information element is absent!\r\n"); + isdn_set_cause(&isdn_sd_msg.msg_list.relComp.cause, CAUSE_M_IE_MISS); + memcpy(&isdn_rv_msg, &isdn_sd_msg, sizeof(IsdnMsgStr)); + } + else if(ret == 2) //u03-19 u00-14 u07-13 + { + isdn_log_err(pid, "rel mandatory information element is err!\r\n"); + isdn_set_cause(&isdn_sd_msg.msg_list.relComp.cause, CAUSE_IE_INVALID); + memcpy(&isdn_rv_msg, &isdn_sd_msg, sizeof(IsdnMsgStr)); + } + else + memcpy(&isdn_sd_msg.msg_list.relComp.cause, &isdn_rv_msg.msg_list.rel.cause, sizeof(CauseStr)); + break; + case MSG_RESTART: + case MSG_REST_ACK: + if(msg_type == MSG_RESTART) + { + if(cg_ptr->attrib.nfas.flag) + { + if((isdn_rv_msg.msg_list.restart.chnl_id.pres) && + (isdn_rv_msg.msg_list.restart.chnl_id.b3.int_id_pre)) + { + if((circuit_newId = find_circuit_by_interfaceId(cg_id, isdn_rv_msg.msg_list.restart.chnl_id.b3.int_id)) == -1) + { + if(circuit_ptr->attrib.plat_id == isdn_rs.attrib.systemID) + { + monitor_isdn_msg(0, "RV=>", &iua_rv_msg, COL_YELLOW); + isdn_redirect_send(&iua_rv_msg, 3); //send to another plat + return ISDN_CM_FAILED; + } + else + { + isdn_log_err(0, "not find current circuit! circuit id=%d\r\n", circuit_ptr->id); + return ISDN_CM_FAILED; + } + } + else + { + circuit_ptr = pal_circuit_ptr(circuit_newId); + if(circuit_ptr == NULL) + { + isdn_log_err(0, "receive restart err! circuit_id=%d, can't find circuit_ptr!\r\n", circuit_newId); + return ISDN_CM_FAILED; + } + if(circuit_ptr->cg_id != cg_id) + return ISDN_CM_FAILED; + } + } + else + { + isdn_log_err(0, "receive restart err!\n"); + return ISDN_CM_FAILED; + } + } + } + else + { + if(cg_ptr->attrib.nfas.flag) + { + if((isdn_rv_msg.msg_list.restAck.chnl_id.pres) && + (isdn_rv_msg.msg_list.restAck.chnl_id.b3.int_id_pre)) + { + if((circuit_newId = find_circuit_by_interfaceId(cg_id, isdn_rv_msg.msg_list.restAck.chnl_id.b3.int_id)) == -1) + { + if(circuit_ptr->attrib.plat_id == isdn_rs.attrib.systemID) + { + monitor_isdn_msg(0, "RV=>", &iua_rv_msg, COL_YELLOW); + isdn_redirect_send(&iua_rv_msg, 3); //send to another plat + return ISDN_CM_FAILED; + } + else + { + isdn_log_err(0, "not find current circuit! circuit id=%d\r\n", circuit_ptr->id); + return ISDN_CM_FAILED; + } + } + else + { + circuit_ptr = pal_circuit_ptr(circuit_newId); + if(circuit_ptr == NULL) + { + isdn_log_err(0, "receive restart ack err! circuit_id=%d, can't find circuit_ptr!\r\n", circuit_newId); + return ISDN_CM_FAILED; + } + if(circuit_ptr->cg_id != cg_id) + return ISDN_CM_FAILED; + } + } + else + { + isdn_log_err(0, "receive restart ack err!\n"); + return ISDN_CM_FAILED; + } + } + } + pid = circuit_ptr->id * ISDN_CIRCUIT_CIC; + head_cic = circuit_ptr->attrib.head_cic; + if(circuit_ptr->attrib.cic_range == 24) + head_cic--; + isdn_rs.port_pond[pid].callout_fg = ((cref >> 15) ^ 0x01); + isdn_rs.link_pond[circuit_ptr->attrib.link_id].restart_clas = isdn_rv_msg.msg_list.restart.restart_ind.clas; + if(isdn_rs.link_pond[circuit_ptr->attrib.link_id].restart_clas == 0) + isdn_rs.port_pond[pid].cic_val = head_cic + isdn_rv_msg.msg_list.restart.chnl_id.b3.chnl_num; + default: //other + if(ret == 3) + { + isdn_log_err(pid, "msg=0x%02x mandatory information element is absent!\r\n", msg_type); + isdn_set_status(&isdn_sd_msg.msg_list.status, isdn_rs.port_pond[pid].fsm_state.cpc_state, CAUSE_M_IE_MISS); + isdn_send_msg(pid, MSG_STATUS); + return ISDN_CM_FAILED; + } + else if(ret == 2) + { + isdn_log_err(pid, "msg=0x%02x mandatory information element is err!\r\n",msg_type); + isdn_set_status(&isdn_sd_msg.msg_list.status, isdn_rs.port_pond[pid].fsm_state.cpc_state, CAUSE_IE_INVALID); + isdn_send_msg(pid, MSG_STATUS); + return ISDN_CM_FAILED; + } + break; + } + + monitor_isdn_msg(pid, "RV=>", &iua_rv_msg, COL_YELLOW); + isdn_rs.port_pond[pid].msg_cmd = msg_type; + if(global_flag) + { + isdn_restart_ctrl(pid); + } + else if((isdn_rs.port_pond[pid].cic_state.call_state == CALLOUT_FLAG) || + (isdn_rs.port_pond[pid].cic_state.call_state == CALLIN_FLAG)) + { + isdn_cpc_proc(pid); + } + + if(isdn_rs.port_pond[pid].msg_cmd != 0) + { + isdn_log_err(pid, "ignore the message! msg_cmd=0x%x\r\n", isdn_rs.port_pond[pid].msg_cmd); + isdn_rs.port_pond[pid].msg_cmd = 0; + } + + return ISDN_CM_OK; +} + +static int isdn_m_mdsc_proc() +{ + u32 pid, cic, head_cic; + u16 cref = 0; + u8 msg_type, link_id; + int ret, len, cg_id, circuit_newId; + const pal_circuit_struct *circuit_ptr = NULL; + const pal_cg_struct *cg_ptr = NULL; + u8 *flw_ptr; + flw_ptr = iua_rv_msg.msgcontent.isdn_msg.ie_content; + len = iua_rv_msg.msg_length - 5; + link_id = iua_rv_msg.e1_no; + + if((circuit_ptr = pal_isdn_find_circuit_of_link(link_id)) == NULL) + { + isdn_log_err(0, "m_mdsc: link_id %d is unknown link!\r\n", link_id); + monitor_isdn_msg(0, "RV=>", &iua_rv_msg,COL_YELLOW); + return ISDN_CM_FAILED; + } + cg_id = circuit_ptr->cg_id; + cg_ptr = pal_cg_ptr(cg_id); + if(cg_ptr == NULL) + return ISDN_CM_FAILED; + if(cg_ptr->attrib.protocol != PROTO_ISDN) + return ISDN_CM_FAILED; + if(!(cg_ptr->attrib.variant == VARIANT_ITU || cg_ptr->attrib.variant == VARIANT_ANSI || cg_ptr->attrib.variant == VARIANT_QSIG) || + (cg_ptr->attrib.variant == VARIANT_QSIG && (cg_ptr->attrib.nfas.flag || circuit_ptr->attrib.user_network_if == NETWORK_SIDE))) + return ISDN_CM_FAILED; + + if(cg_ptr->attrib.variant != VARIANT_ANSI) + { + isdn_log_err(0, "variant type=%d, is not ansi!\r\n", cg_ptr->attrib.variant); + monitor_isdn_msg(0, "RV=>", &iua_rv_msg, COL_YELLOW); + return ISDN_CM_FAILED; + } + if(iua_rv_msg.msgcontent.isdn_msg.msg_m.cr_len != 2) + { + isdn_log_err(0, "call reference len is not 2!)\n"); //dummy call reference + return ISDN_CM_FAILED; + } + cref = iua_rv_msg.msgcontent.isdn_msg.msg_m.call_ref[0]; + cref = (cref << 8) | (iua_rv_msg.msgcontent.isdn_msg.msg_m.call_ref[1]); + msg_type = iua_rv_msg.msgcontent.isdn_msg.msg_m.msg_type; + + memset(&isdn_sd_msg, 0, sizeof(IsdnMsgStr)); + memset(&isdn_rv_msg, 0, sizeof(IsdnMsgStr)); + if(cref & 0x7FFF) //NOT Global call reference message + { + isdn_log_err(pid, "Invalid global call reference, CR=0x%02x\r\n",cref); + return ISDN_CM_FAILED; + } + memcpy(&isdn_rv_msg.msg_m, &iua_rv_msg.msgcontent.isdn_msg.msg_m, sizeof(MsgMan)); + ret = maintenance_msg_decode(&isdn_rv_msg, flw_ptr, msg_type, len); + if(ret != 1) + { + isdn_log_err(0, "decode msg err!\r\n"); + return ISDN_CM_FAILED; + } + + switch(msg_type) + { + case MSG_SERVICE: + if((cref & 0x8000) != 0) + { + isdn_log_err(0, "the call reference of service is err!\r\n"); + return ISDN_CM_FAILED; + } + + if(cg_ptr->attrib.nfas.flag) + { + if((isdn_rv_msg.msg_list.service.chnl_id.pres) && + (isdn_rv_msg.msg_list.service.chnl_id.b3.int_id_pre)) + { + if((circuit_newId = find_circuit_by_interfaceId(cg_id, isdn_rv_msg.msg_list.service.chnl_id.b3.int_id)) == -1) + { + if(circuit_ptr->attrib.plat_id == isdn_rs.attrib.systemID) + { + monitor_isdn_msg(0, "RV=>", &iua_rv_msg, COL_YELLOW); + isdn_redirect_send(&iua_rv_msg, 3); //send to another plat + return ISDN_CM_FAILED; + } + else + { + isdn_log_err(0, "not find current circuit! circuit id=%d\r\n", circuit_ptr->id); + return ISDN_CM_FAILED; + } + } + else + { + circuit_ptr = pal_circuit_ptr(circuit_newId); + if(circuit_ptr == NULL) + { + isdn_log_err(0, "receive SERVICE err! circuit_id=%d, can't find circuit_ptr!\r\n", circuit_newId); + return ISDN_CM_FAILED; + } + if(circuit_ptr->cg_id != cg_id) + return ISDN_CM_FAILED; + } + } + else + { + isdn_log_err(0, "err!\n"); + return ISDN_CM_FAILED; + } + } + + if((isdn_rv_msg.msg_list.service.chnl_id.pres) && + (isdn_rv_msg.msg_list.service.chnl_id.b3.int_type)) + { + head_cic = circuit_ptr->attrib.head_cic; + if(circuit_ptr->attrib.cic_range == 24) + head_cic--; + if(isdn_rv_msg.msg_list.service.chnl_id.b3.has_chnl) + cic = head_cic + isdn_rv_msg.msg_list.service.chnl_id.b3.chnl_num; + else + { + if(circuit_ptr->attrib.cic_range == 24) // T1 + cic = circuit_ptr->attrib.head_cic + 23; + else + cic = circuit_ptr->attrib.head_cic; + } + } + else + { + isdn_log_err(0, "SERVICE does not include chnl_id ie(pres=%d), or chnl_id does not include cic(int_type=%d)!\r\n", + isdn_rv_msg.msg_list.service.chnl_id.pres, isdn_rv_msg.msg_list.service.chnl_id.b3.int_type); + return ISDN_CM_FAILED; + } + break; + case MSG_SERVICE_ACK: + if(cg_ptr->attrib.nfas.flag) + { + if((isdn_rv_msg.msg_list.servAck.chnl_id.pres) && + (isdn_rv_msg.msg_list.servAck.chnl_id.b3.int_id_pre)) + { + if((circuit_newId = find_circuit_by_interfaceId(cg_id, isdn_rv_msg.msg_list.servAck.chnl_id.b3.int_id)) == -1) + { + if(circuit_ptr->attrib.plat_id == isdn_rs.attrib.systemID) + { + monitor_isdn_msg(0, "RV=>", &iua_rv_msg, COL_YELLOW); + isdn_redirect_send(&iua_rv_msg, 3); //send to another plat + return ISDN_CM_FAILED; + } + else + { + isdn_log_err(0, "not find current circuit! circuit id=%d\r\n", circuit_ptr->id); + return ISDN_CM_FAILED; + } + } + else + { + circuit_ptr = pal_circuit_ptr(circuit_newId); + if(circuit_ptr == NULL) + { + isdn_log_err(0, "receive SERVICE ACK err! circuit_id=%d, can't find circuit_ptr!\r\n", circuit_newId); + return ISDN_CM_FAILED; + } + if(circuit_ptr->cg_id != cg_id) + return ISDN_CM_FAILED; + } + } + else + { + isdn_log_err(0, "err!\n"); + return ISDN_CM_FAILED; + } + } + + if((isdn_rv_msg.msg_list.servAck.chnl_id.pres) && + (isdn_rv_msg.msg_list.servAck.chnl_id.b3.int_type)) + { + head_cic = circuit_ptr->attrib.head_cic; + if(circuit_ptr->attrib.cic_range == 24) + head_cic--; + if(isdn_rv_msg.msg_list.servAck.chnl_id.b3.has_chnl) + cic = head_cic + isdn_rv_msg.msg_list.servAck.chnl_id.b3.chnl_num; + else + { + if(circuit_ptr->attrib.cic_range == 24) // T1 + cic = circuit_ptr->attrib.head_cic + 23; + else + cic = circuit_ptr->attrib.head_cic; + } + } + else + { + isdn_log_err(0, "SERVICE ACK does not include chnl_id ie(pres=%d), or chnl_id does not include cic(int_type=%d)!\r\n", + isdn_rv_msg.msg_list.servAck.chnl_id.pres, isdn_rv_msg.msg_list.servAck.chnl_id.b3.int_type); + return ISDN_CM_FAILED; + } + break; + default: + return ISDN_CM_FAILED; + } + + head_cic = circuit_ptr->attrib.head_cic; + if(circuit_ptr->attrib.cic_range == 24) + head_cic--; + if((cic < circuit_ptr->attrib.head_cic) || + (cic - circuit_ptr->attrib.head_cic) >= (circuit_ptr->attrib.cic_range)) + { + isdn_log_err(0, "decode cic err!cic=0x04x\r\n", cic); + return ISDN_CM_FAILED; + } + else + { + pid = find_port_by_cic(cic, circuit_ptr->id); + if((circuit_ptr->attrib.d_chnl+head_cic) == cic) + isdn_rs.port_pond[pid].timer_flag |= DC_M_FLAG; + else + isdn_rs.port_pond[pid].timer_flag |= BC_M_FLAG; + } + + monitor_isdn_msg(pid, "RV=>", &iua_rv_msg, COL_YELLOW); + isdn_rs.port_pond[pid].msg_cmd = msg_type; + if(isdn_rs.port_pond[pid].timer_flag & DC_M_FLAG) + service_dc_proc(pid); + else if(isdn_rs.port_pond[pid].timer_flag & BC_M_FLAG) + service_bc_proc(pid); + + if(isdn_rs.port_pond[pid].msg_cmd != 0) + { + isdn_log_err(pid, "ignore the message! msg_cmd=%d\r\n", isdn_rs.port_pond[pid].msg_cmd); + isdn_rs.port_pond[pid].msg_cmd = 0; + } + + return ISDN_CM_OK; +} + + +/************************************************************* +Function: isdn_receive_msg +Description: isdn receive msg from iua +Input: NULL +Return: ISDN_CM_OK:success + ISDN_CM_FAILED:failed +*************************************************************/ +int isdn_receive_msg() +{ + u16 len; + int link_id; + xua_up_msg_t *src = 0; + + if((get_xua_msg(IUA_APP, &src)) <= 0) + { +// printf("isdn get iua err!\n"); + return ISDN_CM_FAILED; + } + memcpy(&iua_rv_msg.msg_class, src, sizeof(xua_up_msg_t)); + link_id = iua_rv_msg.e1_no; + if(iua_rv_msg.msg_class == IUA_MGMT_CMD) //heartbeat + { + if(iua_rv_msg.msgcontent.lkmsg.opercode == M2UA_LK_DOWN) + { + isdn_rs.link_pond[link_id].lk2_status = LK_OOS; //out of service + } + else if(iua_rv_msg.msgcontent.lkmsg.opercode == M2UA_LK_UP) + { + isdn_rs.link_pond[link_id].lk2_status = LK_IS; //in service + isdn_rs.link_pond[link_id].link_heartbeat_time = 0; + } + isdn_rs.link_pond[link_id].lk3_status = isdn_rs.link_pond[link_id].lk2_status; + return ISDN_CM_FAILED; + } + + len = ntohs(iua_rv_msg.msg_length); + iua_rv_msg.msg_length = len; + if((iua_rv_msg.msgcontent.isdn_msg.msg_m.proto_Discr == PROTOCOL_DISCR) && + (len > 4)) + { + isdn_mdsc_proc(); + return ISDN_CM_OK; + } + else if((iua_rv_msg.msgcontent.isdn_msg.msg_m.proto_Discr == M_PROTOCOL_DISCR) && + (len > 4)) + { + isdn_m_mdsc_proc(); + return ISDN_CM_OK; + } + + isdn_log_err(0, "there is not isdn msg!\r\n"); + return ISDN_CM_FAILED; +} + + +int isdn_redirect_receive() +{ + int type, link_id; + message_list msg_trans; + xua_up_msg_t iua_msg; + + if(iptrGetMessage(&msg_trans, ISDN_IP_PORT) == 0) + { +// isdn_log_err(0, "do not receive msg from another plat!\r\n"); + return ISDN_CM_FAILED; + } + if(msg_trans.msgSrcIP != isdn_rs.attrib.isdn_remote_ip) + { + isdn_log_err(0, "remote ip is not compatible!\r\n"); + return ISDN_CM_FAILED; + } + + type = msg_trans.msgContent[0]; + + switch(type) + { + case 1: //heartbeat + if(msg_trans.msgLength == 3) + { + link_id = msg_trans.msgContent[1]; + isdn_rs.link_pond[link_id].dc_status = msg_trans.msgContent[2]; + isdn_rs.link_pond[link_id].plat_heartbeat_time = isdn_timer_var.t1s; + return ISDN_CM_OK; + } + break; + case 2: //msg, don't decode msg, and send the msg to the other switch + if(msg_trans.msgLength > 5) + { + memcpy(&iua_msg, msg_trans.msgContent+1, msg_trans.msgLength-1); + put_xua_msg(&iua_msg); + return ISDN_CM_OK; + } + break; + case 3: //msg, need decode msg + if(msg_trans.msgLength > 5) + { + memcpy(&iua_rv_msg.msg_class, msg_trans.msgContent+1, msg_trans.msgLength-1); + iua_rv_msg.msg_length = ntohs(iua_rv_msg.msg_length); + if(iua_rv_msg.msgcontent.isdn_msg.msg_m.proto_Discr == PROTOCOL_DISCR) + { + isdn_mdsc_proc(); + return ISDN_CM_OK; + } + else if(iua_rv_msg.msgcontent.isdn_msg.msg_m.proto_Discr == M_PROTOCOL_DISCR) + { + isdn_m_mdsc_proc(); + return ISDN_CM_OK; + } + } + break; + default: + break; + } + + isdn_log_err(0, "redirect receive err!\n"); + return ISDN_CM_FAILED; +} + diff --git a/omc/plat/isdn/src/isdn_rm.c b/omc/plat/isdn/src/isdn_rm.c new file mode 100644 index 0000000..8b189d8 --- /dev/null +++ b/omc/plat/isdn/src/isdn_rm.c @@ -0,0 +1,515 @@ +/*********************************************************** +Copyright (C), LGC Wireless. +File Name: isdn_rm.c +Description: ISDN Resource Management +Version: v9.0.0 +Author: Gengxin Chen +Create Date: 2008-2-19 +History: + + +************************************************************/ +#include "./include/isdn_const.h" +#include "../../m2ua/src/include/m2ua_const.h" +#include "./include/isdn_rm.h" +#include "./include/isdn_debug.h" +#include "./include/isdn_ext.h" +#include "./include/isdn_inc.h" + +extern int isdn_receive_msg(); +extern int isdn_redirect_receive(); +extern void isdn_send_heartbeat(int link_id); +extern void isdn_cpc_timer(u32 pid); +extern void maintenance_timer(u32 pid); +extern void isdn_restart_timer(u32 pid); +extern void service_dc_proc(u32 pid); +extern void isdn_restart_ctrl(u32 pid); +extern int trans_callref_sd_rest_req(u32 pid, u8 g_pri_cmd); + +/************************************************************* +Function: timer_init +Description: initialize the timers of isdn +Input: interval_ms:time cycle +Return: NULL +*************************************************************/ +static void timer_init(u32 interval_ms) +{ + isdn_timer_var.t301 = ISDN_T301 * 1000 / interval_ms; + isdn_timer_var.t302 = ISDN_T302 * 1000 / interval_ms; + isdn_timer_var.t303 = ISDN_T303 * 1000 / interval_ms; + isdn_timer_var.t304 = ISDN_T304 * 1000 / interval_ms; + isdn_timer_var.t305 = ISDN_T305 * 1000 / interval_ms; + isdn_timer_var.t306 = ISDN_T306 * 1000 / interval_ms; + isdn_timer_var.t307 = ISDN_T307 * 1000 / interval_ms; + isdn_timer_var.t308 = ISDN_T308 * 1000 / interval_ms; + isdn_timer_var.t309 = ISDN_T309 * 1000 / interval_ms; + isdn_timer_var.t310 = ISDN_T310 * 1000 / interval_ms; + isdn_timer_var.t312 = ISDN_T312 * 1000 / interval_ms; + isdn_timer_var.t313 = ISDN_T313 * 1000 / interval_ms; + isdn_timer_var.t316 = ISDN_T316 * 1000 / interval_ms; + isdn_timer_var.t317 = ISDN_T317 * 1000 / interval_ms; + isdn_timer_var.t321 = ISDN_T321 * 1000 / interval_ms; + isdn_timer_var.t322 = ISDN_T322 * 1000 / interval_ms; + isdn_timer_var.t1s = ISDN_T1 * 1000 / interval_ms + 20; + isdn_timer_var.t3M1 = ISDN_T3M1 * 1000 / interval_ms; +} + +/************************************************************* +Function: isdn_init +Description: initialize the parameters of isdn +Input: systemID:plat id, interval_ms:time cycle +Return: ISDN_CM_OK:success +*************************************************************/ +int isdn_init(u8 systemID, u32 interval_ms) +{ + u32 stack_size; + if(interval_ms == 0) + interval_ms = 10; + printf("Start ISDN module init...\n"); + memset(&isdn_rs, 0, sizeof(ISDN_Resource_Pond)); + memset(&isdn_timer_var, 1, sizeof(IsdnTimerStr)); + memset(&isdn_rv_msg, 0, sizeof(IsdnMsgStr)); + memset(&isdn_sd_msg, 0, sizeof(IsdnMsgStr)); + memset(&iua_rv_msg, 0, sizeof(IuaMsgStr)); + memset(&iua_sd_msg, 0, sizeof(IuaMsgStr)); + timer_init(interval_ms); + isdn_rs.attrib.systemID = systemID; + isdn_rs.attrib.isdn_remote_ip = 0; + isdn_rs.attrib.isdn_run_mode = 0; + stack_size = sizeof(ISDN_Resource_Pond) + sizeof(IsdnTimerStr); + isdn_debug_init(); + printf("ISDN module init completed, stack size: %ld bytes\n", stack_size); + + return ISDN_CM_OK; +} + +/************************************************************* +Function: isdn_sd_link +Description: isdn send link command to iua +Input: iua_id:link number, opercode:link command parameter +Return: ISDN_CM_OK:success +*************************************************************/ +int isdn_sd_link(u8 link_id, u8 opercode) +{ + IuaMsgStr isdn_lk; + isdn_lk.msg_class = IUA_MGMT_CMD; + isdn_lk.e1_no = link_id; + isdn_lk.msg_length = htons(0x0003); + isdn_lk.msgcontent.lkmsg.opercode = opercode; + + put_xua_msg((xua_up_msg_t*)&isdn_lk.msg_class); + + return ISDN_CM_OK; +} + +/************************************************************* +Function: isdn_link_ctrl +Description: isdn link control +Input: NULL +Return: NULL +*************************************************************/ +void isdn_link_ctrl() +{ + int i, link_id; + const pal_circuit_struct *circuit_ptr = NULL; + const pal_cg_struct *cg_ptr = NULL; + + for(i = 0; i < ISDN_MAX_CIRCUIT; i++) //for timer //setup link + { + circuit_ptr = pal_circuit_ptr(i); + if(circuit_ptr == NULL) + continue; + + if(circuit_ptr->enable == 0) + continue; + if((isdn_rs.attrib.isdn_run_mode == ISDN_DUAL_MODE) && + (circuit_ptr->attrib.plat_id != isdn_rs.attrib.systemID)) + continue; + + cg_ptr = pal_cg_ptr(circuit_ptr->cg_id); + if(cg_ptr == NULL) + continue; + if(cg_ptr->attrib.protocol != PROTO_ISDN) + continue; + if(!(cg_ptr->attrib.variant == VARIANT_ITU || cg_ptr->attrib.variant == VARIANT_ANSI || cg_ptr->attrib.variant == VARIANT_QSIG) || + (cg_ptr->attrib.variant == VARIANT_QSIG && (cg_ptr->attrib.nfas.flag || circuit_ptr->attrib.user_network_if == NETWORK_SIDE))) + continue; + + link_id = circuit_ptr->attrib.link_id; + if(cg_ptr->enable) + { + if(isdn_rs.link_pond[link_id].lk3_status == LK_OOS) + { + if(cg_ptr->attrib.nfas.flag) //nfas + { + if((cg_ptr->attrib.nfas.prim_link != link_id) && + (cg_ptr->attrib.nfas.backup_link != link_id)) + continue; + } + + isdn_sd_link(link_id, xUA_ENABLE_xUA_LINK); //enable + isdn_sd_link(link_id, M2UA_MTP3_CMD_ACTIVE_LK); //active + } + } + else //modify by 080821 + { + if(isdn_rs.link_pond[link_id].lk3_status == LK_IS) + { + if(cg_ptr->attrib.nfas.flag) + { + if((cg_ptr->attrib.nfas.prim_link != link_id) && + (cg_ptr->attrib.nfas.backup_link != link_id)) + continue; + } + isdn_sd_link(link_id, M2UA_MTP3_CMD_DEACTIVE_LK); + isdn_sd_link(link_id, xUA_STOP_xUA_LINK); + } + } + } + + for(i = 0; i < ISDN_MAX_CIRCUIT; i++) //release link + { + circuit_ptr = pal_circuit_ptr(i); + if(circuit_ptr == NULL) + continue; + +/* if(circuit_ptr->enable == 0) + { + continue; + }*/ + if(((isdn_rs.attrib.isdn_run_mode == ISDN_SINGLE_MODE) || + (isdn_rs.attrib.isdn_run_mode == ISDN_DUAL_MODE && + circuit_ptr->attrib.plat_id == isdn_rs.attrib.systemID)) && + (circuit_ptr->enable == 1)) //modify by 080821 + continue; + + cg_ptr = pal_cg_ptr(circuit_ptr->cg_id); + if(cg_ptr == NULL) + continue; + if(cg_ptr->attrib.protocol != PROTO_ISDN) + continue; + if(!(cg_ptr->attrib.variant == VARIANT_ITU || cg_ptr->attrib.variant == VARIANT_ANSI || cg_ptr->attrib.variant == VARIANT_QSIG) || + (cg_ptr->attrib.variant == VARIANT_QSIG && (cg_ptr->attrib.nfas.flag || circuit_ptr->attrib.user_network_if == NETWORK_SIDE))) + continue; + + link_id = circuit_ptr->attrib.link_id; + if(isdn_rs.link_pond[link_id].lk3_status == LK_IS) + { + if(cg_ptr->attrib.nfas.flag) + { + if((cg_ptr->attrib.nfas.prim_link != link_id) && + (cg_ptr->attrib.nfas.backup_link != link_id)) + continue; + } + isdn_sd_link(link_id, M2UA_MTP3_CMD_DEACTIVE_LK); + isdn_sd_link(link_id, xUA_STOP_xUA_LINK); + } + } +} + +void isdn_heartbeat_timer(int link_id) +{ + if(isdn_rs.link_pond[link_id].plat_heartbeat_time > 0) + { + isdn_rs.link_pond[link_id].plat_heartbeat_time--; + if(isdn_rs.link_pond[link_id].plat_heartbeat_time == 0) + { + isdn_rs.link_pond[link_id].dc_status = DS_OOS; + isdn_log_err(0, "link %d heartbeat timeout: another plat doesnot send link state!\r\n",link_id); + } + } +} + +/************************************************************* +Function: isdn_timer +Description: isdn task schedule, include isdn link control, isdn receive msg from iua and control the timer +Input: NULL +Return: NULL +*************************************************************/ +void isdn_timer() +{ + u16 i, j, chnl_j, cg_id; + u32 offset, pid; + int circuit_cic, link_id, ds_0, ds_1; + static int link_10s = 0; + const pal_circuit_struct *circuit_ptr = NULL; + const pal_cg_struct *cg_ptr = NULL; + + link_10s++; + if(link_10s % 600 == 0) // 6s + { + isdn_link_ctrl(); //setup link + link_10s = 0; + } + + for(i = 0; i < 64; i++) + { + if(isdn_receive_msg() == 0) + break; //no message in lower layer + if(isdn_redirect_receive() == 0) + break; //no message from another plat + } + + for(i = 0; i < ISDN_MAX_CIRCUIT; i++) //for timer + { + circuit_ptr = pal_circuit_ptr(i); + if(circuit_ptr == NULL) + continue; + + if(circuit_ptr->enable == 0) + continue; + if((isdn_rs.attrib.isdn_run_mode == ISDN_DUAL_MODE) && + (circuit_ptr->attrib.plat_id != isdn_rs.attrib.systemID)) + continue; + + cg_id = circuit_ptr->cg_id; + cg_ptr = pal_cg_ptr(cg_id); + if(cg_ptr == NULL) + continue; + if(cg_ptr->attrib.protocol != PROTO_ISDN) + continue; + if(!(cg_ptr->attrib.variant == VARIANT_ITU || cg_ptr->attrib.variant == VARIANT_ANSI || cg_ptr->attrib.variant == VARIANT_QSIG) || + (cg_ptr->attrib.variant == VARIANT_QSIG && (cg_ptr->attrib.nfas.flag || circuit_ptr->attrib.user_network_if == NETWORK_SIDE))) + continue; + + link_id = circuit_ptr->attrib.link_id; + isdn_rs.link_pond[link_id].link_heartbeat_time++; + if(isdn_rs.link_pond[link_id].link_heartbeat_time % LINK_MAX_TIME == 0) + { + isdn_rs.link_pond[link_id].lk3_status = isdn_rs.link_pond[link_id].lk2_status; + isdn_rs.link_pond[link_id].lk2_status = LK_OOS; + isdn_rs.link_pond[link_id].link_heartbeat_time = 0; + } + + circuit_cic = circuit_ptr->attrib.cic_range; + offset = ISDN_CIRCUIT_CIC * i; //ISDN_CIRCUIT_CIC + if(circuit_cic == 24) //T1 + { + if((trans_callref_sd_rest_req(offset+24, ISDN_RESTART_CNF)) == circuit_cic) + { + isdn_rs.port_pond[offset+24].g_pri_cmd = ISDN_RESTART_CNF; + isdn_restart_ctrl(offset+24); //restart control + } +// offset++; + } + else + { + if((trans_callref_sd_rest_req(offset, ISDN_RESTART_CNF)) == circuit_cic) + { + isdn_rs.port_pond[offset].g_pri_cmd = ISDN_RESTART_CNF; + isdn_restart_ctrl(offset); //restart control + } + } + for(j = 0; j < circuit_cic; j++) + { + chnl_j = j; + if(circuit_cic == 24) //T1 + chnl_j = j + 1; + pid = offset + chnl_j; + if(cg_ptr->attrib.nfas.flag) //NFAS + { + ds_0 = cg_ptr->attrib.nfas.prim_link; + ds_1 = cg_ptr->attrib.nfas.backup_link; + if(circuit_ptr->attrib.d_chnl == chnl_j) //d-channel + { + if(ds_0 == link_id) + { + if(isdn_rs.link_pond[link_id].lk3_status == LK_IS) + { + if((isdn_rs.link_pond[ds_0].dc_status == DS_MOOS) && + (isdn_rs.link_pond[ds_1].dc_status != DS_IS)) + isdn_rs.port_pond[pid].g_pri_cmd = ISDN_SERVICE_REQ; + } + else + isdn_rs.link_pond[link_id].dc_status = DS_OOS; + service_dc_proc(pid); + + if((link_10s % 100 == 0) && (isdn_rs.attrib.isdn_run_mode == ISDN_DUAL_MODE)) //send heartbeat per 1 second + isdn_send_heartbeat(link_id); + if(isdn_rs.link_pond[link_id].plat_heartbeat_time > 0) + isdn_rs.link_pond[link_id].plat_heartbeat_time = 0; + } + else if(ds_1 == link_id) + { + if(isdn_rs.link_pond[link_id].lk3_status == LK_IS) + { + if((isdn_rs.link_pond[ds_1].dc_status == DS_MOOS) && + ((isdn_rs.link_pond[ds_0].dc_status == DS_OOS) || + (isdn_rs.link_pond[ds_0].dc_status == DS_STBY))) + isdn_rs.port_pond[pid].g_pri_cmd = ISDN_SERVICE_REQ; + } + else + isdn_rs.link_pond[link_id].dc_status = DS_OOS; + service_dc_proc(pid); + + if((link_10s % 100 == 0) && (isdn_rs.attrib.isdn_run_mode == ISDN_DUAL_MODE)) //send heartbeat per 1 second + isdn_send_heartbeat(link_id); + if(isdn_rs.link_pond[link_id].plat_heartbeat_time > 0) + isdn_rs.link_pond[link_id].plat_heartbeat_time = 0; + } + } + } + else //associated signaling + { + if(isdn_rs.link_pond[link_id].lk3_status == LK_IS) + { + if(circuit_ptr->attrib.d_chnl == chnl_j) //d-channel + isdn_rs.link_pond[link_id].dc_status = DS_IS; + } + else + { + if(circuit_ptr->attrib.d_chnl == chnl_j) //d-channel + isdn_rs.link_pond[link_id].dc_status = DS_OOS; + } + } + + if(isdn_rs.port_pond[pid].enable) + isdn_cpc_timer(pid); + isdn_restart_timer(pid); + maintenance_timer(pid); + } + if(isdn_rs.attrib.isdn_run_mode == ISDN_DUAL_MODE) + isdn_heartbeat_timer(i); + } + isdn_debug_timer(); + +} + +/************************************************************* +Function: isdn_assign_port +Description: isdn assign the port id +Input: e1no:link number +Return: port id:success + 0:failed +*************************************************************/ +u32 isdn_assign_port(u16 circuit_id) +{ + u8 i, chnl; + u32 e1nox32 = 0; + u32 portnum = 0; + + chnl = 32; + e1nox32 = circuit_id; + e1nox32 = (e1nox32 << 5); + + for(i = 0; i < 31; i++) + { + chnl = (chnl - i) & 0x1F; + if (((chnl & 0x1F) != 0) && (chnl != 16)) + { + portnum = e1nox32 + chnl; + if (isdn_rs.port_pond[portnum].enable == 0) + { + if(isdn_rs.port_pond[portnum].cic_state.maintenance_state != IN_SERVICE) + { + isdn_log_err(0, "this cic is not in service in assign port!\r\n"); + break; + } + isdn_rs.port_pond[portnum].enable = 1; + return portnum; + } + } + } + + return 0; +} + + +/************************************************************* +Function: find_port_by_callref +Description: find port id by the call referrence and link id +Input: cref:call referrence, circuit_id:circuit id +Return: port id:success + 0:failed +*************************************************************/ +u32 find_port_by_callref(u16 cref, u16 circuit_id) +{ + int i, circuit_cic, d_chnl=16; + u32 portnum = 0; + const pal_circuit_struct *circuit_ptr = pal_circuit_ptr(circuit_id); + if(circuit_ptr == NULL) + return ISDN_CM_FAILED; + + circuit_cic = circuit_ptr->attrib.cic_range; + if(circuit_cic == 24) //T1 + { + d_chnl = 24; + } + portnum = (circuit_id * ISDN_CIRCUIT_CIC) + 1; + + for (i = 1; i < circuit_cic; i++, portnum++) + { + if (i != d_chnl) + { + if(isdn_rs.port_pond[portnum].call_ref == cref) + return portnum; + } + } +// isdn_log_err(0, "find port by callref err!call_ref=%d, circuit_id=%d\r\n",cref, circuit_id); + + return 0; +} + +/************************************************************* +Function: find_port_by_cic +Description: find port id by the cic of one link +Input: cic:cic, circuit_id:circuit id +Return: port id:success +*************************************************************/ +u32 find_port_by_cic(u32 cic, u16 circuit_id) +{ + u32 head_cic; + const pal_circuit_struct *circuit_ptr = pal_circuit_ptr(circuit_id); + if(circuit_ptr == NULL) + return ISDN_CM_FAILED; + head_cic = circuit_ptr->attrib.head_cic; + if(circuit_ptr->attrib.cic_range == 24) + head_cic--; + + return ISDN_CIRCUIT_CIC * circuit_id + (cic - head_cic); +} + +int find_circuit_by_interfaceId(int cg_id, u8 interface_id) +{ + int i; + const pal_circuit_struct *circuit_ptr = NULL; + + for(i = 0; i < ISDN_MAX_CIRCUIT; i++) + { + circuit_ptr = pal_circuit_ptr(i); + if(circuit_ptr == NULL) + continue; + + if(circuit_ptr->enable == 0) + continue; + if((isdn_rs.attrib.isdn_run_mode == ISDN_DUAL_MODE) && + (circuit_ptr->attrib.plat_id != isdn_rs.attrib.systemID)) + continue; + if(circuit_ptr->cg_id != cg_id) + continue; + + if((circuit_ptr->attrib.cic_range != 0) && (circuit_ptr->attrib.head_cic / circuit_ptr->attrib.cic_range) == interface_id) + return i; + } + isdn_log_err(0, "find circuit by interface id err!cg_id=%d, interface_id=%d\r\n",cg_id, interface_id); + + return -1; +} + +//d-channel status +int check_dc_status(u8 link_id) +{ + if(isdn_rs.link_pond[link_id].dc_status == DS_IS) + return ISDN_CM_OK; + else + return ISDN_CM_FAILED; +} + +int isdn_set_run_mode (u8 run_mode, u32 alter_ip) +{ + isdn_trace_func(0,"APP => function trace: %s\r\n", __FUNCTION__); + isdn_rs.attrib.isdn_run_mode = run_mode % 2; + isdn_rs.attrib.isdn_remote_ip = alter_ip; + return ISDN_CM_OK; +} + diff --git a/omc/plat/isdn/src/isdn_uif.c b/omc/plat/isdn/src/isdn_uif.c new file mode 100644 index 0000000..30fe730 --- /dev/null +++ b/omc/plat/isdn/src/isdn_uif.c @@ -0,0 +1,428 @@ +/*********************************************************** +Copyright (C), LGC Wireless. +File Name: isdn_uif.c +Description: ISDN USER INTERFACE +Version: v9.0.0 +Author: Gengxin Chen +Create Date: 2008-2-19 +History: + + +************************************************************/ + +#include "./include/isdn_const.h" +#include "./include/isdn_rm.h" +#include "./include/isdn_debug.h" +#include "./include/isdn_ext.h" +#include "./include/isdn_inc.h" + + +extern void isdn_cpc_proc(u32 pid); +extern void isdn_restart_ctrl(u32 pid); +extern void service_bc_proc(u32 pid); + + +/************************************************************* +Function: isdn_setup_req +Description: msc invokes the function to request setup +Output: pst:post structure pointer, ptr:isdn setup structure pointer +Return: ISDN_CM_OK:success + ISDN_CM_FAILED:failed +*************************************************************/ +int isdn_setup_req(Pst *pst, IsdnSetup *ptr) +{ + const pal_circuit_struct *circuit_ptr = NULL; + circuit_ptr = pal_locate_circuit(pst->cg_id, pst->cic); + if(circuit_ptr == NULL) + { + isdn_trace_func(0, "APP => function trace: %s\r\n", __FUNCTION__); + return ISDN_CM_FAILED; + } + pst->sp_proc_id = find_port_by_cic(pst->cic, circuit_ptr->id); + isdn_rs.port_pond[pst->sp_proc_id].su_proc_id = pst->su_proc_id; + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_SETUP_REQ; + isdn_rs.port_pond[pst->sp_proc_id].trace_flag = pst->trace_flag; + isdn_rs.port_pond[pst->sp_proc_id].enable = 1; + isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__); + + if(isdn_rs.port_pond[pst->sp_proc_id].cic_state.call_state != IDLE_FLAG) + { + isdn_log_err(pst->sp_proc_id, "call state is not idle, but is %d\n", isdn_rs.port_pond[pst->sp_proc_id].cic_state.call_state); + return ISDN_CM_FAILED; + } + memcpy(&(isdn_sd_msg.msg_list.setup), ptr, sizeof(IsdnSetup)); + if(circuit_ptr->attrib.user_network_if) + isdn_rs.port_pond[pst->sp_proc_id].cic_state.call_state = CALLOUT_FLAG; + else + isdn_rs.port_pond[pst->sp_proc_id].cic_state.call_state = CALLIN_FLAG; + isdn_cpc_proc(pst->sp_proc_id); + if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0) + { + isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd); + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0; + } + + return ISDN_CM_OK; +} + +/************************************************************* +Function: isdn_m_info_req +Description: msc invokes the function to request more information +Output: pst:post structure pointer, ptr:isdn setup ack structure pointer +Return: ISDN_CM_OK:success + ISDN_CM_FAILED:failed +*************************************************************/ +int isdn_m_info_req(Pst *pst, IsdnSetupAck *ptr) +{ + isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__); + if(pst->sp_proc_id >= ISDN_MAX_PORT) + { + isdn_log_err(0, "pid=%d, is paranormal)\n", pst->sp_proc_id); + return ISDN_CM_FAILED; + } + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_MORE_INFO_REQ; + memcpy(&(isdn_sd_msg.msg_list.setupAck), ptr, sizeof(IsdnSetupAck)); + isdn_cpc_proc(pst->sp_proc_id); + if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0) + { + isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd); + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0; + } + + return ISDN_CM_OK; +} + +/************************************************************* +Function: isdn_call_proc_req +Description: msc invokes the function to request call proceeding +Output: pst:post structure pointer, ptr:isdn call proceeding structure pointer +Return: ISDN_CM_OK:success + ISDN_CM_FAILED:failed +*************************************************************/ +int isdn_call_proc_req(Pst *pst, IsdnCallProc *ptr) +{ + isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__); + if(pst->sp_proc_id >= ISDN_MAX_PORT) + { + isdn_log_err(0, "pid=%d, is paranormal)\n", pst->sp_proc_id); + return ISDN_CM_FAILED; + } + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_PROC_REQ; + memcpy(&(isdn_sd_msg.msg_list.callProc), ptr, sizeof(IsdnCallProc)); + isdn_cpc_proc(pst->sp_proc_id); + if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0) + { + isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd); + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0; + } + + return ISDN_CM_OK; +} + +/************************************************************* +Function: isdn_alert_req +Description: msc invokes the function to request alerting +Output: pst:post structure pointer, ptr:isdn alerting structure pointer +Return: ISDN_CM_OK:success + ISDN_CM_FAILED:failed +*************************************************************/ +int isdn_alert_req(Pst *pst, IsdnAlert *ptr) +{ + isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__); + if(pst->sp_proc_id >= ISDN_MAX_PORT) + { + isdn_log_err(0, "pid=%d, is paranormal)\n", pst->sp_proc_id); + return ISDN_CM_FAILED; + } + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_ALERT_REQ; + memcpy(&(isdn_sd_msg.msg_list.alert), ptr, sizeof(IsdnAlert)); + isdn_cpc_proc(pst->sp_proc_id); + if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0) + { + isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd); + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0; + } + + return ISDN_CM_OK; +} + +/************************************************************* +Function: isdn_setup_resp +Description: msc invokes the function to request setup response +Output: pst:post structure pointer, ptr:isdn connect structure pointer +Return: ISDN_CM_OK:success + ISDN_CM_FAILED:failed +*************************************************************/ +int isdn_setup_resp(Pst *pst, IsdnConn *ptr) +{ + isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__); + if(pst->sp_proc_id >= ISDN_MAX_PORT) + { + isdn_log_err(0, "pid=%d, is paranormal)\n", pst->sp_proc_id); + return ISDN_CM_FAILED; + } + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_SETUP_RSP; + memcpy(&(isdn_sd_msg.msg_list.conn), ptr, sizeof(IsdnConn)); + isdn_cpc_proc(pst->sp_proc_id); + if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0) + { + isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd); + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0; + } + + return ISDN_CM_OK; +} + +/************************************************************* +Function: isdn_disc_req +Description: msc invokes the function to request disconnect +Output: pst:post structure pointer, ptr:isdn disconnect structure pointer +Return: ISDN_CM_OK:success + ISDN_CM_FAILED:failed +*************************************************************/ +int isdn_disc_req(Pst *pst, IsdnDisc *ptr) +{ + isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__); + if(pst->sp_proc_id >= ISDN_MAX_PORT) + { + isdn_log_err(0, "pid=%d, is paranormal)\n", pst->sp_proc_id); + return ISDN_CM_FAILED; + } + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_DISCONNECT_REQ; + memcpy(&(isdn_sd_msg.msg_list.disc), ptr, sizeof(IsdnDisc)); + isdn_cpc_proc(pst->sp_proc_id); + if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0) + { + isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd); + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0; + } + + return ISDN_CM_OK; +} + +/************************************************************* +Function: isdn_rel_req +Description: msc invokes the function to request release +Output: pst:post structure pointer, ptr:isdn release structure pointer +Return: ISDN_CM_OK:success + ISDN_CM_FAILED:failed +*************************************************************/ +int isdn_rel_req(Pst *pst, IsdnRel *ptr) +{ + isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__); + if(pst->sp_proc_id >= ISDN_MAX_PORT) + { + isdn_log_err(0, "pid=%d, is paranormal)\n", pst->sp_proc_id); + return ISDN_CM_FAILED; + } + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_RELEASE_REQ; + memcpy(&(isdn_sd_msg.msg_list.rel), ptr, sizeof(IsdnRel)); + isdn_cpc_proc(pst->sp_proc_id); + if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0) + { + isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd); + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0; + } + + return ISDN_CM_OK; +} + +int isdn_rej_req(Pst *pst, IsdnRelComp *ptr) +{ + isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__); + if(pst->sp_proc_id >= ISDN_MAX_PORT) + { + isdn_log_err(0, "pid=%d, is paranormal)\n", pst->sp_proc_id); + return ISDN_CM_FAILED; + } + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_REJECT_REQ; + memcpy(&(isdn_sd_msg.msg_list.relComp), ptr, sizeof(IsdnRelComp)); + isdn_cpc_proc(pst->sp_proc_id); + if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0) + { + isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd); + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0; + } + + return ISDN_CM_OK; +} +/************************************************************* +Function: isdn_info_req +Description: msc invokes the function to request information +Output: pst:post structure pointer, ptr:isdn information structure pointer +Return: ISDN_CM_OK:success + ISDN_CM_FAILED:failed +*************************************************************/ +int isdn_info_req(Pst *pst, IsdnInfo *ptr) +{ + isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__); + if(pst->sp_proc_id >= ISDN_MAX_PORT) + { + isdn_log_err(0, "pid=%d, is paranormal\r\n", pst->sp_proc_id); + return ISDN_CM_FAILED; + } + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_INFO_REQ; + memcpy(&(isdn_sd_msg.msg_list.info), ptr, sizeof(IsdnInfo)); + isdn_cpc_proc(pst->sp_proc_id); + if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0) + { + isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd); + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0; + } + + return ISDN_CM_OK; +} + +/************************************************************* +Function: isdn_prog_req +Description: msc invokes the function to request progress +Output: pst:post structure pointer, ptr:isdn progress structure pointer +Return: ISDN_CM_OK:success + ISDN_CM_FAILED:failed +*************************************************************/ +int isdn_prog_req(Pst *pst, IsdnProg *ptr) +{ + isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__); + if(pst->sp_proc_id >= ISDN_MAX_PORT) + { + isdn_log_err(0, "pid=%d, is paranormal\r\n", pst->sp_proc_id); + return ISDN_CM_FAILED; + } + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_PROG_REQ; + memcpy(&(isdn_sd_msg.msg_list.prog), ptr, sizeof(IsdnProg)); + isdn_cpc_proc(pst->sp_proc_id); + if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0) + { + isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd); + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0; + } + + return ISDN_CM_OK; +} + +/************************************************************* +Function: isdn_noti_req +Description: msc invokes the function to request notify +Output: pst:post structure pointer, ptr:isdn notify structure pointer +Return: ISDN_CM_OK:success + ISDN_CM_FAILED:failed +*************************************************************/ +int isdn_noti_req(Pst * pst, IsdnNoti * ptr) +{ + isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__); + if(pst->sp_proc_id >= ISDN_MAX_PORT) + { + isdn_log_err(0, "pid=%d, is paranormal\r\n", pst->sp_proc_id); + return ISDN_CM_FAILED; + } + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = ISDN_NOTI_REQ; + memcpy(&(isdn_sd_msg.msg_list.noti), ptr, sizeof(IsdnNoti)); + isdn_cpc_proc(pst->sp_proc_id); + if(isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd != 0) + { + isdn_trace_func(pst->sp_proc_id, "[waring]primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd); + isdn_rs.port_pond[pst->sp_proc_id].primitive_cmd = 0; + } + + return ISDN_CM_OK; +} + +/************************************************************* +Function: isdn_m_restart_req +Description: msc invokes the function to request management restart +Output: pst:post structure pointer, ptr:isdn restart structure pointer +Return: ISDN_CM_OK:success + ISDN_CM_FAILED:failed +*************************************************************/ +int isdn_m_restart_req(Pst *pst, IsdnRestart *ptr) //restart indicated channel +{ + u32 pid, link_id; + int circuit_id; + const pal_cg_struct *cg_ptr = NULL; + const pal_circuit_struct *circuit_ptr = NULL; + isdn_trace_func(0, "APP => function trace: %s\r\n", __FUNCTION__); + cg_ptr = pal_cg_ptr(pst->cg_id); + if(cg_ptr == NULL) + return ISDN_CM_FAILED; + if(cg_ptr->attrib.protocol != PROTO_ISDN) + return ISDN_CM_FAILED; + circuit_ptr = pal_locate_circuit(pst->cg_id, pst->cic); + if(circuit_ptr == NULL) + { + isdn_log_err(0, "isdn_m_restart_req err!circuit_ptr cann't be found by vcg_id=%d,cic=%ld \r\n", pst->cg_id, pst->cic); + return ISDN_CM_FAILED; + } + circuit_id = circuit_ptr->id; + pst->sp_proc_id = find_port_by_cic(pst->cic, circuit_id); + if(pst->sp_proc_id >= ISDN_MAX_PORT) + { + isdn_log_err(0, "pid=%d, is paranormal\r\n", pst->sp_proc_id); + return ISDN_CM_FAILED; + } + memcpy(&(isdn_sd_msg.msg_list.restart), ptr, sizeof(IsdnRestart)); + pid = (circuit_id) * ISDN_CIRCUIT_CIC; + link_id = circuit_ptr->attrib.link_id; + if(ptr->restart_ind.clas == 0) + isdn_rs.port_pond[pid].cic_val = pst->cic; + else + isdn_rs.port_pond[pid].cic_val = 0; + isdn_rs.link_pond[link_id].restart_clas = ptr->restart_ind.clas; + isdn_rs.port_pond[pid].g_pri_cmd = ISDN_M_RESTART_REQ; + isdn_restart_ctrl(pid); + if(isdn_rs.port_pond[pid].g_pri_cmd != 0) + { + isdn_trace_func(pid, "[waring]global primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].g_pri_cmd); + isdn_rs.port_pond[pid].g_pri_cmd = 0; + } + + return ISDN_CM_OK; +} + + +//ansi +int isdn_service_bc_req(Pst *pst, IsdnService *ptr) +{ + const pal_circuit_struct *circuit_ptr = NULL; + circuit_ptr = pal_locate_circuit(pst->cg_id, pst->cic); + if(circuit_ptr == NULL) + { + isdn_trace_func(0, "APP => function trace: %s\r\n", __FUNCTION__); + return ISDN_CM_FAILED; + } + pst->sp_proc_id = find_port_by_cic(pst->cic, circuit_ptr->id); + isdn_rs.port_pond[pst->sp_proc_id].su_proc_id = pst->su_proc_id; + isdn_rs.port_pond[pst->sp_proc_id].g_pri_cmd = ISDN_SERVICE_REQ; + isdn_rs.port_pond[pst->sp_proc_id].trace_flag = pst->trace_flag; +// isdn_rs.port_pond[pst->sp_proc_id].enable = 1; + isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__); + memcpy(&(isdn_sd_msg.msg_list.service), ptr, sizeof(IsdnService)); + service_bc_proc(pst->sp_proc_id); + if(isdn_rs.port_pond[pst->sp_proc_id].g_pri_cmd != 0) + { + isdn_trace_func(pst->sp_proc_id, "[waring]global primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].g_pri_cmd); + isdn_rs.port_pond[pst->sp_proc_id].g_pri_cmd = 0; + } + + return ISDN_CM_OK; +} + +int isdn_service_bc_rsp(Pst *pst, IsdnServAck *ptr) +{ + isdn_trace_func(pst->sp_proc_id, "APP => function trace: %s\r\n", __FUNCTION__); + if(pst->sp_proc_id >= ISDN_MAX_PORT) + { + isdn_log_err(0, "pid=%d, is paranormal\r\n", pst->sp_proc_id); + return ISDN_CM_FAILED; + } + isdn_rs.port_pond[pst->sp_proc_id].g_pri_cmd = ISDN_SERVICE_RSP; + memcpy(&(isdn_sd_msg.msg_list.servAck), ptr, sizeof(IsdnServAck)); + service_bc_proc(pst->sp_proc_id); + if(isdn_rs.port_pond[pst->sp_proc_id].g_pri_cmd != 0) + { + isdn_trace_func(pst->sp_proc_id, "[waring]global primitive cmd discard.(cmd=%d)\r\n", isdn_rs.port_pond[pst->sp_proc_id].g_pri_cmd); + isdn_rs.port_pond[pst->sp_proc_id].g_pri_cmd = 0; + } + + return ISDN_CM_OK; +} + diff --git a/omc/plat/isdn/ut/.copyarea.db b/omc/plat/isdn/ut/.copyarea.db new file mode 100644 index 0000000..36c1e4f --- /dev/null +++ b/omc/plat/isdn/ut/.copyarea.db @@ -0,0 +1,12 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\isdn\ut +2 +8 +4:code|2|0|0|0|728472bb6cf311dd91c7001c23e19543|0 +b:isdn_main.o|1|11d70a484f5|7e50|59745f11|f50487c66cf311dd91a5001c23e19543|0 +b:isdn_test.c|1|11d70a48523|216b|dcbb98cf|f50487de6cf311dd91a5001c23e19543|0 +e:test_main_0526|1|11d70a48978|1107e0|d62c06ae|f634883e6cf311dd91a5001c23e19543|0 +b:isdn_main.c|1|11d70a484c6|1c9e|7d7c103e|f47487ae6cf311dd91a5001c23e19543|0 +b:isdn_test.o|1|11d70a48562|6170|778d86b|f50487f66cf311dd91a5001c23e19543|0 +8:Makefile|1|11d70a48478|662|3881d1d6|f5a4880e6cf311dd91a5001c23e19543|0 +9:test_main|1|11d70a48765|111abe|15c9f66b|f5a488266cf311dd91a5001c23e19543|0 diff --git a/omc/plat/isdn/ut/Makefile b/omc/plat/isdn/ut/Makefile new file mode 100644 index 0000000..3baefce --- /dev/null +++ b/omc/plat/isdn/ut/Makefile @@ -0,0 +1,45 @@ +#Create by Chen Gengxin +#2008-03-03 +#WXC2 R9.0 ISDN makefile + +CC = gcc +CFLAG = -g -Wall -c #-fprofile-arcs -ftest-coverage + +ISDN_LIB_OBJ = ../src/isdn_msg.o ../src/isdn_fsm.o ../src/isdn_uif.o ../src/isdn_rm.o ../src/isdn_ie.o ../src/isdn_debug.o +ISDN_TST_OBJ = isdn_main.o isdn_test.o + +ISDN_LIB = -L../../isdn/lib -lisdn +PLAT_LIB = -L../../8ecp/lib -l8ecp -L../../aif/lib -laif -L../../bicc/lib -lbicc -L../../debug/lib -ldebug -L../../haepub/lib -lhaepub -L../../iptrans/lib -liptrans -L../../isup/lib -lisup -L../../m2ua/lib -lm2ua -L../../mgc/lib -lmgc -L../../mgcp/lib -lmgcp -L../../mtp3/lib -lmtp3 -L../../public/lib -lpublic -L../../rtp/lib -lrtp -L../../sccp/lib -lsccp -L../../scf/lib -lscf -L../../snmp/lib -lsnmp -L../../smpp/lib -lsmpp -L../../tcap/lib -ltcap -L../../xapp/lib -lxapp +MSS_LIB = -L../../../mss/aas/lib -laas -L../../../mss/ae/lib -lae -L../../../mss/hlr/lib -lhlr -L../../../mss/mnp/lib -lmnp -L../../../mss/msc/lib -lmsc -L../../../mss/ssf/lib -lssf -L../../../mss/vlr/lib -lvlr +TEST_LIB = -L/usr/local/lib/CUnit -lcunit -lgcov + +isdn_main: $(ISDN_TST_OBJ) + $(CC) $(ISDN_LIB_OBJ) $(ISDN_TST_OBJ) -o test_main $(ISDN_LIB) $(PLAT_LIB) -lm + +isdn_main.o: isdn_main.c + $(CC) $(CFLAG) $< + +isdn_test.o: isdn_test.c + $(CC) $(CFLAG) $< + +isdn_msg.o: isdn_msg.c + $(CC) $(CFLAG) $< + +isdn_fsm.o: isdn_fsm.c + $(CC) $(CFLAG) $< + +isdn_uif.o: isdn_uif.c + $(CC) $(CFLAG) $< + +isdn_rm.o: isdn_rm.c + $(CC) $(CFLAG) $< + +isdn_ie.o: isdn_ie.c + $(CC) $(CFLAG) $< + +isdn_debug.o: isdn_debug.c + $(CC) $(CFLAG) $< + +clean: + rm -f main *.o *.a *.xml *.gcov *.gcda *.gcno core test_main + diff --git a/omc/plat/isdn/ut/code/.copyarea.db b/omc/plat/isdn/ut/code/.copyarea.db new file mode 100644 index 0000000..c8561ad --- /dev/null +++ b/omc/plat/isdn/ut/code/.copyarea.db @@ -0,0 +1,26 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\isdn\ut\code +2 +16 +c:rest1-0.Text|1|11d70a48ddd|5d0|2faa2cca|f9c489a66cf311dd91a5001c23e19543|0 +b:u01-10.Text|1|11d70a48f34|965|cb19d056|fb048a366cf311dd91a5001c23e19543|0 +b:u01-01.Text|1|11d70a48e89|5d6|afa72bf1|fa6489ee6cf311dd91a5001c23e19543|0 +c:iua data.txt|1|11d70a48b2e|278|eff3c271|f76488b66cf311dd91a5001c23e19543|0 +12:iua set up-bak.txt|1|11d70a48b8b|547|73515bce|f80488fe6cf311dd91a5001c23e19543|0 +b:u01-05.Text|1|11d70a48ef6|50f|e74d0810|fb048a1e6cf311dd91a5001c23e19543|0 +10:nt-2link-01.Text|1|11d70a48c76|df0|e778c5d2|f80489166cf311dd91a5001c23e19543|0 +12:ds-service-02.Text|1|11d70a48ac0|4e2|fbfd00c8|f6d488866cf311dd91a5001c23e19543|0 +c:rest2-0.Text|1|11d70a48e1b|5d2|4c12cdc|f9c489be6cf311dd91a5001c23e19543|0 +13:nt-incoming-01.Text|1|11d70a48cc4|8d9|b0dfb62b|f894892e6cf311dd91a5001c23e19543|0 +b:u01-03.Text|1|11d70a48eb7|a14|369def5a|fa648a066cf311dd91a5001c23e19543|0 +b:u03-13.Text|1|11d70a48f63|a30|9da8f644|fb048a4e6cf311dd91a5001c23e19543|0 +c:headfile.txt|1|11d70a48aef|42|528d118c|f6d4889e6cf311dd91a5001c23e19543|0 +9:data.Text|1|11d70a48a14|5e6|a94d1962|f63488566cf311dd91a5001c23e19543|0 +13:nt-outgoing-02.Text|1|11d70a48d9e|8db|3d86b62d|f934898e6cf311dd91a5001c23e19543|0 +13:nt-outgoing-01.Text|1|11d70a48d6f|8fe|f6f7be02|f894895e6cf311dd91a5001c23e19543|0 +f:iua set up.Text|1|11d70a48baa|8db|3d86b62d|f76488ce6cf311dd91a5001c23e19543|0 +12:ds-service-01.Text|1|11d70a48a82|4e2|51e00c9|f6d4886e6cf311dd91a5001c23e19543|0 +e:iua set up.txt|1|11d70a48be9|4a0|e1432fd4|f80488e66cf311dd91a5001c23e19543|0 +13:nt-incoming-02.Text|1|11d70a48d02|8da|ad7b5de|f89489466cf311dd91a5001c23e19543|0 +c:test-01.Text|1|11d70a48e4a|a7f|c1b10332|f9c489d66cf311dd91a5001c23e19543|0 +14:nt-outgoing-01-.Text|1|11d70a48d31|8f6|df78badc|f93489766cf311dd91a5001c23e19543|0 diff --git a/omc/plat/isdn/ut/code/data.Text b/omc/plat/isdn/ut/code/data.Text new file mode 100644 index 0000000..b89bdd7 --- /dev/null +++ b/omc/plat/isdn/ut/code/data.Text @@ -0,0 +1,69 @@ +Test 1 +3 SCTP.SET <> "remote_ip=172.18.99.1"; +3 SCTP.SET <> "remote_port=0"; +3 SCTP.SET <> "local_port=9900"; +3 SCTP.SET <> "STREAM_ID=0"; + +10 SCTP.SEND +01 00 05 02 00 00 00 40 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 25 +08 02 00 01 05 a1 04 03 +80 90 a3 18 03 a1 83 81 +6c 07 00 80 35 31 30 30 +31 70 06 81 35 32 30 30 +31 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0E +08 02 80 01 02 18 03 A9 +83 81 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 ?? +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 ?? +08 02 80 01 01 18 03 A1 +83 81 1E 02 83 88 ?? ??; + +10000 SCTP.RECV +01 00 05 01 00 00 00 ?? +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 ?? +08 02 80 01 07 ?? ?? ??; + +10 SCTP.SEND +01 00 05 02 00 00 00 24 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 09 +08 02 00 01 0F 00 00 00; + +30 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 00 01 45 08 02 83 +90 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 ?? +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 ?? +08 02 80 01 4D ?? ?? ??; + +10 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 00 01 5A 08 02 83 +90 00 00 00; diff --git a/omc/plat/isdn/ut/code/ds-service-01.Text b/omc/plat/isdn/ut/code/ds-service-01.Text new file mode 100644 index 0000000..bc9e4a1 --- /dev/null +++ b/omc/plat/isdn/ut/code/ds-service-01.Text @@ -0,0 +1,33 @@ +Test 0 +3 SCTP.SET <> "remote_ip=172.18.99.1"; +3 SCTP.SET <> "remote_port=0"; +3 SCTP.SET <> "local_port=9900"; +3 SCTP.SET <> "STREAM_ID=0"; +3 SCTP.SET <> "server"; +1000 SCTP.SET <> "wait_connect"; + +200 SCTP.RECV 01 00 03 01 00 00 00 10 00 11 00 08 ?? ?? ?? ??; +10 SCTP.SEND 01 00 03 04 00 00 00 08; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 02; +3 SCTP.SET <> "STREAM_ID=1"; +1000 SCTP.RECV 01 00 04 01 00 00 00 18 00 0B 00 08 00 00 00 01 00 01 00 08 00 00 00 00; +10 SCTP.SEND 01 00 04 03 00 00 00 10 00 0B 00 08 00 00 00 01; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 03; +1000 SCTP.RECV 01 00 05 05 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; +10 SCTP.SEND 01 00 05 06 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 2C +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 12 +03 02 00 00 0F 01 01 C0 +18 04 E9 80 83 90 00 00; + +10 SCTP.SEND +01 00 05 02 00 00 00 2C +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 12 +03 02 80 00 07 01 01 C0 +18 04 E9 80 83 90 00 00; diff --git a/omc/plat/isdn/ut/code/ds-service-02.Text b/omc/plat/isdn/ut/code/ds-service-02.Text new file mode 100644 index 0000000..099d145 --- /dev/null +++ b/omc/plat/isdn/ut/code/ds-service-02.Text @@ -0,0 +1,33 @@ +Test 0 +3 SCTP.SET <> "remote_ip=172.18.99.1"; +3 SCTP.SET <> "remote_port=0"; +3 SCTP.SET <> "local_port=9900"; +3 SCTP.SET <> "STREAM_ID=0"; +3 SCTP.SET <> "server"; +1000 SCTP.SET <> "wait_connect"; + +200 SCTP.RECV 01 00 03 01 00 00 00 10 00 11 00 08 ?? ?? ?? ??; +10 SCTP.SEND 01 00 03 04 00 00 00 08; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 02; +3 SCTP.SET <> "STREAM_ID=1"; +1000 SCTP.RECV 01 00 04 01 00 00 00 18 00 0B 00 08 00 00 00 01 00 01 00 08 00 00 00 00; +10 SCTP.SEND 01 00 04 03 00 00 00 10 00 0B 00 08 00 00 00 01; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 03; +1000 SCTP.RECV 01 00 05 05 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; +10 SCTP.SEND 01 00 05 06 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; + +00 SCTP.SEND +01 00 05 02 00 00 00 2C +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 12 +03 02 00 00 0F 01 01 C0 +18 04 E9 80 83 90 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 2C +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 12 +03 02 80 00 07 01 01 C0 +18 04 E9 80 83 90 00 00; diff --git a/omc/plat/isdn/ut/code/headfile.txt b/omc/plat/isdn/ut/code/headfile.txt new file mode 100644 index 0000000..b1dcbd0 --- /dev/null +++ b/omc/plat/isdn/ut/code/headfile.txt @@ -0,0 +1,3 @@ +#define RE_IP 172.18.99.1 +#define RE_PORT 0 +#define LO_PORT 2904 \ No newline at end of file diff --git a/omc/plat/isdn/ut/code/iua data.txt b/omc/plat/isdn/ut/code/iua data.txt new file mode 100644 index 0000000..cd73820 --- /dev/null +++ b/omc/plat/isdn/ut/code/iua data.txt @@ -0,0 +1,19 @@ +#include "headfile.txt" + +test 1 sctp +SCTP.Set remote_ip=RE_IP; +SCTP.Set remote_port=RE_PORT; +SCTP.Set local_port=LO_PORT; +SCTP.Set STREAM_ID=1 +50 SCTP.Set server + +0 SCTP.Send +01 00 05 01 00 00 00 20 //common message header(version,spare,message class,message type,message length(ËùÓеij¤¶È)) +00 01 00 08 00 00 00 00 //iua message header(tag,length,interface id) +00 05 00 08 00 00 00 00 //iua message header(tag,length,DLCI) +00 0E 00 08 //iua message(tag,length(ÕûÌõiua messageµÄ³¤¶È)) +FF 01 F0 02; //iua message(protocol data) + +1000 SCTP.Recv +?? //common message header + diff --git a/omc/plat/isdn/ut/code/iua set up-bak.txt b/omc/plat/isdn/ut/code/iua set up-bak.txt new file mode 100644 index 0000000..5d2c9d4 --- /dev/null +++ b/omc/plat/isdn/ut/code/iua set up-bak.txt @@ -0,0 +1,47 @@ +#include "headfile.txt" + +test 1 sctp +SCTP.Set remote_ip=RE_IP; +SCTP.Set remote_port=RE_PORT; +SCTP.Set local_port=LO_PORT; +SCTP.Set STREAM_ID=1 +500 SCTP.Set server + +1000 SCTP.Recv +01 00 03 01 00 00 00 10 //common message header(version,spare,message class,message type,message length) +00 11 00 08 ?? ?? ?? ??; //iua message(tag,length,content) + +0 SCTP.Send +01 00 03 04 00 00 00 08; //common message header + +1 SCTP.Send +01 00 00 01 00 00 00 10 //common message header +00 0D 00 08 00 01 00 02; //iua message + +1000 SCTP.FLTR +01 00 03 01 00 00 00 10 //common message header +00 11 00 08 ?? ?? ?? ??; //iua message + +1000 SCTP.Recv +01 00 04 01 00 00 00 18 +00 0B 00 08 00 00 00 01 +00 01 00 08 00 00 00 00; //?? + +0 SCTP.Send +01 00 04 03 00 00 00 10 +00 0B 00 08 00 00 00 01; + +0 SCTP.Send +01 00 00 01 00 00 00 10 +00 0D 00 08 00 01 00 03; + +1000 SCTP.Recv +01 00 05 05 00 00 00 18 //common message header(version,spare,message class,message type,message length) +00 01 00 08 00 00 00 00 //iua message header(tag,length,interface id) +00 05 00 08 00 00 00 00; //iua message header(tag,length,DLCI) + +0 SCTP.Send +01 00 05 06 00 00 00 18 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00; + diff --git a/omc/plat/isdn/ut/code/iua set up.Text b/omc/plat/isdn/ut/code/iua set up.Text new file mode 100644 index 0000000..e210d6f --- /dev/null +++ b/omc/plat/isdn/ut/code/iua set up.Text @@ -0,0 +1,82 @@ +Test 0 +3 SCTP.SET <> "remote_ip=172.18.99.1"; +3 SCTP.SET <> "remote_port=0"; +3 SCTP.SET <> "local_port=9900"; +3 SCTP.SET <> "STREAM_ID=0"; +3 SCTP.SET <> "server"; +1000 SCTP.SET <> "wait_connect"; + +200 SCTP.RECV 01 00 03 01 00 00 00 10 00 11 00 08 ?? ?? ?? ??; +10 SCTP.SEND 01 00 03 04 00 00 00 08; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 02; +3 SCTP.SET <> "STREAM_ID=1"; +1000 SCTP.RECV 01 00 04 01 00 00 00 18 00 0B 00 08 00 00 00 01 00 01 00 08 00 00 00 00; +10 SCTP.SEND 01 00 04 03 00 00 00 10 00 0B 00 08 00 00 00 01; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 03; +1000 SCTP.RECV 01 00 05 05 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; +10 SCTP.SEND 01 00 05 06 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; + +20 SCTP.SEND +01 00 05 02 00 00 00 40 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 25 +08 02 00 01 05 a1 04 03 +80 90 a3 18 03 a1 83 81 +6c 07 00 80 35 31 30 30 +31 70 06 81 35 32 30 30 +31 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0E +08 02 80 01 02 18 03 A9 +83 81 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 ?? +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 ?? +08 02 80 01 01 18 03 A1 +83 81 1E 02 83 88 ?? ??; + +10000 SCTP.RECV +01 00 05 01 00 00 00 ?? +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 ?? +08 02 80 01 07 ?? ?? ??; + +20 SCTP.SEND +01 00 05 02 00 00 00 24 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 09 +08 02 00 01 0F 00 00 00; + +100 SCTP.RECV +01 00 05 01 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 80 01 45 08 02 83 +90 00 00 00; + +10 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 00 01 4D 08 02 83 +90 00 00 00; + +100 SCTP.RECV +01 00 05 01 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 80 01 5A 08 02 83 +90 00 00 00; \ No newline at end of file diff --git a/omc/plat/isdn/ut/code/iua set up.txt b/omc/plat/isdn/ut/code/iua set up.txt new file mode 100644 index 0000000..80f52fd --- /dev/null +++ b/omc/plat/isdn/ut/code/iua set up.txt @@ -0,0 +1,41 @@ +#include "headfile.txt" + +test 1 sctp +SCTP.Set remote_ip=RE_IP; +SCTP.Set local_port=LO_PORT; +SCTP.Set STREAM_ID=2 + +10000 SCTP.RECEIVE +01 00 03 01 00 00 00 10 //common message header(version,spare,message class,message type,message length) +00 11 00 08 ?? ?? ?? ??; //iua message(tag,length,content) + +0 SCTP.Send +01 00 03 04 00 00 00 08; //common message header + +1 SCTP.Send +01 00 00 01 00 00 00 10 //common message header +00 0D 00 08 00 01 00 02; //iua message + +1000 SCTP.Recv +01 00 04 01 00 00 00 18 +00 0B 00 08 00 00 00 01 +00 01 00 08 00 00 00 00; //?? + +0 SCTP.Send +01 00 04 03 00 00 00 10 +00 0B 00 08 00 00 00 01; + +0 SCTP.Send +01 00 00 01 00 00 00 10 +00 0D 00 08 00 01 00 03; + +1000 SCTP.Recv +01 00 05 05 00 00 00 18 //common message header(version,spare,message class,message type,message length) +00 01 00 08 00 00 00 00 //iua message header(tag,length,interface id) +00 05 00 08 00 00 00 00; //iua message header(tag,length,DLCI) + +0 SCTP.Send +01 00 05 06 00 00 00 18 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00; + diff --git a/omc/plat/isdn/ut/code/nt-2link-01.Text b/omc/plat/isdn/ut/code/nt-2link-01.Text new file mode 100644 index 0000000..e3eb26e --- /dev/null +++ b/omc/plat/isdn/ut/code/nt-2link-01.Text @@ -0,0 +1,151 @@ +Test 0 +3 SCTP.SET <> "remote_ip=172.18.99.1"; +3 SCTP.SET <> "remote_port=0"; +3 SCTP.SET <> "local_port=9900"; +3 SCTP.SET <> "STREAM_ID=0"; +3 SCTP.SET <> "server"; +1000 SCTP.SET <> "wait_connect"; + +200 SCTP.RECV +01 00 03 01 00 00 00 10 +00 11 00 08 ?? ?? ?? ??; +10 SCTP.SEND +01 00 03 04 00 00 00 08; +10 SCTP.SEND +01 00 00 01 00 00 00 10 +00 0D 00 08 00 01 00 02; +3 SCTP.SET <> "STREAM_ID=1"; +1000 SCTP.RECV +01 00 04 01 00 00 00 20 +00 0B 00 08 00 00 00 01 +00 01 00 08 00 00 00 00 //interface id +00 01 00 08 00 00 00 01; //interface id +10 SCTP.SEND +01 00 04 03 00 00 00 10 +00 0B 00 08 00 00 00 01; + +10 SCTP.SEND +01 00 00 01 00 00 00 10 +00 0D 00 08 00 01 00 03; +1000 SCTP.RECV +01 00 05 05 00 00 00 18 +00 01 00 08 00 00 00 00 //interface id +00 05 00 08 00 00 00 00; +1000 SCTP.RECV +01 00 05 05 00 00 00 18 +00 01 00 08 00 00 00 01 //interface id +00 05 00 08 00 00 00 00; +10 SCTP.SEND +01 00 05 06 00 00 00 18 +00 01 00 08 00 00 00 00 //interface id +00 05 00 08 00 00 00 00; +10 SCTP.SEND +01 00 05 06 00 00 00 18 +00 01 00 08 00 00 00 01 //interface id +00 05 00 08 00 00 00 00; + +test 1 + +10000 SCTP.RECV +01 00 05 01 00 00 00 2C +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 12 +03 02 00 00 0F 01 01 C0 +18 04 E9 80 83 90 00 00; +10 SCTP.SEND +01 00 05 02 00 00 00 2C +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 12 +03 02 80 00 07 01 01 C0 +18 04 E9 80 83 90 00 00; + +test 2 + +20 SCTP.SEND +01 00 05 02 00 00 00 40 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 26 +08 02 00 01 05 a1 04 03 +80 90 a3 18 04 E1 82 83 01 +6c 07 00 80 35 31 30 30 +31 70 06 81 35 32 30 30 +31 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0F +08 02 80 01 02 18 04 E9 82 +83 81 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 ?? +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 ?? +08 02 80 01 01 18 04 E9 82 +83 81 1E 02 83 88 ??; + +10000 SCTP.RECV +01 00 05 01 00 00 00 ?? +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 ?? +08 02 80 01 07 ?? ?? ??; + +20 SCTP.SEND +01 00 05 02 00 00 00 24 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 09 +08 02 00 01 0F 00 00 00; + +test 3 + +10 SCTP.SEND +01 00 05 0a 00 00 00 20 +00 01 00 08 00 00 00 00 //interface id +00 05 00 08 00 00 00 00 +00 0F 00 08 00 00 00 00; + +1000 SCTP.RECV +01 00 05 05 00 00 00 18 +00 01 00 08 00 00 00 00 //interface id +00 05 00 08 00 00 00 00; +10 SCTP.SEND +01 00 05 06 00 00 00 18 +00 01 00 08 00 00 00 00 //interface id +00 05 00 08 00 00 00 00; + +test 4 + +30 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 01 //interface id +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 00 01 45 08 02 83 +90 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 ?? +00 01 00 08 00 00 00 01 //interface id +00 05 00 08 00 00 00 00 +00 0E 00 ?? +08 02 80 01 4D 08 02 83 +90 ?? ?? ??; + +10 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 01 //interface id +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 00 01 5A 08 02 83 +90 00 00 00; + +10000 SCTP.RECV +??; \ No newline at end of file diff --git a/omc/plat/isdn/ut/code/nt-incoming-01.Text b/omc/plat/isdn/ut/code/nt-incoming-01.Text new file mode 100644 index 0000000..f13544d --- /dev/null +++ b/omc/plat/isdn/ut/code/nt-incoming-01.Text @@ -0,0 +1,82 @@ +Test 0 +3 SCTP.SET <> "remote_ip=172.18.99.1"; +3 SCTP.SET <> "remote_port=0"; +3 SCTP.SET <> "local_port=9900"; +3 SCTP.SET <> "STREAM_ID=0"; +3 SCTP.SET <> "server"; +1000 SCTP.SET <> "wait_connect"; + +200 SCTP.RECV 01 00 03 01 00 00 00 10 00 11 00 08 ?? ?? ?? ??; +10 SCTP.SEND 01 00 03 04 00 00 00 08; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 02; +3 SCTP.SET <> "STREAM_ID=1"; +1000 SCTP.RECV 01 00 04 01 00 00 00 18 00 0B 00 08 00 00 00 01 00 01 00 08 00 00 00 00; +10 SCTP.SEND 01 00 04 03 00 00 00 10 00 0B 00 08 00 00 00 01; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 03; +1000 SCTP.RECV 01 00 05 05 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; +10 SCTP.SEND 01 00 05 06 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 40 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 25 +08 02 00 01 05 a1 04 03 +80 90 a3 18 03 a1 83 XX +6c 07 00 80 35 31 30 30 +31 70 06 81 35 32 30 30 +31 00 00 00; + +20 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0E +08 02 80 01 02 18 03 A9 +83 XX 00 00; + +10 SCTP.SEND +01 00 05 02 00 00 00 2C +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 12 +08 02 80 01 01 18 03 A1 +83 XX 1E 02 83 88 00 00; + +20 SCTP.SEND +01 00 05 02 00 00 00 24 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 09 +08 02 80 01 07 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 24 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 09 +08 02 00 01 0F 00 00 00; + +30 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 80 01 45 08 02 83 +90 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 ?? +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 ?? +08 02 00 01 4D 08 02 83 +90 ?? ?? ??; + +10 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 80 01 5A 08 02 83 +90 00 00 00; \ No newline at end of file diff --git a/omc/plat/isdn/ut/code/nt-incoming-02.Text b/omc/plat/isdn/ut/code/nt-incoming-02.Text new file mode 100644 index 0000000..8bdbd50 --- /dev/null +++ b/omc/plat/isdn/ut/code/nt-incoming-02.Text @@ -0,0 +1,82 @@ +Test 0 +3 SCTP.SET <> "remote_ip=172.18.99.1"; +3 SCTP.SET <> "remote_port=0"; +3 SCTP.SET <> "local_port=9900"; +3 SCTP.SET <> "STREAM_ID=0"; +3 SCTP.SET <> "server"; +1000 SCTP.SET <> "wait_connect"; + +200 SCTP.RECV 01 00 03 01 00 00 00 10 00 11 00 08 ?? ?? ?? ??; +10 SCTP.SEND 01 00 03 04 00 00 00 08; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 02; +3 SCTP.SET <> "STREAM_ID=1"; +1000 SCTP.RECV 01 00 04 01 00 00 00 18 00 0B 00 08 00 00 00 01 00 01 00 08 00 00 00 00; +10 SCTP.SEND 01 00 04 03 00 00 00 10 00 0B 00 08 00 00 00 01; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 03; +1000 SCTP.RECV 01 00 05 05 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; +10 SCTP.SEND 01 00 05 06 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 40 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 25 +08 02 00 01 05 a1 04 03 +80 90 a3 18 03 a1 83 XX +6c 07 00 80 35 31 30 30 +31 70 06 81 35 32 30 30 +31 00 00 00; + +20 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0E +08 02 80 01 02 18 03 A9 +83 XX 00 00; + +10 SCTP.SEND +01 00 05 02 00 00 00 2C +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 12 +08 02 80 01 01 18 03 A1 +83 XX 1E 02 83 88 00 00; + +20 SCTP.SEND +01 00 05 02 00 00 00 24 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 09 +08 02 80 01 07 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 24 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 09 +08 02 00 01 0F 00 00 00; + +1000 SCTP.RECV +01 00 05 01 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 00 01 45 08 02 83 +90 00 00 00; + +10 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 80 01 4D 08 02 83 +90 00 00 00; + +1000 SCTP.RECV +01 00 05 01 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 00 01 5A 08 02 83 +90 00 00 00; \ No newline at end of file diff --git a/omc/plat/isdn/ut/code/nt-outgoing-01-.Text b/omc/plat/isdn/ut/code/nt-outgoing-01-.Text new file mode 100644 index 0000000..77b3411 --- /dev/null +++ b/omc/plat/isdn/ut/code/nt-outgoing-01-.Text @@ -0,0 +1,83 @@ +Test 0 +3 SCTP.SET <> "remote_ip=172.18.99.1"; +3 SCTP.SET <> "remote_port=0"; +3 SCTP.SET <> "local_port=9900"; +3 SCTP.SET <> "STREAM_ID=0"; +3 SCTP.SET <> "server"; +1000 SCTP.SET <> "wait_connect"; + +200 SCTP.RECV 01 00 03 01 00 00 00 10 00 11 00 08 ?? ?? ?? ??; +10 SCTP.SEND 01 00 03 04 00 00 00 08; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 02; +3 SCTP.SET <> "STREAM_ID=1"; +1000 SCTP.RECV 01 00 04 01 00 00 00 18 00 0B 00 08 00 00 00 01 00 01 00 08 00 00 00 00; +10 SCTP.SEND 01 00 04 03 00 00 00 10 00 0B 00 08 00 00 00 01; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 03; +1000 SCTP.RECV 01 00 05 05 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; +10 SCTP.SEND 01 00 05 06 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; + +20 SCTP.SEND +01 00 05 02 00 00 00 40 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 28 +08 02 00 01 05 a1 04 03 +80 90 A3 18 06 a1 96 00 01 00 01 +6c 07 00 80 35 31 30 30 +31 70 06 81 35 32 30 30 +31; + +10000 SCTP.RECV +01 00 05 01 00 00 00 2C +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 11 +08 02 80 01 02 18 03 A9 +83 01 01 00 81 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 ?? +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 ?? +08 02 80 01 01 18 03 A1 +83 00 00 00 81 1E 02 83 +88 ?? ?? ??; + +10000 SCTP.RECV +01 00 05 01 00 00 00 ?? +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 ?? +08 02 80 01 07 ?? ?? ??; + +20 SCTP.SEND +01 00 05 02 00 00 00 24 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 09 +08 02 00 01 0F 00 00 00; + +30 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 00 01 45 08 02 83 +90 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 ?? +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 ?? +08 02 80 01 4D 08 02 83 +90 ?? ?? ??; + +10 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 00 01 5A 08 02 83 +90 00 00 00; \ No newline at end of file diff --git a/omc/plat/isdn/ut/code/nt-outgoing-01.Text b/omc/plat/isdn/ut/code/nt-outgoing-01.Text new file mode 100644 index 0000000..6b1a064 --- /dev/null +++ b/omc/plat/isdn/ut/code/nt-outgoing-01.Text @@ -0,0 +1,85 @@ +Test 0 +3 SCTP.SET <> "remote_ip=172.18.99.1"; +3 SCTP.SET <> "remote_port=0"; +3 SCTP.SET <> "local_port=9900"; +3 SCTP.SET <> "STREAM_ID=0"; +3 SCTP.SET <> "server"; +1000 SCTP.SET <> "wait_connect"; + +200 SCTP.RECV 01 00 03 01 00 00 00 10 00 11 00 08 ?? ?? ?? ??; +10 SCTP.SEND 01 00 03 04 00 00 00 08; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 02; +3 SCTP.SET <> "STREAM_ID=1"; +1000 SCTP.RECV 01 00 04 01 00 00 00 18 00 0B 00 08 00 00 00 01 00 01 00 08 00 00 00 00; +10 SCTP.SEND 01 00 04 03 00 00 00 10 00 0B 00 08 00 00 00 01; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 03; +1000 SCTP.RECV 01 00 05 05 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; +10 SCTP.SEND 01 00 05 06 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; + +20 SCTP.SEND +01 00 05 02 00 00 00 40 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 25 +08 02 00 01 05 a1 04 03 +80 90 a3 18 03 a1 83 01 +6c 07 00 80 35 31 30 30 +31 70 06 81 35 32 30 30 +31 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0E +08 02 80 01 02 18 03 A9 +83 81 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 ?? +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 ?? +08 02 80 01 01 18 03 A9 +83 81 1E 02 83 88 ?? ??; + +10000 SCTP.RECV +01 00 05 01 00 00 00 ?? +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 ?? +08 02 80 01 07 ?? ?? ??; + +20 SCTP.SEND +01 00 05 02 00 00 00 24 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 09 +08 02 00 01 0F 00 00 00; + +30 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 00 01 45 08 02 83 +90 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 ?? +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 ?? +08 02 80 01 4D 08 02 83 +90 ?? ?? ??; + +10 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 00 01 5A 08 02 83 +90 00 00 00; + +10000 SCTP.RECV +??; \ No newline at end of file diff --git a/omc/plat/isdn/ut/code/nt-outgoing-02.Text b/omc/plat/isdn/ut/code/nt-outgoing-02.Text new file mode 100644 index 0000000..e210d6f --- /dev/null +++ b/omc/plat/isdn/ut/code/nt-outgoing-02.Text @@ -0,0 +1,82 @@ +Test 0 +3 SCTP.SET <> "remote_ip=172.18.99.1"; +3 SCTP.SET <> "remote_port=0"; +3 SCTP.SET <> "local_port=9900"; +3 SCTP.SET <> "STREAM_ID=0"; +3 SCTP.SET <> "server"; +1000 SCTP.SET <> "wait_connect"; + +200 SCTP.RECV 01 00 03 01 00 00 00 10 00 11 00 08 ?? ?? ?? ??; +10 SCTP.SEND 01 00 03 04 00 00 00 08; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 02; +3 SCTP.SET <> "STREAM_ID=1"; +1000 SCTP.RECV 01 00 04 01 00 00 00 18 00 0B 00 08 00 00 00 01 00 01 00 08 00 00 00 00; +10 SCTP.SEND 01 00 04 03 00 00 00 10 00 0B 00 08 00 00 00 01; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 03; +1000 SCTP.RECV 01 00 05 05 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; +10 SCTP.SEND 01 00 05 06 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; + +20 SCTP.SEND +01 00 05 02 00 00 00 40 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 25 +08 02 00 01 05 a1 04 03 +80 90 a3 18 03 a1 83 81 +6c 07 00 80 35 31 30 30 +31 70 06 81 35 32 30 30 +31 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0E +08 02 80 01 02 18 03 A9 +83 81 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 ?? +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 ?? +08 02 80 01 01 18 03 A1 +83 81 1E 02 83 88 ?? ??; + +10000 SCTP.RECV +01 00 05 01 00 00 00 ?? +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 ?? +08 02 80 01 07 ?? ?? ??; + +20 SCTP.SEND +01 00 05 02 00 00 00 24 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 09 +08 02 00 01 0F 00 00 00; + +100 SCTP.RECV +01 00 05 01 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 80 01 45 08 02 83 +90 00 00 00; + +10 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 00 01 4D 08 02 83 +90 00 00 00; + +100 SCTP.RECV +01 00 05 01 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 80 01 5A 08 02 83 +90 00 00 00; \ No newline at end of file diff --git a/omc/plat/isdn/ut/code/rest1-0.Text b/omc/plat/isdn/ut/code/rest1-0.Text new file mode 100644 index 0000000..1a3fbc2 --- /dev/null +++ b/omc/plat/isdn/ut/code/rest1-0.Text @@ -0,0 +1,44 @@ +Test 0 +3 SCTP.SET <> "remote_ip=172.18.99.1"; +3 SCTP.SET <> "remote_port=0"; +3 SCTP.SET <> "local_port=9900"; +3 SCTP.SET <> "STREAM_ID=0"; +3 SCTP.SET <> "server"; +1000 SCTP.SET <> "wait_connect"; + +200 SCTP.RECV 01 00 03 01 00 00 00 10 00 11 00 08 ?? ?? ?? ??; +10 SCTP.SEND 01 00 03 04 00 00 00 08; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 02; +3 SCTP.SET <> "STREAM_ID=1"; +1000 SCTP.RECV 01 00 04 01 00 00 00 18 00 0B 00 08 00 00 00 01 00 01 00 08 00 00 00 00; +10 SCTP.SEND 01 00 04 03 00 00 00 10 00 0B 00 08 00 00 00 01; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 03; +1000 SCTP.RECV 01 00 05 05 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; +10 SCTP.SEND 01 00 05 06 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 40 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 25 +08 02 00 01 05 a1 04 03 +80 90 a3 18 03 a1 83 XX +6c 07 00 80 35 31 30 30 +31 70 06 81 35 32 30 30 +31 00 00 00; + +1000 SCTP.RECV +01 00 05 01 00 00 00 2C +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 11 +08 02 00 00 46 18 03 A1 +83 XX 79 01 80 ?? ?? ??; + +20 SCTP.SEND +01 00 05 02 00 00 00 2C +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 11 +08 02 80 00 4E 18 03 A1 +83 XX 79 01 80 00 00 00; \ No newline at end of file diff --git a/omc/plat/isdn/ut/code/rest2-0.Text b/omc/plat/isdn/ut/code/rest2-0.Text new file mode 100644 index 0000000..9e20dc3 --- /dev/null +++ b/omc/plat/isdn/ut/code/rest2-0.Text @@ -0,0 +1,44 @@ +Test 0 +3 SCTP.SET <> "remote_ip=172.18.99.1"; +3 SCTP.SET <> "remote_port=0"; +3 SCTP.SET <> "local_port=9900"; +3 SCTP.SET <> "STREAM_ID=0"; +3 SCTP.SET <> "server"; +1000 SCTP.SET <> "wait_connect"; + +200 SCTP.RECV 01 00 03 01 00 00 00 10 00 11 00 08 ?? ?? ?? ??; +10 SCTP.SEND 01 00 03 04 00 00 00 08; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 02; +3 SCTP.SET <> "STREAM_ID=1"; +1000 SCTP.RECV 01 00 04 01 00 00 00 18 00 0B 00 08 00 00 00 01 00 01 00 08 00 00 00 00; +10 SCTP.SEND 01 00 04 03 00 00 00 10 00 0B 00 08 00 00 00 01; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 03; +1000 SCTP.RECV 01 00 05 05 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; +10 SCTP.SEND 01 00 05 06 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 40 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 25 +08 02 00 01 05 a1 04 03 +80 90 a3 18 03 a1 83 XX +6c 07 00 80 35 31 30 30 +31 70 06 81 35 32 30 30 +31 00 00 00; + +20 SCTP.SEND +01 00 05 02 00 00 00 2C +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 11 +08 02 00 00 46 18 03 A1 +83 XX 79 01 80 00 00 00; + +1000 SCTP.RECV +01 00 05 01 00 00 00 2C +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 11 +08 02 80 00 4E 18 03 A1 +83 XX 79 01 80 ?? ?? ??; \ No newline at end of file diff --git a/omc/plat/isdn/ut/code/test-01.Text b/omc/plat/isdn/ut/code/test-01.Text new file mode 100644 index 0000000..a80b73b --- /dev/null +++ b/omc/plat/isdn/ut/code/test-01.Text @@ -0,0 +1,103 @@ +Test 0 +3 SCTP.SET <> "remote_ip=172.18.99.1"; +3 SCTP.SET <> "remote_port=0"; +3 SCTP.SET <> "local_port=9900"; +3 SCTP.SET <> "STREAM_ID=0"; +3 SCTP.SET <> "server"; +1000 SCTP.SET <> "wait_connect"; + +200 SCTP.RECV 01 00 03 01 00 00 00 10 00 11 00 08 ?? ?? ?? ??; +10 SCTP.SEND 01 00 03 04 00 00 00 08; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 02; +3 SCTP.SET <> "STREAM_ID=1"; +1000 SCTP.RECV 01 00 04 01 00 00 00 18 00 0B 00 08 00 00 00 01 00 01 00 08 00 00 00 00; +10 SCTP.SEND 01 00 04 03 00 00 00 10 00 0B 00 08 00 00 00 01; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 03; +1000 SCTP.RECV 01 00 05 05 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; +10 SCTP.SEND 01 00 05 06 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; + +Test 1 +10000 SCTP.RECV +01 00 05 01 00 00 00 40 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 25 +08 02 00 01 05 a1 04 03 +80 90 a3 18 03 a1 83 XX +6c 07 00 80 35 31 30 30 +31 70 06 81 35 32 30 30 +31 00 00 00; + +20 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0E +08 02 80 01 02 18 03 A9 +83 XX 00 00; + +10 SCTP.SEND +01 00 05 02 00 00 00 2C +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 12 +08 02 80 01 01 18 03 A1 +83 XX 1E 02 83 88 00 00; + +20 SCTP.SEND +01 00 05 02 00 00 00 24 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 09 +08 02 80 01 07 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 24 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 09 +08 02 00 01 0F 00 00 00; + +30 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 80 01 45 08 02 83 +90 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 ?? +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 ?? +08 02 00 01 4D 08 02 83 +90 ?? ?? ??; + +10 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 80 01 5A 08 02 83 +90 00 00 00; + +Test 2 +10000 SCTP.RECV +01 00 05 01 00 00 00 40 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 25 +08 02 00 YY 05 a1 04 03 +80 90 a3 18 03 a1 83 XX +6c 07 00 80 35 31 30 30 +31 70 06 81 35 32 30 30 +31 00 00 00; + +20 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 10 +08 02 80 YY 7D 08 02 83 +E5 14 01 00; \ No newline at end of file diff --git a/omc/plat/isdn/ut/code/u01-01.Text b/omc/plat/isdn/ut/code/u01-01.Text new file mode 100644 index 0000000..11cd9f0 --- /dev/null +++ b/omc/plat/isdn/ut/code/u01-01.Text @@ -0,0 +1,47 @@ +Test 0 +3 SCTP.SET <> "remote_ip=172.18.99.1"; +3 SCTP.SET <> "remote_port=0"; +3 SCTP.SET <> "local_port=9900"; +3 SCTP.SET <> "STREAM_ID=0"; +3 SCTP.SET <> "server"; +1000 SCTP.SET <> "wait_connect"; + +200 SCTP.RECV 01 00 03 01 00 00 00 10 00 11 00 08 ?? ?? ?? ??; +10 SCTP.SEND 01 00 03 04 00 00 00 08; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 02; +3 SCTP.SET <> "STREAM_ID=1"; +1000 SCTP.RECV 01 00 04 01 00 00 00 18 00 0B 00 08 00 00 00 01 00 01 00 08 00 00 00 00; +10 SCTP.SEND 01 00 04 03 00 00 00 10 00 0B 00 08 00 00 00 01; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 03; +1000 SCTP.RECV 01 00 05 05 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; +10 SCTP.SEND 01 00 05 06 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 40 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 25 +08 02 00 01 05 a1 04 03 +80 90 a3 18 03 a1 83 XX +6c 07 00 80 35 31 30 30 +31 70 06 81 35 32 30 30 +31 00 00 00; + +10 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 80 01 4D 08 02 83 +90 00 00 00; + +1000 SCTP.RECV +01 00 05 01 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 00 01 5A 08 02 83 +90 00 00 00; + +10000 SCTP.RECV +??; \ No newline at end of file diff --git a/omc/plat/isdn/ut/code/u01-03.Text b/omc/plat/isdn/ut/code/u01-03.Text new file mode 100644 index 0000000..7b45e3d --- /dev/null +++ b/omc/plat/isdn/ut/code/u01-03.Text @@ -0,0 +1,96 @@ +Test 0 +3 SCTP.SET <> "remote_ip=172.18.99.1"; +3 SCTP.SET <> "remote_port=0"; +3 SCTP.SET <> "local_port=9900"; +3 SCTP.SET <> "STREAM_ID=0"; +3 SCTP.SET <> "server"; +1000 SCTP.SET <> "wait_connect"; + +200 SCTP.RECV 01 00 03 01 00 00 00 10 00 11 00 08 ?? ?? ?? ??; +10 SCTP.SEND 01 00 03 04 00 00 00 08; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 02; +3 SCTP.SET <> "STREAM_ID=1"; +1000 SCTP.RECV 01 00 04 01 00 00 00 18 00 0B 00 08 00 00 00 01 00 01 00 08 00 00 00 00; +10 SCTP.SEND 01 00 04 03 00 00 00 10 00 0B 00 08 00 00 00 01; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 03; +1000 SCTP.RECV 01 00 05 05 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; +10 SCTP.SEND 01 00 05 06 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 40 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 25 +08 02 00 01 05 a1 04 03 +80 90 a3 18 03 a1 83 XX +6c 07 00 80 35 31 30 30 +31 70 06 81 35 32 30 30 +31 00 00 00; + +20 SCTP.SEND +01 00 05 02 00 00 00 24 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 09 +08 02 80 01 0F 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 10 +08 02 00 01 7D 08 02 83 +E5 14 01 ??; + +20 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0E +08 02 80 01 02 18 03 A9 +83 XX 00 00; + +10 SCTP.SEND +01 00 05 02 00 00 00 2C +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 12 +08 02 80 01 01 18 03 A1 +83 XX 1E 02 83 88 00 00; + +20 SCTP.SEND +01 00 05 02 00 00 00 24 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 09 +08 02 80 01 07 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 24 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 09 +08 02 00 01 0F 00 00 00; +30 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 80 01 45 08 02 83 +90 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 ?? +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 ?? +08 02 00 01 4D 08 02 83 +90 ?? ?? ??; + +10 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 80 01 5A 08 02 83 +90 00 00 00; \ No newline at end of file diff --git a/omc/plat/isdn/ut/code/u01-05.Text b/omc/plat/isdn/ut/code/u01-05.Text new file mode 100644 index 0000000..63a4ec7 --- /dev/null +++ b/omc/plat/isdn/ut/code/u01-05.Text @@ -0,0 +1,36 @@ +Test 0 +3 SCTP.SET <> "remote_ip=172.18.99.1"; +3 SCTP.SET <> "remote_port=0"; +3 SCTP.SET <> "local_port=9900"; +3 SCTP.SET <> "STREAM_ID=0"; +3 SCTP.SET <> "server"; +1000 SCTP.SET <> "wait_connect"; + +200 SCTP.RECV 01 00 03 01 00 00 00 10 00 11 00 08 ?? ?? ?? ??; +10 SCTP.SEND 01 00 03 04 00 00 00 08; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 02; +3 SCTP.SET <> "STREAM_ID=1"; +1000 SCTP.RECV 01 00 04 01 00 00 00 18 00 0B 00 08 00 00 00 01 00 01 00 08 00 00 00 00; +10 SCTP.SEND 01 00 04 03 00 00 00 10 00 0B 00 08 00 00 00 01; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 03; +1000 SCTP.RECV 01 00 05 05 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; +10 SCTP.SEND 01 00 05 06 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 40 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 25 +08 02 00 01 05 a1 04 03 +80 90 a3 18 03 a1 83 XX +6c 07 00 80 35 31 30 30 +31 70 06 81 35 32 30 30 +31 00 00 00; + +20 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 10 +08 02 80 01 7D 08 02 83 +E5 14 01 00; \ No newline at end of file diff --git a/omc/plat/isdn/ut/code/u01-10.Text b/omc/plat/isdn/ut/code/u01-10.Text new file mode 100644 index 0000000..496145b --- /dev/null +++ b/omc/plat/isdn/ut/code/u01-10.Text @@ -0,0 +1,89 @@ +Test 0 +3 SCTP.SET <> "remote_ip=172.18.99.1"; +3 SCTP.SET <> "remote_port=0"; +3 SCTP.SET <> "local_port=9900"; +3 SCTP.SET <> "STREAM_ID=0"; +3 SCTP.SET <> "server"; +1000 SCTP.SET <> "wait_connect"; + +200 SCTP.RECV 01 00 03 01 00 00 00 10 00 11 00 08 ?? ?? ?? ??; +10 SCTP.SEND 01 00 03 04 00 00 00 08; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 02; +3 SCTP.SET <> "STREAM_ID=1"; +1000 SCTP.RECV 01 00 04 01 00 00 00 18 00 0B 00 08 00 00 00 01 00 01 00 08 00 00 00 00; +10 SCTP.SEND 01 00 04 03 00 00 00 10 00 0B 00 08 00 00 00 01; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 03; +1000 SCTP.RECV 01 00 05 05 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; +10 SCTP.SEND 01 00 05 06 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 40 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 25 +08 02 00 01 05 a1 04 03 +80 90 a3 18 03 a1 83 XX +6c 07 00 80 35 31 30 30 +31 70 06 81 35 32 30 30 +31 00 00 00; + +20 SCTP.SEND +01 00 05 02 00 00 00 20 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 07 +08 00 01 00; + +20 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0E +08 02 80 01 02 18 03 A9 +83 XX 00 00; + +10 SCTP.SEND +01 00 05 02 00 00 00 2C +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 12 +08 02 80 01 01 18 03 A1 +83 XX 1E 02 83 88 00 00; + +20 SCTP.SEND +01 00 05 02 00 00 00 24 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 09 +08 02 80 01 07 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 24 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 09 +08 02 00 01 0F 00 00 00; + +30 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 80 01 45 08 02 83 +90 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 ?? +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 ?? +08 02 00 01 4D 08 02 83 +90 ?? ?? ??; + +10 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 80 01 5A 08 02 83 +90 00 00 00; \ No newline at end of file diff --git a/omc/plat/isdn/ut/code/u03-13.Text b/omc/plat/isdn/ut/code/u03-13.Text new file mode 100644 index 0000000..94123e4 --- /dev/null +++ b/omc/plat/isdn/ut/code/u03-13.Text @@ -0,0 +1,97 @@ +Test 0 +3 SCTP.SET <> "remote_ip=172.18.99.1"; +3 SCTP.SET <> "remote_port=0"; +3 SCTP.SET <> "local_port=9900"; +3 SCTP.SET <> "STREAM_ID=0"; +3 SCTP.SET <> "server"; +1000 SCTP.SET <> "wait_connect"; + +200 SCTP.RECV 01 00 03 01 00 00 00 10 00 11 00 08 ?? ?? ?? ??; +10 SCTP.SEND 01 00 03 04 00 00 00 08; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 02; +3 SCTP.SET <> "STREAM_ID=1"; +1000 SCTP.RECV 01 00 04 01 00 00 00 18 00 0B 00 08 00 00 00 01 00 01 00 08 00 00 00 00; +10 SCTP.SEND 01 00 04 03 00 00 00 10 00 0B 00 08 00 00 00 01; +10 SCTP.SEND 01 00 00 01 00 00 00 10 00 0D 00 08 00 01 00 03; +1000 SCTP.RECV 01 00 05 05 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; +10 SCTP.SEND 01 00 05 06 00 00 00 18 00 01 00 08 00 00 00 00 00 05 00 08 00 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 40 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 25 +08 02 00 01 05 a1 04 03 +80 90 a3 18 03 a1 83 XX +6c 07 00 80 35 31 30 30 +31 70 06 81 35 32 30 30 +31 00 00 00; + +20 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0E +08 02 80 01 02 18 03 A9 +83 XX 00 00; + +20 SCTP.SEND +01 00 05 02 00 00 00 2C +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 12 +08 02 00 00 01 18 03 A1 +83 XX 1E 02 83 88 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 10 +08 02 00 00 7D 08 02 83 +D1 14 01 ??; + +10 SCTP.SEND +01 00 05 02 00 00 00 2C +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 12 +08 02 80 01 01 18 03 A1 +83 XX 1E 02 83 88 00 00; + +20 SCTP.SEND +01 00 05 02 00 00 00 24 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 09 +08 02 80 01 07 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 24 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 09 +08 02 00 01 0F 00 00 00; +30 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 80 01 45 08 02 83 +90 00 00 00; + +10000 SCTP.RECV +01 00 05 01 00 00 00 ?? +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 ?? +08 02 00 01 4D 08 02 83 +90 ?? ?? ??; + +10 SCTP.SEND +01 00 05 02 00 00 00 28 +00 01 00 08 00 00 00 00 +00 05 00 08 00 00 00 00 +00 0E 00 0D +08 02 80 01 5A 08 02 83 +90 00 00 00; \ No newline at end of file diff --git a/omc/plat/isdn/ut/isdn_main.c b/omc/plat/isdn/ut/isdn_main.c new file mode 100644 index 0000000..8cfa272 --- /dev/null +++ b/omc/plat/isdn/ut/isdn_main.c @@ -0,0 +1,323 @@ +/*********************************************************** +Copyright (C), LGC Wireless. +File Name: isdn_main.c +Description: For isdn module test +Version: v9.0.0 +Author: Gengxin Chen +Create Date: 2008-2-19 +History: + + +************************************************************/ +#include +#include +#include +#include +#include +#include +#include "../src/include/isdn_rm.h" +#include "../src/include/isdn_ext.h" +#include "../src/include/isdn_inc.h" +#include "../../snmp/src/include/snmp.h" +#include "../../mtp3/src/include/mtp3.h" +#include "../../public/src/include/license_id.h" +#include "../../tcap/src/include/tcap_public.h" + +#define SYS_IT_INTERVAL_SEC 0 +#define SYS_IT_INTERVAL_USEC (20*1000) + +static char serialNumber[18]=""; +xua_up_msg_t iua_msg_src; +static int systemID=0,systemInited=0; +static int sys_timer10ms=0; +u8 ptemp[] = {0}; + +extern int test_len; + +extern void test_isdn_msg_encode(u8 type); +extern void test_isdn_msg_decode(u8 type); +extern void m2ua_init(BYTE system_id); +extern void msc_isdn_init(int *sap_id); +extern void cc_timer(); + +static void isdn_param_init(void) +{ +// ISDN_Sap_Attrib_ sap; + Cg_Attrib_struct cg; + Circuit_Attrib_struct trunk; + int sap_id,cg_id,trunk_id_0, trunk_id_1, trunk_id_2; + +// memset(&sap,0,sizeof(ISDN_Sap_Attrib_)); + memset(&cg,0,sizeof(Cg_Attrib_struct)); + memset(&trunk,0,sizeof(Circuit_Attrib_struct)); + +/* if((sap_id = isdn_bind_sap(&sap)) == -1) + { + printf("add sap error!\r\n"); + return; + }*/ + msc_isdn_init(&sap_id); + + + cg.network_id = 0; + cg.priority = 0; // 0:Reattempt ind / 1:Discard + cg.tg_id = 0; + + if((cg_id = isdn_add_cg(sap_id, &cg)) == -1) + { + printf("Failed to create isup trunk group socket\r\n"); + return; + } + + trunk.cic_range = 32; + trunk.head_cic = 0; + trunk.plat_id = CTRL_PLAT_0; + if((trunk_id_0 = isdn_add_circuit(cg_id, &trunk)) == -1) + { + printf("Failed to create isup trunk socket\r\n"); + return; + } + if((trunk_id_1 = isdn_add_circuit(cg_id, &trunk)) == -1) + { + printf("Failed to create isup trunk socket\r\n"); + return; + } + if((trunk_id_2 = isdn_add_circuit(cg_id, &trunk)) == -1) + { + printf("Failed to create isup trunk socket\r\n"); + return; + } + isdn_rs.cg_pond[cg_id].attrib.nfas_flag = 1; + isdn_rs.cg_pond[cg_id].attrib.variant_type = VARIANT_ANSI; + isdn_rs.cg_pond[cg_id].attrib.ds_ch[0] = trunk_id_0; + isdn_rs.cg_pond[cg_id].attrib.ds_ch[1] = trunk_id_1; + isdn_rs.circuit_pond[trunk_id_0].attrib.d_chnl = 16; + isdn_rs.circuit_pond[trunk_id_0].attrib.head_cic = 0; + isdn_rs.circuit_pond[trunk_id_0].attrib.cic_range =32; + isdn_rs.circuit_pond[trunk_id_0].attrib.plat_id = 0; + isdn_rs.circuit_pond[trunk_id_0].attrib.iua_id = 0; + isdn_rs.circuit_pond[trunk_id_0].user_network_if = USER_SIDE; //nt or lt + isdn_rs.circuit_pond[trunk_id_1].attrib.d_chnl = 16; + isdn_rs.circuit_pond[trunk_id_1].attrib.head_cic = 32; + isdn_rs.circuit_pond[trunk_id_1].attrib.cic_range =32; + isdn_rs.circuit_pond[trunk_id_1].attrib.plat_id = 0; + isdn_rs.circuit_pond[trunk_id_1].attrib.iua_id = 1; + isdn_rs.circuit_pond[trunk_id_1].user_network_if = USER_SIDE; //nt or lt + isdn_rs.circuit_pond[trunk_id_2].attrib.d_chnl = 16; + isdn_rs.circuit_pond[trunk_id_2].attrib.head_cic = 64; + isdn_rs.circuit_pond[trunk_id_2].attrib.cic_range =32; + isdn_rs.circuit_pond[trunk_id_2].attrib.plat_id = 0; + isdn_rs.circuit_pond[trunk_id_2].attrib.iua_id = 2; + isdn_rs.circuit_pond[trunk_id_2].user_network_if = USER_SIDE; //nt or lt + + printf("isdn init ok.\r\n"); +} + + +int wxc2_get_license(int functionID) +{ + return 1; +} + +static void sysTimer_IRQ() +{ + sys_timer10ms = 1; //test +} + + +static void SigactionSystem() +{ + struct sigaction action;//,actsegv; + + action.sa_handler = sysTimer_IRQ; + sigemptyset(&action.sa_mask); + action.sa_flags = SA_RESTART; + if(sigaction(SIGALRM, &action, NULL)<0) + { + printf("sigactin sigalarm failed\n"); + } +} + +static void sysDaemonInit() +{ + int i; + pid_t pid; + + + if ( (pid = fork()) < 0) /* parent terminates */ + printf("%s: %s: fork (%d)", + __FILE__, __FUNCTION__, __LINE__); + else if (pid != 0) + exit(0); /* parent goes bye-bye */ + + setsid(); // become session leader + + for (i = 0; i<3; i++) + close(i); +} + +static void moduleInit() +{ + printf("\n\n¡¾R9 Platform Init¡¿\n\n"); + + debug_init(); + heartbeat_init(0x0400); + iptrMainInit(); + snmp_init(4957); + m2ua_init(0); + mtp_shm_init(0x0400); + mtp3_init_serial(serialNumber); + + + + isdn_init(systemID,10); + + printf("\n\n¡¾R9 Platform Init completed¡¿\n\n"); + +} + +static void SetFSMTimer() +{ + struct itimerval *ptv, tv; + + ptv = (struct itimerval *) &tv; + ptv->it_interval.tv_sec = SYS_IT_INTERVAL_SEC; + ptv->it_interval.tv_usec = SYS_IT_INTERVAL_USEC; + ptv->it_value. tv_sec = SYS_IT_INTERVAL_SEC; + ptv->it_value.tv_usec = SYS_IT_INTERVAL_USEC; + setitimer(ITIMER_REAL, ptv, NULL); +} + +static void moduleProc() +{ + static int wait_sccp_normal_count = 0; + + iptrans_timer(); + snmp_timer(); + + + if(systemInited) + { + wait_sccp_normal_count=6001; + + heartbeat_timer(); + m2ua_timer(); + mtp3_proc(); + + isdn_timer(); + cc_timer(); +/* test_isdn_msg_decode(MSG_SETUP); + test_isdn_msg_encode(MSG_SETUP); + test_isdn_msg_decode(MSG_SETUP_ACK); + test_isdn_msg_encode(MSG_SETUP_ACK); + test_isdn_msg_decode(MSG_CALL_PROC); + test_isdn_msg_encode(MSG_CALL_PROC); + test_isdn_msg_decode(MSG_ALERT); + test_isdn_msg_encode(MSG_ALERT); + test_isdn_msg_decode(MSG_CONN); + test_isdn_msg_encode(MSG_CONN); + test_isdn_msg_decode(MSG_CONNACK); + test_isdn_msg_encode(MSG_CONNACK); + test_isdn_msg_decode(MSG_DISC); + test_isdn_msg_encode(MSG_DISC); + test_isdn_msg_decode(MSG_REL); + test_isdn_msg_encode(MSG_REL); + test_isdn_msg_decode(MSG_REL_COMP); + test_isdn_msg_encode(MSG_REL_COMP);*/ + } + + debug_rt(); +} + +int CStrToHex(u8 dst[], u8 *src) +{ + int i, len, offset=0; + + len = strlen(src); + while((len--) != 0) + { + if(*src >= '0' && *src <= '9') + ptemp[offset++] = *src - 0x30; + else if(*src >= 'A' && *src <= 'F') + ptemp[offset++] = *src - 'A' + 10; //*src - 0x37; + else if(*src >= 'a' && *src <= 'f') + ptemp[offset++] = *src - 'a' + 10; //*src - 0x57; + else + { + src++; + continue; + } +// printf("src=%x,ptemp=%x\n",*src,*(ptemp+offset-1)); + src++; + } + + test_len = offset/2; + for(i = 0; i < test_len; i++) + { + dst[i] = ((ptemp[2*i]) << 4) | (ptemp[2*i+1]); +// printf("set[%d]=0x%2x\n",i,dst[i]); + } +// printf("sizeof=%d,strlen=%d\n",sizeof(dst),strlen(dst)); + + return 1; +} + +static void isdn_set_val() +{ + iua_msg_src.msg_class = IUA_QPTM_MSG; + iua_msg_src.msg.iua.link = 0x10; + iua_msg_src.msg.iua.len = test_len; +} + +int main(int argc, char **argv) +{ + int retval, err_flag=0, daemon_flag=0, no_sync=0; + + while ((retval = getopt(argc, argv, "dt")) != -1) + { + switch (retval) { + case 'd': + daemon_flag = 1; + break; + case 't': + no_sync = 1; + break; + case '?': + err_flag = 1; + break; + } + } + if (err_flag) { + printf("Usage: %s [-d] \n", argv[0]); + printf(" -d with daemon mode\n"); + exit(1); + } + + if(daemon_flag) + sysDaemonInit(); + + moduleInit(); + + SigactionSystem(); + SetFSMTimer(); + + isdn_param_init(); +// isdn_set_val(); + + sys_timer10ms = 1; + + while(1) + { + if(sys_timer10ms) + { + sys_timer10ms = 0; + moduleProc(); + systemInited = 1; + } + if (sys_timer10ms == 0) + usleep(1); + } + + return 1; +} + diff --git a/omc/plat/isdn/ut/isdn_test.c b/omc/plat/isdn/ut/isdn_test.c new file mode 100644 index 0000000..275a59c --- /dev/null +++ b/omc/plat/isdn/ut/isdn_test.c @@ -0,0 +1,325 @@ +/*********************************************************** +Copyright (C), LGC Wireless. +File Name: isdn_test.c +Description: For isdn module test +Version: v9.0.0 +Author: Gengxin Chen +Create Date: 2008-2-19 +History: + + +************************************************************/ +#include "../src/include/isdn_rm.h" +#include "../src/include/isdn_ext.h" +#include "../src/include/isdn_inc.h" + + +#define CODE_SETUP "a1 04 03 80 90 a3 18 03 a1 83 81 6c 07 00 80 35 31 30 30 31 70 06 81 35 32 30 30 31" +#define CODE_CALL_PROC "18 03 A9 83 81" +#define CODE_ALERT "1E 02 83 88" +#define CODE_DISCONN "08 02 83 90" + +int test_len; +static int cc_state[8192] = {0}; + +extern int CStrToHex(u8 dst[], u8 *src); +extern int q931_msg_encode(u8 *dst, IsdnMsgStr *src); +extern int isdn_msg_decode(IsdnMsgStr *dst, u8 *src, u8 msgtype, u8 len); +extern void isdn_set_cause(CauseStr *cause_ptr, u8 val); + +void test_isdn_msg_encode(u8 type) +{ + int ret; + int i; + memset(&iua_sd_msg, 0, sizeof(IuaMsgStr)); + IuaMsgStr *dst = &iua_sd_msg; + u8 *flw_ptr = dst->msgcontent.isdn_msg.ie_content; //message flow pointer + + memcpy(&isdn_sd_msg, &isdn_rv_msg, sizeof(IsdnMsgStr)); + isdn_sd_msg.msg_m.msg_type = type; + ret = q931_msg_encode(flw_ptr, &isdn_sd_msg); + printf("ret=%d\n",ret); + for(i=0; isp_proc_id] = 1; + return 1; +} +int isdn_alert_ind(Pst *pst, IsdnAlert *ptr) +{ + return 1; +} +int isdn_setup_cnf(Pst *pst, IsdnConn *ptr) +{ + return 1; +} +int isdn_disc_ind(Pst *pst, IsdnDisc *ptr) +{ + IsdnRel src; + memset(&src, 0, sizeof(IsdnRel)); + + isdn_rel_req(pst, &src); + return 1; +} +int isdn_rel_ind(Pst *pst, IsdnRel *ptr) +{ + return 1; +} +int isdn_rel_cnf(Pst *pst, IsdnRelComp *ptr) +{ + return 1; +} +int isdn_stat_ind(Pst *pst, IsdnStatus *ptr) +{ + return 1; +} +void msc_isdn_init(int *sap_id) +{ + ISDN_Sap_Attrib_ sap; + memset(&sap,0,sizeof(ISDN_Sap_Attrib_)); + sap.event_handle.h_isdn_setup_ind = (f_isdn_setup_ind *)isdn_setup_ind; + sap.event_handle.h_isdn_alert_ind = (f_isdn_alert_ind *)isdn_alert_ind; + sap.event_handle.h_isdn_setup_cnf = (f_isdn_setup_cnf *)isdn_setup_cnf; + sap.event_handle.h_isdn_disc_ind = (f_isdn_disc_ind *)isdn_disc_ind; + sap.event_handle.h_isdn_rel_ind = (f_isdn_rel_ind *)isdn_rel_ind; + sap.event_handle.h_isdn_rel_cnf = (f_isdn_rel_cnf *)isdn_rel_cnf; + sap.event_handle.h_isdn_stat_ind = (f_isdn_stat_ind *)isdn_stat_ind; + + if((*sap_id = isdn_bind_sap(&sap)) == -1) + { + printf("add sap error!\r\n"); + return; + } +} + +void isdn_cc_fsm(u32 pid) +{ + int offset, circuit_id; + static int i = 0; + Pst pst; + IsdnMsgStr isdn_msg; + + memset(&isdn_msg, 0, sizeof(IsdnMsgStr)); + pst.sp_proc_id = pid; + pst.su_proc_id = isdn_rs.port_pond[pid].su_proc_id; + + circuit_id = pid / ISDN_CIRCUIT_CIC; + offset = pid % ISDN_CIRCUIT_CIC; + pst.cic = isdn_rs.circuit_pond[circuit_id].attrib.head_cic + offset; + pst.cg_id = isdn_rs.circuit_pond[circuit_id].cg_id; + pst.circuit_id = circuit_id; + + if((isdn_rs.port_pond[pid].cic_state.call_state == CALLOUT_FLAG && isdn_rs.circuit_pond[circuit_id].user_network_if == NETWORK_SIDE) || + (isdn_rs.port_pond[pid].cic_state.call_state == CALLIN_FLAG && isdn_rs.circuit_pond[circuit_id].user_network_if == USER_SIDE)) + { + switch(cc_state[pid]) + { + case 1: + cc_state[pid] = 2; + break; + case 2: + memcpy(&isdn_msg.msg_list.callProc.chnl_id, &isdn_rv_msg.msg_list.setup.chnl_id, sizeof(ChnlId)); +/* isdn_msg.msg_list.alert.prg_ind.pres = 1; + isdn_msg.msg_list.alert.prg_ind.code_stan = 0; + isdn_msg.msg_list.alert.prg_ind.loc = 3; + isdn_msg.msg_list.alert.prg_ind.prg_descr = 8; + isdn_alert_req(&pst, &isdn_msg.msg_list.alert);*/ + isdn_msg.msg_list.callProc.chnl_id.b3.pref_excl = 1; + isdn_call_proc_req(&pst, &isdn_msg.msg_list.callProc); + cc_state[pid] = 3; + break; + case 3: + cc_state[pid] = 4; + break; + case 4: + isdn_setup_resp(&pst, &isdn_msg.msg_list.conn); + cc_state[pid] = 5; + break; + case 5: + i++; + if(i % 150 == 0) + { + i = 0; + cc_state[pid] = 6; + } + break; + case 6: +// isdn_set_cause(&isdn_msg.msg_list.disc.cause, CAUSE_NORMAL); +// isdn_disc_req(&pst, &isdn_msg.msg_list.disc); + cc_state[pid] = 0; + break; + default: + break; + } + } + else if((isdn_rs.port_pond[pid].cic_state.call_state == CALLIN_FLAG && isdn_rs.circuit_pond[circuit_id].user_network_if == NETWORK_SIDE) || + (isdn_rs.port_pond[pid].cic_state.call_state == CALLOUT_FLAG && isdn_rs.circuit_pond[circuit_id].user_network_if == USER_SIDE)) + { + switch(cc_state[pid]) + { + case 1: + i++; + if(i % 400 == 0) + { + i = 0; +// cc_state[pid] = 2; + } + break; + case 2: +// isdn_set_cause(&isdn_msg.msg_list.disc.cause, CAUSE_NORMAL); +// isdn_disc_req(&pst, &isdn_msg.msg_list.disc); + memcpy(&isdn_msg.msg_list.restart.chnl_id, &isdn_sd_msg.msg_list.setup.chnl_id, sizeof(ChnlId)); + isdn_msg.msg_list.restart.restart_ind.pres = 1; + isdn_msg.msg_list.restart.restart_ind.clas = 0; + isdn_m_restart_req(&pst, &isdn_msg.msg_list.restart); + cc_state[pid] = 0; + break; + default: + break; + } + } +} + + +static int flag[256] = {0}; +void isdn_cc_setup_fsm(u16 circuit_id) +{ + static int i = 0; + Pst pst; + IsdnSetup setup; + u8 cg_digit[] = {5,1,0,0,1}; + u8 cd_digit[] = {5,2,0,0,1}; + + memset(&setup, 0, sizeof(IsdnSetup)); + if(!flag[circuit_id]) + { + flag[circuit_id] = 1; + pst.circuit_id = circuit_id; + pst.cg_id = isdn_rs.circuit_pond[circuit_id].cg_id; + pst.su_proc_id = 0; + + setup.sd_comp.pres = 1; + setup.br_cap.pres = 1; + setup.br_cap.ext_flag = 1; + setup.br_cap.code_stan = 0; + setup.br_cap.tran_cap = 0; + setup.br_cap.b4.tran_mode = 0; + setup.br_cap.b4.tran_rate = 0x10; + setup.br_cap.b5.usr_layer1 = 3; + setup.br_cap.b5.has_ext_a = 1; + setup.chnl_id.pres = 1; + setup.chnl_id.b3.int_id_pre = 0; + setup.chnl_id.b3.int_type = 1; + setup.chnl_id.b3.pref_excl = 0; + setup.chnl_id.b3.chnl_ind = 0; + setup.chnl_id.b3.info_chnl_sel = 1; + setup.chnl_id.b3.code_stan = 0; + setup.chnl_id.b3.num_map = 0; + setup.chnl_id.b3.chnl_type = 3; + setup.chnl_id.b3.chnl_num = 2; //CIC + setup.cg_pty_num.pres = 1; + setup.cg_pty_num.b3.num_type = 0; + setup.cg_pty_num.b3.num_plan_id = 0; + setup.cg_pty_num.b3.has_ext_a = 0; + setup.cg_pty_num.b3.pres_ind = 0; + setup.cg_pty_num.b3.screen_ind = 0; + setup.cg_pty_num.ext_flag = 1; + setup.cg_pty_num.num_digit_len = sizeof(cg_digit); + memcpy(&setup.cg_pty_num.num_digit, cg_digit, setup.cg_pty_num.num_digit_len); + setup.cd_pty_num.pres = 1; + setup.cd_pty_num.num_type = 0; + setup.cd_pty_num.num_plan_id = 1; + setup.cd_pty_num.num_digit_len = sizeof(cd_digit); + memcpy(&setup.cd_pty_num.num_digit, cd_digit, setup.cd_pty_num.num_digit_len); + + setup.rpt_ind.pres = 1; + setup.prg_ind.pres = 1; + setup.prg_ind.loc = 3; + setup.prg_ind.prg_descr = 8; + setup.nt_sp_fac.pres = 1; + setup.nt_sp_fac.b3.len_net_id = 2; + setup.nt_sp_fac.b3.net_id_type = 2; + setup.nt_sp_fac.b3.net_id_plan = 1; + setup.nt_sp_fac.b3.net_id = 2; //?? {2,0,5} + setup.nt_sp_fac.spec = 2; +// setup.disp.pres = 1; +// setup.disp.disp_info_len = + + pst.cic = isdn_rs.circuit_pond[circuit_id].attrib.head_cic + setup.chnl_id.b3.chnl_num; +// isdn_setup_req(&pst, &setup); +// cc_state[pst.sp_proc_id] = 1; + } + + if(++i == 700) //more calls + { + i = 0; + flag[circuit_id] = 0; + } +} + +void cc_timer() +{ + u16 i, j; + u32 offset, pid; + + for(i = 0; i < ISDN_MAX_CIRCUIT; i++) //for timer + { + if(isdn_rs.circuit_pond[i].enable == 0) + continue; + if((isdn_rs.attrib.isdn_run_mode == 1) && + (isdn_rs.circuit_pond[i].attrib.plat_id != isdn_rs.attrib.systemID)) + continue; + + offset = ISDN_CIRCUIT_CIC * i; + for(j = 0; j < ISDN_CIRCUIT_CIC; j++) + { + pid = offset + j; + if(isdn_rs.port_pond[pid].enable == 1) + isdn_cc_fsm(pid); + } + if(isdn_rs.circuit_pond[i].lk3_status == LK_IS) + isdn_cc_setup_fsm(i); + } + +} + + + + diff --git a/omc/plat/isdn/ut/test_main b/omc/plat/isdn/ut/test_main new file mode 100644 index 0000000000000000000000000000000000000000..aac539e95f83a4ada0648097493b547935d07082 GIT binary patch literal 1120958 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⋘IR;l*WiwQ z5RBQ`1`>r}%pPnYQ3%HDAqKK648fQ^)NT}&!Vrwv!%SIYAsDlB@j4NOF$CiP=+>VN z6Ph1_nin*T%y$X75PS>hbW5*)Tj~_HM0^Fg#=S9<2@&o-uph zTcR8v5uGi}+5A&9Pt-Lia&G{VXCyT|qqmWv4%ywkb2U2#01eORou>e}Y?|ulEED?og^e&O{FBYEB z>t*kj@QfFuL{T}@R`My95aXPLarBeZyspz2brKtvojq7LTgiP?0LptBz4c{rmE2c> z@Ctw3@Jn+@L4>=asOnmFrOd_L!-|46_8(wl0>v8^_%}0%b7^TYtS|pq$qNC91#9dd z3)a|wNQJZ(IG8Q!Zt23Q8D5LF`VUoT7_71Xu#ce*!_aE5#{R>}y&za)|4MD;@nDVp zM^KsMH*p0_u*UxR!5aJ5l86(43D($u^#2MV4A$6xOakYH)Ioza_8+Th25Y3YxOoVA zH*qy{6@yH(45S$MWh^OJ}F+ZLjj>sA&tu+9*&NcvEL2bw=54XA{g*YWUj{=w}i~^WB z=`EdV@}mG|P9`7mLpcOLsHv3m-$Vh-v{IGiFF_uC8Nz8YlNSXr(@s{bMib~PbISVy z$VCCnbkI-~UFP7+KzW%cfSEp`0A_kZmKp^xvzFOnQ2;ZimIDAcNJIhTFIr104YfQH zfF`Icl{Uc29@P&Xz1Sdr?Jt=#J$UROknOr*qE8eCFteUSY-!=ss+kQ<0?CB}%$%i4 z^%V**bGG983lP+W>6Ljh)Dp#U?N5W}`p5DGBU%Ql+OP=H^9hBA!2h^K=da`81ugnwdp82r=Gf(QMwPP&6%u^Iq_DFxjUk>hHb2E9d05i{Oc0{a@w)7{C zDrnnLFu=@nTHhKBF!MYI4NMq$!2mN`NV8)wz|0E@zu6ve0L}LzE4hzgfSH#R(PuEg z%vMGA5ezW%vhpto2AFw;W$r5&VCGfLkRJ>%^V*9-pC1e`^9I+lI|KvFYSlot&!^Qq=zG(d`{zS5f{8sI-+fE05@mO?bZOgx>1O`_swJ`2Di zH4y}nDO1+K_mFNt%NpinrrCkE;C*aD(PefF4~XdE+Pw3^17`NKsYD;)0W

OhI_S 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 B_Ge*T&Mc9jX;!HfuqIg(tZ`O9 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 *Z!HMJRWQ z@Hdq#^>-ZqNl+yMubJJFMEe3*Mp9rVIX;*AJrLcdFDq6ugh(ce=L-U+S^$ zuyXB>Y(W&K`X*+U;;4fuMf3G}i+pg6XthGrw?>4!PyLmbIz?Eb(xxk7{vY#FmEDN` zdtKhh2Ump06r#QrLFTgNI7Qf^(x!`W{~z*Fm0g6XpHvZ&*GjH^E5d24g@sNL-cV`N zMR@u52T_F8D)q;24imja=(#!IjzPa(Kh}NJ5t*eZKA2K`cYfX?ADk?eD@3LudM*Vf zb^VbNcTanTN}jHZ3-{zDEL)uZ`q{jZ53UqnQ;5tFLvG|`1(%J?_2ClfBG;gcJe_id zTa|Q;)M;vRUhB$!R+|#(d%D+PWa+u5J3H2vC`X?g<*IIOSln-y$$BQ%&oVBGjW?4f zeV=M+1N!@&*J$=&RweW9{MNX{Mu}DLqi(5#m`SIZF4Q)IBTYY+6!i|MV4b=qB#@}) zrw(ofs-_#+$0_EijZrXo0`>xIR6u9fa6T=d92N(O;bBIE(mpDa-FDa*k{wqUGgvzS zxgkYFiu(I`JxGF-H2Hf}s@Wdo;xkI)oP5L;|W;d$HnpS==(qDO)qZL-G&@@MX+R+1U5mlEA z6yztwX~BK6{hP0pTn$6>+mECGXGYvbcub{D7vY0c--;l^mvdF>EdD!cG;{dUT>5jL zrFQ+s0?QueUajT_&bC}$++EbX1!9wq#jSD8rI)$AxG}AHO3dxW9k3Z*$4f#_jwjN~ zi=LZbo2!m+Ghs)55@XoB_r62CNtk@)TpwvZ%}`#rE4_sYFzDB(S|7zK0emM@suVQ`!E?iIoKr za^F6|@iX57liTZuWqHe8_a9y1AXZ=Ci&(sD`>iZ*e#y`Nt@1{Dv8@A4=*RuD50&FP zTIicj24T=iLj%% zve3R*<$~|G{SJPOp?B-+UR8mc>YDk|f=>>fw_0uvPh&^cy1{Iy!C`eAn7^k&vhyxe z;5#&OroSk84noaGz>bj~T5lO{lnbrTE@HWG#$*_=xE4C|%^~s|j_6n)kxmKyeUBeH zKsUxuMdFNN^t9fQBQ`%C$=F57T4s>3_@Y*2e6gFsg-V{nW_NDalUeFJ5}d>ozo_z) zL*5xnD_q#|$+yYUC_*_#Jb%F24PYGFxHPdf}3~}jQ}kl ztS4vZt3G)LvHTaL*n=G($dJz)ER%DxJo>|2W`yiu-ThLwEWWFSKWvAvGb)5jg;wlx zT=btKpdgB)>R1rVZPboPjbyf-bm@6vo-Ek)ClTW028Y7E!MdmhJn78RjXp<8^=U6l&u@3ySE>O4lsW6~X?3U)+Je{e&;F>pTQ&CNi2aV{z%Yc0 z|DWf}zym5lRtleIFY?&Ms`|eU4ystYOsv~5V^bV?ov}WzVx_8e7l0$8!S&ZWT9S>i z2xOvvv~c%KTA3GNdK#XX?e$mQ0Q=S*B-<*(_Vo%iap4=nW7JI{-(t@DnRBrUM*j!P z-gSfcNY$O|QK~-K-WvJ{M`U@ny$hcy*il;43U!Fv2gU^N;)R`!^A0qIKAO}fUkc~l z4(evON6!?%rqC=Mu*C+(n;lmwrbYIS6V;@z#+UHl3 z*s91geN!M{NK>7kRUFXJ5Ege)%eW^p%=QWfF|Rj6x5Xm4;659hL+ z-W^iX0|)D9L1mW2)1!I{*ce|7=9blOpp%&lF(KMTWI=0Lp{gNmK%vsmzofl%b>V!_ z0e*`XVXQFd8dYIBRS`c*61M**Bo!f5X$&%TNQ?X7J6A;FF znc;(l`7pz&NIcu(jM-Jk(78~RdIyTx(LO6MLq21-<|cP2sBPNJuiG`v3N-AP{F0Ll z0ouU9S23qGLH8oZ9XtL~gjp$fB%S*Fz~r_~{(^=J`HdjRokjMcJjsbDCE0fy3xDVN zntf7u=&DUiyRKiL8z1g60On%0zxsI}X?=!Us`RIS(gdMZQ`e%;C==l@({9*MSTh~l zVM?Ode}m07ZVgNZVl)nG>Hv$v!?UTwMKf%|i7+eGg0G>2YVfr~lY?0NI*2GjX>d|{ z(9`YMvAXObl)Yd_!(6sXofyiOiM<+e{Svp#VWFChV@8O_vuEdN#Mr5W4c*iy z0VbO!NZ47=u`r_M(DOmfrS2oI8_4USvo)_psiXGN<&uFc;(dkj{xM79LA~O0KM&Dd z2kj5@yWM*5wpqFp%-gX<%D`<6z0Xe(VH|hsE%BQ7i*LPoQ|SEzU|yinYO(vvcY{8} z=HG%?zt+$P1u0JYl{H$47GFI-+k;qV<3JY{t>x$fu93i(v!SX_lqA^HOIxHn6i9s? zR&eNpP4o6IE5HYbfC+wgrL}>#MCj>GSvL&7XWe=jOJh&Lh>AwR>F_%~8o=+_U^VX+ z=lQtQ7=T0RE&GC0yGec@IEj+U|W1ZTfKkOrqG86GNTPl zM;qjhrjQJRWs>L`89P!VpGV}4WyOiz@p?b32H=B7Q<)!C#e1vxWw#7EhBE_iCn&{*ZYv20|zNP=k;FkJ~uD&jC9 zydZX61~n60h>tYLfcU5#?S7NVXs8JDel!}tc^~sqdpb{kDT5TLi~_NW9x^({RRSEW zS0zB&v93(VxiUT0mFakQrc%%eR%~TPW|Li|n&`^lID@pYY*LzZ!7|y39hZUScw)i! zZAi=s8KNLHjI&kI3_&Bic!c-R&kC+TVwmQA&R#E5xrK(LzS^zz38d z@dfMH$Ohl4KkoNEs+XpjS`D$MvyvnHv@Pf1{(|E8IXH%LpZI zaJ%1^XfNN;IN&qbb(;1|rKAqN*6>)w2 zEbKu*L}Un+6-?~rh(41h?7RxrJ%JFjRN%+ggBxc1z2r=Yg8@6b`q$4Io|O+uFw797 z8rMRi^AsnYev~&L(O$Nrt6%-B5t-hl!mlH8%8yn!;Y=C)k!%jsq$+XNnz41(~ z9GU4|vZKpiKkKMW@4$|(!unaGGrj#gx_sQb=c-y&=f0P^>Sv*I<2XkdK51eC!8)0I z_YiKlaZF|wiW{Yw-ipq#ncj-dahcwV&ST;2h@gwk@oBD309QFE_995v;bd=sVdKP1 z?~%f<jX)uWP0s+IpoeGf{3)($b0evjP} z-UCKuHkJ*bnnas^Pdc`E^+1b#A5!iX0?>&KGJPMSctf0CQ6*0IiWDwqT+Ivz<5b9< zH99rzU>G)?jTdY@O!`KHcn_^*2?}n%U}FjG#{N#!;DFur{?inp5+{Dg#u6(wCL8Gx zAsC%M@QRU|ycM=I)bM+_rcYbVTx5n7RUi5gc9t1P7=8Sq=;IH^c=YjyXBrb6g|m|D zorVv)3`O+&(jrQ|iApsAMnskV{lKMvgQ9;w5Ou0pFGA;z0!512K@^QJL-{ZDQYB|Q z*u*kWKoi9Jt`CCHayDRZ`kj`*aQFiwbiKxv0_54X8m8NPJIwupTKvgwm_c zum~}=4%1%SwmA90ZdO%kdNn1F?O0$efyOd)i|3_HhrV>)>KlX7X}@~9yVJ&EM25PX z&;qVXpHrZ8kSko;HFS(mLNXe6Z*-%L`Ann6d!ey|@a{Lp)xdC3hLwZR0&U2Ch1D&} z0Stg?8#N}Ewt#Wi&9Q(p%&7ik9u04xgJw}?WiBIJE2GBnz{H!!C{iHXFsW0Y(xxf2^NcEK-J?ED7BIHRvoV|(_8hhg_+)}ho$Y*$S>qNMjot&qD`T9jLoJhJW8{}8xNYM zpDUgcgJA82Ip{4H`>1~=1BGzADJe7XvQ_wYChk{CV*YbPSI_6Tkt=4+V8s{#YT+J_{G9aujO zurIotzdZkA7ep_TQ&V{LN0%qxQt?WIwOHpyCU&XBDv92nl#|Cbc3H5Ntz$!t9fuRF z-Gblb5AXwp)C}%eCvd*4uzvQyjajTX9b!*t%EP zx>wk`H_g_)X}0cl*t%EPx;M?%y$)OV#=)KpwxX7Eur=-LVQbpk%~rQ>nyqf%G+W)i zX|}q3(`+RmSR0-%D`pFy_zZONu^Vp4h;L;>RR-kqd^N3Z?1Q1&%bBs#Z;&5tZgrnt+i(j@jJ2tKs|&2?tc+g5$1Vyc0hn5t#Z<@A z#ppA$kJA|xnG8I9_8O6C>+x0@oC~9Wagr{mT1IMM{ojbP!ahT`+AQ-AsXreZ83IE3 zXB3Om#$%O?2iXgF4Kc77EK+uuHw4V{tB{;o6=5P!3F1CuKY3))5we0l37IK(xBl3& zl>65wdMX%84_wKqP7Bs!-Uv7(Nz=b^D6*^%7i84B3~aiwPRc5z(Sr3r+-cyGGYt1C zOz>$8!>a1GI4x?-K-~}=8ugV8LgQpF2^XP@AG&TB>_}Np+{w9>ej2y_h&9(!fl4Ug zx(sf?0TFhIgGjN}%zuhaiWybcV9FO@}^a?nT4{SN$ZW> z-*`Jr$|J=-&PjdP&tvnvcf3cMx8{{*Uv42U%&{c~j@3HUX>hw0wx=gqT7Ufx;UMg(Kz%Wk8aS<% z41VFTP!^4i!gcWK$-T7kDAF&Y_rzp3BU4wiadVNpds18dtO7m1aHiIs)U;vy64`Iy z$Hx<}YF>Qnkst@OZVLObv|g`tts-kjy2NHI#IccA43x%1QCwxnY%A{e{Lv&&d&X7S zs<~#jRfrR2AwD!?YInDVc9Ss+p~ed7SqL?~E<@qW$=X3?lrb<|>{j8ZGc)lJJzG^K zW*he1d9utLV0e0g@364F;_psfV$r~~(}#O1=v;+IH%i7gFq%4#P)s{G!96dwZ69>M$2SvHY4(jVZQ{^|1Bt<2`c!1ccnp*7O?1 z&%6=!QoBp!a&lH?L>xLcWQ(`AOIb}#}uGQFlqN)vZZC4j2+SiLg0!2(o>}{Rw)^rzo z^EfwyQq{S+6Y|EovJdS!Tk1S(X8A@Ykck}KtQk?{>}kDgfUar8d&YXoc2VxKE%(OC z9z_vBcj;_v!3A&6#&PqKBKh(8keYlxPl@mUo#l2M=yR6aN14f4#5vNv@}0sr1(`+mLc2Q)tl~Rc z1+a?mWQSFJC%ZAO?65HJtnQb(vy;rmf=z$K^hO4o+*=5+YVTx%ReM#A#tt_%Jfpb8OWhbOL>rH-=yO_L$(HjixErvhIeu|sIUisYGf6=EX z@=nRk-cu60%T01G;wkQYAJ4$k&oDuu?QfW%KyKJF+eUOX=FjKU+}Tgf?R}bys#L~i z4CK*nQuU>ikDaj0YPnoD~sWo-+EC(e(*! z<`|Nd4>(d{2$FAz*7dZRgPTD#Pu$EJn(19Cixr3G$}MB-NKczN#wsS22$Kq8c{X!o z?Icl4BHT&hAythQMrL}eB^-{nGUPxua~vtWac$;M#PqnCBWoLp;zrgs5=AGsk>sG0 zg6Z*AbaJCeE;>uob;us2r_CG_GBK;hlC^t8ZRYUo9uX0Sh2z;el5aBycZWEnO3L%< zXB{VW8ks%;I?_`}l7bJ72J84OHrEh3-=>bqrr1uGP!jX7Nb*HnQoBErJb9^vN_BD4 zHG$8%$CIup4NBLP2Bm9CgVHsnLFt;(pma@XP`aix$gU~R+(Pyq7|bo4;9*+|rO3gy z!eHG?ET2s1$;?CUO)Tg_Nr~x&a`J16WSHFG@Jq#(z9yYm`kFMzzJ}JmQ|n4cDET^7 zRh27L>IOs2skuW?YuI|y>vDwYzYC1Hi=tt^Lz!F|OAo61#Xi#YiLM2vpH$#N(0-b? z*HtsYFoeC{Mec4-n=%^5o!A;p`$K`N*Y^#fdznA8A9XK}^tm4`^z@_Khk5!@+9g_e zG8WA@c_Y5Ty3bHTswz1ZkAts|vez@LtM=VT?;hWBc*-AxSy3XAR80;T7s^Gwz{^A0{WQzo-Y-7-^l_u;}> z+KgdNQoB|`Fx+$PbpmCw=~QoW+JO2=52{BfESS{;!!3L|IpMSypqnf@RmZiwh^9@%j&`e#smpVasdg>ZWQKe4)(BH6O)Ox3Z2)D!nLEruOJ% z@d;L=p5o`2jWlOPfo4~|$wBFk3@({+S*7Vg;mm+|R{hZ1+<$G>v6N89eT1 z#pY@I!B{GCXhzMO^-s?O+?5j0vCqE~{9HCQb{wmc|B%XkM$!`$>uBu^!QUaezlOhkY8N znO}wuT`aQ|T3Y(tGDJbc!JZ5mdURKA85+==3?(||qrJz@LYfxBZq;KL}m*Yx+;ZLk-ul=t+gFPq?_QMf4P#1=u*5Nb)(v~;W6 z7xr*p&&dG^NM3>I;nvU#rMp5eGI?ugw?ct0M1@*{&j7{IJ2VP@d`hG6-whP0{tAWq zOg*wqr%9S@n-ew7?ljNnG=G3J2&w5bPn$GPC2F2>r%C8E-=+l3Ysok#-5TfhJg{1` z1LO-R83E=@bLiRnjl8!dUvP8%M&8_luWUIdXps|6-QwJ7+G|&w2cXF~w{L5FC45W0 zUOcs)5vu}TAiOy{hqRZt$4FP+0v**T=WR1Rg5L)zEL!R@7UaC=D( zJUKj>BC)4PL_&7mq>mizDvIKU9@L(>E$RWh?y8I6M8j2ID&iF(n*@+u0kM99LLI8c zx7+-XehCd%9%e@hB(SdKHh$GDau)NfaODY+vM=y;^BN9*=is(65q>2mauwo57V&2# zQ%qGUQYDNN9SBU7mVFZPwf7)x`l1ovdfryT+a9;6eAN{pe=~=NNy2&}{EJ`6vi~)N zQe7Oeu+nCqv$%-u)BbO@PdsnL<%{<4RpP0#y!n2F@D?YXV$K4&`HJw}j}`~)9~(GO zIq<<1V4*bWtxrm3jP(FBuTYt5qHwZn5AP8P?c0TtLoV@B=I51c@}@6vhhH)MguUId zeJKCYC_0ESWwVzq^I7)WBzI;NvbLhf?kcLr%PqKm%`U<$yS?yhh;d7-(6V298ob+q zd(G_B1YOD4L8QmfAe7gNy`k`{3sSlRV10M6R(-<^TS(zS!J#u!)-A$iU`-7gjX091v}sdx7S)ES&xMFH`ZFq0m7cd=muxq zQ@hixp|z;IV`8AFwP+EXk_U-v*~5$Ru30}avA46CRhMW9;{OgC_N;&MPCeGqOx0)0 zP=Ar1KnTEK-r+bviD^S;Z94Gjo{H!Q{;mhxJI;%aPVIsljSfovT<=~= zZPzD?Qjcq+J@tq*j#JR0z|8I`k)Ki4x>N>~z26eH9k{ZrDKD1S-iTRK^%`tw2Z@j4UAR~oDp7_Cm(dO7bwax&Gb+O?si2n^@pB1?CZ}K zB-A15(mR_){m9a&Wnu_Iiv5x`V}(7qQ>23iRiu*W9RoCs+E-Qf=c;$`3C=}d2uzGOxBL1!)jbC4M27g(_`wF7dQy0Q5 zijGO03wLhxRQ^g>C^{i^JfQ2MN2kW2vb&IfY7|~B-GmohG}CoGUwGxfO?c5P7{|K< zC!j7-1tPLkMI*BgP(+wcko3?)D(A3!)w#$rM!K&CQ zdz_zqL~!Ryo69fJ5drrqZy-M01K(*X?}3ZHT7;(j$YOE6u|k}!>%@6%t2o;{S+uTl)M3V5(FAb64Se5qP5q8LH6DQBA8O@4IMVbEM1+O>ZaqIN!YGZ`7?E2 zzAoB{h*)N$9yg!W4(D}omP&|Y>YqW;awjgpIi-^%G|*5t4JB^6pTCK7?q}`y3*I$_ zn-Ihg-z=pcmIRvOwO}8=s~yl{f=HHpyM|RaDAJ6^su(CA?|V!sfY!S6ff|!Dt}ro= zFa4I(Q5qc&CMCBkvUCpUmvI(cswgx03tKXhV;$K_@-pS_qIhI5EpsIA zTI()_gXZCiB2{NUoWXl!Z*0XqidDGV2bYSnH5Ikiou#myO>C`oGn8|V@|*+*Q6|Ij zwbmW4!cI`miEucrC*K*NT{#CHVf*F%LM5)%dpB`T-4;|c7H#>tQTjk~=mSVV+#Q7* zuHJPFYFESC71~3(TkC+1g(dQWT~cPIZmkQ$1I`u7xl%b-!6|92y8%vNYu$}-khEGk zx4}Vz+ZFUV1>K<>T%^gE>lGAN&IUNZvJnmn{|FpJc}#^puAC>7^8@AZ7#vLTt#A~L zKg3(n|3lrI$46OR|Kl@B1_A^I5nQTNw5Yh_LW^J|RYv229TzGV7ql235!+g40Ih+6 zWHggu3RY=pT}p(us8mteT!KOA1h*CyEm~TmMSaFWMMR{Qulc>-=iFzRN!Z$c{`m3I z$#c&==iGD8J@?%GUZ^O%EXmKP@nEW|x|Ru1d*D~5OxKYpn|uR*AS5qxMd+{iW9az_ zdKL)&P#Ym0i;vpx{mXDbjV4W<{z>8wgufks%CpHk6xe`2$Vy88G%7Hyp_%;Sm4DYC^Pg zUt52@{mfjsRB%~oN&aVKg1Jd_Ec7lU+?KlIkjcXU#x_g{Vy2T2ZpxV zzeXPl?T}t`lz+ApsdzF6Yngua)RU#@{?+KSrbn$ytwDCz zn0vf~Yw6Rv^76aVqt-Ah>+4#2C#Hmh@t^Dk#lUm`OLTM;e5G~IQvzL8)P7v;D-&6V zELS1RnQOO>z49t4T`${xB-=eD+xGX7-~WGR_D|cTGIg3++{?`Aon$LI)^xkpA;_~# zFU?Xa3_@Q1Njah_tP>Gsuh=HcQpsmPQP<4hKs;<;_&LBsOX8uNzGPj|zLZh+^@>i; zXF8nU_|mXw5f=QFBWIGXRn1f$|3Xl5%@7Vrw=X4X6smR*8+O>fgCh^ze z;UZ#8GZ;rZ%)|As!z{p~F3oBZo7xeY56TnTP9fv;hN3 z$l#@tHmR(pGWi@>tRIGgP=7EZ1(YZc<~~7YDA8<#JGU6O#KV2g;NER;Cpx&{`ad8_ zd6#HWE#Z&G=4i&J2O znX%s+@Ut!$OYh~@g9g0N1()QZ9U7;ros!&IS`@Gs8SGnK?2`#zY`{Ns!Pq2NZY?q3 z^IdQ#cRM&4+jkUHlDkRRJLWh_)stvuFL!YNX73O8o{cO-10&iit?x+24+D+f7aT9h7s|B z*eT>Z0ukzGes&3J9%jDq?%+4*d@do$JxYQwhWqzZ!*X}<){n)4?DsL>ZI|HwJ$B$` zF5VB#RQnLNL3ST4D*GR&0AuPX!I;p^3P7UvAtQ#ya+`X+cEB3qMOq5t`$2#tz+DP^vw%pYn^VD45SEPDG~`SBZVX(=-E z?qFxuPY@n=h$^fsnLME3yr|-3LT0-dpuP)wvCDAX0#n(-RCGSneo+%5nBLm~KjDEt z_hBFG@GQ5w%=WMkSL{@BJXO=o-$0!68it)!0c5-VQz-;3n-Ufj5*>z^_NAn-pWP(! zp6!kZ&-wxUHs(omut_T}!v(%H^l<$ML_x*=N`Nav85y-M_PAcJT$$E54|=hamR#~w zSGzeh?MO1iZJehhS?E@chkS%0>s6hvV`7LyGSKv#cD^t565I-luK)QEAP|Ey@k_=y zFlL;e@hf@Bu`+(7kfbbBFIl<4ljD9xFTz8ne=eAlJj|GbS#Bjg=#@@#@DaItjVo{P z;!pReW_i#-3iXO*YIxQdr&u};^u@J=>%Z+Q9l!5^w8SVVqU=Y;FjQql=s`jMttZg0 zc8Ojh=#P8o*3QvGrGmWLLmuuRms_uU(8Cq#OqkYgE}eF&QwpxMuePC(!^`Uf1BK}Z zkNkt2ub5ZS5`Bg8f)mL?xxZtfJgD)cYV%m$rBJU>P*+B?P}J9#N#{ASq76+3s><+! z!q7+*1Y@JtzdWv$URu7oa-@@%Q&$c#c8}V~QHI+6Mlkc)y%z_&XPn>e->`iOaqV76 z(C3F_<401mo_D&wVZKs$N_R7Ht)L#{p-$N;YK@>CLi}t^emTzmr7iSO_Fe%F5#Ku4kDWmJgGb)Grm-&iXOn^ zOlxTK>c!=OxyJ;i>(}f9%vZ~gzhS<}*2Hc&(D?!_TQpj>-OsB`ru{e10!KTPA3AQ!rF`S40?HqevdN>IW1j~m=FU|YaMYOb8yfVxf^}L-uSWaRiGKA*KMlG)UH`sg_s>Hc)N0H z)#tx!jkMs4JqL?V#7HmD3IxW@v!}f;5~U)m>uOiG$E7Fr6LLMvNs4Q{=P*lLQAXD> zzS_Q3jmOy>Aw;uCw2z;tFNj)0>}WD={i-@SEsHic{=6$Hz?$fU3j6!l8N0^YiZfm4 z&6Z>BNHk=BaJ~ea>?3Q-AJ~i^W@QupqFROQTSrMOZZ;4|*#fcWXeHQx|Aq2#fo=Pw%kA1CVBk-S z%Wca6QhWDoR2?VJXHU`PSPtSU7cV2RQTzB01UYIw2!&3lvRal^l-t)UkhBR%oJr!{ zNet?*Q7}jT4+D%!=){cCm{bz4WTA7)UyQtOSERH+@x*mH&_3Ay`+G*ZOMqnP+m|w6 zErtkIU^xUBqXp}uOvC3wS55qxA3$FW`)HsybP+d(rwzaZE|~u%7$9_JH-_wd6L*hi zA{#MQd%HEnl4M+KsLlOa(mQQn8~)iOGsmr=^WCD^gsP$xJHU%+wT3QnV_Q%b606&J zrq?2!K!5|mjeJd}?2U0RK2?sdY}ud2;|r4%6lA@#`=@r}h-tVrFS`5Y+Klpa!Cgug-HPNAHTn$;j1Dx;9u(01sXNNXh1 zt_25f?1lFQ)PXP-vIdFvHVRMjIPMl!D?kRK+B1(6!2O_X=mz{5n+^R4e}-p6H{nk; z>oa%zi+x)y$h{rYYU7maOY*nwo-rEGK(i6X%p&hW298wGBeA$>&~q|cnjRl>lo z%`Q{XHT5<#@V1u$H=)pAsS#D!^YeehJ6na_a;la8q12~AYAxJMWCKPBZ_C7G8@~3# z*B%>HXdRCB?WI|T*1I&GVRfB`byIDccVkq2)u$lJ``q3CZf|d5r=>M9Z_$1%ZJ2MF#b@#+1SBG~0Pv{&#ydjH$hNcP0ZN$^Tj_y! ztRamR_;`7_{Raj67F5s;SqHh^S!s13ih`=|TyuYitP8)_c`W5p{UeVPbO_ai25OI-_CO%vU8 z&F~PN^vwsO|IIKuoeUGl5O2=!3!ujJlQ>Xs#$0S5{PTApKW2~c)Ltc13eWm800ujS zwp8CFFu58T+ZygedqG+q~~Z42Debvnue?9wQ+ z?Y&mD^+FS_LT^m>WIn!|8nprM0Hq@9>uT2v{(8k<5B&L(fBp#N22u*FJ!0o>La&DQ zGD;@rnbJC?Tvw1%&3xuJ_n~Gl6o8UV2Dz%Id4Ex|+LMT>QBGEI(JPmO!?QZ(b@axD z8BSg)fvf;fg0(6E_RZ}iuP>(~FJpU3UF{ml>l(#h(=o3v7v%LPPF~rw7s}O2xw;@F z&1<4kIxpd*4O3Gi#FmJ^A%N{n$SE?t9nSnk0Pxi#T>lj612?*1Iq6Y+rblhxwNuo3 z=QmxPfk6>ti&;hcPmZ;}d`o+w&odm~WPhk(IQ_a7Ed1g!HtCvR?^wA0bWr}6=BtU! z&_s~JsYv1W4^Ykp=KKZ##+PEOR#BMI4n^POB@a>cEVw-$6;}L)Z)~rMRm1{gu^1`u*l)C*yCWTqET++ zdQtYN5&P!vnTn5+NRP4`%kWq`GwP+WFdbQ#ieOXY0!d?mrm?_DW1*J@Dp>yhg3Mmw zv6+`1H7_;l-n!a*h0VRn=3a-*JdaHQ2dwdn?}5VSrbo?9jk>$8_HN;Dw{p1K;V^e6 z9DGGKJ3VT4YShfS+L^*(rgE6+aG1Rl4!$C5NRMhrjjFG!trrgU%Awxj(BS7#B^LuF^Chz9v98svv+kY5EFM8ihK-z$obA-1lWze2_jCF55C znJQk}j$5D%JU#a{{8)I_M0PVFXM%mBR8rh_hQF!IMEuq@^A~ndm*hv+wEV#fC79Jr z&mkU-PWRk`4SXq1Ridwht+l3?vjO{wP#|s^RVi5pOJ{hFAeHegUojB|kqG}di4YHo z%;B=0aAA)umAst641ZIZG5D=(=C4S~4=~{$hY9g0>8Y}m7(dB#=y6=Jv59vkfN`05!!pbPa99xHx`u(>MtPhCf;!uSrzO@IQWqKtpZl9%KUt zNdS7k1erhIN*~_O8gKe68BvV?Nmm;i|SC=?saET9sNO;6$a2+r!B} zh_Eu24<~;k0V8<^fda|nQ~grkqPx6}RqOy5aK5Idu9AO(`nEY3=_F2FrOZ*qBXyNBKNLT0 z&u6#RPzCts&1uz4ujC}rSAj`Akb=$^<-0-xe%d1{g8@5>3uf$lC*h}cA(kRE)u|zS z^crev$5PBS;ZVV?jWDY#cE|)VMja#JcILf}slA3IW*^%#b1<9RzM>szV=RM}_lxYW zUK5XzsC-Mx<#bawVnY&@fsa{I$0jO2V^n;9^eC(ib9&$?4^HWztg<1&z@!u6gSjlA zhE2Sy0+C9E6$Bf*>03s@LK3e3HIVTN5oV>n$5fmenfye?LNbFEu73i>4ml@;tne=} zJ1LBQpz`9CEJfJY}B@0_i)_}d$AutzTM-S*(qxvlFvv={g^U0VgmXV6v+QXd4GSlTOQTvCAnOn6F%XJ%` zb>6mr_>QwMg||1t$R@~eG6b^S=iAH>ZK{aczk5adA;}h)cU?1oF|J+-HUh2| z0r?w<-$Zp^=HjgF3}+N^u5ob|b%t{kaVEMr4V~eHau1@??@d{_Ce^-_;_f9WY%2N} zqq#zxI#t1*-P5M#brYL{M+oJ*qKiqtA$IlBORBi%_q5^ z|6?9bpQH>@Pm5c>mFYj!thffphkYnbFEGv|xq&=tU!^<%o-n|H4L(Gig}4vJI_CxB z3Orxc9v=dEgqJlL_1Gc)v!-W)riqAmajFWgRpLfWR8ISgo|24R{VJC7GGJkls}(u- zv~CHUP+{Hg`ib67ZsPszuCIaaVUMo2p{p}=I6>*st$$H60M%j#oKfv%O`=+ACJGYN z$Xv4|rXxvSID=t?{tp=8TJBfH;|I5-`7h#|-(io8aZ)M;txw$P3 zAFD%~gMIf4_tMYl#{2kQTD;kLuWk8W(xSGUqS;XU#!*UawB@86xPTWuw!NG5HRLnu-?&+u6QoqK4M=s({Ke^pv;^lbKz}^<40=`Mxt%<}h4lzlgZ=nd zs?D*#ax8oY8a>3JY_IBAHXo6TDVquSZkh+)^JnLeC~x9VI#C9Wk|5J!&9=|np(K(! zELKYHa>s#KOk^NFwCjiY?e}E8uWSM~YP#}Fbmft1+>O=v3f*Fw`w)F-%HPEr=Hj2` z;&-=?!jyaNIfGPYeb+_W-$mjRE)#CDd%qz&UvqO@j%T^ZAGJCf5ed3df)k&UT;;BH z@khD%Pj!O-%u9+t#KphF#qa*7j{MiWruZRO_^~ej4_yAow93jfs*!jix;SgxE|X=rS=LGNl^>!QD(EfBJtN?7xT3OUZj zztP2C+6n$YHY)yLgI{XJUHqhrk3G;8RvGyZ!FfS7MezoX?RPE(5& z-{P|Sb|E`){=FlevU{M2-7gHgQfsQq?nAeT&PY^JHqMj))V2qHIv=#S5`s$eN6gg*6l9Rb#D4cFsG$f8d2>-ShMZbFmf=!pix)# zbFYR}A0^hEE`uXn24cgdRBz@%EsiFG-_5$)#ovYwpGqa$eYz9>ska2*9*2dX+(eh? zewS#KOSGRo97t>nMgmV<`EWzf#aieR%ytQ|Gr7W&nssBFqyj~D6S`8+*&qJ{N&d@t z2Y(}ffy+ViCFR_P_xT`u?ghd3>pJkPldJCb)h%H8dxP?*E7IRrIw<>QLmW~YhaAY= zYH*jixR1HG-zwY=!pw;C?u{d`6y(S-)^z^4UC zTyMzyj&-F=W*qDCzo=t9%^-KNJV$w_i|jepyRxdW3K!pVl<&I5=i&eM6~*5mLk9K$ zJx6(>%YUbi@)1Qb?j-k1my72p^Q#<9_#Nf>x1(&XGw6Ot`HYJ$LW-mO?OGM`J1)NG zC}(zpzZ8{+W~1XE)_2cQUhd+1jGC((W5FsvLAA-r zCLJC;>(a{8aH7pKJ{Q`2B?k+h^N2m=nAL!tIFHxwR6;x#@?{A|KSA6*a1s8N#`{?< zsHmocf8AG7TKVrFsw93QM3Ql{wGk*zpZN}z%Nv7nrs;SkEF4kYrJEkJ&jpU-EG{N++i}}RNqtMK zQj)+bpd9rbjr|9kWoc})E{$!*QpK7YuKTmf)v5+%ZUQIBS!fFCm8tnjGFCNX?#KPa0dud&%A z#!&6m*(64O1Y!tFAja(NCuNhE=x9GTo5TbX&weu%pgf5`Kw)Zwv&pCN=f-Rj+HF5P zn{39PfU^e<_7aBh);{>L7a$6i5<20kl8$KyG9nEQbQbim-tmnC!n5WfD^hq{?LRCx z#)i8MQUGU@SQD0a5^<}MIXOy5)c${v4%`yW3=V|FU6B!74r#H??Q~_7inMX_22Y2! z(P8r#l+b4~>$hR12wN~w9&&C3M;@@TA4lG>0n;9#nb619zmGwWk*}-fLHM9+j_Xod zeqT{;_g3_*9K46-9z@hwlSeEI4v%caE8*~|dJ7hIC~U&6g`43yunv?;u7e~1^_yCO zASQxbNO)>*!l!iy9LqF5c;-II9&a1*GKa^z$}f!C z`>N)QYQpvJLeGxwFdoX(>IU~ zhL_{D_y9Tpa6AL;_n@TCF)&B~MoIn*9fo4*YZ+nQKopaIJ!Ha2(t2nDjo z97-cLNS5s5-Wp341 zB`NG^IfRwgMejUX)ck52mzM;SER`b||B;NvXjoH?(TrUo7EG`jV_|6p4caM+rl$BP z)(5ele5^VAPTv8oJMJN3XKFv%@e~V8-bzlbO0E6;VK;V7Yve`7Ie_FE%vNRQyolcw zT=a!UmUWh2s0FZdDAv7YnFtDlnO@t*^|i_9F_cT3)$$0;e;;ik=+UdNA>Fz}%#z%r z_ELu#4ryY~xOE%j?vs=y{iuDHut(*?729_xHm)r^2)7uH%|>1voQ=G6V>a^g;n~P5 zuEVL_i2Cy;>(8F;0!`e8oB6O335smQ2J75dYzXf$4NucFlQUZ6SXg0 zDn)~;SSbaAMi8faZFsRZm=DWl%noUFxh-Iq7dx0GiWXj<7q#1$6!IMbzI)EXm;77* z*5o5?RVpFo&&sStGy+$|rHZ2)9S5L-(DGz||CAyzgqSfN@f1TW#w4>K5_HBrKSd$vPF&lX&fvZ5US$Ag!jJwz1 z9nt|j!+{oV3jCo!PN^Gu;N+gpXK+$UzM?g<8eXnFH`c`gm0i*hdAF`o4zI+IrJ5E) zllF-!J;N2hM)*(-J1lU6h$b^M9nd{fCE@y|a0J*rRWcbb$S(-SzM13eR`|qg^;e>r z;HxZL|2)2OxbHB4t4;78x+_!`PQaZ>e0LXyWp+2?5k`3Lk>4n9mjf1w+IPE7?t|;b z-odiNyRUCAm$Lx*et7l(kjT54>g}nu1oLbFm5Q7|l0fbPq)SoyPI5&V4iE|$x1(&t z#bUk5a2N8RvblyHwU2s2tlZ>ed3@vUse|jYBL{cqlHZ;tBlh*^W5$K9&NX(~L*3Ca ztj|OTLV2l@J<_&N;C_~DRTxb&`Zkf(xr2~gc=;6@AqLcAAEAPr`utCEIeBN;s7RFuMKbeYF>W_~MmWm%*HU3hB34O2(&oy=>f&x7?DrMDusP&Og58*fIZ6PmJvmG8^y4BKc< z_m1r zx5J}mt3oVPH_Z`6X^v$t3kUoDhgpu=ztKcc)3E7#b?z}3me}iQo;Sy5fj7@MI8`)G zZjlYf;D8sE#BRz>V4OK3fmQCwF# z`!rlKv^@7U+^IOy$=2?YT(P?(SL`}TIFw6HIIuSB$qTxL5wYv8vawNZZXP?>SK>+Pg8*)^J8I(=6~l zQ0ZT!BddLfKlC=OL?t)t1+j;|oo;TKoW?W98e(A_Zome!CN{@y65Wr-@lrbZL1W$= zj1A8HiNliC&_!+aT0g7!I|bNGdGBtPeTwr;Bn=6*viI8_YP#0vIV504!W$6-LY zfq*dFkN%XI>4Kj#RxBva5r0ga@+!D~b=LmV)!pqN#7)oU& z;Zh()iDS$Oiq`=u0;>T{(JQBo(kSiA7B8_ zNu|+{3ko&$^8Z9MyoMEu+Ow9sX810gD2j?&Kv8u#E5trB&kFV6Mp->8R5PE*Ic$n# z}`23^yj@7mFtr4iPr(hs=I%I>JBth;Zem9Xrc=;O4X<=;P z-SNnyti0#3T<$Nyu~xfx%__ST&qXvQ=Am2rz(hETnsk39e`ycMQ_t0``l!@s;nlX9 zqn=N#_t@P?c1@avy%*-kDvXl<_rm;y>{>%dLz7Y~S-d5ITu^#Ql?0c^dl{vc268#r zgzQ+a(v9}vdR@$6dqrgUavmp-+BMh`49|oDAUO9J===p-!{-}e72B~b9LmN3wxzBu zToYa?8fSz*l~|n44X4cb2uOwDtd65Bkcahnmg6#pxozJS%foyupM2aAR?N$FN#6GC z7_^faweYE#F!L2rWCqSSdeMdU`}4&CW9s`$T>d%%*Zc7U6DPPKrl-B`6SVlNF^k*= z`vZwy5Mprbw|*zI8iX{M|9e0ne5j<5QQBpM1`HdJW$DNy@?$p+&9}s1oyNpn?8adn z%=tqUtH`kd`Eca8u!9`!O`Xco%Puwik_(Vau)?lge(gW)8sw2lq$P&4_;S*e*`5$g zXNa`xrq-F4C|BKu?YSR|?lQs<^U`yW0@@URCdS?4Wn$)nVr357Std?b&aFk6z*5W| z!e5fL!ya&WSmn~0e&LD9@rt}*M7T`l;6xd z)^GUvQf^JogGmrx*UYbd^mJ}ZLO^V}olVbJ%JjJVblj57XUFC7)UTYPXlh+g``9!f=f4Ive|C53oUzlQtg8aN_{9MQ?-|2& z2=iX3D!1q2(mym;0tN=(@A%m_%kAk7ShsXLn-#vH^`5Po-q&e!anCOGz|6MiF**5pR4>QS8O&HTb)Fr2?^MmRl(VbhB$xG02|*y+V**~B?7R+ZyK+@7FD z_Y}3JHE}L*_e=yJUm(aC$qC%Z$;buTbG?D?u6so8ApwHLF z8-}n6;h%)N8G2695yqwjd+RSnXl~cJ6jZbZz0_5U{R^kqnR`c|HW%pNYW@|Rk@UVM zD-bY->HPaOGw{Uvd3~ap@Dt*_63sdJ2<2`RojVjxO51+zs?@KMc2$&InXx&*xemS% zz-*%5C4yUJ^H5NKb;u>F-8$&07M0Eu(@8X_`EV5|n%Zo?ILFo0SFmpMjHzFbygk0z z?&r(p8qGa5Iuyc0?aSs01HJ%MyD1P`$e59c;mr({g>hFfuG+*MS{PT7pNd%Y*O|PN zUrj42{DjboQUPxY>44UxYZ{H{LGGNKf+`Oo|5XQazPe)c@zmW$AF*?(|3Z1JXPEq@ zD!Cy@`9fRmpJ~V^8n!(;yf^VvZe*6HZK&Gw6hGftVmp}FN53+*g2LWxA6$@FuMUaL zki;C5wgxwW!$OCHxjtE~*M3Z`$fy|G!FY-Cy?-qe33*ygtN#Rt+T5f30}bcy!jTnI z+3rw~=9yjjv=ofFxSRV1;Z5N*5JPW@FMdutFq7Pl?^21&a=VL0<^R^2+-%TWlbhTx z)&O#Em4gXnCh3>kUGH*D_;w67>Y9leh#ls)Wu_!=9G#d{N7QHUPj1rfEH!}61l=odm% zyAz^IfGb2pA*8BAOU5a!+||G^#nb0dvHHT}B^Wy6g&3sE7h=W$IchIfpY7R7S_&F7 zd;^DzX-qvbonh9}bK3YTu=L0ogHrVwa&YaZwNr`y0zc|=5!PJf(4MIoY)vvpkS36; z5$B1E$+rqiu^ZK86x&3_+pE-{Q%N`-*PTgz22)gj*16G4?I_u8(%~`p2UY16Q{-KjF(&wfwIXwN*eVkia$^-zAiCebTit483PE;f2oBL zti43vb7VFQ}OLms^ut4YebTH2~LG z*bkcG42?sG%-!hmjBeCu4>$tAcrg&W8SHUIzy$=Jr$FrJNesnH;b7x5$<`uj^`+S+ zYo~l+D)2=R0%)jUDqlC{fH$IC@zIo4*ssoXTa5=XgM;fe7~g5DQDN`;d$@g26RVKBxe3eRcRbuF2v7l?%B9=-R zC6mVm3XT*XbH#IPgkB$Kvj1A2F4%1;8!k!|&ORNEG zE6O8~yB*PP_N@1y;ix_3=c1^B9ER&(KuLR;Il;U@G4Xgq1s38^`ZVJFG!N}FK|8V- z4Jl*3)I-}LXn|rhHi-EXl`}qB%C0e#FMu(uREpN5YYaR=r6sTRsjy}--Q35}U1wD; zw+<1WOy?khs68>$nJ#d6hW<;D(aS*RNegJ77sYHmE~ACZ5uI>}jYM|RYDF!5qLx&i zQEJ`l82HQ?M555e@=8}>AReQ26vUs=1Ut83wrPBJe`YHM|#Uh9< zn?Ubnc8O&6)Xpl11$9~D;R<}p+K3Y;@X4^AZ~2*1VCGMqq4cDN6^YqGF;{6iJ~69Z zF+uL9{|f%u6O)6LsQrs{XC*rcDN8q|FSh$&=7Ap1=+&M!9C51$q>>{cVO=wSv8m|* zP$Zhgk%#M-AYE2kl3_U@ipzxE2Wj;A3VVXuY(XrSeadQ@h~6+`99EjrbI9F+JSe%L zUxsy~i^@3dB@s6D)B;}UyQWr^W*DPf(&Fi*-&B_2gBy4@4v}y;OVMFwn)$xUvnDMP zpW85-DKa1WrpXwfqrdAI@kRveWRfHh*HOG6=qUaeRjaR59*3nQDrw$0hoA|yCf2cf z;$M!Zy3vw?C4*4Cnr~U7l+JL8nKT03a$tyy!3yVq*uX+Sx7fagfbOx9eD{nHA)gPr zZ2y?@u?^Sbe7|Iq!r@ImxXh^iqMDTkK?r}SMAa$bhv5Q+ja{G^r2@qBSh0bH0LWAb zpiCG7F%>1s(xH-BdpSjPBv1vMsbaX2f8Josbu$Q1nbJvqRH@%+AHt`Q>~~a9E%qjY zQZuONCSEdMss!`-tpIsfNgh!WezdCg#l*LI{SHH)r7UNA`0bJ|jo}~XK@+bLY?qfiRq`p4_&&4EI$hI|>}G=NVNGbA(|2z20aD6AfYwQcGqPV4fqG zPxvuu5x@!Lt}Vd4P%u+2=FwhqmrB%++$bbRCerU1P{8CW!5ryg`k2&6)KPAfVIocX z-ype{+)o9w-6?%yTK9GB?0CTcnzEOfSX>M`)u0K+7H6rr2Q*bm%(sr@1W!J+*!R!0KU7?^r!zS4xKxLiswB zcdc|fl$f1h!>Z}CDvIIGDH^5^0DJpZ&9P7ZvvCuW*CkPBFZ81egqtA3o!5zQ;rf#b z>?j}&u?EQYAkC;xqhG)d)goB>#bqP@;9q!z zw>UzS-i8QI8Xcj&Ijy5bbUs2|q?kHFW%Egs=r}^P7U2eak+0TY- zE(5c3K`>`yVz@qEG+sEzBLmP6HA_C;OW+(k75fI=2wEWanp>T$7KmLnt_J^f7xyf8)H4UGF?m|1GA|ey`qR$g9P2l2*_zI|__OEX1M8pn4Nb`410r~4f zK4#C!zXkGQv4n5;0=_yT4|KveT;IaEIxg}$BXZPE%}~_-_!t@yM&zd;yLHX{#fbbG zP_)Y)g!CMO=F#sp%vg^iYfTOYfHtU6I>N4Qn85+Bg3^N0m{_oY694yNZwHmg>ZorzbUSM+plRE`x)UHXjE$*({(!1 z7@W?KL;60BDAIG7SFD=ww|>TYlGgv4f1Dix`PGTazSwAqL%Bx*tjUL$$>^W^9q^=} zdH!9a8WU7g!wf!?xC`WYf5PVDh8cW^a93Da!QvBy?(nImu9@SgLnfbDKp0-0A=rrY zYFh@c#YoA9m&>@z%x&;d#f$*(DtrEk0v4TSr)prs3_h%w4N(gw|A`eel+wv^X~+iF zwlV5YV1#(DYb<`G5?9C9G6X1Jt3X=Hd=zrW%VU?U(82$;tl@eDmi0_LYc zyQvxLlS_RWc$n_ezXmW^>j%O9HGl&>uzw9;#w}9GiS3`oNvluC;v6)JyWjBJ$t=#b zO6+qmCqXG;b&YwHt zu+l`WaURY?ML1ertRH(A4MiAcQe&!zQB#Bgd0As3QLvb7{O3*4&$-c~eGk?2; z?@;H!0Ct|ACPO=_o83Lk^8g&RZ&TaJ-3|7PV;|3n8>eykpD}{HIw#_66LAeA*pG7} zjyDnKFoK;oC!(K;kmtbJV{;;QXhG^gbv|G2{miKwK_ZcytG+-BX zBxcc8dznAyW@dh{To2^p{O6o|Kjc=EPk&0z1I(n6@@`Bp)5ByQY0`yGdUH6flpZs5WN*k>*UaBw>V;{+Kq#+-73V_s7UA;x#6w<1AveiRn0tc)Z4VZZj>DV9xf)OQ&x-1)9sqZ8;ro z2=O+-OmF6P7+I}#_skH28K;cwltJ@`Ju_PYqQY2yG8-7cZg9K1sovZy$GZhO=~&|;QS2_z{&`7$joX2oaBS4RUa1Rqqr`vbqF7_#2&4ANYDEQD z;rio|9JUQXaC~?}-wDH`b{|)$`q9X|r;UtmunB~iPv%B9JlOyEqeuwogy90W|MDZr zS3#PwZdhYe-RV9eCXB1c^u@nC#u-3dI=LybA70xx=KE48;GCD&8WEf0?mB_ zjt94@QoH*NLLuO?rQ|v!go}ajJD=NJeN zU^CN1cDlT_mP@N#pv1i7jzn^GVp0LQ@Yo%IN`~&aNpzAQS=UUp7ojX-o~Ia;L(NsN z@dCpRECR}CMe)>>o|dap4y5|pmz=5QG;%mZvy@9M++y=r^3FX zcJ@Z6;)AU-<1b6jEOOtN`=*CXp1I__%Na_XXf4i`m(XmP}k-&T{d!$|I4G9q1tDrJaZ=+2neQC#Ft(z1o?TN};o& z`oz4=F?6TUJDcc1IRUS5#3AW&evppQh$X4SE)g2xX2XIvjx-I zs@xdtSDG|BQB$MB_1Yjgk{b`^le~{B`I&fY64}F3Osl~FQ*3g&x0!*I#Q62coH0L| zGbxE&&ov!5j67DVuyDF51*1F^oXz&h|!lyx8nA|~w00naM zG5e1F)sO=>H{g0=_+kcRF>{IdVt=*1o7|65?zsf8{gG=KS)q}IJ@E=KvbR`LF8P9< zxUAZ*H!%f0@oLhnG%*Do7Fo|qOfr)cRsmcowi!ZQu~`P1gxO&wI`#RR zkHRHno3U32(8Osa17f(Q%oiSpoitr>6(a_?D+@Wia;=Da>hrt~9HN0CCIcdyGjqr) zhzBsrCzP}=mDC=&Pn1MZz<`!&_n^KdT>o>iUfd9^QJKj4s69f9EsMM55Qf~)&vlX@ zD)i|{0P~mp6NvS!nXX^uC_G#d=heahdUnuW{VYt-hjFAa>aFOBTN^}~F+#vO*mx}L8@|Anrvb~qSae}!~+ zrt35A?V#&(wDUk+bNdf;yp07L_(v{$LWzSr|2I-RzWZnEHNDCJ zcupF@I)Xa|l<{nB1mR`y%CQZKM#L6C{6Z^x}9m_0sgHv7* zz(MaO=uyXL)+1k@^6P-?!Cd( zeqVX|^!R0OX-%E7tOjY+{-!E1eMN=mMBmnut8S>{)VZWO&X=khr_Y%NV%HTo*W=On zjJ6k`AXBTni15m?65l1maAG)6RZ#wyQ|{wB$UOpbtE*0V+~CuTCSQd5({WNxzFY@E zt*bLZI#GD?XrTrcX>J*ltq)NvZ0I(Zif*gaC1SrT;Nn1s?D{^OBw{F ziQ4lQNX@A4EVES|#JvbRUwo;3&!oonFe!+?V!fDM3EaINh+|vM8j-8q`n?!Z;Hpl{ z^mGqvkzl=jWhYp0@Sg?qxKbCF(h672d0tz=agywp!TeQ;+RuWqQ69@jgykKbu`DRu z6)fDS%I7PdYkD!i%!Q_>CY?%F0fKW5_=S0g>)Wu{iOC(&%*%v zJO?jjpNG0b4=I>C2XTqoFM>SiRc__IWNI{-f)+!AY1y?2Q%}rmznhCqWgx(<^-i>6PoSMBKjrqypPM_Hj_eI#BRov6?0lgqN@7@@=WNavMruMmCk?=l~sa;vlD5 z`q(@QDA$+lgxa<*Q>Q!TI`y0B`-ta@J51xM8_pb=FOaXE@~s;y#o)`)2N+bR=a31S z#1wnBY#Pl%rca7q+)2yH=|PmMnZJSfiOwXk3T=wRTEe8R?~v5bkd$PQ#2D_||7N2u zuYT=>(RMN#(1FoOA~U(DfT=S^!tUU_Q2Aa)k4B8}d6|x2Ny}~Req;RlvO;70DGZ}? zW4v3-({GF&EJ&L|81^&TaKw(c{|GWRdy&oImD-$iX!P8n$7&8edU&I^^|Jo?zmz@h#{R#frv`o~38*ROwWG7W`WFHb^NQp`f0*{slduMMwwZqcKuE z9o=Mk?i1;PtU;kdaBG>M_ud(Lx7@P@=yXR>``t@B;Xc&<>IdpY*_o>9%#HHQ3F6f0 zB46EeSA)A`a11`&ssclrP;Nadq8$#VYT(l1tO3wC_xvR$#_|7P!7TY)=FrXr9b#X& zJ3*=Riri}K@xw=t+|&BeGxsxb7akmCbO%bEW-awM3g9I})9_PmMXAR&so7|AO#wF$~W?#qj*kT03E3 z(vmy2x=l--w&(TQ3Mx}y#i&WuUojX-5);& z&;VS4m`V-+b2JW&bJ8a$HDfjuiQ?3L6NWm~fJW_$HNzTYX&;FBn5ezUHMd@AVTnbP z+(B@A9^w&#_4jA&p<67#%f!vrPMfs`!T}H)?kALi)&>1{I3PXGFgs9 zO}W_@`D>OFi49`I{P2!b0moY_9s$(d4zk?#W_jUM*LxRRV zRV}!K5cj2*N;k1*ZsJz;BFqECylb@2gZRY%Spi%plVbgWpyMvp3NF@*+D(d?FPMCN zhQ)HE<`EO7@Jq%weT-X&sSQkPVu#PiVn$ALpreqWW~iX`2-oulCTFDH$u!mm^j+bo zq0Vy(hL;0kCl!Q;#SSY7cPpAwvIZAl9qOi2$ zy)f-kxC%jvU9Cbu?qKdCTo6{A?fxoZK^f!hxJ-epS$uysjU$d`Vj_7R`D=wyQ;c0VfX9VjuN(H~>fpr_D zf`_Zb#MW(;3Lfbg>n8Bj8)Teql!Bm#VZW)wt;vzVqO`f2(O|d&;dV}Yte33pZHP3W z{9V|DTK3DnJWuPYUO}z9XuxE`&lvf3QRKTw29M9^OGikdJ#O1iG)l(~cUa?&MN-yA z?FW<&gX)t30VnGx(4>9C_arTGCd`}t8wL3C@F>V1NC+g%wuf5q0nC^$dW{TJGd=`&^r({nUHc22d z^;|kqpQ@juh=gFGG16PFawQNO2MOgBwj9ZgMe33_eJ5_XwzS;r#AxeYW@5~!A|2nM z0H2QU)mZ_Oyya=6{Tw0mcB*OG)x#xAQ;$Ppn!ENTax;`wGuzeX^GfSxcC{c&hL#Aq z^{JQ8FAXvZ2F{MTw6=M%Q#2L@WA$22KOh+P)$kU`I>7Dmdg_9=(uywRVl!i_6;@x+ z*q1oS*c2(HU8ew_4(5`a%r^1juJx)|IC!=B3Tq_!R21_W-hmIEF~(}7V-PH39n>4G zeIJnY9I*+r-PT;hhIAmDL^v4jOJqZ?qm$bqff0W^bbvK&SG{vx_0lrT$~P~(D`CmX zP~XYNT;^k>W9*JTZdQO#9}RFs;A$oC7b|S>1MFv=yn312s`nTWF!g9P26I<^`icX1 zrMGAOW!MWzJXn4!%Tl+jZUV&q<=I6R`o8*#bYv@<8em`uh+pr`HqfJ^&nqe0`%miD z8rcpR1Nrl7nh5gG_mqZs_avUNq<~SzJM0HEGwIPgIRA1+72c|Btr|%__|hAt zWwjY^Vgf;)r)tOZR6CF^t5=Xg{T-J-*%UGeIm8mve8% zOF*0311vz{oxd8g<3XU!&PH^7{W3O)tkC`2a_*^XV+SEab=Zg=cd3p6gj>-g+cS~R zzYgRka6}2yiiDV&Zo;9WPD1SGH?Z*)D+-G?H!IAl%RRT^}{>7OZyaU zsa61A3OpX%nv9tQy;Oz^Z0g0#mwY-$gOa>;n3g(6KB}sQpHVd#x06FWy`s^&9CF#` zxm69f2VQ`TWrPbV^|(0AMxka&kb$6E%t|e44~jgGnN5R^-3{ zOrFzDB`rYfn)w@y4KN?mLb+=8qXdkrk2spheH)M_UMX9*f~Ta+o2P3j^ED~(!1EOQ zO6RM>+Cktb1tMWplF){i&tXUpS|v{F9f+OT5#CtVyCL~wpe365+dbA-Kf1+mtso%- zFqr6}df`c=-*sd`)^YQ&HWs)-JcN~tp`)T@QZs*LuQZM&@kMd-YCN!3p~B-4fmo!tX69ccCOVSJ|=OiR>EZLCp$SJ zF4mCsbi~Q;aA_)6WPL zTF!{rUk6N?#Jgj6fD|lmXJwAg!mDFr(3ly7*fr^Xv=)qih*l~WrBq?Fs&MD71m5N2 zl&2}!ZiNNgYt}ALVwT$zYGa7<2W4N5_(cX#t#`ui8>aAVwO006KJ~U zd+A3{wb5XrStJT46HrU1Vs}S#BzmucozN@hv9QH*Fu}9{wHkEF0CNZt)N-vNyd+ra zgJYFWjXI1dk`rFh;y9R}BAq~El7EIt25vsQgJK4_ipdBf<}zO~RP~ii?pIg{f1E0XUI?(uy+02Anm<$LsL z&8^Q?y?DM|t4Z82M%6r<;=Vrp7xb6doz)%pc(l!a>`bS>tm9_F?(<;#(Z>+h?Yl0X zTy{)YKgH7%5_Qe%$UHs-4JIk9W5qpHL;9%QLov~1WzaNukJn1pa{-L%v&mOM9YlG) zOfDkh=f9)}l;Mrt-4O{rQ>J6Tb(+Y-EqVJ%0{~QEZsG^sBFq!b1fIaFVYv=`0`&N_ z!nhr8vC=@XQQI1!8Qfkq2~Y4=SmPkReR7omb5~#^Yc}~hMGG&xkAHoX$15dftNP=j zXGU`E38@W75~z!Wz|yjXk)|oTo5{Sa9CF)`lSH#56Fa$42&)^CuaRRje*-b5AYn~` zZ4y!-YM+tM|Zkj(s0*UtW)%e4FqIUK@UO4IgMcGmSGuUVKH!h6rEN) zVdHdM(^5PQGXk$KXD`(-?}!e%P$_V5znG?5ti1JLFKYj+QZ(FAc~=!GFEfWE1(FVg zq^>O|2Qjzyds<+a&_s}apWtlrDEy+XG9am@RpAYC-le1Xrgz#X(G4?#$Vo;x)&)x3 zoXlZ4X+qrj5<4WktPnJyAP0Xgj`kbCOR9z37aU)*e=lW^^%Z7A<&N6FRH02Iijdi1 zP2u)1&HjtnvW7kp*80ST#khWKc>fx_eJW@;T@>FS@6+!>1#}q=GfJQWtf?VE%(3Iw zK2Z^9}N2 ziJ7IId-c7bo@Gz0;5~)yc+^!|4WlQ?25&Pg2@0xt9wD)UZUD&3pj2o>vqf)#Q}J>y zqGTsLOv?ic@P#Oux%EiQsL`hn$9bS4TzGNR{#45o#xk-~+{OgO7$!NJbm&e{ScMw| z#VMa0t+qfUxv#NNkQ!$ET&`4PmN0hYALPZ_40E&((frUnSIGo)H5f(hL0W2F6UQ#r zzPEZ~Iz@X|b3<;&Jq2#BYS@_vuiIqRRUW{53&KCIM86g{4peaAkt(HLOA{-2w?ZI( zm~{%sO-pJ`k~+{D5=xXtZX9T(OQN?s3=5G&np zp6{=~l6c>y*?Amx9QWE&3ag*0A;QiO4h!C%Ch??_|@B9Fsjnl0%B^fKn z=v)s{_LTm5F)f%fpXvJP9QNtU+Sn4Djx4~Ke!h)4n>=Q&;3$jIG<4Nbky!@b7S%jq zs2Cv&?E!?POS4Q1k`uoZN;+`DI-7_PeWz?-X8gc1{J;J02M@GczT{Jz#A@H8e8i8*f4dKXZ8;H@xex=l}q{+b)LHaYTqPvsFc1txTXRsZW| z;UzuH@1u*k7{-R4TW`7+HeVCESpl4*H6{Q47%ll^nbacZwC6&E@G7U9S*%sy#VG;y z_W|MO71;1?NAH%twxQrVwO~_nAxh!>rGj8pJdNDmpu~FlEL0W9-6*@C&}Q(&r=31Y zn6o!|E+R6L7kE+FOGe-9Fo>`INU{!RRFZGOOCgZ=Tlid>P416Rb`JShX~g^OGekI> z{tYA1IV73sx)H+8p_0HK5fEIfQ*?=;!^8F8hkHS7!6ulLTq&+sT#pLZUyDLFfoTWn z$DnY1kX;D51^a~9h}=(cgOG-94A-CH65Kegk3z?W>(58uHg~Rz_p@;Qy@U(}B%ACD zX|PtaRc^!V!$1JCB!-?4>n?wp3#_mrKL4QrjyLynQ@drjDfKe|skM1}BbenugdJZws_%e)L>E)!zNC@S%K7AjfI~e=+ z(Q52AiL4y63giwIQcO5+b(SxW_N+UNJUQU!)p{@~noaHpB9w^y zNi_3Mc=Caek6-9x@BkO&V+iv7!yq;aAiQk769c2FE`muZbRMjUc zt81p>oSmS?pk~vc?$zq*GpPGvvfz$tlUt2tWwA(mDUzqqtUJX*!^(k|XznXX97ki! zB5i7Ct3B~#G1!J=Kk8O0K@b?(!0=p+ONINDE<*rtjx#L5yq?_DG_(lC2lO}W>S$nN~7+NIFAnKqs02Q?o|iiDMoN!&Rr}Fdj2B3^&Xe0M(dXlP0fYn9MaD zk{OR=So(>f!{VoErrq)oXN*W0-yLk6vxd#!&ZvEzx{YF6Wr~|mDAw*4dT1Hsks6CQ zt`}IMCE+@q5Ut9o^QNk^`CwI#9h=Umhnge4KpjD&I)aA!?sRufrO!XFHW^;Fl(_U- z-8pC^`>6ei>ZGCmo21bK(;8jXFoTX#Ye_KP$BARLXqZ6@HlmhBwpO$5Rdeellqn8N zjGEdSdPQu1`HPoyq-MHq^j(dPV?QPby`-pyLa;o}tQntvzse_+xevCR+6_viBJ{Pp zW?vh}ei?^7xnry)8IKso5`_4!j}^)Hv?VasB9frFei#+n9uCgj1Lhb|X9sO!7&$W` z)Y|6@y$lRUl|I}T%Arc@9cURK|m(R}X5&+`elMKx)o zX&?e7LD+G$@4ui!%UZXBtt_1Abo`svfQt{wJt$mvjzD~mh4dXD; z#La_9tQ82G7MQAaAW2S95=XoF7s)J%?F{xeG{$pR`9oj;Y#<`rjDhBc<4X}Rgn{3` zgxS4z``9a`C=nsbB}W}hc^4Tqa}cnrF`F{lhc2`F~n6Aan zmSaKYOe0;c+)Z#oSLyYaTJ8u!RPY{N#nXuwRmp2!cr-B6_ zT#Fdn-_^bnm76h;4aN^-ckvCdbSCFN9wgSK*S>t{i&&=-iORN3%N@dh`{I}Q3Hv<|7z@Q&>dL2el9w= zzOJQrVoEp|za_m_L<7@-Yyf8(9nI`Dbyd_JpgGEzT`{?1IQ;Y83cnlKGNm;IF_}5H z&^1i+mDUMI8P`y54S}Y(oA9s% zM>*L~8OYZ%{&Yjuqmb-uDKW|$wW}O5v5EXyB)i0rtvlS2Q&PLqN7l_x7Rcj8KCVVW zT75R&S?_0=bH&j$00xQ-fS|oLfITDf8Gz*0F@Qa$h5;O+wy!IXn8>98Xl}I`k&PV2 zAkc_h0;scwDJ!_&n|v%9ajxZJkA~ZG^}=T2fdF(pUP8Oa&rsZLF zBc)Ih&CC(b3jPISca3A$qs;0Do51_BPKn2FU?VgUMQ68MCw11Ei~!sZCq!3X?RxM8 zQSMU|mn36I=6fV*k7Nl+CMZho6}0`H93|GBzoH!9b>s*qH$yWn<5LXde|U^f@)+A> zypJc#z~>PT8j=$bFygn5bHyJ@lz-H?4a5|N|EyuF&Ler*BbiNc3eyw7m8A=&JaoaK=O{sff6J(4KH{S3)i1WYRXdL$Ex zvIU21O=I{p!|!R>%6cSiSGnq0N0ethl7BJ$s39rKx~crpBk2vOJ<}sOpW)jK$)z62 ztscpEqFkmZxn~Ltv(%a@1~GV`@hS1EVXxLaP*`u1SLYOTi zEPoAzi~->=LwH~j;iE#BDI^?BLdJkFXb9UdOXJV_#lVT$m$-zI^~*{40DeHYW~^&7 ziwORT;1c^W1?OfL@f#s?+4A!ERAiXr4>c78#=D}*l{QlPW_Nyr!wjxdDZ zEF!#H2!ByXcnS#_1Hvwb@O?}d`BPjdgqIZ(#z^=wen9xj57b;16%oFHX!I`&3EN1x z&pIKz+YsJdM7T^+{P3Fvc{~U-7Gsd&SVK6hi10hWiQ132grOYY)$?a&gka3{VQj-< zl7~@d-7bkwa51E0s+l-rkoZ3?)9f~b5SFf;7poo^$|h=Ol-LB(yahpaiXpq5i&th4 zuA}W{j!NI<#cYrL?Cu)+(A2n)Ti48!Mo zVHvhIc;Pij)t=&o4}Jq-%M1U6;W1u#HN(|j_<%PN9_ocBGCar&w=jHw7w-F4gv-6K z#qjpao#L~eVc7PRxV88H=>W*L(l8$rn`paEmAKe9aGx)5(6#4FhO$$PVXW1?tTd$(&&!H_fD3H8 zc+6$HzO2s+%)f~s)>}6b1mj)p^WMQ8Pj0=D{eKLX-UDwQ1n zHFU`#20xt49ea?eLQZzgqN}~HM)>n;3j=J}TaKwkH?KGMR}v>j$LZcHlie3I5`yCX z4nG+#aDkkDQf#oHWNG>3`ef{Q_d5_f%(@B%XgtUk487d!%1Cr2h9rv3C871uLN@sp zez9lYxm#9mEF3P1uZ7SS5-XKhw~UC2GI~QxZ@5JAjvO4TVt%T*W(F$!A#v26dY~wR zFC$_-o6_6&V45GI;hvRA@RwL36}97huS4^c(%8SiU*1;3_)b>Iu+3zOm*HTC48MYj zTxCYVu#yd)_PC0nhw+_as4`iW68@R+puOrHUr}08A1_L#f7@ZzOGF2Iw0{y z=i+FTCN8`&<Z+jyE0$8U(MkJS2ZO26-}sBvDGOOJeuP(rVE{%DF#sDW;k=Mm15Kqw zt{7J&?i^K=Un&atn;L>uT5i^{j~FWT9Lq1VIy?mnub!`{sax?7D?{v%)=;-Jaz4ET6qy;8}ixA%k1h#Isxsh&9s7{RyCxjKsQBZ?5RbGT{8=h6O#F@w*fj*nya!#2#LX}5Qj^z55*Tx&o@TC7#7(Uu4{5NQ#BA5#%#qMp3vTdpP!5p1t$hKG2%3l(Rcm&9?Jgyv9K{)>I|$QRi5 zb}{^rsA!MM^pbDxrcC?4RZyn)A{{p~P)#5=4G^fRe9~do8c)LX_lisQQsPOCIU)XI zE!7j^HE6-QIjZpQKf3mmA~o!+HLG1;Am0vj*bC)*2M}XT;rf*j*}fQ+5$k*_#S?ef zVvxiIjHdY$4;I?Tc(5;MmyMBa!y;eYd^9d5*oJ6Y4X-C+MUUEz2DQFF!)juG_L{-E zX0`-Vr=9P37&L5uz}gq&O|8n@N1F5;q7=SU4fSwGW&eEzQ#LVS5z;i04=dAY@iTy? ze4|#y-{`j0ADpFRCTQHw$9R*@)sooHlj!10y{p}J$mIQ)t=4)u@Woio$wm_&nvDJI zqqh+UD~)`D0V|CbtWMGX4rAy!d6ecPylm7qCpRU*HFc*Y`Ra8bc0BdhDGFE;B~^c) z$MTQR`u|7Xo4`j^oqyw#Wi%piqk`g&JGfF;Af!fR5bM&>idq%Lia2U*U1q>m1BsKt zgfU7j)TQbV#J#rCRu=skMa2YL+Tw0otf*1%IH*)nqowBkexK)@d+%%^aeM#o=g;TE zzI-`(&WKv#g#r`S1duPnFBPE4|<<5V>r2P97L zdN`DbnNvsXhaTznTl|L_8C7xWX@D94Qju8-vRE56)=G0t-{GTMs8pW4s6(htjnboe z;0K<#Z46_9CvNU)E_ZYx(@49@rbQYiLc0KHQxLxg{;fwamQRAhJ#3&6?oSy~S%mx3 z%i%=njlTQy@WOn96Zb03+(<$L5RrUqL&Z9ZkbQRfoa} z7z#aOSr<^wegg#UWLM=>IL@t0hr}w!Ci~Fu{9YdP?BxLM8*dM6Pvh#UAsey5H$R_a z;spcdvlw zdwc2`{6aqYBF6V7<$%mh{h5h-`!aGVlmw$5j~iwkqTll!AQTjus+k5Y|}OB@G;)4M6pa zVkl=8qOm~%*e4Z({n3mNbH`hk9 zmwIS?cC4Twh(es`_SIw4;{#1^S*+=YamZ7&#wfr|rU5Q4teJCCZyL^>0B~+Xi+G%~ zSNr`i(AM4kigfdMZL3}Q1TS@3FJZoS?;WOHGk-xw=)qx_Fni%$Cs+%Ya{Pu6dKQ`h z^T;=b6-cd-O#Wh9AT6)?vKo|lEdc`ovf|LvCW0zf-nR*yr?9r?Lp}s^ibiH_?`R#& z+Tg1^4u#9IIIPMCOdsS=91d9&$53K4+|}`*=yqRH7n>BI)AY@X&}omc!jtTIAklhG zNCZ&)6rc-PTMsX+T!23h0NhUi4$YOX7mgBua6iHzfRO=%x$vNF)RT$%Ds`F5G1ez* zWtE7fZ+Ioni-5>D@5`g}AWHiZ48v-~lK7-M zH0}G;mxeJDrfyP*CPXBti|M?Pt9U^-{|9R1%m%yc(v^cb6Y1AX#IrW78g zy&|rn@yVkNWj#u8c#g(YlsG~C5o&1RPCC~REnv2c{WFN(sgyX#6^`y zn>?aelWtv5I@0E#dPk}b+^0Yzq$Zy1tO~JXfZXTS4te_}vE^VgILG1QR|?U{a^`G6 z0cAMfT2?MHf{-l;#e!|Honu2@^{SnnTWy$SoHx1IITrOxeYGiH5ZhK)FN+W2H?jjBK zv!JCLprt=DGLPUpHVBfQ7CQ#Ml@i@$hhS$fJ6x!4Xq5df3h{6l%{Zlqf!Ex_5G;}t z+z6dPLfP$NO@8+e%&CuAx%g#5E(MJwcExvyJ?a;)u*DhXC6wJwN|}kg*IvhZ)7}Q* zd&J(P=VI1q5KYU8H`$(>g?Ktg?9O;P@6U?7KW5<6oA}D%4`9jMZjSyCc{s(aYQq1DPJo{T^wF0hzkvSMM$_GELq7UouUVR(`ClNGAP* z5gv9{T@9O4Q+QsWv5kKaJ*S{Q<;D8* zUR{2FW*(K_pML-kFc|*-1ntR(F1x0Ic^Kv3+8x_Xx)qad%~e$aO|cSV3Jis0j0p)< zA?zPu>G=NmQBTGX1_%+cU4{OJ(hm0XC_X-2vC9fP)=6Zc^%4#@^DIX(2;9DC+Fg01 zU{3A8>O-2lu%FxiyJ{dzg02JpFh&wtRjl(bY}KmRVbY6{U?$=}X)nkWBCI+Bb^`1A z2-@-X9zFnrhsCDMCSQk1)j4I-Pa%M$K#nA%ru)BC3k~Os(aZqxU{h3LqXY?s^u1D$ z{{4kOVkc^)|3^swO+z3f7bGica(jA@7E-c`q6mRS{~Fhh#D)c;+hL<0%=r}I4bu^K zd}`Ux!kH_uS%JtjC*h7nObhy>Cfgm)c28E2UJoiFuAQXT?H-N&K>G5^1`>3-avz@` z_zD!uf#M!Mif0gBrNRSg1Z4Lmplkrf=wdKlAFa}&#>PWsd`)EC^piXyQ&!2S3j*M> zh95a7y;SR~g<}5GIwdY3;C#6!IHzec;-!!>BnrM9!gH42We`8qgN;|ziMsV0glDqJ zfuqC{DnKOAQ9zk$aKKtC?1U_=PjCGZ5Le;T7}Bo-MiPw+4)|)KF#OO!8T4Zp2gtNsgl#CY4Cg3Z7vcUX$TF&V zqg*(10?nVK$j1n$=@}SBuS+;7AfcGJH!(nWTfhIJ7iEWS4e@I6rQ&Ev?9HTi2Nj>VC8+ zcBNtILbQ$Wi?IhlH#1tDbEwEk<{IqtcBGa81j>XO+xYYao@O8xBcIJeD8z70d~dJR zg%Lx^@Ew}{C(UU|J&N~a8-GJT+cYV!o2KQ@6I~U}k+*HRr6`e}%ior{4@n*VN*z9+ z4*#GIPWEcK;Rrd=9C<5UE9>sXk+)k?3sEG!qrNBJ1|dM0w{SS$U8X~2zowmjkA9@* zvS4%5XnB!4mR}wEU4aGoStRQz)kPHpRQ;)2=9u##eYlQ3Fi%1Y5 zxy+hEuW@u;fwZW5s0yQb1rK;O{?&t(2NibTbT=o}iD3&I#CPWc{vN0>@&sn}Cq`f{ zKipjh;o(s-k(*-Y$gtIlW5CD1V~Q{m$=CraRI+|U$!Z@PUcsq@5xh`*JO8CNaghIl zSjTz7H3Ho=!c}QHwl_Kh{gDHN3<5PtacvRF(J^m{taA|%mb9xs9Hn#8qp{NhR9x33 zef6ox< zmEn7llAg=ombrK0H`&Htslx}<;U6o*ELTK^=OMYMz-`cR%9CLhv@$GRv}$OHMNwYh zK8L_Ng(4ncnv;T*`!ZkIC^9cV(t}xjO3Q45%B7=|ItSyPC+>qsZdBZl{xpwK6!-VB z0Zc{>0x%z^S|{}pS~O;@nB0$6V8%eM{YXI9(nw9+9I6tgRk6DQ!ct+YscV$# z;ZN2}ZNRdc8EOz3DBb2O4a73!(*XXqJ`J`wY@;+dN`>7QR?^_z5lVw<0P|_EzmsAo zdZ59f3e3>J{jdib+#8@l_s6EYK^k1B6b#T{1AG)|`$Tq1(;zVsb=2f-ap=bTuWje` z{{ZPfJ{TV>klQAxl`Rq&EW_=4t?r~Kx_G8<5!#V4+%|ZEHkgb4XX`Bbm!IPHM+pWh zU@wYnwqTTh)kp5i{Z-t?0XZCzMW^7hG@(;#i>Hzh;6`ht4Q-cdgNnNC3@691)2o1T zX*;b<7_Sm$CV^&9_+UT9X!f90Wm`tPEYl$%?YCMb*V;A1&92 zeT97iC2d^W3{*NIbMUKOwR`Rm!YJSw#(x60CffZ|G4O)Ij09fg9=N9@y0vJF;#^FY zou)VZ28=4d_ny&(IhP;dhD_x-C3PY0qw!ON#wzMUWDfNH0VDRr=V^tD9WBc=ZXwsz zMAl!mNs<>bj|@yrba#0nNfx;&>i$sGh0mtT6{fAp($@NJk^Wn2%l+;M5sdkaKt+)N%3Ly!)Uqrl>;7#5#Tu4gOWy0QK;`QI^4S3b zBy$lUTglLnRt+p#6Pe>&x2kB}SDh=AXZWkETUVuN=Vm_h({6Dbm4oMJs z%sfYpBpqf6_V|js0-OIcD?*Qu$}KCVe43cqybAGx-hztcXl9_MW7!I z^_|XC`ou@xhN~kCD88q#HYl;XcLNoZ5^jrz;PJAi~8yg`YZ^u#?2J;DE-g#mTuUlK=E~&x- z;0r02eYrhY-pMPE$cW)()d;QbmnR_o5Qz(4u*Z^NTxdv;4g`yHJyX>0L+sEUsxKx8 zqLYIA557awMFaj%oV*6zHF%+7XIW;C++=Lil(QBZV?7OGqZ75Ld!)jr@{sVFEOPF? zZHbRt_e7OAwPSQAL;b(yRajyx#0M!DatD#)QiD)0E1SAEQ8Y&5I1`8JyL70Itwf^q z_0V@zW+d`x^ujWFn26&|Uc|${YC~ddh5&X{YIk|5-HX_wB)+MMAWM063+etW@fR7d zM*`|QLkVnz*%+%y%^rf6B6KgN z4!9`=wr28MLJ_#oPP~cKEFF~ebS;TPqH~rtN8W_mmM4yN$3lTxp0d!kw$KVem8}Rf zXsPp9T?M^{E1V^j<$Hu+V^hoGP@XqwyC87CQaLKDufdg#M-UW7)FtY6Do0Jak$=)# zE}=3DfycFwpDa9e@6}{AoNpmi?n=?xLsTtAPl*S1n%)YK1zuSzoF%u07^oHyLF>1o zYMBS;BZskQjCvNH^-9 zrpYqSWO$-45MlSKHw6~FO}9Y?Rn^q;C|W571>>hmn3^HAR)JAtJ~pMTnVUwneFtvI zGRXLwyKfpdmc;H2wST9#MPhqc#p=Z1*eWQ2nOoj7RHh7KI70zz-ME&Y@R!mU){=*b z{g=|v>GQ6!^*)626hcR;6B7<_E|ft+zBy^_yN_>a?Iwq_mLB ze0LWSwbroChp%Aujwt8)*+5WJbhpE4`XyN)jY$ejMk7+(M}a3#brHD|%cxyrXZmy* zhNBzMEuStKY=8hT5o(>#h4AmQLm;aMP|rg#moB#KS%s8E*E9bD0(of-Z7c%hI8W3( zF}LA2r2FGrL?rzF>&<)444hwN8=g+#^MtmUeKjprYUKT@qs>))ywMWpe_1BhjNaMU zL9N=3c{Or<@Q!(Xh69NJHB2n?@yY9s!Z9_u0z5sPT{47+??ANcHY9)P$jv@9p9bRCRc9e`Y> zkPTR)!1rz+paS|2(PJ~BmvYnAAhT0OR*IaBBcEPEuCelB#8IZ%3UhA_*GAE9E>%guqchajuG$7CGwV3k0GLVj! zwhF=+;_k3ec9y{d=FLYIo(uLmtz>kIEp)V{N5WsF_gaHjyW&>0&dg#O zGkyGxJ_ZFzak|0FP=|rk&yip*MI%h>Fo1E71(3wc#H^c|o2++X-)165yTmIre}ym0 z+Nn$NwOI%ycM!(&`?!{_54MkMd(%g+2K%^{eSA)klE)4_YOqXrQCUgM>jSqGiuECW zRd-^L$UTN~xBHT@?kJTPb0Q{wrts$kk3SwJyDAp$m*1{HSg8C5? zF&Tp3D19*j5Ql&dR|}2x6?ztR=cy>kiJTngmh=B1MKcMkgFMErhh){mvxRdK1ThuQ z76!9^E0BcnTFj=uggHTZHd?|PoPx9%raH!FMX-w9OJ)C55E+W5AW0-PxeU`g9j+A+ zo+@aH=Lh8eNwF3JWS=Ma9Pfx8nwhQ5(8ll{VYfjcp*>H?!3>QJ{o&MEMfxGxtkf5?a|s_23;SP${T~(moHA4ZiPDaN61+2>Gv<+=Gv<+=Gv<+= zGkoOMrI#q4Gct#aZD3p1OIt%V-|Sw-r-Q~8qXXYUsS6aNjufU`GC#KPbW>51r;kt1 zWpnVw=P!0GTT+lOyz^JK8RdyvmlpVV0`ITDTcsYPXMsU`>1=R56hBg5(+zx8kmRty zszb*J-C69xw4g5`=-+p~n>m>T~6;?;;AvDVBnI^NZvHjcZhJNk%r@{dS-HTSD9rym{ z1O*0l+EdEI$zO_^NueqBOMJsc2jDA&O7KTP8_72QZsIg8BCh%}W1v2S;@f0+I6>dG zb(+q_OJ+WP%#=4Vfu5@1br6He2!W;*Na~aPxF!F&Bf>7CD7OfF9>?Z;m6xDSW4Eq*IKyzUM3BT zPtndZcF_;&-ff=M9dI1SKhKZor4DhHVOocLyVEBNCoQ=(;!otXE|8kKoLGUD8b_D+D;!9|oZvQfw%lsBWFh>J}f+^(6N?(a|Tg3>Gl4$rRt= z&*zEnX`0|GB0RiEX)nOBUZyIWfawMXYOV>3XIJWYNS@h7Wt4UZCVX$vZ*!({)?i?# zXDa>u)0m#ByaMEpx(snaGm~?h;bh13-WZ*uESUbWKd=J_+4o9m8()*yxIIszfF~CN zytx84F*ePnChLxtz?sg>R`kKZ)UcalXIGk7ntEAf{6xJ5QMZEAdKsx4!v+=%u+Es+ zb%ITs7%|1>C8cm~H|udTlk{EVcV-ab7rZp59gbNpq!UAnZT=UC7-?>ol5yN-ix_lh zgA3CstAvc0bPtKGMw(d|Z?7$6S~d};u;g)CGTAkB>X2CFJ6_RsDsh>!P_#V-_Ze83 z#kcV<-lKBBFWSEBAjHU16tuY?j~=JTS71(Yn|nTa7Dua-9zR5?Nt zI3s)j5VYh{r#PHL)`jL*KSlJ%=X z@lol>sshAtKZ{pVv?vd`%zns@?d$X8Ot{5EKr(+qy8Fjxxe??%7I`HQWQ{5$GR1#p-jen*Y@jr(vm4^GA`=5usFCeGwh3iM%jJW){QmX zcAkzbM?{m65Htv@q~dP%I`unesy!z6#Csx2Es+(;`V}FtVyTZTLavKKeX zR#PPq@cI_NN{m&0rbRLtd>{1jumP{577r)&EcoC7KFRG`uddOBJ;PtEe9vkmh`DfVc@yV?6h+jnlTHkM~wD?u-^{dQb zm20#}=2L|5@_TF}I-m6?OZkF`&d*suxe=ZJ*G~>cbiUJ14n}lt)#S|2@>n8^zI{(5?4n}nTxt|=2=zOjwXTG0@lty%3yuwmSqVonLI`8en3r2L_%E0T! zTr0?Tjp#hZgC{XyS3**3MCX50D0SNNDr!XM{cOeJ5uI<-%A`;wgE5)S0NQZX2qIc6%JoL5l;GyktwQCJ@g z%zS{~gJ59hAqHM$9y|@qe31uF5D5lmehnYYIN$v<=25{OXnf@Zb1MepE8lG@-jG*O z<12smbWYcU@s%$&6@QplQR6Ew%dHrUuY9nnI5e-K##g>3w_-59@_$0w$9FKPiuHfj z8yqh&>3>7|SBhc$pXJiq_S8MtPv97WP{uDmA!&J`jMs+k0ANEI|MV#-mmkXbUQLFi z77Jzkxi**^%6L9z&?4Ms3E$wgrJ;;3@!utm@Ff3zIEdm#{de)XuJhkzf-yqhV@D|k z8OnHnzey=Fz^@{qjQ?9{yQ?U?=f4XIulnz@)%lma_cs515>foE|Nao)Z}Z=`r0Z;} zzRMzYmaLANg(qghGfTD{MoZG=IJtpy+g#3K!OQIc>{wUo9z$%?EH^{B!il=qDJRS; zPCIj8KLiIB46UnC)*Yk`w+bMv$>(y2AIzN3D})60Uf?O-4C8gp2+nq1`>zL8W;>5* z5wFVcOqIZF=K;UUP&Sv=A~qPZeE#JZRsU1!y)1U~GLbs_DV1|j>=4Y7?Ud1x?#uA8 zkzS6W4ENlbGn*SN2${iX3m?vke28cZo0&4%pQ1p{*VM~TO&{OIkDuuX0y9>Yrz;!r zrIP?1=Cwyp1;1f`nq5TTt_u1n?{IUaDBOigP^HEB@yk(C@oH18oK5Jcr zwri+;9akm6h46d(Ff}#|ACR3?EnaZJ?i4B~4#2nZ!I_4jXRUl{S%Dj~%T}08Sh*#- z3`v^|XF6{5u9;j_fn|Ev-ZYS`z%SPi7s4CedwAt=OWfQC_Nc+B8qNFy&EOVBwsXg@ zl?=sE8QZXedt3wf+9R^zHKQk2!GG+%CD<>2ObF@s?*L9b8IGDSMk69zK-IAKbC0ZMQLy0qbgKB#N>5AQ_jrXd( z;T*CcGi^8|QChP5ao<=|{n3=H!WOJTOeJkp7LFb{b@65$CX}=@=W;zPo3u(<`+Zxy zF_LYQNgk)^9F$TA4Q^WKNq~(|p;h5zxaD+IocOuzG z>D^>L1xa_P9^8}K9HvU?W|y<%2HM|IgHjt{yrzCL7=!~D><0`?(*}=9Y1%j>c%~c_D~Ax05(Nq$$L6y%;J<93AcXvzD6A^5k(1SHC5A< zqq(u+iia_R8zIOp2h1@01ehm7AOLd`{)j>0YmKBj$uoBHD6>RL*j-3bVbxmhMLH>L z$;h{+erq{X7%wx0JO5W~E(|6lpYWq5=*d{gj@WEekQ7^QEk1~0GNG>+?4$19kEr!l z3VfX+X}>iJ4V$l~X$|mTtKCTw8Y*j>a_z{Qm??wo>|5bTBvvSV|NC@hMjxg;Z2NEu zis#!Gra4JE#qyg<{{R)w(!L87duj<%@@KS_OXJtIQNYZjar2UV8n-Lejg)DeA2sVrq(1_C)x=Z?Yx-NpsG{ly$b>kq#OmMEgX8W9S znw;3mD|s}ko{o~)%>b4UfS+vR1H!D+{R!lQ1hYY&`@9;F%^;o_{&x!#E9}`F<}6tx zZ7sQtf3!RSu>46{zU9eN6VYqxz)DUYW<{WvsCjiwtY(s_L9b< zyKE6tscl*XR}3btl7t7j_RlNpRUhIddDX+2)3)Qxj{RW82k=))nNi4T8i{;CwI^v5 zxyRh=>4msoU1d$6=x7D^l$O*;Ku)&tcN6EDqql;l&E-qFa&9%mzk3a*`BHxedh$BW23F4h)RaHd)TyPhp-$48v4H^ve08xjU&@S4x7qnBwuhn} zFk|N~3U=h%Q?cWAHVObQsd24?o~8!*oNw)4ZC|2C%M*%45LjgjKYzAXmem=`dkoq9 zLFtF+qzWxHm9jqNQ_+nYQ4A+}DQ-JJfmo27*C`Q7k@EnXolnk}{veG8$T=uSF1|f- z{&z?A$_VF--v@bGN;nUMrgQK`wOskced!9IIVs}m4bhL40(G*xFZ#VPImgs(sA;KT zDIwQQ-#+Jk+>F4A>(<=4L~%WM@sHBeQjD8wv-26ZqjoUBxHFWMMy$R)#*N*fgdWg) zu(f}=5&m2)uu9O9ijskC{FM*_e5goE>Jwe%=nNT**#drHPx#`@EM`wywfCjyxWCQL zr{jyNbpbkVl_PuK9vwGe1W3=7jvD(pd=>itBlcVq##`Pl(Yt__%w^_qe2BkdG{#m| zMI2j9o%n=>xBd|br1vbb-OY`v64Fq2RrU`?fZHXPa{z(E85&!zk?KxzLw`=nBuz_> zXw?E(T)p7wZO3oFqTU|*I|0xKy^SyYzoNH0qFLFSD?SZ>OvMUjI&X@2o>C|vZws`` zmbbmytmxg!u;*#`wYXTo4oo@YSMT)pI7mmbjlZI|e1P8aPoMPmMeThly`5^a^Xa(b z1491*9nZ*-y>Cx%$8ICb8FbtjsLQu4r6{lDWP~#JY!(>v()WKw-T7Pr^g(wG=A+`MR@nj_iGVbgUZGv+hLvK_*{!F2eV0Z`}F*JwZ7rHOcE?zWA5| z=!5QTxbJJwok*W`=Poqc!?-ifX6N(#y}R>yzK=@5w?6I++VU&u&REeM{)+DK0lLFK zebSwY+WS(v^M%So;rM;mUHNo;Qz`qc({W{W&$=_NwC)^$kK3N^Y;|W)cfP`mpiVf$ zU*QZN5Dbie5DX0D>E%rRDWzvA&P=x1`4Yal_9HMl9HYGY);V(^B1w7EXZE`HGXj3y z@i_CdJH95)i~$bGHvS4{_yErEPoFq5T}(Tl)7+rdIo{$ii)N{mJ6xqQJs+rF~T*3+))I7sA~C@e7X(E!`5W>@u^?*LLk za&LE4KQ7o+-S;hsQy+F!H*`w*zV50%t<{3Ns@`sCVQ-F7TFS?~S#^=oM~(}0&~BN= z_bDh9?`JoV;{*LY*#8zIWa8L@+K3KmzCPC3HW2Ipo=gQL;{$CwIF5w^cH6cpb1d4z zEq(aqW?v4APm@Hruh+kncHE=Y zg4*GUqW96D=r@PGJuN~vh;>zhUsF`Xd=(giPich^i++Z97D8d=Ig~jchi1M$c}@Vf zhlVw2y_4s}PWkNYJr~EX=^Gb^X!*X{xYu8kX1;AM7L^N_KaL;#lEiO!t@0h1Z#TS- z)cMo#8O%(2N-c%<$o0#a)gT|xuFl;p|8qlaGd^d-o#YajDj!t9xk)Br}VEsd6EXJ%ODr*N5@%RIeN)^nW-x1eNHCliQ& zc&pANI%J>nS8I)q~D#1C-?pdHyN zVLI;sCa~h)!B~Rk@xELr`zJVlamTiN>h8H&_|$(lh-b1Z;^EAVcx~0aUwm+!%f?JU zaH9`q4|tbpnBC(g(dArS_af$*O-FarUki2oyAIi@`z&P(Gepnkl(1L^5x| z_Gt>g#E~wU=a2-kG4i7u>J`%_I*W4ytXYb&9KHHhA-Gy(DPDARVX}#@_FEiN;`9sg z)tcINEDak|$NV!DzS=91uJj;N~yT0C%}@pPG;DV*O!n_(IFIdOjJypc9^AN_7`c zAog1P5vsqB2U2|<{({JinOEL>p{Ou&*dC_uY?(P_76_>)KDXCG1`2&{&%&;U=W~0a zyu5_Sdob%aLg!6+r)d^m&|{8{!gW5VH!hzF-HIxTdEzey)VN29dqE+3)x}0lH@AqYSQL1_L#%aCUc6W**pva_Wv%BV55F7Sn^QyW#NUPE)F2NV4FDEWV zY1$DUE4P_hM2b-NxA<^eKr8W!C;57*i7^22CFiSYVp(a?EkiR10|C6gl3V<<*V{R% zN(js>AK>vCbc>fH&B=F*XBMqQPj2xC{$55!Okg=#Q@`(T%varoWQ(X7Uv;)Aj>cC0 z=)QZ0=g(`spo4zToL+o06ThI}^Wjv%|Eqq_ZO|}F6>8{|n($04Sa2_xr>=UNtmDk& zEWe?aM=nB%pE-+nY=WX@^)!Ps=Q7cX(fVet6}ipuUZA2~_=A^WyKv3_Ajx#WNj2c*8|uceT*QOu z1x;RdG{+L@&Gy=x>@Xz&rWu^3lu1pais?af=?!l#U(y^6BDjEd&0GFns>@&1W;1Nb zY(n%pclpag{_>Y^Im=(G+Wzu)8j9HEFQ1*6n|RA#zW2EN{Z*?qHM%PaOM4mN`6kyG zAG?%wnzqC8SB)IjJuHk8{FAf#4J3rH`gPEZtm~wFkE>snpzY%7HvmOfzeG}3zkw`& z^~-F3^~*OvYPG9hl1^5?auA6A?{ftmwV`J9%RIaK-ApB*uv}pED->Tcmu(fSem6@i zaa(d%zd_Vx^($y&^_xNYjZ^8HF@nL>)95e<`5^T}iLJ2XLBzpx(ovSbCW-4`Nqbh; zzbq!x8a@0Skzr+mKz^I$`FB4?_%LgOf z1?yktdFx-ku(AJl*1uPX1+eSi+hn9KSlrIzRPPQhaDA<}ljRy=wlkBFp7Up4J5L*r zDIht3B_(N7bV=ENhEs(b^SITj1UYc^aPU>r=oG$CXHp&rPpD1Vc0EhrO)+nn_ z>;cpm8R!9)OftfkU=N|at~xLcf5d0RV}RPnJp-<5?b5%YmZDr8->)~5A6>~-WTU=Z z`%=&DO+6Hy;X{v$3j-#wsxT9Tz&=FdT5foX_<6@c_v8d)8K+CBcDcD*w=WQioReY{ z4`q(#hduwqUnns=)`bctcH7y@#3&Y4tIn-fhHBCGylTTrRr@<^MWD4!5(nB{li{(2 zetq}x63yOh>wB?ix5q}NK$IKG8Zaq!_fN@Cm_10+O{8U+BuRp)T86JZ?033>S7q7L zT_BkAm#eW`Zs8$c^80kQFpY>i#Vwly}S!0Zzr4g11F^s7zy(t$t$;c zsCS!J@5hq&cB9{3qnCHF`EZwOy3#ZjEzT^+?$^gSr2sPN8s?6 zvAykK*%RGZf5lw(+~2}IP6M>D9$i43x2@P$&u$5@&OTZx+9g;i**4d`IBT==+Cq%) z_1?vRavu=M_&QKQ{ErZBAqqdq)kk(yeZYl9D{)vC!S1oEioI5p!M639y|5k1C$S}b z!WRn2m;@qdTzeWnTy>;yGz#6bddFoYEeuVPu`vJr-&|FPtGXJdCajKaJ+9bM&zPZD z^i{9=V_LmKLhG_r<~Uo=EbP%-+!yrgN;Nk)w;B!Fa=+TCrKt56eiZM3kVGUA|aVq4A6hL|GuG7sF`H$wjS;x+R+*~fHjnqSHNl%7FI<|>iY|D1`vN zH~}#Ha`#bs=*XuWZT`9NLq_w@bjgBIIV0TuvCYG%{HmAtuH;2+9!B#gyu7UB9c=SZ zPp?DcNWWI{hS)sJ9$LJ5?@8Wn!k@j_tK4S^A65W=F<8IgN zvw4v4w3nw6{>4;-XC!gC;-S+0woMN?ipb9|8FL@!Ik(oJFB%uE-mKHhCp8qV&i_OHy~KGL)sT& zQrxd2%m>;-2rX^kPcAp|9i56R_53N$mcKXRI0=Rr#Y35Gw`C<7&elkC)J>?Mn|>h) z0Hf~C3Qi`3NW-l%4I_v86T(+)S}1V@V8ud}>V_f&9p^6>y#l(`T~$pwyV zvrG%MhnI88udrHDO~8Q_V*n%%|%UIOd2O!GOEm!IL-DoK;Z% z7hZXpYHEA_RFi?=&16fVM%_m)mHxCuTuWXvvvf<(ESrH()Q!faW@}1b&G`E%W`?5G zo@jirwORgP|H9*(ooc#fs%Z%mN*t2Q`hB#K98PbeX@=98bCic7PPI-7ad~r=TV;tK zD|Da9vF+Az8ll~I#t6A5BqsekN*J_kN&-sM{k2zGBv0jYrY2@y#zY~vtu~5PC_W)q z1W(cOd6E^n#7frX+u;hW#wRKJ3eMwT_BqV8!_2_CBZnyE3eythI1d#FUSdoxR$f=x zqi0m0EimoTLz+ytk8j&=Nk#=!W{10-m0l+oI6* zC{45Iw*nTbf}MzRoyX3&8m#ge7onz1%8c&ju=PWaeMa{UTTlO~P&tpS%e~S8wmztd z8SW)C)XxgV`{y+nuqsI{o5#}qe)3gVdVs<-G|67Y*1b7u)LnP60LN_NN2T$~s!-)} z_a#lt?k!8~P<+?ec%Q|G{3f5pV-U~=23#fMbZzyHr(k7GZ?O@~H{RfNf)!6#_QYts zUZ*7_cD`=XzPC1-CnDmKbF2qs|~ec;hogJ5Y7S= zoa^=myL>c8&2ape1E!Z}aeIPlP{YV^!Mr-;eb>*MG(Avn%8YU>;C}2AsTxKyR}Z$q z0ZVrxgiCfBq#s2_gZK_=OzcL0l$#a8NekTAbD`h*xEaI!m%8btY8{4J2m1vlO_z;E z(y(FVlo{KVXzSGGa-nYqTj}=JEOTw0iTmku)VU6ZCNz)yO|B^$Q%o8Os9syCb+0Pjano9MakHmgQpGSyjzFTfKz(=wUhWiFf!b@C&q%k)-BFRNxr zek%@?48?bLmK@*dr_HJ?H!(vLz_Yl1va?;Ig%CSw`L7o!@{x5$4Im2K657vw0s5kX z$bz|ohz`JJc>8dFHkJD8u_e%{J9|Ywyrv%DVRx$-Jbcfnys-MhkfOTaB0*ISm}IwQ z7B1w}tmZ(L%t5@bKEen2>T~@A`Fyy?vJn%@_Lu-~j=VD~@=nt-<=-mu@6>{NKSe#; z3g#-L1Q2zHQ&)c-y$A+6j?)w*#%ecg*IsZ&V9MdS>QREQ6C(1#{;l&wwgLH>1 zy&>>PCB;KDVZVt3iwAM5n?$5y8!t7U&oh{+8K zclG`GEL%@UzsPF4B_``%FOKQEU`4W)2j{v$gz67HBHx8Q++0)p0N@w_6&NP8DaW5( zG~gaY+63FHk#lsuwEs1)#*73A)qM!tjU9(Z)$T;y%T=|^tC{_5r>LNYfl`Mn7fm2Y zolK6=YS2&%=!t1UUmKMYYo+%#2hU~gufb4pdkXj7nG!haI+k{>jlVeRIu8ZXbNPa! zt{c|pgp_;cyi!KsZ%~U;Mxcb!?i#z+r~Ez(@+p6yMIFay`yRa}vd*(ybI$S20jz0v zVjTvH_4i48$}%VU8{i01lRuLEqGb0UAB{Z}VAP+~fCngk?!EbfcO`_@Yx?HN#pyLX zJ#l^GQ#6+-$}!bg&ZxVMQn5SFhb{1m8$hztL93tR31u>sP zevdTT?p^s`M;F~rQ;Gg-eb6d#&CeqG}e zq%g*7G&UH*@t(dE>K(Rw9eUtR%D&fuRSz^;^TxaI7=>c@~tJ?lpd$bMOVM2hm`V2p6?t#{=2_#w#ESKvof_`zS{ z2Oq!>{wd0jpnjaEA{pSv7xVM6hYuBS(YDPp=%5PmlqapQyUhp zqR_0zL0>yRnWfwfbZxhSuGK(*3cF@ZZ;q&a%2}LUo*XdoYv|f|=^B59YkWZ0_yEB<+Cv!a=&_#?sn{j0H+wfR2u1dj^l{(`GS>R5@-2?BUzEf}k?T?{RvI~H{m4D3HysBC5+-{xw zcNAR8Pb!#zVI6jod*zv;Ll7T+FltF%3;*n78-L5G-4f6_2$Str*Vh8I5 znO|}rlr*0ZgN|{1JPf@&P}jM7A?Re=8yp+*vA1Nr>{saX^6KoQ-g~z8;l7f9)4%7V z#zQXXpODR?ktF(u^)h>rFZg7|W4!Jjv9s6z(Fn=n~WaYd)=QpUF1Y;-765HsC(wGMMu9OB5dX#``HhLl7_HY`SVh!p>sr{IwGr4 zUUkB_WF;^>>dNuek!5Q>hlI9!5e>gNsDk)@Dj60sw^s>(jm z8Ix%n)1bHZwPjG02C*XZ9FjcFpC#k)*gri2&Npp_7aTd`Tg%*sNcuMZZs}a}KM;_# zBw;&cWtVQJRK?y1knW%f!ir3svIL#|IFPrE$ve&DRej>K@INPOy)hGm@zt#@rY)4 zcHP&*GU(w=vw`k%9IG?~Zm;a_gL`Wq#Z@3xB~E6~D-V;k;s=}<7H|U&Kjca1>NgRg z0~G2AA7@Tn&s)D`8eZM>Pduc9>ZA=au5-)mW*=aAPB=1CpBbR@2+_P7*dW)QUTF zd{nY_1zISJgDut)>M^0kVfGKlgrc!ig(=$Fd4|8jEk#~4uGI{&ruI0(w9S&WBwQ#V z#d-Um#ro9~1&=}mmup5xcmrdiP$p~XmJR#8KNo#G-eAF-%jJulc&OzTDinVO>dRuv zyXON=ftsQltaJgyHF#^-Q05lq5t_63rhD;>IRj}>>|_+qbxitj3!&_SM01*Q2VN zmc?4@>eSuO+omY&Cyn$;SsQ`S=G*zUEXVaTSK;R4se5 zW$ptglTPusC3P=;lWqJJD0~1E{s9zR36hr5+?8xjRRCnVR)s*|x1{bw!Ss%rw1`b= zA6b%p9IvBtzowmjk3Oa6vUqdTXucG|jTbT$Vl1ce{xS*UQ}N99%BLqIvn<0e+Qo~s zq~@XFWE+2_n|wew`DbIqx)o*8DgL&kZo+S}jlTkg4}iiymRKxTl2~()*#oh*zX5Dt zUj6B+T`jp-;Ts|sW&?75B+;vLZRQrp_()ICdGHRgeNvRw5?4kZWt%9^j?{swEOCHu zyMkkh9YGBH8aUrn%U&y{&Pio)F&T9tF;Hz@83K{Lj5Ip}Zr@P*0gQEJd`p?f>F_n< zdY#CMp~ZM}H-X3q0^Pb9FFKR5vm}3TL2ylA5VRqB^nM?SDUxSNEDD!4)V|2^A`vqa zV0^`E9Fq!-ez1yb)%gC&`qhWe7?z%3PDuqp){R1VEELpFaGb+FnOD0Cwd?SSWb^I; z90D^3(@D+P@>C-xaUH2nhzlB$nM!c%9B_hI-Hw!N3Us8_c~5J-r#0ru<8fgyCve?) zyn!+N#Rv>!$eE)#El^d;1inhk)- zHvZz{u?x?n^jyARwKL>1u68;^N-2Q8mD-w^h}Xl@ntm#=?Cco@uean=S9t-_)=CWzRc;)#jQ?ov-2E@ zbL^ozUgbJIyr4{cGlMsLbfqg0sRIGqc2v6E8_;|90JQujJWBsH`17UY*TW_Fltwrhs930(aRlf@cEOxA{L1ZJQ}j>&pe zvjb-2;<0KY)PiJxlx$Ls@_$p%bh|)AT=CM~W8uK)#P>c*K?ZNiaLeqhnAjZ@5T(W!Nx?NVm!3@U{ zNpu-%jyY0gq$w=Jj9PCfNGLObYT}Dyj;vj3ph~YXZo-2u2z31srGSP2)R!GgbkXM2 z%V^c67=>_BPa+XmTo|%e=98wv4vh_T=n8E+*;VF^oq^obOJSD9aej}AIekr;1_OQF zGXSxwB*bm}j(SS+7*~I0FcK4>m!D#2vL*llRg-O;F*4?y*xXPC6E!a2Vuu7YW7SbY zj06^2EqP&1zSQkpUGYtxK*O8X+3F;jDT&DSg{H9J5&ie+jDxk=(8;esUDDK;O*wKVQ@*`d4W>$T94f>wKu#_*GH0l&W`2OL1;IgQ3gc!^|D+WE-bsBNF=s#+&~gDWZ}LEc|^7o9R?h z%^~13M)bHMBfQuZGTT<_{@7+>J}oKQRMg#Sl$t*5Y#KUMC9bjv?aiq<1g^|^>1G4&{HlDc$64WZK5WtlQ-0lmW} z^uY8d^*&;yCG%rI^m2Q>!sXZXFR?3rKYyQ&dtKlHaIj6H|4ea@)#ftGE4?p1PKq&U%vT?$=|j9|=sMVNYE&mw!i|KX=Zt)~OEW|&&v@!{)7OZjT0Ux?tb6s&TbR>^fk z_~<7>UE^(#*xYy@D`#|J7tqI^`L_yC6vExs<@PXj=1;CzjCY6VtazvE$d|sPL3@XiCf2V^0R* za?+{VP~a!lgez3!mraklQ?$dX&bMp3g3l~59L-0bl$OHnbt7Q5*<5>Fv^#SvRgGIc zo*xHxi@gFT;^^`kyz}Gfpc#jm-oSQrj6L#X{oKP(g$2m`{X0T^Mdm5n+(}$788&KK za@mNe`+yb>psXGwIPQF8)CvuqbBsD)rR6gmF02NpT)YIyAFqeOQK})584aB=mi8=R z73?m~_m2=n1usc~Guuk|)wJOHnSN!fTKhlE-WT@^0R3ABl`S2*WNB5>-I@M8?&}IJ zJ26Po`1k#8e>Lz|EBJuHK|C4SNyu-=eAzu67o~ZEeXkff`Bd+uZb2asCAMJ&;!T7Y zxqtBh#^o=xsewCV!fOy~KkB}+pU|l{H8lKexOYX*L9qW&rVME2W2XK=Jva&&%)aYk zw$U0sX1ypXm?7jpi+a}LfOSqsQS~M>-_(I&ma(v%DdIjT|^8%({N%ijb#_djryOcv3v`X z)0?`RXx;ws_H>Uhb#b7yS9Kc_^u36UVBN6R&0f-*MjN%_F|4@qVnH~2SZ^v`oq!i# z|JYC`y*g-~`ZJK_LF zZ`$CyAmqTa5;ybo562Rp}n*aT*-M}r6o0lQ`0v7%9#>*;F%IWz@6w2ctB*f$B(AqOv%Zd zwMaJ3l&l_v>Rc|t9GHCN1K{xgJBGG{&37o7DVN6Ssk%->L!{qv7}T=4tc{>_Gw z2^{&j9TmLcj`G2i)12!w_{%$v8%PVbRtk0^WvFoG^w=ARXpYUM{jFD-qq<~-} zPL!DRpP2N&Go7bNO!_G%{RyV?B#BA?u1V*dD8^GHCVfwn{tKq_1c^x>sOj0OVmvxx z5NRb8P^L# z{AvhQvi3C2>zve$fG7dKR=LjNWj(c3zlUu{PDKb@6VVJI#%wcx2}BP&FnyaK_EZ2d zKF%6noqXM~&=|mM;ksSRH(Sws6auNUv+QQ}yMC8pN+sr;G%~$cc<7z7-dPHM?+;E( z7x(fk#hs`p^Hg2I&#L2D3MbWSlVM{b8Yfyx;T2wzYtRKl;KV`c+d9b{rGZ4fZ)`WG zDDVjiS@2tOe}+|1w$zh=M|N&0_;2ydR#XCf@r zDwYWN2!K8>;3krA!`lG+9wfdaH4>TN8=mUSljRw{O|7%f*d<@*T)PFISR)MysgsSe)4l+!SM6r|=<_@UbV0ol)Y(F9b}1 zkDWvdD74 zl38%ClQ(N*3LKfqs}hdP%-WQW%!Z#^2KXtU#}|SgY}+<0cA9nx=h-=;5FcPAyQvKM zlz^(tG)O=`|1RIb@Q+RqAaIVdjq%bpu6DQJ!-&PL7d#b!PHHgJJAE75Ig0xz3^e7= z8zLx;ddj)x6Cxz~N7UTAx0eVuDVDckzX~Gi?UT;Q$0WW&AnX^y;#}eywn_mEtiwwc zy(GV=yH9VL-ZK}Twu_jdxvlPAywqVir7Zid=geGehA~Xj&J;7#2dR%}jlM|zmRhBE zhH02pi)0&dtfG&wl^0L8_YKH)DO+_aChTgf<^xW?q&~Cl*CeUyAai|{)Wr6=OzR!5 z{(O30d3Cea=nJo=Xq9i7SHFQ+DzA78CU5zilI&lPxw)iJhif zkGM->ahS7mKWIj&)&J4}!07^TXaL|g3b5!pV@FH~ye&}O=BVfhGoS^HO5R=$w>2nv z{`SUMzYcD1BrdXjJ!Yf31RDY<|9NYnL2F6~U{*($ohb5A6zlUbaOdsG6hT#Ya4IsR zP}*DLb1A879BjnPF1%^4T-(b|)m&_~$GFdKayz4fP4+a+Z9pz}(oJr=$sMh^jmYJ8 zxyilPNX6L9(PKmH zH9a}oJ^g~)J->jB2U{hkNNNX})AASFJy)VwdM;luryca4{Oz9Cju%d5xOE=f?&&b; zW0)S;?s?Fp@6PnVcF&C_otsd>?VcGXeLWBiZugvT(z(J9ZuflOr1Kh(;C9bpCj9}X z2ex~5HtBPi9@z2O)TCd<^cVb{pbw7I{!V5(LxmWLe%YiS$8<&tG3k$+^n;nsKp`gm z9+SQU(-|kkq+f5+884+bTPk0}PIu-e3cYS^dUpZEehwXW*PSTi&PEl!IiT=c7>U!{ ztk5mGjx0S^$kum5=54@>vRV^#nb{McenHvI%>(gld+A3AMwbAQ0sYJXPhPX?IhO@ z!&M8-k?wS)Km1D4A^0a_oA4kgv7{WF9J%eZ0rs(MYIzpnN!DU&+nw3kD}!2Yd2{4b zXYui$+UO)H;DjgzEl)o2#- zEMA>?2<*aRW&FgLd7#LE#0@N6b2VG2Kb&cj5C(x~ zNE;wiT^b&YU6&6Q)azKuRJg1>TWh(|EFh({79iZ>brASOIG8=vKnx|LJN|1P-j zRN$k;YE&1B9yP#Fl!Qlb1NlPVH#f8NWgry+jIhdjnNxBt0!ky0@}TC(f2Ood0Lg+v zHqNr6sF1A_AsgX>mt#_ZsP$c>RbLw3Jsqlxx{H-~y|36B-JPvfl-IRmc)=5N ziF6l2P<$qCu=i-)DO1G$u}O?lS6d}qN_I_}Iy^QBlK?YXy&i$w;!e;&G&K3zpE(%c z57cR+(z#|Yyv(Nq2UIxSFz>%ME*U|$rf%ZA(A{43tRofwO!rkZLuBM}1nfa8qa-iB zqvlk|n_jfl5BF}P8g?k231+rL=0PaC6Z32%i~9*6$Qc;sIiKFo7u+V>cWL9zaTZ?xr)N0y-0 zCR?x}Bf_oiVF^kT1Xc&y_^e7x(F(}h$WVN{z}rN$=87w7LD)76QI|mYonBGc2 z$;-V%26_sC8XYV^6Ei$E-e=?5x)N+W9Fb1)YJwr>w@T+h)ix5Le0uO=V@@Wcu_gd- zB{yDF5#zIwnHi-Tdv2gFGZ_cQPpJsXJPepV2N#hn0(`szM*uW38A)PXFRK(aYN@=9 z(Tou7jG1&*!W(bz(FFaV=q$N`2#-P#DdbKo&-T!jeg$25=@yvF$heY@OuPyqye^05a#%xm@O4xl|f(p-A4>{&@ zvNjZevZX>Xlu9<1pw#B5$jb$aQfhc?oll|qF(oLps-IAZQ#mu}v+E~m`?i0Xb7&d@ zr1?-eiQWW|p7@1y-5{MB`zb7`E|QY8B$Zn~H`E@1fEfY0vq;juxO z=ov0QTvMVC{n3XUsOs@s|2?3blOBzY2RLEwLhS*c4fxYbf&cAh7;$8B%CX$KU)WsagWV>4Z4S7!&O2Ya36VX3-1xcV*#bw7`(cie<< z*uH(jMha7F#9%qsJqM(GbyF$ddB#!cR@yVW6n+|oBw$}<*@~7YDq1PTYL0cR!5NET zaA&_24OymVA5suX!NsQ)4JqF`Xo#io18AW_a6(vl0xFGx2_PsnXVvXq*L?L3m$PAF z4At5mzs7%5w^y8LeGG*T=N)>$I#b0Ze*F8`t+?=T*@eoyhE4k~6N_It(S_AUNlxs9 zHQ?993C89BS~x*Kec{Aa_>$mvqETj5oOI1Nv@{g%s)$__pT+jNYJVd7n8($>Va)J@ znJWuieE7jvqP6%laVtE$kB2i69e*AELes>}UU#XmJtZ6NR@yj)SinfYMjOf`V796$ z6fuoNFt%Si&Y#BJ5ad|kiI*?Tt$hzzx4P6vEth00U&}_Mx^8{SYXcZe7)3l@*;A4L%voqQZd{e2$ zs~66_0xw!rq4+VxZCr88)?&A>hB}-vM${p8iEm$jc&OM{Z)h?T{`UXqh=!UHCVm&K z8L+M7g$)z0%gB?o4h9EkGz~1bZ$CRk?YB3(4)U@_Qm3CMX*x4YH_d(p8r71T3?Rui z{)XavbT8sVS`yQBevo)=`0t+!vbha6Xv3a5U87Vj%RCQB@rXAQy$JHqxt=LSRbdA; znhj$#1a0nuNmV8U%oDKo5>q;hBP4tL-H_U9zv^)a6=1JdB6xTDsxDi^&pqE~jIWrlTDUcF&uK5U{-48D1C@DrU z^9I|pJ4%Kb1GW3?l<4gRBMl3@IZ>hB-tuV?^*Q1|A(^iUmP@Q}^mby-WTNS6UvYcZ z*Wtw)T=gBpBb{nzuQ&SI5$3fOq-*ec1Z&!Srq~V0Q7t~S>aqq2^2^bkrl18SK$o~xJQ;F*4>GuI=%80+;;1& zg4p6=mUbSiL(KSlAK~0{Rn$FL8%0&VYRxqtsYs8uB8{es)$RJ&v=FF!r`BzatT6tG zt&vxv7gks{Q8UIz|5>?v>*U=l@xSZU9d>s|XdNpwx7L&Mzq)mA%~W z_=yjDC3o-=iGbFw(lm|#3`9WVmHg9KzfxuuxbJDD3FVDd7t*qCxyv%$-Liw+xOU_w ztg&8etmn~x=Xwd`*9lFk3CHmz$!U5N+3CUDaG%egbo0Ciwhpyc_G_KZhxsfTUbAyO zZ__@qQeLqK(8*C`E`M9*uE8(D)8IGsvwn>!J}{(lTArTh+I#^)NW~}CY@TjqrQuJs ztdQjN0KZ{r??{AuMFAIMOUtU8KW*bn%P#~ImTX+gM-C6uF)BRGFK=?sRb~e?+E6PA z8h24TlhoqQb@R~4DIKY`fOg(i+Rp|;LNtgCNTb*geD^}HrSP4|hHZA4y=?2KyYk;6 zJB@2YplZvSmM2>0GH)qgQ9pXpiSB(`#H~3AELv_dV(iO>A%U+z-7;mXBy|WLWRdnK zWWMV4H(&JzlS{bRnjDC9HP7C8QYXJ)w)C z)g^5ymEV9L(h=!mqcCvYi7NNC52SM~kqzm{h6<64+7M<_&ULq-5Yp0u2Ljs95y2dv4!flJQ+|+KTj$1sO>^WU-5dIfm9@46R$z|NpS}E#OfW*WY`|hJb;Mih@ct zB2`eV)=R}pDn-`P3%XuXv0jR;#x3<)cLlA1h0SWh8lhEM+u90(t+r~ZQi+w=pqNm# zEh<*Ds8Lbh*F}t&Vnk%W-|w7x-+ed9CZU)A_y3;f^TEx$b2)S7%$YN1X3m@`v;Mh7 zvf7IQ9GRzwZ~3u?uA2QBd|y4g6u&cP?~dQ=;=AGZdYtZGgDgr6|NO{@DeI!UzKgCj z!C43E z$MDvHbJ{5YoK2E6Dci$dz&)Z(%-+RP1t+v+vAuo_ha2Wxc!2fl3GHMhZ~@Vi?0B`hB>)9^M&TC5at;=VW zwTI%y6!IA<5l(-~hE{Qa3{B7vYV1+j##|e{zm{-t74_1G~?y*ajzc~h4(2mPuYn*B}tBmqg^D^9M$TG8>k=A+vQeg|D zR8f)!60->6&kl%tdw}>!A&4I;i0qdr86O_NurKDtuyZA}vSe@%8y zru4#E2LN_e2Ih{mo>NB2%XYSe=m|pEaWzY%X)D)Zkk-!=66X|UZ2(v9GI8at&Y(7d zJef#^7>(`qB6id%wMu9x7V!Qw4u2Aq!0`X5eqJ5sRq#(PF&zGYiWk8HN}=h<8nqe} zaWD^c)brjDeuq+)rip4zF4T^>3IL6rGxNw}HESwxfE>tTl$6cDT~V=mwuXEL{lBIH zHWmEFwMqP9)q>w2#D8f5bB1Z)y!Z$^O@5K|+Hf78sj#oXPqLYQF}@S8)WEgz5gNEE zK1>6bfwR62-A1dGahie`W)7>alV^S}k8PhMFbmRb5o`TJ@qoinG=ZIB{|!I=)sbvs6@zCU)?db*f{T4R>Ds;O>D{Z& zo&yybOcS072S5zKD$&I&dxC~RZ(sIvUSOkkq8)qo0EXK;Y!mZmBqWL^oSQ5|RBQTT zrm4#;KldC;ViOS$1*{$8z>2@6-Gk`G0KjPIkJbem-5RRoU}+7#OO3HLL@!zR(|!q# z=37JWF)~@TnSa7{LtuQc_{rQ2c*Ku|!Z%(pjP#WcJgu5+ihOzl^PP(5WL1`hxXJlG z0s)RO21*UI#NPTHTue}RF|+*}mTQ*QB);OQ=vsI$pGn6^+P#zb)xhMfnC6KkRatj}N`-68v0le%3I|cD9eB?X*(J1|~^)+vQ z#P`r1445ALs$5(vkKM*jS=laG?UTznKae5(_Bb)895Kg%RKc|2kOZuH`G`z4^Vb(Y2uwgJLz>Vf zpU$Hh$cXbbq${bM>7Rzjgslz?RBt@+$uM}|VKCK}Ut;&f(!>~UEM8m>%qu2*Iys1Ef1wg`epOQD- zA#s6J^qRvy;ql)THTmy@WB(BcHM-_Zm>2a0exAg^SKJ^24F*UZ{s_*Qb+XTOpUHt0!LZgeBFnaO^WRLG_3iE4h0ahDeU&h)5 zA{Gh(1$O)sa1pJQ+;=;v{qjGYF(jNMct5Op?JpMMO{5_hTd{eEaS&<^*P{IO+LML` z`DDoF7G!9hSW0GWOvl*r#_F{OVR0GxCiZv0^Y!UVkeF=dua|sB7&KNQo2L2`xNhwL z%hzR4c}<&=J;1P9j|^XQa1{!|J|25n9WGf#`t;u6g{1A?;p5q5q$b7P{Fi&uvqllK zw_wM{5DIeAuTF)8Ff923Qv0CBfd`~pB|BaUl zM%f-Zu5?J1*e77=Wd@x6IfT2HURF>#TsJA?9bP{c_DyOYsOohG6(s8jy(phtf@EyW zPiOz@DN#)($upOl6D2Zy<9h5^NLx9|VQy9*wXRm~K$zs$5k1sJD)9 zehS1$>bI1Zj!Ybz_`VTd8#f45u*RQ~oG>myd1zRdLh)$e*+&n}(c0}n$maCWK6wa@ z>3WU|2Mj$Gt;0mwGf@@d0<3m8HrMS_;hGt8yi9{I!EUrC_1T@%BXd) z)~|DkNPrcl>`5r=W^7!<1^@!yBR={C!{*`iq1d<)u=&1uK?i~98}09_U-U9uxbD9r zazD{p?35sd%@-N!uE>2xyQrwhedg~@v;G4jcYy-yA#yKuD)CGerx?7S#zf?qDtZ;U zgPcZ)#L7##fr#9z2){VbtWwnM$;jrga9<+#GR5xFBAUi8rOLyfb4 zfQhrX$o)1_`=G`H1_&Qdb*Ryo$bD5i(TH4`Pw&78w`vTWEf8sqDwuH0yyqvm9JaA2 zp|A{J`+--=>X7*&-mC4$VqMvr($u>9cQujMjzgpu8Qy zG#u$QL{_v$9z=gsKbVQE5XEZm{0Ar5L5-0Ip(ekQkM$)+K^VqFD($ZowMA%6;IrQZ zlVUIK!C+(sCi1>OkLwro6VD5&9nke0CfvJ?JP6sbf`{?eLhVJyL08*=ZR-t(CR}5K zaKU5Y^1^-1tDJ4ht(&x9Yvdu^I*mNk5V_AD%kfpa;h@A9S<6ac0^^;VRaI*VN>zLk zMye-_P2fr-BU5anOt|6a47;pI)vmxwYZWqBhoT@2oL8h;g1uOS$3fka870!jCio*a zU5V_zlI*???8XSve2PLN(}L{B`H=_B+U@YhsZH!MvvzY9X=g;O-Tr0-YQ6{7y5+QM z+c`u|QQRH+(?kW?>Lb4=qfGc*IQ>3)9O!66paB4(D;3#f?IZ9i$89Xcf>$t~X=maH z=i%z#o3)eflyOaR{OWLe333C}#N>p75)%Q|lhG`)Os8<^UlIr%h;q^opD1WgUuM6h zfDTR2*SQx^e-6~KUFX7G+7m8ruL+-LBKMgi+p(@k>+?Y$XUi$gjY;E~Ih>v(DPm(8 zP9KYp#oVnrLDpg6)EGqQ&;)OLy}gSd;DS<4PucIhiLC}GgA_ML4)c|p$nUR{j+H^u z4G?xDNoNl~r?qzhA#c|5c?UpQY!4UesC;DJQf5#-GH)rfRT+!$`mxig*PI2Fuh2L( zcmhpu8qDX?5%5`ct>%mzdxvL}UTGXKActjAY6a*@x1|*AN!GaQw_0NMrvZ?fG zoC$@~^hqFtpdT8QK8nMP*vX#iuQD90Brw&F(CRtm$@3-K!eVkb0CccH?~9*2AXJbw z8vC*bmA8}yvLnbFU-u+DWNUh*a%JD- znV%#%Pms*v8|MR1vROu*I!mYqN>+B5V}02tH5~cd-+;bCKXAHAm9hP6(OATrO1qy6$Pb-J^{ z-nfFa``u8XU89Jyorbu<1p3?b;VqiM$htM=(Go~x;W z`snJP8${4^Dd_-Wo9xuR4;?ks8rp(CK1V4$2Lg661We76Qf!{oG(_%cto_Z7N4|(C zzEkf+r(--`Xr6)Jd?FCX!ukHS(uuHdMbEic%HL_mYRjsk;-+y`pfw(!G~Lnsx;(-Lxuz73*r9V-AVwc2_AX#r^8 z4}@DI9}(C`4zOEYV6y=XJ~gU8nh$s<%wy&8=@R!CD_|(qvU@akvoI&y3jI$ZyBG=y z1j!R!xY&{;l64_1^301KJfCWed<4>ePpIO-xJu#j2=`k?rx*!O4B|M1+=?^nOF8yx zu@4t7G!A^cO&WWAq$`{{1$kh}6{L|~Wqh)+kU$JpD%e1icwc;f7-?jx%lwaP6fY)< zi3YY~V891!zfNRqg&t4aRJH266*c?02$8ei)3r+6`0IjO2;XdYp>XPyl|ompEc>>` z@$#L`$qE1h;q+Yy6`~(Buz>$HXSi?@CkxWBX6)it;I8AYX#dh%5y9BDCrxbGj3N9Up@3k=nX294i$4q+I+|;VhuO; zG48~5L}UP*vGc7Qz|cbSPm=6ub1sBa+gaV`kT3D_|U3$aS&9{^Rx zyWi7%COge&jpRlfE8))wHAoQad>w%xDnyjeUV|UQPorCe3OFm|z6|NI@J~8yx<-S| zUow%OXe0*Vet?3 zH4W|h(eT9TH#swcKhCmF)M0g&aE~yH9dHc3&a&!5q9!zSdX0RhVHqODVG)K2@ndBt ziK)P=ci6>>TAQ56^4N)fpntLgGJ%opR+`&N@|bsPdsFt{oYh0&;?0e38cDx&4|7n>VLD z1)Y}xw7xGZ=!{?k5frXF3E2yq`KEF#n+Xq99YK?KNE`#4Ey6aFaQ35aJ~;d0G}Pg? z4aY=L>wC(RXc#`R-3#`1!NHoHWXSGsxJmLvt$VbHqQ`ka;!$7JnyR&>x*{{fZRv$5 zEW`S*=qpdILp0YP*@b6DUmMR`I%Thft^%1}{rHt%)T5a6!OaNd{=iS`Y%TIinqM#d z`DOdH_T;8WvU4J~sUqDo8~86-udaTn`9>6|$)x#bMLBMc)Dgh_{Qbu-h~P{2Gb#Hy z1A2h@O=m!$O~I^s!=AWY2Pi_nO6`D6o+u7Sa|zIr;dhD7MTOk#^noQ^P9@dU(sVk) zheh~Q$_>YPbH&Hu3jisqHoFNbkii6v@C$|?3+%8e)y&5F;y-JGk5mIJ(Wu3Pkg(;Q_OF2M83tDM6hXzSBw;Ed*cY+S!HN;^KULumODr@-TkLW{n?a z;`xRPaKg`6xYT}I>yVxw&1o*8c{sUmb{MVcK2TVL2?=t=d6aQlq zzuLslHu1Af{JkbVY2s^4{0~k1JQIJK#%FIJ@H!KDyotP&kvE#iF(&d%M%J6iu!+P~ z+OpVu6S@6SX?u1oBM1Lp3H6qV#N`W6)#O~KkxsW5H3w5Ss0N_~MWwuUcTB?J-|=Lk zOBI=S5FsTn(_+@f(&&?9?I*s(tQwi~!z(Z75=mHQ{r-=F2$qYVvz|mpVYhiDed9rA zDhYV5g&#EB{e5$H95N2j@o~G40OdOg?dN{sY3m8H=!G2=$=a z51i7#c>(&jZ>kl;`I|*?zP?wSLr$%{=p=M@^?kbClgp9Nv7C*Gv!IS<0u4_DFTh}~ zm=7vc8FoQ(EY>f9pmG4|(%<=D#CskX4>Gx0h z2rVR&-Sj3UY^3uV$SA^+s|J;E$VKsxQXC zFcx_s4$W--o+e_ECYQNpV-cvjj4aYLXllem4B3BZG8fxsR80U5P(=cGN5qVWhRAxx zRm9E?QR%~B)-(qt+|awMTz3?(MH&3FZiaNlZVT+yzbzr`Q=SVr z))=KtTZDIkebgXuXa#Vomf>i2nRSetu7i8spPyJ*-S8H)WeiB{EbYYD!JGnbI?~rL zb{jDVevmq`S(j{Dg;&-5@RTo~usnGT-!&&jb|%pKyyXa&MYviCr-szxWtTu&5BIc> zl$*QMqfE$<1^75vG1dKu^aeP$A%_PLFZ7F zC0TvBV<%ibtjzjxpXGkUa#OS%3(XjrJN6_N`39z3dUF1LW)U?QW>v4c&pzTBb(U zRY<1WOj4?up%LK)+o0QGlE#Ph$#0}jLiTgs==sTe5nZ2ddyTu2{N;|-?~p~m{E0Be zYpVSKEZ;7%f8xdmOgyf4#i!bH-1wl0AB6a0?MvPG5)&Up{AcXb-T07+_ai=JABXtN zB4W%P;h?$jfIC|Fg0Ut&x?o~SFGdC@nd zft#+fa@^REZh8qetScigqi=EFLc1HP?J9|uKZi^9^vys8V*+Vwkd}$8N9Y-Z+R|(B z%kC%kiS-5_ob(`CE>7RN!WjoKUMc3{MY&XX-}<)jVWqU4yrL!X>NQDVjmMTS8jopo zPlJ8O;77}LPAsz@g7nP@A#2)jAzXvGi6xmvA?_mijjRt&Dr@*snf5|v=rjxtb{X!d zG>%FW>u#5`WD7qS8Z+e4vYhGS0helAJ{HAxv8u*}QV56!8cNX%z0&BXlSqZiRMlAE z@0%U6`E+}#YB;LnFu2G4%EhO_Q#GUG2QA^>hV%;bL#9!>Pr}bzsV+ZwnAcfSRijK^ z{&n(_>oNs-zl^--@`f~r_1tC|+=!Zuix*Bf7b0$G0B%W>d%%(G!0<{qZ*YQeM6w*B z2aDIx!P=l^kr*`XEXfF{XWOB5JFJ5xJwQaQ9UB8=f*F-F0-ju&_G5K-kv+^|zwU*H zKPc>{u!52GG6ix|1X4LH&N*;W@HWx%Syz0PXz{co_XkQfcVt|-T!4gEwnSxq-DnN{ z9b-`RV=a2L6s1+qfiEHKn4yrEty-+lGgS26Gg}X^%CHP^FDyl>^p%CG}#I| zw^Um0sp=U)1R{d4T|(4Ivnw$8HzFF23C#G%b`(9EqW52--)ji_G-DBcX%?uq8 zUa&s^w?(8Z*@-Goss(6%Uzr68@P+{75_6~8F>xgJSaLSTNN9TUD)?nu1F@a0(3p#p z^(H1G@tH+Tt;xU&c2WQX{MVRoNJt<4y7G}(tm`KT0nDH?vYJCa)y!Yttlcy)Vom_- zrm9NHk8s^Nfa8o)>u-9SQAfW`vrouUlx>J?L>@|e5Hf0wH?3-jylkRPZOf4ZF`Nuk z1C&`HKMZAlvKk+d5tNbXqCrTVY8HaSgF93tI7Q-Dlqc~jeDZ3@-1`h8tKR`po=yWt zsPc3nLe?pUr$lUt8liJ)#D(Pyr;vRvroxzSqUfS|VdG{rqo-Usol4*l?A{8Ubn{c3 zr+_F+=l!+-%cC-j*aHo`$4w=nrY*_2AA_baK9^jNXnQC}w)R=L9`l*`fO?6Zxtx<9S>JrGFyDFKEr5xgol(ex!%k=QvLi1xex?=Z?#@P${Bt*t z#6-7b;d(0J^w_fGHUu$!(Xk8eA(Q~=FpRi{;V<@m(&hN;_o ziIb2st+#$7RB3G9fYZIlt{TLg$7#+*^fBG^6;I|S&5W{bp(N--WkNXb*9AOt>@wE5 z?QX+19l*RX&E{hNR1p!Gt8wVMs5L_XltbZ@Yz}IoyWFA-iF~ojvOJ{YdWTfm2c*dk zB++xO#wG}c5bB~6jZh}i-Y}09c55rQQJp+X*sz9qm0nbK~6T)Nv%>#r@F|d=#0Ub=e!y25Xx0zeF>eXEOrW7jr)Or$J`cJCWJ0t^rE6g z+m=ev?v(E^z0@1!hs(gPNWnK)B4okl1j^icumvar#ekv4OFGZHP>o2)=9L&x*cZcA z%Qnc9ZK@UMuF|YBxQU|b0o_ylf`J|En+v37Kb)3L+vB8j18^En#db;B|d%iw+*!5}UHd5vWe+GlNrJOTT8 zs4-4ZFUyE;vW7tB0#G9TF6xvq_L25qO~WZAI4J?ujJiFkTt2OuhDq3}E^C9+Sm_?N z*er(`l;yB!=Hd|wsF~%kv;&;#s@AiWi(S>a!}_wKnw6vWS$jjZMn%b4d*@Z_4(lMz zlW+2QpzA;=C*tSj#lk!>Kuzex~0xie7J#@QU$g(7BW zU{^|*Z2^nh0xo^kr(S;5D895X#jx|2v|ll-3_daNTb0E3Y@92sVS>$zMPR@3UPtC} zW>F9y%`8!C^}FQI60^KYrt{Ui72zU0pS%v)%yVJ10;x*nY!19X)k5n@&g@2+?>3uI;pVbi7 z2(KgLEuTxu0>M+*SshqzHg{@2xyNv}7`<`Mfi@`boXPUu{M4DveqXS1r2L!K1yuC zyI0$}^O>0#z#P{Fd9xiy1YJB&68Kqq%8$|8BhJsZJ9E%roZ!F+U#7GlN>5j0rgj2O zc%`o~>WA40^(p$etc4Wc9k8@*9p)TiWU6XB(DEnt*cl37DP{KQ?IkGH7Lp`{JR1t| z(O6CIjl}b_IgB<4MZRq%m^DVqz^6OHE29Aqf;)(y_2Dl?M?kXB0GTERCi1WY+*7T* z2|tgU2@>{rtGk9^j~i)pF9|ax=#N z2bw{AdTEBP8ro!sQ<6o>YDSe|JXAUj#Kt(+z3tqwWGZX@+eY2waZ{V;#14tn~ak>xEqX5+8_axPt1Wy&Y&@q5Mw~D_u`X!v63#e@pOZZl1U;O-i zcR0o7j`tG&oERE|-}rfyNDSC_hT&bwb79mvQfV)&i_>$O1?#e`6S9dHSI}T{?9hQ=%G$3!@*<$aUDu1z*!QU5^H$fn z3I+*W#BjgG`n%$YLCL+eNC(txnGAku;;|crZz=t~pG$MFZN(-6qVC3Ry2G${r>O4I ze4IceHsuoSxx~g?VuO`J8>zyjD3`TwQcVo|uA^a|gM2hL3z%BBYCY0T_C8#ap}1?= zZko?t;8A0E!6>9U5ab9^yPhYHzBr~Feuh`d$s;FSPupKs%zL!`E)$Qow?#HeP2L87 zsQ4-5WRvpPWPG~qhXd!r_7hpB{Ui`3P@-if&`Gxo1@ZR02L_KQy)-=83qy-LG^A+; zti_ai)jtzpO1+n{nkb+iUbCd2TTDqJhxP6j?Pe~cGZ9Sq(6dMR60$L@$InM8J#g5W zg{HvMQ$G%+N4c>yg}#oLcVn6SqU!!13m#COup-Rava2N9kddzF3{W7K*kKKphI2_K zrSHg>zS1p?^-<2gfDELiJEJ%fm(oxFgf+OOAI_KlyjvPZO*#7jmaZM;7aLNZZEu#< zAu+hA5Qb+__}(H1f9T*jn-5Z=?Plf4qUAr83^-&L7#JHkbV}*FUpq)i1}>ZWXsy zqE6E0I;@S#V%ziJ_HqFbxh!;FOiPQEptN8ybTU6jY>+MMxo!cT6|4b4JGvAO{v#VYBh*14(mZs=w=-!eDfJ#O562q~?W zyQwP>QmmTXxK#)#RxNJa8aK2SA;sz$gcPfFZt8kBb%Pt)h>+GX*`?_egtY9}5mKz8 zZtB?xX^ClW-1!J8R@2?Mi``HRA;s!4gcR~sZfe|3o#lpZKnQFKPE5M_ZgWGoBcxF7 zKuGah?4~Y5Nb$SJjk^ya#c#PAx55oIA*A@NLP#OExT$O0)U|Ht88>yE8@JxXQ5;na z#yaa${%m>$yMwb-@QI)r;-uayci(@m& zVsDotd#A=8tFbX3wnJj=HnN|s38M-UK1Kq04{(B-fGY)l+#d>tZ(0Cqs{toZO#|@* z_&Wz{icWugNcKSd4aSFO_rWa17SWchYZDqkTe7ZAz!!I`ufmBiL8MwjP^rjHA{@J{ z>wY96nG!UY=!!9AMunAp)jXaC7pW2KmU5yKHIP^6E`<=38PbS92fpk?5j?p8*z@*N zc;n5QSysd&x@U{v%RoJ((4J6gocD)44Lo=a*l*95Olk7l`<=Wdq ztf(E<9NEh>Ov{e!bT%gYO^xYd%xM}f!|EYBNm5UOk)E@R35M2Sdv+;dA#HfJvLJ2p zi{7*nmL`3KnDAkW;jy@EXgTbPXkOg7$i{CI7dqfjtlH1C&bd{34E-nUWUX8%-)46N zW{~MkD1sLHvgd^#3z6kW5FGE|{!=veI=&m#blJN3hX#}r10`un)EYviQ51!Ayy_ykX)IzG)0T?M7)$S*&b# z5FJK=PbwPbh8PXe%3>8ri?x4@nqSnKZ7wR1f&#G(dqC%1P*^IAxfI<2-ptvL<+HXk z>&3lhC5h}?4K6nF5tnlp2ubKBY8A-CK zH-+bjN&zZ4_9}qz;y&*d)2#TnJ$T>jvJR9E03bzxtYUE;K)9G+);CH*da3vnQ*q7^ zZE(I~SSXr0JSYryPym%SYsI`s=u+uJu+@NC{1h^>#Y6Vgj$GL2w79%Av?mNAefFY-K6X&}CpU?vK3xd;Tb8ggGKaUoP znd;4W00LqPqZzMn{t?_Gmr+Tbc`k^g0r4YNgp?ne7Ef?G%r$74$s9Q1rKjN7ttQ*& zZ#Lvja5);g-9+!}MhCLE?uZs*zXyY1v_jP@2<+zBpTS)O4um<}Nri={?3ck$oL1%) z>&`wCj(>uDM7xUz3&wsP>!|P?U;qfXj@K2nu)m-)74HGQUH}FnaK=dN8&t#G&TIM@ zwMrDbd~WQnRI;nE*-OdEEfikhuwLWQ;TP(q=|IQNW1lO)H7mQVa(PIZ4t(7eV?1yyVKGsbpW;3?!G84;;!6QGW zlr%Ne*Vlh!HC0?}DxaxTDut5|mv)*B~DBktRT9#$w6E*!lMPrpwm3u~5Ev zB$=RcDfheBIA)^xvh072P@3k^KIa>AH%B=#Yd1Xh3-IxdCaSj$t3SM3PZ{xn|Yzj%KX8!sTmmmvMV=Iu&`a~(9zMu&w)w~JWM$8$jPNA`((JEHN zFd}3^h{Lwk=WmoRaPZ$+LmbkjZRr*y14*Af1yd;TctY@~k6PQbr`@>p1YjDqUUQ;h zmqFarQj5L{KdTJPIj$8nRKIvL4vJcrrKNkYxe&;^#&*F@%sMYQ3Tuw5B)X)2Fdugs8Pf$qbu`b%ezpsE4NO7F@4&drJJsE%8^B zs7W>Rk1u`#4mt@!`enzZO>n8A5h7u6(N1zV%-e~iwh%4Xq)TpRt<9v%9`Ugn*b`bh zEn*C@qOo@JLst3UrYqDQ&D*JoJ)8HIw%arhHakSIde3Wzn&9Po;?Zr2VG=9$5i6Q! zD%wfg0!oH%6#0=;R~DdLQc{BKHJlw9Q2OBP75XI2KF}Y&>?DVR%(#zae97S@CnE`x zN2U^)tbg7p++mBM1CYV{Sm>U?Zuf*7Wa!A=MF#!4SrZx_Zxc@;@FJowaM2eF9{IvA z+g2*zc5}f!tkt!qw|K!JUo0XhAM8chF(dG{tu*#^$@r;OuS8%*A%aWjv)Q(NOxv(U zM2kcAjLybFwfcD$IK_!yz54Y~M$qo1J@r4dJz2#NL@XQX=e;ZOiwHW;p7WE;UO#XC zHW=!SMCHk<2AB=`61%sC7zixp?_KXho?wWm1hDSY@tqeYu&M-999(|w%D2@SC+1!DSCAU@s^+W<#Yo*o<*IQX~9#|$`O@_k|qQsEUrB%3Y128Y3 z7w!F&Uad&74|55enh+4WOXK%LG}hR|u64yu5X#MM=7?6bgHg^ z>HxRkJY89BjjRtKW|B9mLZVWS2fUGZxeWPIj|cOS^-%Dza>7-^3OTyF12YP=1kiyV z0khX5fckvdtBGm8KXe%)Jxm=6@`PFoohE!VPoxFP0g^9!e7;L1)`-sX>A#9wYy+~&hzp_My=fpA?NLbk3uIz=_W`#vyL5MV8tNQ-$9j38G5 z2j)^^w2Kk95>W{yIPMetqO` z=mfE8piyY-9i!8h!JI8%efMqo%y&ArSSlfX(jBj9PmE<*-__E%&U@h?4>z`ExK6T=)>uUJ>j zF%eh>mZe%o765|;+X0loW-v>DQ3x8g11lVy)|;D1dR?sBa_ZSU6~A#-2KNymM5bcb zYhZVmGCs*uhJ>%G!%9l10}Ch)M+SQ65X|;rlH{TftC~Fe@~AN z-SwhQLx=5pQKzBdT`g)FD%Y0=HbRf-)}y-*yh^92)6hM3y{OaBJ$JQeeW}Q#^DZ<} zawK+TeAhuA>Y{kFAEAt+bSsNp2W{OLFGpsIXhZ@;W9}HyfnxRf^v`O#k&$z2ccic* zIp@2Oj+3Ap@GL}Zq&m~j@yH*3^YcaDz19WoY%_UnQ-YBlVx9s=R?*nc^Ti(0VtOs$ z7GMvR0kU5$mbgFBj&Gw$H8xMdWbxP%l-_|Su63uPv3V>bR~JMQx7QI9dlNs_l|L{O zg4|e2z_@q}CmsA}H=sIZ{sj5>Ai)@?6=ku~y)gF{Ccz`)SK zm+A`OrtF(SF6@tpc3cu|jI>9sX2aLDBYk2WLKCE1Vx&WFtYZ&ui>yEsb2dGAq-uxz z;#YwrGb-SWOYD_Syw2bSeX7ZEj!b(fz^@#$X>>B%tfCEs9kjblbnH7PFtt; z=!}DCk%RYjgp8F?SF*>b0uxZG@URF9O+n^E@|m%klG>oDn(+-~hW;U02)hU{f*-9l zY!!Hwj-Le>VB#POribNN1z~F#L)W>vh!%8`1ljL!{7S&ID3_Pwm0?nH5Yq3hOUjR*3ZU7(x zV-YLGsr;TF`DApU9-YMv`9Di-U^j@Fa%-rLE<+&-V>ow;I!IH%QSY?tA7JddXm!yV!vTbWg<(!k;SMzS(=bo?t5-*k)7Kj^8V=}ArJNC{Xe zU?2`i(B1+#K5JSb99+K_Wbiz5kF19mX6=za)LUhRR*B0v!z*#r@TIGE155wXJ{O-WUXmv2$_34^xjBqn>AWP&}^Y`6qxC}h6g-7I1R!YmQP<#`7+(wq(WwKHC5n(ov@_Kp36HQleb(eeTe z!@QPzW0`8Jtz@1mCj7`9GmjGoPR4dvA389(UJf&PoKfbJ0X2^yVUHsh#Raw`tnUevBmq1`z4#mO35959g>eL*WkxJZ%g zO%7+s%>XSjVs8}ro5Ps6cy2w%Tr~6Dk(pSL@$t0`2(A2Q!23DT`@wMR^8gq-_}Eot z)=#BPP<+bu`z0N1OQ+9SB^-M!1CkW0A{Jj!EVyUncva$Ls&j7a3}!i4vp_Dxg}_~} zAB9@p0ec#q8^^jqs>@?grOYxdQEM2dG-)c087>^z2%Z-yd$2(ub&_mGUttM&RBpTFYN{78fLt} z%?J@W-2r)a4MCoYUjf;{oJYGkV}61h-V4YvBam^3n-L&~Iv_s~EZ=mnj525YW(3GT0=_hSrC@olgXMk9*{C`59YO8h?TClb5noBU9Z`8qw~nZh zj_?%5am$=TGE?CVx2xwpl|VyD`>xR0g(_GG2hXM zd|$CcmzQ7Kj4nr@^4V4mOn#NdCx|&!0&Ss*@)vqksHK$rp&T*|_YAD#6nM?jO0W{i zC$R@Qu|Bkm*o;Q1vi#dK45jfh4agL02SjUi9z}^vqV?8&21r|IIz~3?S`QkuhDH<3 z){q5zE@9MHN$kqY1gayBQ&k;I4%ck~u5+t8@j>c`7d(aECH!o7{Mk4Bk2jX=fk!{b zui|43zeZAKFG&-FglF5~?(21=(M1?8?(8&MYcy7vpL}EQRb}g}x|YP@6bz=AY`s0( zj-}FpAZk=93bUtgzCn6AdukClC;1a_Pt!k~ug?}Zxe(FJ4sQ!dGl6)U#2|p1ADfYu z*^9rJHijU|Ss#bf-$VafUj{AR^otA9zlQW=m5?@Ew?950?O_JUh-j>n-IZK`o_S8G z&F+@(Md%orK+9vpN1`{<`fWN1!XDe3HCVX^1L2zdG& z8EU$C97S6}2#QxIsOI8p<=iS#`5!P)n2o+*7>z?;uvb7lM`V}b_$t(eIOQZUx8!H) z-Q@A>!i_H@C+>{xL@HJkMVpfXvcbe*pyqbuPt|TeVCLtD6|uJ7|AHWlHKC}A+ktlW zA8zWin#xK-6aoKEP3b;sx>Qpe(Hao00;<6Bq)*zOtYVXWd{N0vE+=YUe#^{oSpHkY z`hNLuk;%L1H)#1WAn{x`AR{={G=?IKulaUM$<;Gur^H%snwxfE~Hz<4)Z^Wuw z*HIW1x%Oo3PG5rWN5ExAh`E=t7ytz9Zy_s^D`uWd8(Y&hN+{+Iue{mE>}JS70AcKK z8z%Guq>uw-H+x?I0W_bzyFx2g*;X`2Dw}|(Cm`13&Q`hDy@prbrd1i6EIe@K54{W_ z=+shbuRv+3<+lo^SS>eea_P)3_R#Ee`ikT;9 zi$oANc5jlzVk?Vn+8d1Fv}uUljvkga@hrTLZlWTFB(as)(qT!i)8XAT;!%M~4A(9NU=1MsT&5Qp%cV_o@eA%WfmSRZ4G&~Tzq@QMdK zHv&GwqjtI=)t6l&kh=M^L6B8ImRX||Bp0<1xuRkX)+lVHRqYJJe>_*$Tzg95cA=glK<-nY*(dEPR4j&t*ziv_~jD%oZ#`LT;c~qP3&k*lGOg1xzZheDC6{FQE;c zae6ZT*?eKPNBS~ccdnEj$}f8=!ZLXIHn0RvG|+Z4&=xq*227TZ!3J!MLzbxup%1b= z`mF-8^Mu-N4O0qgIHG$EJW1%N$<&E@Su<{3k4nC6DuJ@H6H_l#37!Yp8;RC~C426;cIQnKr|&@WNS zc~q$TIT92?HXUxuD6LZMaG@HmyPKL1uu3*jZuscazY9^grX|c~sBydY8=A)r;g#nK zS5(1Cp6}YRCh{(gpXj>hi^Jz*@bt*IkTcQ}Ryc_-2oiuS>~E-Qu0yq!S_^CMc*oJ?p>Byf;zi z#7LP?s1t50e9vKqLJ1AOx?18%_Ju*;aS^g@}UP*P2;fa1UQqT&_J)hzy*RmJn9nuv@q zzAxJQ&-_M*+X-TFt=;ey@Htp^E7|mdtwlk?e+V&~a{LqFMjD9!J6#cShzmbLaG%<) z9`AWaWT4&iZ}sJF{qpBCfJt`-$a9OPmF92r(YLQ z!?)m^jjd!;CC41@1tCe)g%-0v`882Kag{+21K_Ow+4f}9fynK@_KJeoR@sWi#Thqe z<0#-Tb$hSFV1Dv7(5^l;7LXu$>E;DW3O2Bxz68n`UOsk_hh=jv8OJt+yo)y01OM6f z)}-Q{uaj}ajwel|Iq$g?MFOtP{!aEUj%KT%>EmvU>sANoy5ehRef6iHJoicG)^5-F zW}XiGjN>gY)psU72g$g-2gR|KnD14v&-}=z_49~-BRqRyXZ7BK<*z$;PTkonQL(9A zkM@9(xV>96&wS0Zy{|ksYaSS@6oHd$;x=($=4>>)Ys(h;>?@KJR3@}7TS%h*auPSm zxud_FZ0VLQAYb8e2`9e#$Ulo?lSxvl)az@w&iI(0od_#td~wk3`ao`Y}%4*flL4kSQ$K8Xjwmn&=IRpO4z-3=4h2R`t84d zMv)5y^#*dtMQozhVc%zR_)Frrj#j%PPy*|;pCFR$$Y@bnlj=SYv0TeOZW2P(SBB)fQDX_CJs$-%@qg&i3E z4`EomQ=n@ISBC4R?biou*5vA$&CQ)Yw6EN~j*q&Nl(jnGk&dk`2_|k}YyB=UzO6Zm zGRQz#jOt%87E~6y3^)|cghrB+Au%F-X3Nzxo0~g5qOaULldL(}#NWZZI>y_yIs4sx zbj;?**##%|%al6K>|diS2^lO&TwA;`IxPEWu1Xy|ys9JVr?P5=%Fz!A$FX)gR7*e+ zDU#Q8Sf7SK47^$QP>9?a$rjU8>K7OG6_WlUz zH%!~%x?{0@Rc#%UUd{x$3}zn?0nqEhbw~8WN~+sw@0ewbE+xP< zZ<4SuH3-B<@lP0J)EgKjPy4ls2T=O)^mLh1-N zopr9K4|bJzemQ&qymK8h^*&}UM3S`kZqweo(cZ801++EU4t^AR;RC^IkrhTvnr2Y)%F zeF^BmlLDo~i-;{khgBxY(BU-k09=Sco(>C;nRE!bbQpZJp@Tb8w`O~Crn9l|jekXg z_bG4W_ zqRW%)eC98v#Uz{lgzg@cIHh}KY(hvi`aIA5;`4&DPBM96d80dvl>M+y=J`35?N1o!l{cn)Uy}7+rFf(sLi&LlHhL(M^l| z+C1|)&GAvW<_M^IfxQ>c=Ech<(H~4))(7Fb?^hh5u*q`y?VEiyvJWuaOY+;YL5`t? zeU>W;A-{350hez2-vBBp+)h~9Pa(6Gv2TY2Bc%e^$+#I|LEc>iU(gQ}U0ZjndTc+1 z%udF?wK>BbW4e`7@$`f+C!DkE=XZ=$ko~~C{szN1+XwS;G*@)g)xz$@SBqx<5h|!( zHPI5)M6v4OKG*gVYNAu!(Rw%3-y)-Revc$$J{nG6X_Cx9_KRo!Vgq?n4>+#UoOJrm zmFG(i>zi#LCuO;_%abJ)39q_5<}|5DCz*g-|AD4{@2uLEq-`wN3zRBQP7dS*Y=3)j zPZBZ(i-NtlBrDMMToP^vxPI0Pw6GM;cCkwxs?_nK;l<7seARFE6nq0)MwCzWRFP*x z9A6X_22P*gEzG|5X0ZV#OVFc`iJa&+YlRZ774C64a!DJm6g(9x7xl zBFQ`xe4bu)hj@6?EJk`||8KPatL(qm*F9D2D*I3CQ#Kp+KN^`p3t2TD(r1CfRbx2) zBQQ{Jv=1e&R0S2x%5*aZzWi0gT?GeBI0oW{96gIZt|fh|vJQAW1#=s=rm=%qgZRMYshv2?JSg+ADDu zLwrktZ?mDMq1HjK_GFp=eapEkzAS{Ww_vA=4GEYfO-Wx%n%C}j?(BkwlwN}nchDAm7cwwpC1+?Gx~{{``W*RIob{ zBP^Jl&?5p(PEfLU6AeA#4<=xuK+6Ta#rOiKPUC_ASLq(y$R4Zct%x!C8uxT>iI@p-AJ8!cscB157Q!_%Tk2f*KL`E{ zXvwHF+t!v|j>9u%P>-Gr0d(&cUyhO9K}B<5=bwe?0nU6WcG~kPmvELZ! zM8jlbIHqV#g4ISTwsGwzkesZ26V4y;OV>Ng(Z@=J@J*EQG(zUulTXEVSmR@e5$5Zi z)M`i+Qf7sPBs}YoSq%j1Zk0ByDzSGrQbLyli4C8l=tGmGDoWTfFvS!UtUKWi0q{IM z|8+E=FG`VH8qy<$QvCJB_eeD}0Fr$btZpw?G43|;lnbR^T#uPj6mDx$Zn_ptZ%b}K zwR}#?zDo}w$yCD(b6t_FechLc6)oMGWcT8jxX4HwSnV9F_88RO2OQQ@+=f%@!Bc5P z@bI*9)!u#7lWHP0z>Gy9y2OPg{{{<+nucwIC?BfE=Uw*>*2!I{1vul0BrqB@*VF2DZgC{^XxbLG{$~| zqYM5uzcWs(zL(O8fZ<6o-ll=}$6y=sryl$=)fY&NL^*XtaQop>RNWI~zsvN1Nk13+ zPu8r0^sg}8Z_@9>s=%67kUoy-L6d$z(bjWO&F)UyUKQ1dKW zl$gp_e*0rRn=2;Q1~OEN_n6`#L-L1x)idCs^0mI8I78*&fn@UcmC5C_3gI;VmW1nG z$NDVQEFYX|7=Rswy$}qbU!ic_2iQHaXCsDP492?gRxqR}8;?|i4)ExQQae8UZNu7z z^cVyix*F1z_=`I^I2(Bv@5Fb&o<02Ax<$+g{%aIv1aAc4@rX3z;4h{Fceidlm>h|R z?ZUTw0W+GEPrY#f{=zaoy!1B78~#yC9WG$(g$!+xbvT6Lyw(_52j6aVBG+Lp6exHQ zV|}W2JzlKI%GqB2b-(r2=XB7(BY>=Sk8$Uu-To?rm&VLuI`2$rap6uwu(SX?JKEDsD_mZk;24@E3!R zxgIm+N%Nhb$k$unnJ!|;4x*jKu_M#NaPt<>t9T}v3KN$X%b+T(-{()7CT#XJ;Uy(% z_a-zw(+kSWzojTg(S5}#%T%wgX;?^YuUL+nO!Xg;5H$ z;B6{?PEnexFukg8)rMT@FuZlR%&%qkUZ}Glu%fiRH?&{I7=3|oV^L_`HQ_77Xv@`v zf4*+ujB&4;loc|@qCabXD3=S1l;H4`GJc-N`M94v~inGiuimoBT! z@pJ&^p?KK}=X^Yw zp9!8mM}QQ~m{+8WX3;TMd^kDUaT%8t#h7itWA1V2x%n|y6rRiF?|$QdtbvCBwW0_) zR0#By$yNW$se?E3R~DKKV4-<3M4!DHdrC6yWB3ikzYX1lT^~PJ6^|B7Iz^FijxNLL zpZ1eYHY*b$`)cHq+GL=^LhHD^h@l>zQA@U>H5wt3JvQHGEOz#QiqT`D2s3N37$v!~ z=PzrW+1wX*5IcqB=y#XvFUB&hV3+HW)gp7kvA0=@^um5W|E#`8qq0lB-|u-xdd5-jUyv!IxSBM;>7OHo z-Y<%%)Y@4WLy~6uQuw)r#+jTwdV|}em;XsH_Vnn!*eC`~aH}qv_)gJEySMxSvEFex z{vWcaoDz`3wkGdYfqQ5P&iF@>P3TQ^pu+Iq9k$^S^s4LcrLg>4le8;IyTE(G{+HNXD3cELcDeuIs-KAT(zJeldZL*KhxvFuqZYo{Q|EfQnBX*YFKx zgm6}~9}_z9gBk+(6RtZv|1oC|#LC6CIy`Oav!BtVpybQm0bYvlaNWBY%=VR<6p(!HAqIuS1hvj)a?~VqQB=28lLPor93}R7<{PW| zf^H1Jl*q^5n2fhqg_zJS!gbdg%JO5uk3mf2mD?b7FKGq*m~%X02ML6GG*&)t{*iu& zc~IR?^h1n+>$o9lFV+|_?W?mDHa`?!slE-d_AJdO=I3>P(R^~dtB&%?rtciFrVi#U`ijekMPRWH?V4JF2|Q{=J5eWB6_jpUyC~Fyy(E;YJPDGCWtqw=$g2 z@VyLwSHsN=U!dV<89qb9Z!sLvuh975`orL@^FuYpBZ!`P{4S&oqiHJNy_eb~_8XnE? z4>f!|!)XnlfpGQ)WUgW08U$(?n1R5L8Mp|6-!m``fhQO^9f21ZI28elfhq((VF2C@ zyY@H$0eCm;8pi;<8+J`(0NxF|su_TH!>$<&z`J4B90bH051u(tKN@)DX*lf~_>3i7 zGi<}eask(3+aa!^)(3m)E?z?ru_%a#J>dCJlK$=_oq`uPkPu9@^W6`?qGO-!zF?et z&4AQ}4R*MgEW!SGg%u48K+F!@6J#piF6K59eJU}R_1+$m1yS1^djg<389>wrj)Q6^ z&IH;b*uKOsG_%&o>zEU};KzpE3J`*O0wB`mFO83uzoGcP{EPb-d+@I@X6h1SCLSsF zZd;K_J_vmXj`m4E-SeW2Qe;)Cc2#NkroUjTBvZW#ekVIX+FU!%m$s=xN{D54KU`Ca z(}Q(2cXuX6{4oxa{5WIGTo~i>aA|I z_#Ew{I=o_{)h)+XPSNVHZKs|k-hct?8+p$XZ;EG$H~T90FpxxR>CFfQjcF#}@m?9? zH=`5Y6uLcL-i>bDK5*&QrA7sXbRz+`fPh}40D6=98-Eq$Ulq_VRv0dAS>2A~9;ah) z%AK#^C%sevqs2gcdePRQ*I##fy~M>{x|LX&?yvCH^7&qBak{^H!+iLRnuK?awMX{H zP83?Ut)cpvRP8e*c-IKOd{Xlne|%rthg1YZ@oVr~8m>!$KkY2GHk|JhOz{`r(P2E#MPRixoQ%Z}H4!vX;qtpHZicu{1dEkoy zxi(e1mg*1Y0fyM(wR~}xj=>RxN_8fZ?3`@E;L#+jen>aY+0EPL$JEhy@0^2r-<9La zcj;Q_78&D_ce`KI^2INM1bo-wdmt|^?cs4Kah5j$48aj0Jon+?Zb%id^SHi{YK*)~ z|2{QPy|oKq&sNYmC2rFjyVp|C^e5D0p|I&9Yz#z~*B*odQBarL-M3S z_)S?~gltzofCWv|L9-@RyCxjIX#>F;hMcShJtr$f|e zqCjvLsXIHONCIwZb&5C5^^}|TK45j`^ugmE=1V_TM;lNjpO21O-!W*Nf@O~J&l;eA z*1t--BHPtJD{Lj25dnXErHSKpNz};&4-VI9jE2y5{&YpH7sX9LNi=pd))MNI);EYP zugo4LE2fB3Fkfb=Q>Mi&^Nfg^N}#AP7Az5VMb+|6^syG(VBL9-iFf?pI{C_D?*W)~ zj(%fdMUVTXH0}K;gx$E6(i)ofaYMjudI_7(b2_%jG(8?>8*wj!j+}AIGN+y)1vqDX6#*)h{Q1M_)^$vKerH?$Uxj_-^r@+r7_FYcJy0oVzcn}-_*JLL8Yfg;p zOzh2%@WT^>_}amzGP|&@%i>|T&Xf;x9^aArJzNxX6BV{;&h>;bQacxA&hnTmc|L_Y zksH`i>r%fAA!O(zvq70p)ovPwOO()M7@Bh^eqnES6lPO~s3LFj$IrBXrWtk%*IkC` z#?I*Hp5eNKFf@>7Pi{JH3Ww|JP}05($#ZKriGEXe8^jl$(akvff01< z+k%SH@xl0kCNgNv$w$KJmPO*(`+G}Wn9uOVq8-*MYiIPXI?BU!hlj=04K_n?4;tIg zPm4OynQ9N#;60=M0Kwt43+VDfK=TApId(3%{D!e1rrjg0k9T~+83JojTp{6G5gZdy z>v>r^V!_x;OXKTPtNTWk$^LkMsNyWh z<-O}gE?3wKsMbIZ6{30_V|7f2td^W0QG-tAL1Zyvya611HXje##r|0Qv1ueB^z7mH zz&Qq&uyxG9a1qZ?_CqYWYuq;6!G#cd;F7(V!)&a7=J`eG@E;grkSo~Uurl~}f%E9; z6wCz}>v#d{ll%_prY&2R@R2|ybYO0x@gBNz{=`6imzTob0NR3DzPSX=}3xf zghtt$%h*rRs@{Dz&KIw!^>nK1Rf>#eV4T)NDVh(8qc*glgW^%1G8Z8SCunzZUOn?EIPdHv>hw|CbGI-)T)&}zQ3P%B6~IgM73&~Fe5>Ro4Y zf?sBW-kYT(7)SUzEO0&fJ8HavM}uTaIkB7^v=LK^nNj+Jc53xy`3ys9$ z8f18)u3ypDG!(G!r{4)N!yQW+yAR-u_j$iB~%E{ZGBywZfwPGM-cF-U>%aqlvQ+1JV zEc?T^Jb|rOp-G9|ln>r-f`JnIE)xuv$V*~(+isAZ-_%liG2)U7VV6l1g)esm6QAiJJKWbf=@P4$ z08#i}FUKFNIf66Np5?Bsu}{TrzK5*u>q^;>b3~Fi0}XYLFr2MiKCLyk_6>MBFR$SP3smm=Z?>!R(f>gqGB0C`HWwOCW^^R0 zthrWz4U)B=U>yF241s~+tiJZZhr9X;*%>mW*e;92m9=LPvHSJcjM!c5irs`v33;(Q z;nree_tc*iirryOP9t`A{z%fX=lFI*HMi!mr}{i~f$Fu`GATPy_f#!Ch~cs|zg_C- z>!7ao-653Zesgucl(W0#DY9;>RE#1r)_9iCyU;@)nzMv<%@B>LXI9jhUcnWc84 z2?k5;c_vs=YR@#mP^m1(n76dlz6h~i@_05qJrsICuNOE(t>g1(1Td)7t{f16%UuBW z`?^Nyox(kZ$nZC$bL=J*8-NhO)4ctUCa(}#@w&iwgviaPrgtIo8}SK?#hXR(@h=FG zuNKxcx-UBX*M&&4c&FhThoYq{;;PC!O3aC+hX;P6E8Ksh{e@MIMwS0la_hF2*~w5B z^Kz^C!$Ng2d5iD?m=mmid2DCY7)m5EG%0{V{}}h@6lO+YA*RA^S}P z3)s$V+6R(yQX+A`Ifpvdwu4h%>%&?k?Ma%5sN(b>#{f`;`Z-ZB29 zz8Vfk#5Jlg?!*$~!SkPZHA(T58{exi zx-}`$nW>!xK;}zy{g+B>mhesciJxUNYL+sb3!Q{1&AhmVZ5(G2Yu@-V20!)HANNTG z-O_6jDiqmrz`Y4h=ve%sYkJ?6a4dbWKPnV2B;{sos?CplOj2S`4^Ub_P+T_JlBZ`i z5<2Jm{tt0q11Duw{Xet2!w#@83xbkqprU~gvLa(>l4G)Ino4OnZDyuBfYrJK zyBoVZtWrslTH#w+Sy7>qNiImc_)=l%qDB&Z7rJv&>gORrDpmw!r;H8|DO!Iutu&T=wC_1$Fq}(gP`p(F2AL zL=Or}LG^%ckOeFG0QF#?D7m297QnunXahy*SBFiVRvj>o_vt`?qT8u-j0OxWe0~kU zP~EKLaDqY?`}{+xP!gIQa~{e_{sqw%*&E&pVt9vr3!)$sb1!`%Zh)bWAjlzoF=<*5 zJSxm`jDT(EcMVL4SGC2QceQnB6vx`$Yfw${I#X|fbML$umUk}UHEhp3nY$-5G*1J- zdU=51Yl0E5j@FGQnfr)Xq#hT>QkU|}-QGhKX`sL8fGp%qL0(kLB`(b7hUsYqeT6u5tct(sveQ71wfZMy3!Q|6t1cu(sCx5;mvZjL2@O zDVVL^_f)jx+@UZMXAFX|oGf8hfr}aRxM?5uNqd~yiKvS$p4>jI4tIY2p0Ma{cFK!p zO3&dv#yD2=M>=e4k+o;;O+|arRYdpVFZSqoG6-v(|1>SQ6-(^gsFSWZw>i9-s)SwW zZ7NclwmT(#^jr(&nb08jVjD%Y(KqdC0QX||dV8_gfhOz{fvmhYWARncMqOfU5?kfX z^)IN)8Z$!|xH#LN=yfh@&K@%#X)(>1d8~f-hbp9(gQG50Nv~C_>ty?*804kf+!ZWr zS0UP!&iy;Bbf6FYp#bvBE-%kVpdjz~%ZukD?cVcEC@*$XAzE&{o3}UPkGW-D{TlQ4 z%6#eaoH8@17CY=*-IQJI<1Df%_WSjlgzQ~#WAQX0c7(;bK*w!7WdXC{zaY#!U+9hP zUXzWWaB^ue4yKL6M}MdUC5K>=OGBlRh9nD}W#;r2!axF#0<)p>eNlDM#FZoNkZ~1q zVmt-md{R9JvkbGo6$rnY0*A?P2_{>xxbZ79xaIOsg_w!d(`le!X7=v9OA2COj#SwX zBgak6!bsZn@Rc`H^0(9+sg1JFt)8ypaEpJLx-{k~ejv?bA_eJLwyX12K=l;`6QTv9 zKpzjGKh5 zvP>2i7MNI#R*&N@|N%=M;-@1)m&{S9Bw_-oUY>syN z;eh%zz;XQhSj&Ki!!Wvrbi%3RMi{#E7X`2Lg!@tGx*oV6T&W2~zJqrF>cVp0-~US; zfJoDJ027Y1o!;#)WlQstuVzV8`VJ$@u=5$OpOeSKkG04~mWS%MD6F{*bYKT?oivQW zJAiq>c@H-KaCL(8+x$M(inaNl)t!<&MsH}F|7~e2?0{hN|4tpw*8xT9pAhvf(1BRv zS@`I%-}>bDB9brBt%*lsqE8nu+G{>l}{a4YrqPR>q67q;5kf!@$ zKHA3ZL#7{*hOZGTpA4$Mm@jb-<4v13y(BX|czuOhN`ffFf%gi-wWPLJ7>hM$h-JUq z*1Q+~f3&R&+_p7c+O9Xa+Pid+wlyr7ZKwWVkxkqBt$q*Qws;11sKFHuuMem<(|0~4 zLoL&H^3nRpZI2MU;CP7YGt>Y@`pyaa-FN1&-<;GNUHg(XedfJD9*Na4-e0zg%=FUz zpbLIn!C4({`fY8$`>hE1*#oQRi6_XmWa>`cQPwu%E;9sR4JM6GEE> zhAm2#jW-jeNW-(JJ2!cxuBSM03_ep8MKeP@_*RV}A-*E!t0)6w-2<98kMSoeg?sbm zAVpX4%5KCoSA?+?OyccWSH%u}e_$z6U`@UU`tb46MNP3_W}M;zP=RyiXqStc=EyZ6 z?5>m;Y#n5(<{ zuqsmK%)Qyb4PKeWGrHURC5bo9FWbY;ECEF7dD4Ess$$0xSVD-@-=Q^3&4;dIEQbkF zt@cm(m(u*#s^`bB%bAHQQJeWu{MV`%!r&qrx8^70ux{?<&hWl&zeAzIacZn@(K6gR zI0$X7M(SOa`Dy>(7J&K!yD9shSU)uClU39ZZzdQ0IB%QjQM2Nk<*}4)PJL_Q&>SgY zRh?IBUOIAsTusb_$5;stN&J~VzBl5ZEJ*yP$C%QiEqaT@xYjY+ho;h>2s>NR0=45LP@Js3KmsMn>dMR#1bI+vP@{V*0-8R;en^-+Zbgk7}Jhu zSxs3#a;TkR0+HL6()v`Exw|;rF_G<#NCU6$Xp1_*wrCpvU&sFp{&(X4zwmz-{=dQg zjXXH9s*&+}@I*E)aoLbEec8vxo7&OaGVvl1?CN&}gZO<}es_imdDSglN35#I&3WJN zsd_A+G1Fb|)v3t@mY@xk;+l?Xtos(W$8S zPz7!?hwpM?3gn2+C;ki)Y4@~Q$$@YEZuq>_4#*H)=6%xK@K^`6#jV}9@j-=S^Wr7h zai~7FuQV_H#L7@p!!>}XQP5k2o6d$qZ0DqpiB5EhP=#^BcGYlKv~NFc^+0MWc(m7QR%!P< zv}g}QA{FJe%A70OW2;288$__KEB+MJw8LvS%DLXy6nz~bj4QcN2CaZDIp_|;&IqaX za$G)_5FM@b@z$+F1*~YIIs)n6;Adz)uW|W&Tn(?w=km`9pLI3k0@a^~#;Or`-&10q z$-pE4$f>lM%5t>-LiT;G# zkiG+1Yd4X;L3#HX!yf1FQmy4Mh94m3G=_@(8^tzuFZ0nXzEAg$^^V1KL(;^%-D0dT zRbrdY`Dg{$1jJBTCr7pv`&Yr~XGFePEaYvwlaH|qHY|sMC$CinqZSzA;Kr;`M;-~B z5KIQJ0^3zr(^azMBXF39OWFeDhU*E)GdCQufE^yiP7+06PlOJkILV#}fubaPA_Pj3 z?1>NvCD{{kXj$uZ>s*;>;S&O>@vWmA6-vY4syC zK`<-9{b5aW#<3xw2Po&T`Q@!5Ca}j-xV2+am6)eu9o;B@=4{NCa0HUq+n^ausOw19 zw{mti0duM*`~~ry8C-uKj>l1QRfF}{i`+~WSdKTsn+Ma0lDuQ4#_iD!$Ad3&a~O^F z)|fL+HLE?^x={8K9^;vkRJ0YB0i~iFunmDuNQy$xmJ~b!TQQsNY!C6A4Fv#3`V$-C z{OnIW#yrv3!4)<_elBu|(==*ZoQtsppo1uhWP$ECZl!mau%wQkaSU zQ2k=3LlHfJGxItVYp{zgwwVaM z1-q`zYG!m?Vz|*Kt9V$S=(a9l*euR2@M>MgwWAX}j!>YBX_sf4vIUX9=X}g9W#f}- z5N#o5ZYde7yTND{dvJ?P<_Weinq|vDOve?OBMXt{hNpU{ zKwxSJbfN%NUeF$0&!*?s(`x9tH?XgVTN<&1Z^RrR;_?5bM(nZXqD$EN?Y6?>z_ zHVXL}`|a6*G9_>~&x3s!{K=Shf*HDY%r(GGSw-))ofz=Ge+lj@7Ojp!e0+gW1dVVIo<>S`X4t`?{S-mMDEx83}MutWW9zz?EWDB*)%1BQN<2iVAa z1?NM{YRcJeZgC-p!LHv+@gjHh2Q+It_DOAO2WCvS6hOudfq3$b?O~@%3t;rWpBawr{Sf)Q;^DLe(Xls87%)FvcmrAC!pxD5+VbWh`AsJMgSgog>4 zQyEjy9#*qx!L6Z{r=f%aj8-x;4?OWIn;0UT8SU|m-r0UPSh&4i*_(N{RptHA1chqA2p1GfSJ5$i9)4 zj1dS~&Ww@DOQRw67h12+u8wXV08De%>gx25;EDg=sgD1ePSd<)&daI`Px6E7v?LvE zbb5e_mS{Wow>)VWY`e{K!^5^YFp+f~rN%56^pEM0O?sV1 z{O7`0okWvp+En*asSA$+UN8%|n7Uc)-exkHkedl(eA%GJdm$9exO?>oC-=~`7^%u$ zuByQ1uoS7e;i8$*aN^p0k#%1UM=&f{Qy?v)`>Sg(><@LEwJqEhz}`b|sI~iF2x0{W z3rW54xv=V0!<=n5LW8!HXJYxtfQJZqI9YO7VQ%wk6 z3t9_auRHoN)9dx(8>w)?_pb$V@3z*muvEWf!qN8K1f?p%=E@2EoL91;sj;zfcetEDtq(m9>rwk#NmU4uLpCUSchhpBljyyqnHt64 z!E(O0@e|L5ZCAallRJEnRMmu*25h#Yvpi&@(50vhWV}MmWG#W)Ud!Tbs1)aT6|9!> zL|}0gUs2AEvI|p~RN&sZr|q&$ihX&1VnTmn9IuBR^Qe&t!F-~PLxAJ8$i5*!dnkaO zx^>}m;ky~Y_K*I>W|#(&C6i%0OgO}FdnkF%u5bW_yqf`xg;BzQ2`^(*Y@bC$5l zdEwi;!X5jNGXpkf4f}JhfIJsov@Lu$1I$_eGG_^xoHcBD9u8^z_<8V*fX!LMUe4N9 z;{90rjK`B}`G`$mVfF8c;@4|(GL#sWdyaR$Zyn}<2O_Cmpw)*zT2Zm?Y&7wBV>*^RHsdtlM@tF1mTdGD?;J01j& zW>E9~Nn2 znV|;fOHjrA$F|VIGoK3w@MjKW2;rY9e->geg0K5HWNQnpohx6hU}aZZsN*A0P#-`aJjEJHen)z0Vd|qULf||%*fGZoW<=E_*+)GE?B%dnb#b2; z+~WoJy1|a9n^|kW3vCTh8k$3&3+*_^!wq@}MQ*TTu7}X&CTsn-7ktwT>e!vEx4z{< zJI?lUc-w`xzT*XVd%+$r_^uZ$_SiYs&8*@KS31c%C|@bt!Wk}f?L97ZQoonOzg+ot z^t#X_w7}#LxPT-ivm}(l1UvriCR=#63vKJX1N`t{3lXaXTK@7R^g;{URd40Dotk35e zaI;arsHuK<$D40p%?=v$OBMjLC79gw?O2d&3q1jYjONIBFupin#evO|DqP#V1FQM8 z@XOapUt%V6SR%q1b)3?GR}Pn+`{4oSIwP^`Gh>{{!(w!?#&yeQbyP%C%{k?Tn1&Z6 z&c@j8tlCrY8@%O2P&D|*MSJGOfX_vhDM(<$OdNA||6Ew<8%28#EN*FiTt`N?C1(*h zTNc3BBV^71ogfdfk5}w4hE&XEEk7&jI%eO)fT25&S(%+Lnlw||NoMMb#Z`zrj2Rhr zy0ETYpxeOR&os%pA%};cxm?MlxI-1U-N>;boE?E9298!VZA;DX_|EP#nkqYu$PBHz zn%)TS4DBtBI-w+ttQ@k~iA^lAgxvJ!aB*g|GcgW*`fi}LtV+TH1EUd@A@a}(@%onN zZmbL@Ee}h$(!m5F;=_1ryxko;9z_Iabu}GY z>cMG6M3*k#0NEp$-utQ{%G01{m|epF21kltEs$5aBUcB3q2OiMOvd zvVw27a3@a$-jgo{)_QnCMNR+^jd28BF`f2Yph{COb$UwSc_POaU%w_`2Ga0S75gNrz~eI7DE&w9aX+C~b_sm8^Lyuyh=r>qc4M zLRO7)#|+1H3VjvOP-T!#@jeFc0)sXRywkb1k;@)~GF^qcZUYH@VI57O2bJ4@$|~i# zsrEp4M(rrihxmA|AJHUSfo;t9r0VcWAuROG7=#%^1QXAiO^w&d7ee*ROOBEHf(gZ} zeR&CL1XmR{M*G~Embt(RZI!D|1GYVywxK3d^~MopC07T zZ4}SG46BJlEF5rVMraQM-zCfcVV-e=nn-)iTJ-ccuH*(8*H(x7WayZwhAlJ;PBbsw zbgve(1m!`5UaO0U&SF%|raeVXaD!k347Jl#$t#b=ob5!qoz^Tl*=7m*ZX=eLp!0)9 zHcCLJ`}4gLl!(PLTSTVC1mGs7D^$tprAtPDYI1t<;-btjgm_;BzLy3|myFav31Xm^ zy;%JrLUL)5jVfXyjVjVq#Wt$giz?Qr5*t{$U;aF=SD@+PVP>hYSoSrCu29&Yf=D!$TtQRe4{-ao~Zv?c4&VrH9g1H$7>_-hE4nD7cW zjHy~9K9&UALYxv6>l`ZR?EY~u;LJ?-_dD0(hqG*s$#e!DbiO^Rh->&Xrl)e1Cw>Jc z|5)YjzD$ggtqkYLcH}Y*8+p!^TyvQv%jVU%m>7;93_F+U)t7F9UhLyK{kRg$Il;3* z?Ba}fZ+ru}Hv zzqu2?-lB!BaW*HH!3M%`%8DnpSMfC?+Fv~bBCFz3RX=QAafnNxbklLZrSwwc32Bb@ zW0)9eT+Tc&MnktJ=ayw@65W86maG8#D4~K1Q$nOrI^Ly3^!=s8RbY>jeibMaBZboD z`$UGR@q)g;l#)^kS9<$Zrb{g)NxZ+5xR~E8tJSP0{o;Bx>*-u-Ji=xyV>&49rSSYC zQij5amU8~}UMZ*K&?or~R%cwx_o(XE{!t~aNA(&*mC*g5igkV;Rr%Uas=)QA?z%_I z%1wo#sd5j%qpDx~N0qo9)uo0ip+iwM^F)}8=8A|Mr4QFl@8`Ldt^n#YeK~$4vW!iP zM+UgX-iP^K7*|nivQ}r9Y~~inoD;jmqN$H)U@5&Nc4L=Ud;gN^Q*h*5o;2$$u0B{# zW8e&W^@#wFs-BsKWe^QQqitNi_VVY#>Az$_E(K&u7UYwF{4xu286ax`ksbsNeHG;% zuNdV;V+iY1*g*!y8>QoiO%=NR3%tBB0J7IA_$y+}d#i{szKZw( z?)O8NlT#6q|I3OPn^h5G+=|$Badt%r9$(@@MeIG(6W0D##P=k>?22eMFn>iXR+v0WQ(>*Do)_o|Ww1$ptwY;#CxV(51TRfy6@oU0M=I zT!Mf$6jiLr zY^Q)Y@F(ZWq)V{<0__tHE5w}k@2Z&;gH?e-4OSTEFPOQ!FK?~fh221@PIw&Ir6IJd ztm@RBOU4?~hiR?ltK)LiF{^Q~>YQ+_wCUq6DqNk@XSiZC)wwSwkoR1jv4YikujZUr zt=664@?okokV9M4t|*buK7ao!fD8M&}LC!<;VarPE#JOm+T1 zu`P4C)j3LLTW*gqWb0&Uq&lbGVFocAIt^8wU4^UjzJk@sj%yHO%jy)r3?pU^$A&hx z=wPnXI&PVtEk=I_a|awfMZ~VLy-KmI7!TOk=2j>8Fvd1C2p?lTK1_8!cY$zb`N*x# zcAZ=AckAR3RI2l`HNG+Ff3-R}^TRs*I5?l!CEJmG@|pg!tnb+}KIVR}#cohAF&MRRpf*_U6Z&0`3qP-} z6QFTOfJ=|%0vinUtiX^NCq_c)m$9gB_`$&fZ1T4{CH1Y5`hQ3VYGoFSuc5vUbN+U| z)I4@XD4DE;GS6iWk%vby(t3Fe;A@;XdCXieA(EIs6z<#!p09(yiV_E55N*igzJpf7 z)!>A^%+eV+)$Bj*^kYD`>zxD2Lq|s==W&v)FbXFg`m)%V>0S*$&Zq#$`OKn7!)K7f z)6H0XtI9cXUVb@i%{4A(4*So)pFo!q7-tCxv$)I}yU1|=uwU5P#VVU8;TNAY{0KtK z`PFt=*1~1_$73*9WmCqS+dnERDgZO`{;{KOD-3MJZ*?Y3bd6-vobo}_^M91I#$bUoj)|n}t^r&aGJ!~ru zrLH!Q%xuGcmI#g=I)j|Xlckf16W6ktwmPVg9g&B(84`Xc<`K&$V?n#Ij=vcnI&hIf z>dTLgT`ECslw@jNle0*qKY_Ee*$a;!cvlp~TW*7`89yGl1vW-;;+Go(SUv2;86^1X zELSN`$lqWfhzr~RT8s|0vVNp?B!m;B!F>)IZQ)1y+ z{GzZhzHIYaF1iI~6h-Qnn-C@5|n4;Gfxm4z`<7vY1i_k5T z6TK}Hb}@&b(3nqxPi&N_XLL{FctVr2_&a-XD9y*@3@U1XP_%UTe9c%+m&i!{NnU(% z13|kY4ZOP1q_G~CYR2n}5tF@2AGz%f6`;x8wj_12OkB+}aL<=p>z}|!|0!bq>2SV4 zt;)UUh#-jADy~Aj&H!H`rE9)mtfmWj6kRq3f0D29LNc4)en)@H4gLKME4Y=%dhQ1@ zC)+LU{D~qq5x19&%e*?mr%O-=CU+yF<|O5Yu7?8ET4@u|F459uolDV`wKQzSYJXG1 z?by#~X;_2briNAA^9YrrP9VZSTf=Sm4kS17&%`CyLkjUv9E4TwPXX9 zw)h?fz}5u7W6n>XF_Nh^!!ZT_e3J;JPq4D;yLidrDm_+y%=zJ>?CSX|ay|?>H#IaO zzHTFbBTJ&G)ePWV`VDAG{TpS~=7yC-5NWajf@b z%A6v8g`B&9vX&WhGv*!!lCuuS@9;!TTZn-`U+7SQ@^?hy+BW$NIQM=%h^Y4i=zQXA z>^EJ6pX4llk4Vf>&nKRV$=XqizA5r_wnA;3ZvITiHes9Of)mq|_QH9wHsl<Qnn|j1e<;A*9MMQ0hh1cPg*hYArzlcX;!Brz&eChwy730H(Tt-Va z%goNeI~86UbK)MHels`;uTdjn&U`nDbOA;zr^m=}Bv$h^HoXE2Yq83Bh6N`WeVHacd@ox1-g_ zJzA~M)?Q`={lz}~PHJtkW*1cTPpo-fl-!FUMCDFu=bpOO5vF=~s&?*aiH)$;yHm6i zPqFy4bEjzM%PVa4R>8vqdPb)~L_tB@H3|gkHp2}9t2@&ABoB;SjK%^NI(es?4SDf2 z7O|snY}m#^;)FmqVvsRP|NOtC^y$Y3=rUWqPo3eDnOok{0p%^tTVAMhw-yTO{N~r( z@@AC*y8N6QHJ}V=lfSmHS_ZtyVaqUH%YdT!+5n2_YXf`G2KHzh*kjwk8`1`F!wBRR z@6tAKvt5;D8$gw^4eUf4Xg*5BB&(Xz2L4sJ4aB7lbU>im1_nVbku^@ss;><=(gt>s zy7R!Wxc-tk(%1`@AyObc*K3n()h;kYfJ%xZ*_rv*6D0y^qljqq9kqR;|fx)gCO*Lgv(A< z7N^kjH|lJG2XKlz51!Rn7|+)V>zFDID2a~y6i1CG6~}R!r+SLh;q1W-4ZZUQs?C#6 ztXj3Ivgw~#DxpCt$8ngKy5UIkKgzTj6-=fM@J+A&#!6m2iK}sV4jG(bfXd_kOjFk} zv2i&A9*FNKBVI4P9~oJ3;wb9Mix@;rJD!6m9&3*@VA=ui;(c@i#$}iEz#JD@fl(um ztpIhQpfaBjbHBH|ZCx1X!Sp}NFhL6OvjaUy`Y-P1nH~6ScR$yp@wvhM?0yrUKk`1A z_73+m#hudO5 zK=NJgX9FLJ#smu_z4DDG>1D9*Mhl&>qhxH!FOgN2bf(Ifb>sBm`X!16}>J55vNjL7t8dv1SRk(4tYFx1wm&EA;&GSZ$ zEAho)FZK!9QFq^ZidF;#f51ISzfo`V6es?3aAKjj3WB3*&Ngcz-2pyzUqhKu%AM=`Jp)Xr_e_M zl|uf)1|IO^;Uu8qeZvpMNkD~u)ejBWI$Pw21}!w^hZb4r3?G!IHZ|YLfU0WKS6Ebg z3_!wY7=dg?szYh-z3#WFRfrAv-v706{IBp_EKm4v!RSOQ;=6upuBcsIEHVN~%BDS$W2 z+WEtQCk%7rRstg>Wr6Nw7t|i5DPMvEh`pstDzcaj;sO`(F6QRDdl==}mp5={=!6kS zisFczKxlaS9sq>mcWhvl=AOSNyGbL*=ovtEJdwsaky>AP$?3k@%AxM7r{}?krC**t zQZpQ$z`1-3P7lK8e&zCHRxU4s1xf#BXG>ZDj>WBw-UIAhz8NmVbssBV(@0ElxI#LyO|Fnm&g(h8Kmoe35~@= z!9{pLDd8^=a63Cr30YVDIObz;fo+ds`4&wrdKcOa{;Wmsfj{>t@B!Eoe9=nc&$=sU zY@_S-OXhyjoYfgX9xu4-F2-Yxhil6z9Hs!pnUI)$77Xvo{LLIyJOCd ze{%&M9Pzm=JiLXImfLZsAoBs>?O6Y*oTRlx*TkyEIN{b_UYgkweFs}1>&>ps1I$|P zY98L!z&ph7g*%D+vBJe|4hBI>V)$1sb&mJK>e~yRS1;yFdXjSzSizBBG9WkoNRb-8 ziu77WcIPN@y%x1mMYK}CR;h@v6G0R!T9w9HO>RZ2zy}q$P7|z0GRS8~uqwzy$L6M? zs&ePx$EC!m112+fQ1ep5jvHnAPges|4x1?Ay!2a}h(xOJCj9VSD6QOQR26YHyU{E{ zJW!6Gg{S#3)>;gya^9+_XH1_3KC4Zyz^>cKyQwiXUk7k%H9t5R`4A@~T)y3eE8THN z{Pwk*5x^bs+dG~>;9LY+w;+H!;Qs32UbGpi57%EcU5WA8)jPo_f|+ysU7@UY_d zE512@VcVZxFeT^5(F8?#kSIQ#LW7s@o*SePaBR965)UM1q@pV~b(HSjc0_0jh>@AI zf$CfczR?h{>=Nfm0$xOdW9`o6H%apJ2ptOUM$+MK!Wa`CoRcu936C@hpG89_KUW%l zs$71~7k-Wsev1A4e1_RR&LdS@%F|y*dPVW*RukcS2H^%npurFr?h^Q@5?~RVnc_N4 zA-R=Ug6V0JzAXM-qMWBFR0Yh8lwx|cq40A<;fG(eBK1*N&*UR~6h^uf{(we7CfbSe z8h7!wlq-dih60Cx6w>pCLNp(Rzccv*nq10I7mjxu3VW~1Q-;7aB)`%}VT4QJNJC)?QD*unj4%`erVR6e zK?Cz0rO*_;Jr%v3ZzVqr+f7xt7zpfTop#k`M5FVDfMU+uap9^dx@uX?s(y9>xBUo4 z2bvg6oR*5NGFNKo-HNN?l{TkYniKMnjPKO5rfIGndZ|Dhr{Gt`KVwssW~chBrV`P* zb}&5^d64THOtCh9-mqwk_0Qa5b*TbMv1mtQ&IhzujnP!HCWXQ1{~(E!=~%D?O-RM! zH(RD|)YP^p+thnMGsVShvY7L-F@K<#%ueocsBe!ZK?k?GB_p-id`=ce>+Mwx5HRJ! z`xxkj^8sN7-Y~9!Gw^b;AMkQX!nO7hO5qMm{Atxt%jQ%iZWiLD_xLeToiPdrTKqA7 z2fgo|{QkFkvopT@Bz(W*eV@tiXT9%p`Mt^eUcm2Pc;DaV_ubz25BdFd?|U=9mwDeE z{Qi>nUG`yof7<&#liwG4-`DW_Z0~y|zfbbMTlsy2ev2I7M_rBE9qz`6C^?JcBHSA= z6aD#GhV?Ry5lc>@=ocRsdH4$6AdO2JoMozDjddN|t>`Rkj_#f(j!zH3K|^}taQrRM zBJS@NnO2;@welr#UebmRn)?jSqneEm%>4%E-T`3lJ2)!`fVuzRBs{R`{5kq}u2gXP zQgr^*ink3rKTthqV=on(SyELN-(wKvH7Z_uvKDNm zi~J$pgwZ+*f`~bPxyH1;F63am=Bk3uJtmv;O*SLr<4rcvoNPu)Hn-)=rpUS6WK-;N zbA-vJ?^-KnKR5I8WmDpeGub>QhJz9~(PZ;TPBvx2O)y_J#m?`KRoNs=HlyNanrv>! z$wp=K=+${-GtBv#$>u{YH|Lvdrsia$+}xBen~*cxWb+yg3U=T|#xF71yzHu=%0{y} zK3_JaPR~>=)LJ*2t4%g{y4m0vJyf{X)IUGt6$6`M7+_&?zORSLx*Y$k0Yf1&dx{SM>y+3 z%|6Wx9lmL@skhlwpSEli$JzbtbnMvL43Yb_W{`XQPNZ|5(Z_SsY1700$Ygf9o7u$n z&}1`1V5&!$>RTq&uS}{xm{h^sRHzHoX<7UQrdnuH)tFRWCe_obrI;?9)-L0GO_e<< zIM-wRU1oNW$!wa*EPRT#?pv(NYad$u1=d5EiTt!niBHq;?VQ`46HG?0i57?B5rcbb zHZHERz1;~K+}{XpnRHoB)0<*D(?2j79Aq-6|Fqk(Q49U2@(SPhQHYdr#H*@O5RQD# zHJN_M zQSLm!Jf4?|3&&F?k4LiexYOn_F*}bMlgC@<;b8b`lgA?_k5^QiVZv9p!gHN0K4zk} zW<|9Q-vMPPbw;Ac%Y2-8n+)Dsizl9rdR2yV?R`=K9LI#?PZ`X`E~Z|N!Amuq)9-h? zIgS)%MZvjCmDcls=Q(Tf6@!!5@xjG#l@u?qSbPWah6BvPL!<%XAr3_2@D?Oj9 zp^q1(eG;cj@qSKlvp90Y_Z!DdU|`@3jfk57f<)DLo!>{8VawI3@5ucN`^6tDzO(C`#1Q&;xY% zgp_mfg|GJn?4&vzA8{(zl?1`rry58_HIOy9O#}wW4#;FBPP`!Wq}dqWCf9RB^&uGy zLBsJ;$cx#(t!7(mX{-Tu7$E#s!|_85@M#4O%)ibVqa+fM6}U|W-VwN?clAOh>tF`& zHyJc*25Bzo5KC zDLnI43g@E+SZRRQ5_q8jRv4f(!ix>?I0KwT%u5XLU;~s!c)0-v4KS;EJ5`|uR;SvMirH0hih06{6F9vRPVWENl*1)YUTy5Y# zFmS62iwyi$1Gl8g7Ht@*?KGnc`47|+1#~668fp=r| zgX6Y$jfMtT5@_^`2L6(Pml*gK1GkzUHt+`x+-iE6f!}W6R@2K3{Hq3THGQ0cUt{1_ z(7b)JsB+Pd;rcp zW(%QVC&nUZ=orLwxS{npz7ExKhcl7(hJ^qTE&ZjDOgpZrVI3eCfF$KYqJ{@elFW#9 z2@@Bw@Cn7e01baeY_t3t&-VsiQHRYm{%LCX6n^VA@;6w0wh7dZ)Igy6;LKtT7FEyE zKymf_%xBmI?m(HbQ-g#tC!$5noX3d2`6AxAOv;{_#)wyZ5q~ogIGGuazvheBq7hic znUFwsILRSJDZx$|#f8Jamr9miR4Jk;znHT|qa?wIW{xZy8~%Y9j;2eD6D~8_E=*S$ zZ23I8e>P6{35k>eKuDW`&U>PXN z%fLNYx}*e7_A&6gOA1%PNRjYk`hsNo*ntdCBXJPKAg~8g2A=h%L4FlD($JsoqaPiT z{uO35;K#5sIRa4nXBvbinjz7_0`%`Oi=Ais=>P5$UitYnu3y8n{53l1&u~`nk5%GV znOJ{0XDFSPhE{4b4vC7gKfS=%5zO!u@}rnQni?Jh0$%+qiL9u_h9oA7aPmkcS4yig z4L#EE9VtJ~deRs>U${upvaPTZ*mUuCK(nV411(al{~=nl{)cF|j1}bu7U0hyyOgld zKh6BbeR2x8!Is#x*m#AA&S8#Db0t}*NXx+t)Aom3#nU%bVFn>J!}6n2TpoG*-{JK> zAFqEG;a6n*)$~o-`NR}`2kU1bS3J)a+=gCFr|w}VsxxxY14+};ppvNgxT#t@r&sV) z3r3AAWXnIqnrIh`<`PJc*6mj#qHkZwj7o;ARexw+g_i%es(b#iKX8V zvuBmA=VMY%%buT$1EkeBi@ksfWscCAmaZc$?bad<-_O$aS|R*@B$o~!uiug?jisM+ zZQZ60pU$tz;`+(?uDJ3yPQL*EYtE&?UeDIs;~a z&Y%p?8ORx+KLAk7xn2xexqpDJ5tSywH$c~jGfjkVfUXfoX+%n-fR54jFdX{2Qs7w< z7F~xnTZM<$t*jw^8E--WIE6Ph=A=74)#)HEsz;K1P@96R!YU+mp0wenh8KYV{nR{0 ziwWeFrY#M^W&cB+h))R?yHR5Ewn-DP9GIRz{-UTvk94Ew2%C@x)UJnIkc7D{m1n@6 zKR6z@f?!vOpZuus#&WBUX@ZsT_Ek(u~7QE=$d3@ zn^C@%?UC}9Nhn=|_?BpSQ$si6!G8Zk3}9Yt$$s)9mOo6G5ao)w)yJWV`Fo0L#9R{| z5n1s8lIIg57z%Bzuv2yan)#FGoBUmh*X)pj$~|8Y%TTovpM-pk)Scg4z}zMwnc?3? ze8!T2>zxn(qZUl+ES>Y}b4vXh-7*}K`fOirvkFn)sS3zSzSM{Rdkc1{#|?G$RT{eN zpZ4YUxKv1>2oq1M)vLyek1-sO*Gt^&K zGccs&zu}|)gw$i6vR7F$*=4`jf?evn{zuDx-F{O4fscB$5cN*C@z{ML(Xs!rV3+z0 zhWajc5c{F?e(LQ~k9o>|y(MG&P}T5DEZC*~=5{H2<|f$8!sajjkgv!eFGTd+bMsdB z%NFbstx=+8l`js`@oo@sKCAG%#r?IT2)mmY9+bt$o{hNkvf@f?+!V&0kQEoUakCjW zCM&Mo##J)z?LSN54ZTS=?mEUjpA}bO(9#$N4IXJR>=g7?&UiWs@uq48L&uz0~Q9%fQ3OBurS~bSSGWK4Gv~? zF=wMHnGRU4@kQKcB4ohwpf4h2B4ohg_#$rf>8ob``)5T@jBq&8$JKVn!`%ay-7Kr= zVl6~&yOskvDLpQ82?bEITuuEu81_N2JV5B*2whD{!KH?;3`OcgNS@qCbhsz>K&Mix zDI&x-mlWB7-ai20R1trg8n)xNZX(Xbl9a4@v)!CQZP&RgH&e(yQ^4 z+(-rjOSwRe?D)ZjhQIs&y6oY#qWF|^MAD3RE{;k+n>iVZIcTBmx9<}|LNs_~5>Xj*#ZJ}d**bn%wRTd=@| zCM%k#4?8dG^fzT`K>uq^nYIFxX*Tqt5Z^?_U=Rf%i%kvN5UShAUuokKU>j$^v~dQd zjWdw9jXys}`j>%iywyYuXyZRL5d+%zts0@VAO<8Y_okJ%i8%_GHa<<;cxp9Ef~GjL zC{lMP+qnhsRVuV}ZH%U!OT%;xz+ahC&4P(AHsEi5U9wYW(P_Bf_!MIvik(aBy>HJ(R z)pS0t{`|CBgrF=z8rA`q|$@8Khsp?AR&PS1qIWQ;rHk*EH3D{%vN{53Us z(zK4yVr6iW#p0|YPH3*zfA2fXS9D2rsYfa3Jd(^uY0WjrWwI}qM>H2drMrkT*N5}X z0hD$<>6WR;nV*-^ecwPX*Z6XoKakP`#HsP&OdUX}-lJ6Pyi%L5OzT>a%eQ>FyfRB9 z<1f>C;{4Kw^SI)u;)wJPwUppex%Q3ic*_1R`CTKwx6AJ;`CTc$jq+QMU)*Y##GhDv zn~%ViLIC!ay_OL8^;RP^5NMUekIC-_`CTu+>*V)A`F%is@53($EW@8zd_vS$|7Wt4 zegc>J2y{r|7v*<{{BD=uZSwn!{BD)sE%*h2<@gheFZ2<(YXE`W?Oq82T@+ETWYHtP z-SXQdzn${y$nQ@4f`DW~54{<8rhd1q((OBRV{+_7){4z7 ztzEvu;Cw^0G-j`2&5aqBH-=Bv=S#sC?()G&BbYZQzKaS!%dYrbpA0%?4pG2i8|^@Fn@FB=O5PtVxJ?yAQE`0OCJ>CwVtRm>so^(RU!|g;vlo4nqt2gV;Y5 zTPPEODLh77QG)A8n;O=mV(K>XSB60n;4p{*GYn!-hCvLt!=Np~@dkim&Y#XugCNcm zTYV9~HW6q=)_FoxtThob4Em!l#R`qc!z?Dz36Ahv8YBz7sT!)&zh0iQ22b+3FUd$v;%fnmw)iUbK_1vdIRYQ?+QN?MxozQOO+v)UKE$67Kpdfn2i#~b z$LJ2ZyAn#`?G0W97xN%EXdn>3jQD&gWwgM@)SxusywB=Z{@(!o+V8AOZ%Noxut!~SK847 z3h_C`&n@jgPt6reg(4nsX}^v>!e83^Fj2@Z?R|K~V1OpCdvsuFW5Sfbv_EOhE$xfG z(oPysh_5ISH1|W`g5zUmAZ*gF1Crem-phCjt0(gRB@vr+bTqGI#i?HdpQUrS+Bpeh!9yAjQ zoCbNPvGVOj?F~2lw6Fh)gAlk;0&NY|_=~GLmf}xoTf-{+;R)iZY4PMX%8T&2*27}X zu#=>u?G0N1f$2q>aX;(pAJx_{9)GaIM$FJ!L^L%lL@>3QziauJD(=;lk2!1kqAKsr zRN}j1-_H4 zc{@-&+Coa(0zc1SHJz;CQqs1-_gU6q@qVyvp}5rZ4lS#4UAK8OP6)rlr(r$%5rVwW z^5*E<9^El;^|QH+^@R`eg?Zt-#ToAlAKVrghuS$9GCc&l($hIVte$)~|28$m$#y4d zg#qmOQRFe_M-S;;?6b}^$oyLf`KyX-7Wnyc9Oj#;`Q!9r(8l@uus|%&?D?0AqCI#P zc1E;sF_sm17if2S0ZbOceY`$r&KcVh(NwgD;ndt!B{QStH@b*&6`{oS`Qvy?XgXpt zso+NuK9ouVryTQV_IFehIgkX;%7_ipRV0LVV{;NnCpdPB_jC zG2K^3;yT-zvO9BxMZw>`n2YD!;G$r|Ah&98 z2RrX<9kOb$_W-lipRR!*Awa(AhZ`alMi+U~0$AR);YNm31h8-8#G!(5CU9VqA2b zTZjBUIm9?qhfHMZ&|rCWNMuuo44OJ*;+u}@m%F0&#e}L?hgEI`Wsa~YT8AVgCvQLE zqS!jTxUO>?+E-(AFXXm2cL^5f>!RJurql8)o}7))p5!7eV{lC~ego-eME>2Z(=+&N zE&iqEtNQg4FVDA`Jq1)VF%YpOhTcFD|=Z!R7yh}}@1qse1aQRW577x@z{Fpu&; z{&(!P`P-at#N#h0GgruYd#Ms(X-GsUnBusfwj78x2M)W`jFd&{*D)bdK?;GX+mx4R zr%({7x)g2&B1as&(jP;JXczwAbsApn?E8S--~2(-n-9PZQJ5ZfD9lgi8;YM@6{cRY zI5*Y6Ym=ltQc)-SxF*^-8{q&Y=|OF?ReKG(6NL$+c}s@8ISLD7>+^T6yrn+N*x02$ zi!u;}ru#0^vFT^YtXqWB?H5ju-d(Sf!UrzFzW*3cIN7)=4J*nXm6elFeBlDNrX5X~ zth?X3J};nXPd{E7=oAHxb{YdnBMq_C)s)pPIV)MyUy_)N*2Jz-o$2vF0LKf_vc@7D zUd8k%kVYi(M?!^(=Km6~Wi@5}wRqBgmSl5`$)++q2bkKe56CN1lao>AI_83GmQ2%_ zO%BH+n#s|4*eOsbr;`;Q=j!``vww+DM@9_smiZ4n`Tz!g8)7I4YAW{ei=3NP@!Fz4 z4DhP5AI4gu55%fQJJWC*Aeyw-g+K{R|3PyFi-@ba1Jx1yVn1RzW%e#*M*p=^JQR|w z*%!d;H2+js-#qB6+^L1c`*18ca_iF?gGy|kTRt4`q9@J(ON>4)+A|Lg1kXO?N5&b7I-F>&qJf4rEG|_C21eu6ee+JtV_X=C&)xo8vbextjn{I?+kYpu#i9DAd?b31j;0-e7 zjFl_Qa0L&%u)26-KSoxkEJyvk8*@H}X%d8q#tnv%rLrRK0AMB3z+S^b!C-QFVCm8< z_Ezr5W^a{#SHU%WKiRwKU9wPCSJM$l;O-q^5~JBlFu6*Z{Lx#&q-xf?9E{4u;}011 zDDSKwZAqN3*a4<%$I3CyPhBy=HD!%g^dPS)ymW%=qgMPuMh@7Q@@Y;Xqrb-*Bn&8Q z!@mLzpH-j^W#}xt8uwX8QKI11;Eqrdi}QE{sWJM-d(Ht1{*uEkn?ogLT35iv4bH=% zsd_O!O;Eb=C3w-D;`MiuuesnJKloLQ+F_6q1ue&gGBzBK&Efc8+l6CvrABi-g;o7gr^o?=4z)nt zPFmC38W%2{v!9Sm4@4n@e??2ibe;X7O?QBesb!V4rs%tkbIRU(7Hm$@9%Lb+ovB)0 zeKK^@(~36=RGyJ>gPJHjtQJ^`4A?w01GkcP4W7YV%|N!fsD!EdRVBv+0&I526jI7( zU&eXD=$=JQ%lWXcE&u-5f-KQr(JRBgWt|(Kr>NC<4<=plR$OxI{Pq1Z^}V;7w+_zY zZ-8fHVw{=dUwRi$c_YOhr074D@y?2a&1^XwFF((Pe#wK5^`MtqsQTc*gEfFM$KuC( zDAO%UR(3~v&{I6zG7B}?J(6sOYQ^H`c_``e`MCSD2ffI{-RMH4R{Gb`$HfHcSYv|p z<}pEWAzJ9=@D<5n5+r00=t*OObl)*S`V5(%I4b#aIK$1sFU_M|&f?2GYNHftCOVku z&W_ynH622tKf~LXX4C?^TpYRW0>-GX1)j&O?994--{(9rFp{1UIIUDDEu%*jjz-qQ z2ThBo0|(36^#jSznClEOFxuz&F)%XA{UcvAd_dy2d%|9O5EW^fjyisfQ3soWPvMgi zZ>CnV%$*&-P~(~E886rK73x(X-lV4YA;z|Os_;3q*Ot}1P<}%aLD(y-K7QQ!pF>2) z+Zz@j25@*=GZd-492l-gKrt5uOM=^q1uc}EfbtmVn9&8fus%9a*p(ZIr-;1y=Rm*pY%OI(p4 zBYx<$7KVc^e_^(b9;7h8lE}h^`KHFRFpXYeY83k33X|*RBZV30>7#|AvyZQe z^um$fVp}B2Ze{QEa51iaqz3?&0MTut}1cqt=H*QInGKV4>}I?*0t73EY_%c z<0qjOrN=BS#yXOi6Xz)vmzSyGm;#VpJ{{p)OfG6VgNX`5=^F=3X`!X$cbh0AsgpJP z1CrDyILg{zN&QLn<^UwMR_)vYODcZAluomhR8ki&>%1NH2^)$H#D=A)2`oN^om-7h zKtnYksl&NCMie|MY>=GM!=>Rg)^Uz1PIB%-WBx2>4w>a|!jk2praDekbMqWmqHLD5 z=$#8>^R-^q3NJ|Dp7*S4;DixK+|u6Ag-?_ULw$xYy?Y5CrjuAr&`@iGY$t)>)|NG# z!`hOs=3Ngd$sAAlVC^&Jgq7u{;uZm;%UC&pdhNCEi8ANDgHXP;RD|WDysAG$0jL;) zw;bFqpDajwLnk;F(}N2I874F(AzN#ofF_g=A1LB_V5^9+Ziceqmx&=+gdkaZK#;fkAmV;MX1eL+@?}pwI5rS$S`fBpE(+z{Ha9#hI7GIfA0hqp3@io@ zftwNzgz$cgKa><%9Uam-n0xZD{jY=&U%J6HFeNr^=>eooO4^^gX~PGQHh?AgnDZq~ z+cfv&;Rld5DQQo2>5e*pv;j1OnDcJ2E$`?9NSlj^s(ZdDF|q!OhRUjGNfS z8f*JWjS{Wg)U=h0)?2Y&y*0Jq!;zT_CKM$;ID|@A^}!I#WHwO6b(;^9C6ZArm_6BU znsvO`1=u}lFX;^Jgf!=pWwVIRHbf)DFoG~b4lu0|VwljBKwCcBbNQ7r6e?tf_5pt| zGsJ}q8V?xaf@bIy-6}TkzZcp-hv3XX0mne2JmQ1CKrt$ zu!%VWi#crpm6mn)Hx_Z|q$2A^llq(-V>xtk(-VBeW{_i%_ag%}kHa*BrgMsY4Jj+N zsa%#FEs0THOTv={&aUG`fNp)?!l7n}cxXxd!y09kGt9~ztjdS#&L7f^6>S4~x^up} zI#fHlQ#Um8wWDgVIG`Q9(zi!6r2czc05k1~n6@2py=-7RdQg)!o?{l=LRm?05-2N) zsm~>DB3GW1&_~uuV#t$uSa~u$lsvsARLC-2t@o4uM-n~HUn|*`X=y%*etn;nC|BW( zM2Tr7%0;^@@kndAOp|#M%}VlkP7)*0quoR~5@ljYlz*&58UD{DIz~6W|09X+_UDl; z(XWEZ0XjOn*GiO2fkvXlv=ZgY;XsLoHJK;TtR&b;%}Qb<`scku3yE?h%EXW;|5%AK z{GUtoaU4r^ZS;F=_4mU8+07$cqDe40K%)QJV0o>UE7sG_6 z8WcWl+c zTM(t_4-seCEdE-482%6Vx%=XR@>!LSpAA@(j5$@7AL1;V#b3)0!~4k(-$&93_6ANk zpn0;z`KGFWTf$E*N=L9Tju_)@|aj(z!_!U^y@5{7%!rnj?#p z{L14^-?cd5cqN#C`>oBqx=c$FOfQD2dT7@R+GlgoiqaQmp)D7*vvSdj(^In0S_JKo zT(pvOFbnN_g4XqpEu7&kl>RG*X&!IC6tpLE(T1gem4&uh(C*1aD^0J=Lfau|U&%!a zr$3v8)-7lYa?ysT&&on8zkuRBAs1~#`j9NNlLT#8F51X+7gp}PlFkyef4rR|kh1iX zS!kaUv<x^$>G`%6dR*1ypk6CXO&$Y8({$1ygnd{a@~|>k!?IZa;Chyq*QY$J-}$h9 zosG3duf!$A@B6U6nT_?X_Oisf*@yLoY^-B-%t@?^eOMpK#(G;vmBc#1hjm0Y))6`f zBvz>pYcB-nE8~2fRQ`Z+uuk&&Il6oxO>*+K1JYjrFvL^+g{R zo+k72b*i|_;?l@SJuba;`NCy5eys0%SV#G=;LhR48ZMr}k{8CjZeIT;7+WA>4xNM5 z%$a=~ZpdKEN2k4TOp}va{?i(L`J-^T3Qvg00%K0H6qXfvZX;h@GnNH$`W$X<{mBg- zr)>)dBMpB*-vRari#eY^8N6;OKeGr=LFdbWem%qLI)d2o!OM{*(Kp6QkCv`SPRyn) z*;>3SjCTc0{E1UQL7rVlR7d8GFxFH})HTQXqLLqd&KEULJxYDNiW9f;dFA20bRDN| zqoXxh=r@B0T17og)GZTV(8kWM}Pd-m+imppluB)3dJhI|r1Xiv~6~RR*m7F%8hDU~l#-Fb#y2Wm& zaKns?X*ewGjJ{hcLHASq_%owh@Y-q*Zi@mJ9L=SZ;%10d8Ki58cE+3=l}m&-O+udF zZ+cU7L#lE^-HdQ##WXByB5WAC)MF@>!}@#gnTIT-IlRT_WeZBuSJh=TffT$g8Uea!c0(7iGbjaw}Z*Zne; zWKe0`oJE6h)W_x7G}0Kw8s_NDnTN))mWJ!?nMyLKG{$GqARP6vTNlS{IT}0~>+;t} z+jotu7;o5NP-*;vS4_FGA{_Pc&1@P+fClJEgCCEuG^jIEC=d@w*WQ9dv>Mri>$T{E4|?I=smAD2oJG0~`tE;; z*)a`T7yJ`lVB9p&m+sO+*8j>|nT~d~tm1;S&9-q4EI77o<=dQa&R%GqsZ^SyPtS-x zRn5aDFq2Qg=|B3kd#YqF6?jXz3KFMPQ=-ld>z2EFQ=m0jI%dtqy$9Li-z&!3kYT!3#7uy z$VKf*I*5xs9miDDkjmESWQ2VcZmYK`y1uSvJ?`a{M->rTf;;-x2dl@WFND2AusBk` z58GDh3L0B@THvLi=uQMGB!rQtyjF$^FM@Bxi!tZ%jMT6Pj{v?S=KN6MQfb2^?e$Fporn96{%A((1NlmehD@+sx?B#8Rz=Y~hHr@62dN z;<9|P9FNS5zL=O*ATmPcCgqEi!N$z!cD&S!x6tTYB0EP<=ui?JE_<^@a6}!uWGV|2 zL4O7$KCxu>x}Xao?iR2cUCTCgoPmvIZ9Q4iXr4P^SYxoR zrZrIgc`%04HqNaxMbFWU6PF5Tr_(Y+L1=Y$cOfemI#4@bK4VCvh*RkzDdQrB-f~F^ z#XE>f_!H@+yOwS4m=30+<+y|zhuXVRB@G=jwuNVg`0jHxO^*x#YN&OdNUNtxUKsY_ zP?!(uIL+Ot(fK_Hq*)?|W94uv`_+uYjyFPuxt@D#n$cpvZ(U%ce~ z8vl;O&+`y^pzuHzL)nS2wS46jIEWEI)1(`RDu&pPh@L<&PiU1BX*gQ&GNK_LT z=gV^q^WnU9rDyVehVo>p1SEJOGavgs;V_E-r_|z7+ONFb4g+- zmJe0#cQw_RkoA_wOO1{eK^J65awLNrvRzbeYiAu}VW zl+A)2=|i7uyMmepB|ivsE0_^}F*LD*)_o)Q_C+KjO|J=L^ix!fz} zw7zQ0A71%no5urSa&bq@>2R9`de=aj&PkR;qZiK93M~x7ixXdv;3?>Xol>;lB@0l$ zsNAOLgLO3z7F8e4-`X&KgViH4AHv__>Z3BpI5*9P>&8SBEPgnK#7^Hog(D~U3|12U zA9Zg79#>KQkMAbgbX!6<#iB(}0v0R?h`d?eL+wHpD$7d{g+hHRv7%Por9}wcHVNc~ zK>Y#=irNAqC~6gH3j(I4q!lUzsI)+Yg+{oy+n3O$ZTgn{Kc91E?!B9AUI2am&yVLJ zy?gJ>nKNh3IdkUBnKSVxvY&LSQ2D&{jYm2@;tf&UyQ(2(m_OT2RTj_&%EAQ}%2luUxG z7B=CWYAE{%&W4(;ax7sW;=K>1qp{s;sYrf@4&-7O_K_j{Qh^pJ93A+ zbmzhKtw*fHdmQ?UU5j(XU9lm@G^9$2a8ZCo2lMU8a-a*6V|2U(oXB*D#6Cy8Wf@4U;#F8O zT9lgc+%HNnbgQe{3zFyaFYV&?aI)0>sVJKE!sHaUk&kHmBaM*rJjNZ#@u!S!T&$t< z(IBhf+9M_s_Gi(A=A^Yv~a0v3_gx<$G@e6 z$QETx(Qsdz&xr6)4L*B}y|2N?24|ZFVe={0pU@tN%{Qw59#{<`A!#F!zbUWT#}+=J zEdW0BQOJD~OlRBrGoDRvU}hN&Mb;fA0Q;DG1owQK6>zcZz8?Vh4GWIuT B$509?!;5gx+JC^=z;C5n&TEMfDWrV2q?rvzd8L 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

IT4vegT0t48NO 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≦K5STUs=!~Z1o zj{Yo0s{iq+A6y2?9NV8;RkdL3;JpAs^SD%H+?@y_HC^jl`MS<=2V&Wa^{musH|FY! z@=E8#X=L&^cLV*U944)iLqYy({7pQL$QsVLgG1ybrqdX7SpDc)T&M9IjXg6f5! zI?4HvOZ|)jalSRein9#619rDV1xXoR{>%^FvvSNUmLp7BIp!D3v7ktf1(6(+&jhm> zpt==*Uyx`(y^1X+@Nlu)7qSlM(A24TM00g?m6Sa}%Irzv$JJqIiS4)1* zj`})<*Wpf+n4A%eX-o@gHrwRJkyR+X8Gn{Cv&x!cW@e~`EgyzdK;bfKf*VbC6P5kUWKlkh2-Aow$gA1K84SmI{1P}}2)XHAcX`3}$G z@3Gh}9i(Bhy@tofFx65MZT9cA`J3{awh$EdqWe5K%l53Cd^@CjKNSSmrK$C6S=Fj| z*u;~c0`^5<-WBW=nG_=I$hoM*arm3$97fFK2xAU7eiQ(be@az1C1k8oe2e8}TB_*+aqvSTD7{}0>?-5W2#XyFA0kfT2udti770p% z;0Y89myx!(E+g#|+gYr5C79$?uqn4hw5PltWjb4cB-f6=Pe~H%(o*A`BM7VpHDZzD zjt~!#;yPtvPSWLTSDd8qxucpc$hRv_*BLGY*g)~;l*$9ZSZa2u&?A$3@i%HF!mfx? zmNl){%3YopZ_0rvB{E+vK$dv4JP4Mf6gQ&!f$eMJ%!gBa4aUWP#1BJ)ACs)<#PjGd zdGod!z8KB}UfHTW>^njjd%dkS@K0{*5KB-9d~U05-@^1$TWfSy4*^eX#SF$BES|nt zLXT|~$>b&vn)+`1=jae_&o8&?K)p83ovYjP@K$b|TJ-o70w3I3!z*X!y0}=Yd+ys> zvzo^afW8+$Uh1`Ht4XnjTy@1}f?E(`qV!QvIlcMDJp(9Wh0{nUUCubw2^n?N;IMu{ zumf5=@b_GthbMHN?;K6rBa*xm#Hsnf&FqWA6FTh&qj|$9$H?Ic+6EE0vW694nGp%j z59lUl+}6=3#CH}E<71UEnO*qdQT)v12~v;sWNO-Be`{+X z>*Flzyf7i8Wn>drejO|)IWyVy*GX1;>|+(ieN17YAH2~D)pVgsOG)p*-*b_)7ZggX z=k*IhiMe$SL7}<`5_N?IH<~HujsZW}u=R*6w1L%S&rWKnM1-}*xzPu!3>129{QYPc)&)VM!*tZPx-IllrQ%5K|U$EJ@;*^v3F?B zU<<-m4pW~28BI`*Ok1U9T4z@SUU`|!ZhB}sPHNa#^+{IS-(hCDjn7kha0xIt;W9qY z^j`6KN@tBq3X<`8ribx)N@uUpB8<=Dddx!Hq1_#(bdE(aKF{=JHa<_;2|T!f2jlak zu18^B&e}_f>0x}HK9yG~S;prHp-b=ztxpxRQ$!-{9fq~(^}Xz4EyVaduGfh!G@VcE z@?mz$GrUqmX~yRfoGi6++gF~oIL7ChE;oS%1xuEUlY)%T<9fVt(<}w$OKlcL=}Dc5 z?7XZ~6~|Q&^650?Wg9FlMCqB%l~p62l$W!uSv3%tZe#V7=hzLHkp)De)edQ#)YV;_o2g*S~_IVzv?2OfuIuE~j^JKeX*kbt$IUdZ)2XE0LjMXz;3?bNa z6x`kHCtG4X@xeJhwHJALCnY5Nn;CQ#bEZ9}6t2P3n(20dS=723TlDF4&VlszJ$+{| zO*#x_A))6?>qbC+N8>0H}xgBWc-Sk3ySFXMJmz&N*y8E*TdsS&pxg-wD>hw&UKag!?7UvUt&w zD9citWdpJdm7^_IRm3>sh5%7`Alpz}k+LU&AP76BO!Ol z6&C>(+M}v%{0k1TMNBg--5|f3n79^b4($zw2Cp z5|fd^0?}O2+amu0mIP6g*u)%o1jx8~f&Ul3c|Af^@tQ)$f&aIhW)wJT*4VMS4nbA? ze<<98)~LJ0ACZl3lHq=2a)~VAmTZHoj6@c~ z^SfmGokAQAn}Bg`Np4Vx=kuA5hEYg%uq`M;bH@gg>|}?IRj2%h^>rrMrKz;I6_{kV zCNp^I0G?&Zotfs<9j&@bCeI?w1lQo-sBud1D8pmU%b2sv|o}Y)dHg>JA>s*J((|K6aCe3zX9z+vGr%7J)GGtK}&En%?l3%4>6|}yq+axb8 zNJDqY-7!e6cti!qC()BVtdT-m8#jr2PV$mGOuS8#myShcOkxkJi7KKyRVKIj_=Tr3 z9sE!%TZcWtg24DPswh@nX0l(y*r@`KuZ8*i`IAOE{3|cae~8(E|XUe@n;1 z@e~P}%@bEb2;AwGG_Mvh9sh6aY&{tO>_cR~U9yywsu3r-N|J4*Qa+``n@ZPj(I@t4 ziUwmwSwmZMTYVQ^J`a5gQuR3%|C|ERN@e6YWgKa-o)b#7>P{cFwpcyTL$?Cg*H(|G z@Rl~N<&&g}tRAQ8hQcaN46CSq=Z;N#R^-Vl@+M;j$)x{mf6PG6iKk#48W{w;LG9n0 z^fz=jb~mo>Zms{A z%aYMUCQZWb@e2Vd8G#WmHa?O+k_X6~b0%`J(+;mj=fyB6ZI`={^0k1&{9CGb+&1Zz z@-QLs4a!9YJwX`;Q$G^M4PY50SKCX)0Rm~q_@g{=j}nzU7xI^yhyW8s05bmr{`TYr zm{2T$O%@0+p+JC1Ul3rj6`+ipJQ%w*b4#Dw!R2NA_5FgS`50z#a9A+8gE4)Gp7l* za4!$%Ue4=l;XxiQkGH*Yi^vF~;6b^UvzW31jPU4Z5xD|{FsZPJ0fInp)Cc8We+wTR z!6o|u3$7G!{z17n$Rb8){(=YP-aZyJDqluu4Yu&nspvtuH`Lj}p-??GWgnD#mCkm7 zOoSfwLAf{FDsrk-?RewuYe6$pg%8TTQSc@sx!E9>e^Bm?b{=3yt)7?a^`P7v<9sNX z1*!ala<9fYTSPc4r4P!z@y_J}SO{+Vpd43^O~Pq$%04Lf<~ipGWVu2hrc?ZtL2ViXN1Ei=9h^86T8mslu)tWika1 z%DtPj)NJ8{a_{yM`Hqb7exgb@CAFQLkGwlnQFAG0;pA!x}UKvhd)>YYp z0#iDQn`n|0PogS^)Xu=)Rir34l$DlVpT4}H9DXtN)zf84SA`|vd$_w>(-l@nDN=;pX#k8t6}?P@S&JJCocSmBKBn&=aCE*^i!hp_ zw3h$g%Gcap|9?IeTrTUD8wISf(Qn)@-R8SrX6kW^gWK4WG_J(rFloR(6W4N5n1G-V z5OEfauUWNNOoj7mYu7by!Ajk()@?o~sLt_qs)6cszI1i*ynMwT4^3;^JI%hpT8 z4-B@UqVdsZf&iALBz2WCZf=kTgD<7^O^M^=#&jXKAdmUkP@i_B^9J~i)XWDSax*_#-9b0;YkSZzWS00 z26#z5NtG+9cDz)Hr1+bZci@JLbSiYe5@k z1Ff9JmZ`K;v}8+GJ=&+v6D=<_<=V!L>qB4ng(3)r;P@LcC)Da;MS>hwB#2E#f*e*P zh{ak#7KMUzTj%=2Ls9Ud1&D7d_TdC@{z}Bt8mB`1dlSI=@!fS_y6q(*+Q25C?trq~ zd(e{qlQyu0J5(!N+#8IxiuU8(5@#xPC$4`|e5 zy=%hL@=WlS&);&nAH3bb{IGFZ5N>Tu@P{V_i107WC)Up3U4;dHExsoNs94Z~_emMC zM@;ZIer!RpWGQ|W#*FfJ9RWxJZTsbRT^57@nByv#kK-gV%OU`UHOt0U5lcbyX4zOh ziS{zf#u`FFBeQI*Q9;FK*%)5qvviqJmSXh{+l%uZ(Ixz#& zK>=Y=Y$m?kr*$uWtcs2o)^HYyAEznUfXU~0mW1^esw1BQ`lLYyCwxK%G5W8z4 zeu^4~im2$Ui%qkrDD~689~9s zw`d!WXG%tF{8TM48E@{ep5vnqFpHd~u&MrX=xv>epRVcYNJGh6H8qou_i9OWn^x@* zdA1L=Y}fQGA3He2slZ7jzC%H?eRvnuHZ@3KS%A+_@Ejk_Q`@o*tj|>9bA4FUD9Txy zp66T9c4~S-7$P8kwkmO<-`Tjq#Lv;xV#o%wJM?j`0+#yS?PP!l7+||gi7XF+IPsbI zc?vwv=NzTo>3l7G0(7H}iiAU`3smeCqBAjW#V^#-r)bZ+NHf$TLkrLEop5H3U#!5D zi2u-RJ>ufK6;|grwA43a)1b*!CioRvjoeE(+Wm0!Xs=|4y>tSGO=6*s4hwnt*3_iq zw`gDeky61RZ|uMgy@}td0LR~a>>O>;+Y}N*ln@jD@dz2CuHTN=0s1AI`0XSetM*NB z0)DV^B8h`FPuWq3pS%t!6Sq?cj3p5w5x-M~xGNL_71!2Zj65S~NqJlFvtA*}WD26X0LgNz#4G0;jeeNa2J0^FY*q_>Q=w&q=EZzVp`n;o z7K-`yhY+*$iAYS5(JYL=%eqP;{vNTmITiB$tAL>WR$~3bFSbY2et!gjwJvHu79+P0 zt^lTNRth_9nT6?siQOum74vCEUxzCn_oOfF9|TM1U{kG^UF9r6i$L5d_1I*; zLQ1<23WDn?LOmi^DEw8HkGt=|Nup0nXKm9e`xS)O6#h{j-U2t?-z)UbgtlU=Ij_rb z>e<)_r-?W8cbAA_6CI}CH}ay$T<6p{4h5;gHu)(CQ$achIhGJowGG{jdK`kfDnL6- zbPx~4)5<^Ap&}59AJSBy`8(_DVBHyKp??R|^w%bV>%JCQDXl@y+@zbi*z7zG@%Sfg z8#4n)bD%UNCp0hl4#khVpZ3cH1MbFe#o^iA`Z^j!Q_K(i+h7+A${54xR5}i>{WUKn zmd%EjNdk|&JFean1oQEm8xq^6G^>md>`T1tB+Xj6=I+2!;leLF9j}!8BG9Rvw5Jfs zX~^rt%^PqlU%smlhkX@{x7^+Vci*3ia407Wv{%m71%CDy$|^o*@%JT)_{zS|8#KoX z1)GRUEEA_Ugp(hLzEXioADq>l1W)C-`RI=JAsz8*l&DRo>b6AkP4JUh&W)OiD9j&}G_m&+LHT6d5G}E~x!3n5h4_n! z=i4VZ+2QL1-ejxZm8fp8ytF`!!jXd#l6&f*$N`~eQ-^2R+`Y$6n0eX;&0HDP9Al73 zeF^AIx2zi?nKAGR@G~raHSoa)pv9IKX0yyd8VkLHUseug0&2wxTc=I$5Zf-p(bvq! zLovgfi{aeoIonp@_bj-HVcz-o4Fm8>M2v|4vw5KO>CG6z?o2pu{!cOw^>GX zDqluu4Yu&nesuYTXv!x-bGZES^U;)R1u_wOjG`&4BBxr_N;G8!&GZW|zYtA%ps02> z$mK7;5KVcvw8T8W*X0+YDc>cS1%CeW3(=GtMTEorD4KG&02YE<6is=ea9RwzPkUX% zID=@)>;#CWtPqK&tdJ8FBGHr;vO*yeO<5r;6(Z4;*NR9DP!o@wh^DM{ZStebFGN#5 zO_;$b z3ebpq?AaOCoZTL=p&=Ha0RWi`3ZaNBuJ*V1mES{_)MG$$G)bKIvIS{6ha=o^*s!=L7lOn`DmP%cL zi>Y1~8Lz(NSz0$6m;qxm&7B=q<3>$8u*YNlTOC75SY(K0O)w>|DG`uYGLExflV%T? zffgCBSpi?P$arh3P%t$G+mz@4Ci}H|Z@r4r8j4b2k@4Chc?vBuUb}*0=>m(4w?Tn! zIPWgFOk0bLw@s^dNE$nA z7^=MOnx2)8EHd5>1(<0-Yqp8J^O)N6rxe8dCF0jaWyOhZC5J-!Rcb)=|OG7iZJDsnEPk?R;Ei&E( zD)tJ|nOJ1J3$^qq+Vd{b47JD*S!BG66}U2;x5#+A6;_uPi;UN!$yFwE7+Q_oWki3` zBI8|p6FcnB*kK{BY_rqeE!tOqq*QRnr4||QRs}fe&?4jArjS^g+shwwqKH+y>AXe8 zyPc$Ik;y#CAE6{g78&m+rvR5a2wTa#MaH{Rg}5sef@2pwZ;vX-(QbOTVqIJBdlXq@ zk@4<*4b)4|BXt=_Qb}j9_j9(89xU!B)=m%#dEo1S&>{oVHipA5$VV(P86sGhGR~2o zJ0|me04TetxR*u7dvG=|sbg>;k0u1!IS=rjEg8zm zAl<%{E{BN&HJw4VDQ(B{%WHL4giT8U z+@#i#4tFk@D=kCmJpUrtajJ!)q#PV~<+!EaiwII}X?)^6dE+ zhry0h9lFqZrgT|E%LY46Z49$v$7K(VsZHT@slkp@n^_FOj?;{sQHvnuTN(gx8SFU2 zU(}Y41WeIg0Q?woi+U04_&OX+U&aP%?;lfJ(_&aiZF|OUrMO08-Arv~CfvWJVd9cl z-l-iw76>*Pb(=-hlwF>Oro|S(X(BK1nJVxwi{o^WN1mm~%BY}8?No(~h(NOaNS&>k z8j7x;PzvL(imk6T`9EE7)S;Mr+?gUOR->X$mbd@;6h>M^n^t>|m%^MR+?8&CZjI*wu+r=HN_#`1fT z(*cGR`Dx4iM%#OYO7L4w2l)6%T5fW~G4d4iFt%~141FJxdRpN(I3+ID)zmX=WX3j5 zV^@YfTq`;(zbl=3RuMNjX^kmc_{22zoFaedq#Il7@Hr_QOXc%{(8u#i|K>c34ri$s zSZBsI#@z5bRA1n&nIq#>?}-Ft%}O zwliOF+pzxON7VcW;UgwQgzG7Eb8;a*XFE-Q)-pB6*#M0USc%`dVikO#rF&k6J41d>{6Gws6HOVs9_I@)2C7~7a(*6Y^W5zW}f_(bML z!Tlp(u2fW0Vlw9dN~KA9mKoGrH72#(Sp)n&e?~^VAS#H5wNb>OnYLXuH?vuUu#v$DyJLw*TTjxOOn-Dc?FcokegRLef+kl2s$cS4@vvzFkn0`4+l zA#ku#eL-_{n|-d%Q`PUwFn-(HVs|3d(#b)v6O@N3yLYr)+c3GBasI$98N=;zJ#gNY z6}D%wsr*w!G_>gRlOKp_=LlgEZNuNqAY3JDJd5w+Xn8Z7AiDZEL)89-yUgly`iHfL zIo&v;9fuUA92^9DL1j305h~#r(K4cr4X2#|*8xrl**HAfaEQ1ymS6jDxM_q}e+OA$ zivUH4vC_9oG12R+MqGW{Hnd}v#n-N}4=6qzMam}tFnoCZ5tJ{p5 zJ(UtU3YD|7JA^0V5G3a>cN`B{j+1#7nc1Oqt5a%ON-OEtecTBT7SId(5;t1z#NL?b zV#u8oqVjh_?qtpnV0kzqIz%iBYiVzI+^N%$BNP|)3gOdu+6duLX#P^iovySaRTQ9R zShn|pXmoU$Wk#^6+=FixR+*RaA8nedhQrKA8z&`k@Z-#YYgGi)7}+aMN@CV6SPX$= zoRpDaoRq}uec>(+==BJ<5%-vdxI?=;Ok$2jF;2?JFiuKv!kcIS6kwc`kzrhvWTl9P zyH$ig389ROlB{AaC=wBN{^ zxl{wkxF{og#YIV%{8LFYE=t_vYOPrc%9q+KjEj;P2cKCk^s3Uh3ZmPnbXg^kU~~=Q zqKwSPMM;8haJ3qLq5!(^hIUccu(Cf84ui^@eEm^4qaa zlOFWBW@mJi%pu6mwM)iqsR`SyI66vta1FAdI*g7oOa`HG((E0$8^zUo=4_y&p>vC4 zhH=hmYHWcoN=X-Rad#!N-H4y;^};M^bPdwEdEhrB+o$kouwc&ngE$2tYQ|j|Kzn`T z%o$9h0B-GjBaKrt&x&M3vbQiS7z!x?gnB4_W3M4{j? z+;+9#Dad%mUegP!tM(K{n!8c7Fv`fx+lNrh0Ru9@zLa=aVSJH;6*&;dVRPp!n_r7q zEQ{waG0q{17z9M-QxITDQRqf9Or+uG)12Aw3GJ2OnHi2N;V9Q;n~NV*a~Adm3eCz~ z3k!3FwD^fNXX#YQwelY1YAwvwW@$}it`okZw3zF%!dxM(Nz7HdQ)%6cTz3}c3TaJd zt~K9RTFmvzm*twmT&+(it^4pG=8u?CV&*0QJm=v?V?H|ran`WN{a;*rukKv`FD||L zp%w&2i5{isy>IY8<2j59hvzVyh+vgWUHNyKCyKAFQ(q%6d>#|`JiVriU3mq-iPJH0 zv9w&%6@HF60|XB=;Wb@yA>B^ony$8Xbpvh|5wjvag|vekf!UE>g4@g0_-p~f++f-{ zf3$-D4_Y*KOjGYt1?xH!VrGQH#?r1S4{yvR@A9lrxqB`uLx+=)$0M?q9j(_n~X z;a(4~u>tT`{1((a0IWZ@zw7q^Bo2@LH=gzVfuMMaAK(XLQAjz2)GhOizQ*joq~TfU zWUkzd|8hbK#{|T3#{b4BcS8$a4m1<`=d2BP6OQ7Uyn0;c0cU#+8f zV0A(s)G0n=8mn-R3jyraK}x`^l_dV$ zqoJGt>U~=LdCdr)PQb7qLEzx{3kpjKj3zC_x8{W(+<)Qf7k^RF@b^TK=GI==y^1Xn zY@O5wb87shXN7keUQ;pPf;XNz@#Ol}nsxOoyJqsws5k4LX1~D`fsDsgVjLzw zduI~4t0l75VL$s7b^|Ixnk8GS%@Q-7?qS0c&~A3+KS=JLh+MdJO=at|CvuH!AV1Oq z2G_&cMop{3es=Yvf-P{^&#rk!KwkDn7H`t*k;8trSpi8ajO9mB)-Hk+i6h{o8{G!! z^>B8*iqaa2QgA(-ZHwe#wWKlOu%B&LaFN4)c7p=l>?IVfBNVimsZOm)ko^WzU7AW| zc|Oi|Yf7B+vl}&`&iUC*nu?tBvzu9g&^bT5h3yxs&O7I4Pt^j2&iUEX6c#$?XHVC( zI_GD%YASNh&u-IdgwFZd?V2ud&d=^pP%r2F>=_EqJLhN5RN|p?e)cR)htB!gotloE z^Rs8G*3>yadyb|e=ltxs3Mg{U&+bwpMb7!z^AuR%oS!{k3-@-;&t9Nn7dYouwAx5BJ*ezr%Gt4#7_v>LgGvs2+|kDc?x^z{qYPLn}weF+1p8%_rS^5@PjoIF&s?y%8L^G zWCL)C**KEs?}4*-sswjg31pD2G1)z;9reu5-mO^cnV-E!ksjQ^)We_D@BJ9mOTJF( zh4;YOyk~y)eq!xRAPUGna3dhNI8@L4>@Ua%$*Cqu1nZ*HmV@;V0Lm^E``iwGQX%sP zj|L`DkArbE^5tYaAp2}~J9YY;c8ns={Ot1zEcDFJzM!yPp844q6!r%hq%CDTRM4m5Ue~Dr!+;RWFYjI zK8w)8PD+-np4PrJ!(^m~_O$esb=}EI|Ls{<-oczDzhTOg322 zo7dp3j+_n`PUN!iPy|&DIV~#Wv?$~R`_&OeY!(->u_>?_O@oHi23|yvwNbc`!{6ow z!Rz3ns%ubc9etTe7v!GyzWU;SjnZy2rDu^^eG{DeNlg|?+)z5_2~iSkogV~c^FpFJ zW%q0>+yG^Ld^63C2!BLw0w3ptXys}XT&B63$~fsN%{Yn`h!)m6^5 zHcWMtbFB?i?S1KK<$TS`53aBf@X{%QwU%?bb-u1S*7t?`5N{id^9^=5#PT({6C>ed z$I#HW38vCN$3#ZT_wH(h1cHqHqzir=3u~2o3b%_|D`-n9mT;vMOYoR=SyU?SYN^%= z_=!2bYnfMwJu$G!h6?M(<%E!x6_6LPjctY%{khq4lCIX~Waifcddh-M>Mzwz+vJJ; zxrcEwu1o}$1n&@V)#+y7Ey(w%=GB`Jd_u+@2WrkzTt#{BVt<_c18DNpA|o5= z|3aEew9H4aQw}OzpG_vi{Em~X!ikuBSvw(UE_5B)M`p5pfOZ^PHrxfnBcHqJA~;`h zWcvOdQ%eYz1urv%%UB4~U8s0}=|h0b*g`@wr)I`+;)G;-C>iMKgj#AVKs!uisLf2e zQRGX$h5y*BQVZOx&^nqq_*p@k%{6FX)4vjPsx!C6n1xT{ea)HwSBHLd(SLF1w~?Gm zp5BPz zl7$g^4;AWU2+}pJCUMdISU(z`aYF24h13p8H(`~b~I%Srlzn?w}kn2Wh6>HxIFr1u6i zy4c1~zZ5opWQj??OnKp>E%}t*@9q|mC!kXsJK9Y84N{h#a14I1w$c-Ps97q7v4LjEm^K^v$h-KUsoUr!JVzf|6T!qz|?@`|7QVXK-=4~E%C44pt`hF+0W?$ z=-;65jD=IUuC|tD1Wxk5uc)#RMUFQrEEkgLUf)IVO$r`h!IACA{{h1q^5cE}b73tN z8JffVrvuueq|^J)M0Etn*5=u$j(}kdF($G9obrQi0aSCC|GZ`l1g7RN{{@Am1oj1U znE#@pQF)N*Z4UGIDz-$h`6|7nRVp+7*;wAC;W&38$bee-F7rPLI@`l4{auNm0|8{K z^bduh+W;0;>A#{X0azzv!v9p`R-j6N*=qiiUEi(VFB(qfLTe$ zl!1OAxy!7L&^rHo?(vNp2B_2PS%S+Xom+A_f zdqpbI4xRa6c*Ue$>CeiQV>4K~D715wTTKtWa$hmSK)9His?GkqS4y z5PPb{Vz7vHm)^+i!QB{R+C=_oHjArS_}y~tm0^a{Z3eHD{m9>HlX06LFWj3ELI58l z#5CQpB`megW=mMf!;XPZ7LtK<4}ZJO3tNH^Z6-Ta`WHJ~{0J|aLjB$N zvXH`yW-GtP;hf9-g;RrniNhI0z)jtV;kPLq4*sPMN2f3j^5D z@JX32ek~rO2fLFeY)h8nHrgzX>I_#p>JI)-_}1YF>@ir^al@MIpgK7 zLZJaI>y5V$IpBRi@M@FAD>Uvx$2wjrz%G3qcG{LhfH7yh%y!|2<-M5^AQb2F7-PJ_ zluk}-Vqs8HuyJ}r$=}~gCYurTpk+O6atVYSP!6MuIE)E7M0KpOT(ph{Y0A?&j@4A$ z#PXEAaa+M^;6de#us8L65Mx4MD>s&s!?fg)?85R{}BFxc#F^|)Qz`*${N62h-^!q10V-N+Oke&;NS7D z)GXgxb8{!M0~{JkAPutUYsiQ<8d{TldmK)7gAVBvHo8nNe2!*v?vepKBO3Q8e!*iv zy*S7%Wmc0s3jdP6^u{j>x#k|7MHc^tV#2ab$+*j<1G&e_fe8n2T7TW+H01@t=XjRn zF)Qv#Jw!_)oUDzA*LlKfGWe{R0S7B0?4J_IOGo!Ba(n~_fxESOocpqnYwpU2NbUl7 zcSSc6GR3Cc`rJP;gxrQupJMhkZlk8z{UQBoZQ)n|EYB- MQLj)B|~G>6-y*%8E7 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 IHjsub0M;x9t^fc4 literal 0 HcmV?d00001 diff --git a/omc/plat/isup/.copyarea.db b/omc/plat/isup/.copyarea.db new file mode 100644 index 0000000..b7af05a --- /dev/null +++ b/omc/plat/isup/.copyarea.db @@ -0,0 +1,10 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\isup +2 +6 +3:doc|2|0|0|0|e6f9679fbfa411dc852a001c23e19543|0 +2:ut|2|0|0|0|f7a96a93bfa411dc852a001c23e19543|0 +3:bin|2|0|0|0|e6f96783bfa411dc852a001c23e19543|0 +3:src|2|0|0|0|829b4a3a15c111dd906e001c23e19543|0 +8:Makefile|1|11d70a3f817|b31|fedec032|ecf968b7bfa411dc852a001c23e19543|0 +3:lib|2|0|0|0|ec59689bbfa411dc852a001c23e19543|0 diff --git a/omc/plat/isup/Makefile b/omc/plat/isup/Makefile new file mode 100644 index 0000000..66a9c2a --- /dev/null +++ b/omc/plat/isup/Makefile @@ -0,0 +1,98 @@ + +##----------------------------------------------------------## +## ## +## Universal Makefile for module template : V1.6.3 ## +## ## +## Created : Wei Liu 07/04/11 ## +## Revision: [Last]Wei Liu 07/07/07 ## +## ## +##----------------------------------------------------------## + +##---------------------------------------------------------------------## +##-------------------------------------- +## +## Project correlation(Customer define) +## +##-------------------------------------- + +## MODULE= [Module Name] +## TYPE = app/plat => Module Type + +## DBUG_FLAGS_ADD = [Module Define Gcc Flags for Debug ] +## DBUG_FLAGS_ADD = [Module Define Gcc Flags for Release] + +## BUILD = lib/exef => Output file format +## CFG = debug/release => Build Configuration + +## SRC_PATH = [Source file path] +## INC_PATH = [Include file path] +## APP_PATH = [App Module path] +## PLT_PATH = [Plat Module path] + +## PLT_LIB = [Needed plat lib for Link] => just for test or wxc2main +## APP_LIB = [Needed app lib for Link] => just for test or wxc2main +## LIB_ADD = [Needed Extend lib for Link] => just for test or wxc2main + +## PLT_LIB e.g. = haepub fsm mng proto kernel aif mgc mgcp sip rtp \ +## 8ecp bicc smpp xapp tcap mtp3 m2ua \ +## snmp iptrans debug sccp public +## +## APP_LIB e.g. = msc vlr ssf hlr ae pps mnp smsc vms aas +## LIB_ADD e.g. = -liba3a8 -lm + +## OBJ_ADD = [Extend third party object files needed] +## TEST_OBJ_PATH = [module object files Path for test ] => just for test +##---------------------------------------------------------------------## + +MODULE = isup +TYPE = plat + +DBUG_FLAGS_ADD = +RELS_FLAGS_ADD = + +##Default commonly as below + +BUILD = lib +CFG = debug + + +PLT_LIB = + +APP_LIB = +LIB_ADD = + +SRC_PATH = ./src +INC_PATH = ./src/include +PLT_PATH = ../../plat +APP_PATH = ../../mss + +OBJ_ADD = +TEST_OBJ_PATH = + +PREPROC_CMD = +POSTPROC_CMD = + +##---------------------------------------------------------------------## +##-------------------------------------- +## +## Make configuration(Customer define) +## +##-------------------------------------- + +## CCFLAG_SWITCH = on/off => gcc flag show on/off +## COVER_NEED = yes/no => PTF cover report needed +## COVER_REPORT_PATH = [path ] => PTF cover report path + +CCFLAG_SWITCH = off +COVER_NEED = no +COVER_REPORT_PATH = ./output + +##---------------------------------------------------------------------## + + +##-------------------------------------- +## +## include makefile.rules (Do not change) +## +##-------------------------------------- +include Makefile.rules diff --git a/omc/plat/isup/doc/.copyarea.db b/omc/plat/isup/doc/.copyarea.db new file mode 100644 index 0000000..fdd1f8d --- /dev/null +++ b/omc/plat/isup/doc/.copyarea.db @@ -0,0 +1,12 @@ +ClearCase CopyAreaDB|4 +vobs\r9\plat\isup\doc +2 +8 +13:ISUP_R9V0_02P02.doc|1|11d70a3f9eb|e400|672095eb|eb296863bfa411dc852a001c23e19543|0 +12:ISUP_R9V0_02P1.doc|1|11d70a3f8e2|e400|17758061|e79967bbbfa411dc852a001c23e19543|0 +13:ISUP_R9V0_01P07.doc|1|11d70a3f9cc|ea00|37e7f07|ea896847bfa411dc852a001c23e19543|0 +13:ISUP_R9V0_02P07.doc|1|11d70a3f93f|e400|1e009948|e8c967f3bfa411dc852a001c23e19543|0 +15:ISUP_R9V0_02P03-6.doc|1|11d70a3fa1a|e400|470e985c|ebb9687fbfa411dc852a001c23e19543|0 +13:ISUP_R9V0_01P08.doc|1|11d70a3f98d|ec00|b00965b6|e9f9682bbfa411dc852a001c23e19543|0 +12:ISUP_R9V0_01P8.doc|1|11d70a3f910|ec00|b00965b6|e82967d7bfa411dc852a001c23e19543|0 +13:ISUP_R9V0_02P01.doc|1|11d70a3f96e|e400|17758061|e959680fbfa411dc852a001c23e19543|0 diff --git a/omc/plat/isup/doc/ISUP_R9V0_01P07.doc b/omc/plat/isup/doc/ISUP_R9V0_01P07.doc new file mode 100644 index 0000000000000000000000000000000000000000..8d66d50768d22ad2d6978fcd2b33a0cd18e8aa55 GIT binary patch literal 59904 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 PUL7rEG>iQ|DS`h3unA?h literal 0 HcmV?d00001 diff --git a/omc/plat/isup/doc/ISUP_R9V0_01P8.doc b/omc/plat/isup/doc/ISUP_R9V0_01P8.doc new file mode 100644 index 0000000000000000000000000000000000000000..8f39b2b6651917eb919edcc29a34abca8d4db32a GIT binary patch literal 60416 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 PUL7rEG>iQ|DS`h3unA?h literal 0 HcmV?d00001 diff --git a/omc/plat/isup/doc/ISUP_R9V0_02P01.doc b/omc/plat/isup/doc/ISUP_R9V0_02P01.doc new file mode 100644 index 0000000000000000000000000000000000000000..f55aa9189db25952293ec0fb0e3ab7d5a5e4183e GIT binary patch literal 58368 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 literal 0 HcmV?d00001 diff --git a/omc/plat/isup/doc/ISUP_R9V0_02P02.doc b/omc/plat/isup/doc/ISUP_R9V0_02P02.doc new file mode 100644 index 0000000000000000000000000000000000000000..cda0ba8b155ab9d51931612fb7c93ae6dbc0db43 GIT binary patch literal 58368 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 literal 0 HcmV?d00001 diff --git a/omc/plat/isup/doc/ISUP_R9V0_02P03-6.doc b/omc/plat/isup/doc/ISUP_R9V0_02P03-6.doc new file mode 100644 index 0000000000000000000000000000000000000000..f64038dfb012592780568c2b66e58f13699c193d GIT binary patch literal 58368 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 literal 0 HcmV?d00001 diff --git a/omc/plat/isup/doc/ISUP_R9V0_02P07.doc b/omc/plat/isup/doc/ISUP_R9V0_02P07.doc new file mode 100644 index 0000000000000000000000000000000000000000..1f8b8ce18009d80309a1f29c41ce7145ebbb11a4 GIT binary patch literal 58368 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 literal 0 HcmV?d00001 diff --git a/omc/plat/isup/lib/libisup.a b/omc/plat/isup/lib/libisup.a new file mode 100644 index 0000000000000000000000000000000000000000..ee961596e23e668b27d6602b39ee582f18c82596 GIT binary patch literal 626636 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

eiIH}gv<8aL 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 z zuX^HvFCxPi5Qv#b23T_VIli-1JjNuZ;V`(^RLC)ew>E3Dx^emaaFgWV2gpzB z=6S90am1MP3wMe1PYl>sFo3j@7a1m2b(am)V!kU-4< zfAOCJUR)N0mHeKP{~1ivqyi+qq-@f^RKJ_coQS+n5s6jZ0!^F;`6(5@`i&&`wXy(< z@6Nzf`qvuog))<5_M}(Z7d8iC{x89RBx6OKf(~zSYB_?j+!kFFFzMfXzzAazAYx_G z40{o9KO}2(EPbR+X@5A^t_6K)mnkP?utXPD^gOHLJuQ`E(;+?IGE*q98Y8sefpQ(? ze2z^iThz;>7dZUdlt_@+?ny7SB*&|&&my6+P@YVBk^Q;&?L-HF4@$IDKX~&uz)_jX zoX`wssnRu;1wOzI563JSrS(FQGuZXFZ>E>plr+s{R@){D4pWyL4IoS_gwj~m*)|1j z6UUoFk5$g&9Gj8^YuZ}5U6Wqz@aIaZ+6Am}xbv*zgS0@Cu66kH?Saz1kG0xVFAT%M z&}4e83v{tfL1~4aV$yY%MT%8jVpD4RLtAtMw!_o)c9{761!@+*BG!}$YX+I*1YpTD zfsZmH+%$y>jFiNrkFx=8v?ObDqYpBPLvc?827K2-=cr#;zplq;=V`@5bnyhk zD5lsrWNs&^=7IGO8lJL~qqUTVu7*wSpxG2fCIgH+o143FPuWgYRAB&JvxDhO({wQP zhczIS-cEPQt{^zKGj@iCDMSC$xGl6}WM?XNIFrIy?i30;TXPtR!00NO0O_Bj^p7@P zZVBz7WWq>VOSjAN45-@;vM|OCl_PHPg9oulHHtO^>`9VPf758}z;SKeo-Abaca6Cn zGHFjys29wu%eB95+bz?ngZl~6s-!*kdM<5sP!8>OOP~5%{h$aNI%9EA(b#R8l!fK&qnfML=<_CvL2JS|oy_mtV z{W!J z^)0F-vbJvrSrIYT$?UtaPKkOsNZ9Pw_WR92QkIm}!uS&$mr_>Q6igh=vX_!n$6H?Q^ZP&j;I3+wp!HTIa$|KQ6eqZNP1Pc# zCs~!!PycQw>qC1L93+=^`+&CFA%8==jrp9;j_30V7VDVV2N&$ORZhtE319GouTV~; zaemun1#=U8dqJZu9QZ7Q{hmO;M)myR>I z8VGpJNyzVelaZUqdPQVfhf*AXF$k_>Od6?D^rQGxW0*HNHX(Bz}hx?VI2|IF~xk6sXpQF%OQO4L@pZSKZ9Z?Nhs#@doFjm+$IYa-Idl;2)0dp1WDQ{F&#kGql1_U)h=kRWpiA61b&>!3SQB5EXAW^~$$I4DAlEFCTv>D*)b3*o23&}vkl?0YO21*Zgu`` z0!t^~7L&~zjKJ9Bv+XWGQ#EX-VjD0*bcH=u7PZk0Bpoge9t#>Z4h4|uclh9py;FQi z`Geo~gFljAvQB0HEv5=oXEi6i_O6&LAoZg~@I@Mtrkq!5>=s|xz(nf4;|Em}#P-wOBuu#Xs93Ym{F9wuzUsx?3H%-Hd-DKXnbhLsMtUL!a@3HQCfp4^y9@Aw$^L zgwJpZ_vpxbrV9;T%o&e-*P>4l!(QO+XT^`n{{ikyWHIq~9IZd+;y4{B1ly`@#21tLMN#?!8V;@z*nc|eR1cC=zZ%gk$$Zt9V+>GgxYcPNbG{q3afDz~ zHRl^4)KVQOkdM3YZCNEGM0Ghac*0kG0wXHl0>X%%|3Hvk7?&C(nMeG<4}KVtx*+Z< zPfl&3t`j`z7NSO}`Y09F0Pu=?{PeQ zO4JduAsE{t2{H9w!X1ws4&e(&5^5E0!SUvlu^keMA@2X7ADo9!VJF!c*G{s_9C9n; zVO+{Sjbty7c#Jdhc|Z69(v}rf0$3JF95~Jd1exEESJiUBQ-DXOBLHxRt6!il{t{&lIF<0#?15=uj0^4lySYwxJfgv&(F9%$~fF?vGoN^-Rm!|h7CNt;l-?v3$u=h2{E`j z;gitue3Hx3s8^O5mn%)A$A8TaE{kZo%+b_Knq=YBUKY|tJtjnjOd(2`5=KOW8h;4# zqrQsQxSTm@+b?7?uNPkTgNKoy%H1`N{FZ7pRA;Ys1awLVIL+AI4xv3FWcfOWI88## zF!p+f=oSR@j*mM8lx^MOu{RWOg`2v^)GvZMP6P1PaC-yy4ZEoRJzXHj#Yo&EKkgQuSH0;6TcT9o&rkLJFjbvig&=fmzW-)xyRm(!DFz8?xlHYrpWy-% zQxw7yiM$~$=|G6!MNEQRt;>5u&X!9MrozL~k0T{5(=Zpc1wD?j!xP%uv{ggAjXfZd zonXq+=79;OAM5|-&T6-vVMjXDU0AUGG(0bXl*oFkmA^PDz$sIN9SkcdfCo_{9yA1N zv!h8Y^?WX&uwBn*(c-b;(9yGgZbj}W^&3gQE*w?LxFd0P!B3$H#$y$Ek-~+&gWGT{k~<{F1&qy=o@ilr zsV4ixqwt7~@!MnB3E^Bku~-&oXABJ69^@dV>v+q|bZ2_1blwT@!9wfVhtCP74=_Si zdem0*BJjNVdJ<)BLwy^DMx5@D?-mAIx@diR!-#*p(i>tWYI*(3LukweUXId(iaua z8so!^+_2PwjnaZ;_aITc1Fv(zQH&(tY~+TG>o&p~i#BWI+*H}fr!~rgrN=_FAox6~ zle6V9fx-+53|riU8OCrcN0J<7X7EszJ$x9j2vLEmpYA#zu}Er<;2{?HJOQztCIVyZ zTuIMP8*u$(o}#Dcz6xnqu#q8t8m(-)dmqxS{G)PoB{>SDPPJEYxd1`u5q%@@{WNv^TOUa1FwLl*T9G z{?ROyGc*7ixx@ighXI}$Ar>J%{$3U#y0Q`Dl?``ALn38U@y2oJj^$p_ zh>f}du?zkSc!m?vDD|#ML}83~?dRZ$Eo$QQ(A91R$2lVt6hJaabaE2@qzvqKgf}}9 z7heig0j*FtB&zGuguB_1xQsE8s3|yuAz%op%|0}37` zYwpHPJlLN3i{fD(N)31X9>Mr{1NVi?3K|kE+D{d1B4O1PI0%(!YHu*fZ3-17 z*yEVwb_I)Z&>VS|CeJT!-Q3-wWlml|oC$8j->7m*a3mg^4W-FT7_!ghcqvPu2<*iO z$CH<3ahrI`S+SRAv3O2OjB6#Y$l_YIYp^S`D6Ts6;AHlHf)>q!#^zu*D0wycs;Ktf zK9lUvfx)}vHRwE@Kc3;k)%E1HERn{50UMM)+sFesqKXERY@>g>vQIVvLX74fI}P0PgPf>75@Obo&xR z?DH1m|KU-?OKkg0^9`*8iyU#0QfxSg*)~v*xgAeeX zml!1LBx(@8gkP1E_^Vv6f^pUDPqF0U=9H@a|oEN1Z>O_Fh>b! zDwRRQ9;$&`%;1q|w?YGNV&EAV?u9e!9dMt@W`7dHN%?WqM!$WS2<2kTNu8{GlpM<| zC%be@8(VPZhSH4g48>(l59TA^x*VX7e%n(mbGaSv8_bC-J*_fG9~xxL4}awc7lW*SvGZ%~YW!d6`Zhpz{-;`8^OQIk zUfbHti@&j(o&nF)zdq3Fp*JLmN*|Ej;gQ<3gU+ZeETIn=>q9npeJG7 z1+TQkCqFI-FQ}*Y6oq`)oMqqV&t-mv74T9~b5F&?a9afuXQhmI-w(!MVp0??@{}?P zWV?74W0lI~(0;!NGy)Hp`7uhi`QVzRu)L;G@n7nX@r(Rt8$>W6dJ1YafFT!2`zaE0U4>Z5Ct)XjbRT}*WA7mN)Ha~SymEh z?tT){Gt94ho7odOEwX$TPcL7+$R9aK5EVgOa#w^h<~xU%dGzI=s7y$4{bFRyeQMWDOd;Fhn=E4t>$L1_Wznz14<&3 z-J&>Vt?V5JsmYuAikGv|eE>XTS~?`b2>EJZ&;~ zGel>N`b)9NAQSxJSrm{wlM91KF<#;g9wjP;qb7V&zJ6IaL(tG zzssdJWpXSv6kU8V{1OMDYl!CaMUkb3qRSW)Of<ZTjaUMW#9gcn+K;FKL!8xGa%d)ual2pm%S!}o@RdPiZ=a!^OuFRrzNvh;3 zo?F&D-I7$v)o(>8E=iU2=fGH!D!Jy1V5UaVC8?5YrIbQvxFl7wJByPgsgmo?L$#Yk zCyI%XT#_m|JHVGNNtIm4+F|eKP{{atvWQDkVx^nB8qBfhqrI#`3@N`3sTTO3!rvkH z;EzqWpbwTmu)Kp=No174lnu$T3Nd74kM`AhRw0IrQfz1yV#sJ(31^3^7X^omVd?{{ zLJXd^)-SBtwIbr_y&PPs}MsD zQMeezCbb1Vi&@}LW~h*W)ohbPCKH!@5`Q9bJIW+~0GLCv4Ce_`)&*tm3{3S*K`Ljl zBsE)95H<}l93hJ(sX4cz8sxfKXeA5U|7*ifkLcLVIgL^|CVbT##5WDP#u#2BQg2t#$cndy<^ zIBVX{cYkpwax+^Pr4mHS5=?rF#u-iwq@QVfRU-qKE5)P0?hH!0m4W=KH*b$S4|nJD zRK@=c_>RsF+<@z9#tk66VUTWP=6==N@Zo9?eQ+ll7x3ZNu72;`9yiJH$d6?ek(zFX zvRvuT6~Gj6cJe!brRi?o)$Htr)d*ZD>(OEv*iLBV<10Y*h9z~uWVt5Yw?@hzxPXe> zrpUrTIzq8PlHRT?C^kcxUHbHC$hg2~ngu?+lHUe`A3`L~L;M(U)Gl_J;fG-9_U~VG z4+dUz5870i2V8Uy+L?|lzs0E%#uDOHXZRnBWXX%emzqoLPY79LP0#VSZ)X z5mfqeAWlSh;bplgn~SO75H!qJe-rE~zX%_}*;OEu-I|lW;2ee#p>;MKf^%m|knAP* z;5?;iUzgm2^VM&km)wI3)HCOjdvKxhW56Z%;38#Q?j`r&VhuW}oLX~miH3--wg;E4 z6w0$#+k?wk_4!xZgUb~+;A(qt#Rf!nSKFCRBys32=*3zWF2Z<64`3EV;6ym&4JBiP zE6MU_l_If^b!&u{&sHS;eC9X zS$cX(aEr>ztzqIT*J0Dnr5dbRYl7R=XJb&a!UT7)700S>wgD_G1$R=X0OSR00sR}Z z0aOSG4cP>DeJF@M#YAXl7u?Nif~|}VTBgr3@mSTH8-f*!P4GG93nMotnj5)+%p?V48IjIBEIInWq*4Rd_jwTUs&|IdK28Qy~+Y9-vcZk z?YOU9YJvx~uulg{`9n(i)1^ZB7nSn!2WKlHH?!bN(?G}YMjWt-h~a3Xd)eO`7kpVs z`S*yF6HM@xkd$?`CU{hR^ui%|Rovw+55ehWAmd`+4C-U2DW zlUjgZFVF%!r3Lu)aw)*mT7dgjm}D=K$o4jPJuGBzmg3;+kD@$@7hQRB%nz95!MC+6 z-wDgYQ?g%j zr{D9+8a2KUyr9}ezVU_NMTVjAh4S;+0Dq+5-By|Q68oQh*jxx+R*!w!TnK)wp8K%5 z5WJ%453soqyvpM3%jQDxnnuXCxe&a5tc1_Exe)B(GaBcd?O;*xhX6ZseBw6vFCEQb{jRyE5x3dp&9UH*+BQ68Y+mHxPgf$*#Hezl9NPO3 za|uE4SJ>d_F~Q$L-L09%JxuTcNv7uEtyqnF`m1Y}WEQSP$Nk~kNa%naOo#{fG#4@B zU={|}7OO=EMT_bicvh3bDTfZ8iVl)i3AN_Hfk^~~b~=(ipl_Hz65JtRrabW92+ zI!dZTN=AH%&E#MQ+7UOhcRa*_UNNKTN=h)vYNs1hB&H9+WXtqHu}MCJ4~o5z7*moY z&tQr@5`G7)q+JO&SaV*5Hw)!?2)%`WaWLJEke+!)NSX3zrq%A;A0b`+Eb-;cuUOU` zU3F8kW;?G7oL6K3Cz#`WE~H4SWum<)2oAMh2c08_9%#(FD9GqoaHQ3WnQLP}Knp9D zgRI(yoFL6}T$$#YmNu&St`M~&c9FeDIq=xxJPRqo0*7B)EU9UeUua1JETm+Sp@o!S zksU97IB?F7h~enojszUZM442>7&D3`32JORm_K?Jj)LoCXI~alf~8hDzRYnPrHw44 z1S=d1&$h*R7E*#$&f^?goNFN^SncrVTCKP>4nEJ0SW6MBb@2Iigs3gYS{+O;w2nuV zueC1F#kSa4MG5LGi$SX>#oCKyt)c|=_Gt0L!KWm@B6gGrJ75*%L}1A%fsZl=4rGT3 zjEgvwC zRoxl-@SK@?Z4JG~yGSmvHka6)OJLj=k)s+>?H(&*zs<$&8psSSa?o!70&X0@htD(H zPj8&zo>`YiMaKqRwpfrj3T=YZBA&1Z*4EhV7*J8%-j26ex3~7VZ#)CT0%Hn><6?bDLtd@j8)7UgdQu~ZYB_-B>^DZsb zvku;~Q^|VHk=0U3F_3))X&d&t9vdPq%A1O>=99o%IL2NOBMDb{@n9FpkPC6J2GDvs z?t#V_!|PvAiI5m^>_st|hV^#=0b_AZP>$PaK+Rqp6OEXa{|ur;LwAv>DyqmUw~8|* z*WMbl%=Rw0&mrq^KtdVZj9bLF#I%;cwwnh;=h~zFVT_S}9mInlIo3VzDBD2Rg}}y2 zoNx$%rb>>^dQ$X-n9T6|U)?E4t_<22U7jt1!WFa_vj*QPaZecOycD}1RSU})J5i%^ zQLhzqDx;EhmivmHLkVD%RGT)nB7IX0rIp$GP9!O{$_al2#<36oc_QpyseB&amE4w*p z(1>{OJX|H~=RY03r4on8>e&7KG_K9{yE}}jx@KUpaZQ^RQgCDO+=OLuKYnmLI0;3b z&`Mg*NpPbYr;^6X3o+*oQ(F2md!Q?Y(r z#6}!d>)3*GC?pE^U2BDbMTfJopL4 zgnKpi#z5P|`f;4V0KAtA;QjstZU+ODMcw{jLZ1efd2oMyWp6Xg&WSkR6ezA~Y#U>I z#-+Dq?6J^PBCrLGA%o8NX6N0i1-!*YKDDxu7BOJ~6Bf?9J5krS1}qEMVv_UlK_Z36 zaZ|NDTS(XP)YiqAq-EK@TN4k8uwFV&H5NNMsg;VZX*@U- zu_}2j4%d~FTB=^w%5@IdW-7#bgVQm=U@EM}zK~?>VXNaoBU5lohGgf9$;+`z73;ro z*I41_kCIFPa3|A!$x+tEb`t_!m7;a?f|$%6?90i2=W1>L<(($E0Kvdb2$Es$$=2*>p=Tjp*HO% zG<42=jSVp^+H7BUiL~iJ{gXm%wr`%L%{YS3WEuAqD)+m_UQYu4vrxrtyP5cPlD=rk zvK6Z{n_>*K*!Sc&XxHWevFMl)zC(hT>UrSvoxh5akeQ1;=R0F`#T zx#<64?#tt=F0Q`kch_I;{gGTq2s>nh1Z0tbsDJ{7wXz9OQE5X+LV|=OW&s2QTu%m1e^EIbc<#(68$zV&G zlhfpjf5Q7#%1L zzfx$74zv#jTHMM&i~F+^%3hBHRh0{G)8db{sA0s&cIt6~Dvh}m|2{Ubu#`te-1>z# zKG14drd2+{^0QoPbYh^^!_T&=>?Q>&%G$CXGT?%%%J_(A7+kILbFpj69%k&mwrq`~ z`$Js!9~Jk%#HUG*vUpp}n8Lca|08^5XH!~#3{<84>{y&Cd2<{fwMQ+V=Y))hp~w#f zd|Y?jFNA|Ygw(@({H-_}w+hb}WPZ+t&l3+=slt4eZ$Ex_`! zXDQf;HdtHAHNC!*sJI!EXZgHI{f>h{6T#TQ_`bC*7r$>m3KrL2NW9Lx-2$9qnB0%6 zWf2%~Xh_xlteU5;n$l03PxF{-*2evJ@o72hL@K=B1IAh}GFNTf2dpky!n-+Fy81h; zKxVV7yXwtxe-`Rby7}^goNm6NK&#|E+s#)NXzkj5T3euvvO^_aTR>9im?vnzJ-op7 zTde;gf@x*^h?uIA$AhOO%jO=wIBZha6-bjJJNY}~{)VtgU2BOdhu2yTZNI(N(y;yZ z+Jc-Wb-m^P3EQM@aADh|ZnUTuYm54!EzfdoP%c=j#dE<`Drgs6ZTtL91zJ06wW-`} z8EYKVx+U)4flsqNV`-p%s(vsLQkc_L-+KJkrn<#V_3P^9X02^|*Jnf`l*X+W!M1dj zbX~?)Ql+%Q>oO|lSSfc^=v>RK(!v5s z4%VA&+ z>=EsVw`VA;XzxQiOB+xeSUXFyZZxMRDa)-(RRI<)AxIAV0jtW(7gLHTCYcxVkV*H!2KDn&_;Xj*iyzl z4Bi7a$tv3ver&@>mt8_-{gaHUfz@R*IJ!NUv3IB@+ za|enXn!7Pm72g-}*2vI#_wNTvH)iYDeR6`t;&J9WY^|@>T?~gI^q|`?Ke}`~&jB6=& zvK2mCik0`6%Hr5!l|{FydT}r8T4|>jOQjL#Z}AO-|5x#z=I~Z>Ro*+TSUc}(ofe!{ ztQF!{O0ztzSexZ4t)DZBwf0&~)t1S~+}YHOi|4V}p)~I(7F9xeA6yyt7m%jZ>+Lq5 zQ6jfnA~9v*cFRJe>a;r@k+MC~t87U-*p2VDNxRFAVk39Kp0Wh%{~pWjCQ}uy&StM~ z(1c;COp?JhSI7OXkjXb3laOnFQA`?TzVPY!Jy$zc%h)1s2L~WA8`~Qv840QOZfbOuPI+S_N$^f1V9= zP>rPqY1MUc0`3CcrI>uVK#$tuX`65p=4QqV2C=(GdN-SrXQyOKNqj!uC4pisI>5T%x-vS*!r10A zI>^FcOBr2tVQ_sJU0B|gR=~%OX}mG+pNtP<1eR|H#}ErE@B~aQYo;P$Uxm_{g@@7y zQ)IurHST{zvB@gZy209AI&>Dzc7%DxV9E+N9rpntL51=PW$oWBgTwy)&VC?g6|$@b z=+y6u!P?nC@#pu&{c^bZb?SHdV5c}FwN9BGFjm1uRc)h}TlRcb+Lbofa#orP)Rx^$ z30^t)Fj+GD?Frf(t{kj-_B>lrF8tf=W#1AZy7=u}gk}DkB&D}&yDqt5G32Vj+ICl! z?O-jq;8A6C{fEJ$OPf2}dpgt?5JHbB`#yX7)q}NTtky>Eg5N5OQ#E{lFy%&@R-|BG zme7L#z{WL}eN1Y*tsGiPZ7TA7&0w93zrRfy-?f9a@wJw&>uGJ(q2s#2I&{3h6-F@k z9+V$34e0t>2Ayy%O|6jb4~BTGq>3NM{bi`A3UNAoe~7K9vTky`dkB|haU`(pev0Ip zAu43Fh(+Y`njxwiZrfo>uFR#wr;=$4^nCxakFscYeQt=>--lT8#B#7c z>53KZs*k>c$9SI%k#&dPXfF<%IJkJ<(22yJXDY3x7L>bx;uJRbKK0*wmqcSChe z`<)#sy{Ct&^lsRp(tFzCya64!>V^YyxkGj54Ura z<{GXnBDmmDWxN^FbHSsvq1R361KE}3^f1*4t972v2FZipPyxX(waM0$;#M!?^&6(G z>xCU!iTT4+DleQ+O2(|U6+*YGjhSz`ZB!K+MsE{sgB#?B>4?=rVPDu*Y!Re?7T*9yV-*rlt4(54oK zg|zcQjtO)j4fd@+J-4JS7_@PB>If+&i`e<6xPK&yspis>5joYrY=lzVpccpS5nAq6 zRdk2hV4D_h#Rx52hZ&ot6)*#rcjGS@!Kxs&XYrj3isQ_T9Ns!MgR|Qt8I%0yyI49w zGBuNKA7O1VrFDm+#p<}za%s&Z7wl0}24Y>0cejy>Cjz3q?`>AN=;}L1kO=@cX$kML zMcTv$q&0H)h>Rq8a+B8SJr>WCZ7PL(MyTq12p6a@B_$?P@|`BHBs)C9lnr19z0TY=d&l2t*2TJ!`n*L$1b-3gwW%4_?|V= zHtR93{Wb1i`ZuU4nRjg&>E>Og{KvUP*AX5D$w-d{f8?XMpTwxEo$Yd4T5+ykC1s5C z)|aluO$-V8d9;}F zx`T4623KLj3>oE-vCBS<`%^;Z){e^31Wlt<;Hxcj>qcpZvCO$(A9Ky4v_HdxNq%KF z4VGUWRCru(DJYM}S`y&#ja(kvb-$kX)+moG&NB(WE@X3$W3$X-1NxK2(x~nHZHH7F z!aJk10$bHE|MMtPiuPWJnWgdGwP|tf(E9*~v*%@|>f(cQghqGYk`hrZWaivR!as`) zt>@wP#U(kaWod~@s##mE3%2OU;)3h@MivJ;)`F%&jaeKUw5FGpsI9p`?CoVGT8NK! znDW)La`==rW3~TJE%C_aV}8Qt9jw~^z8$hEquyzjOarCi0%D50K$8w{c#gO)!8(EU zg`3s7JiSDR>fJka%yQv3cc?Y#!n%vaO~{RTK&94`}T(?n5yZsa|B`+s}x;Tsnj5GJs2eX0+@Ogj8S!1S?a1$ zY@)HHiWFWFF&M^`YKLf47F^I)s|&W4%H1$7*kP)6@6Av*cawUJ$_x2eo1gG!kQa$) z2-y&_O{LnJjw_R8n02K(P<5)xZZ1_V|G^GZRW%1CmjbQDaq28QQ03H`~&+9u?JwmffJDjhl!y<>~lZOTump^Vu}l;^o+9(jGDIN|># ztlgTjoME=6%nq|kdS00}=H)t^x?rt}a=y)r6-q9Gp|vh3)6RgIql}(mc-xpGixU2; z0~2;&+)$nces>g&p+8?(F*4N3TeuZa+^izo9*p-v1^Ih=Wy1d_c+{!G zKPp^}X|4aWg0(K*S6NZ}utKYSHZ9kGSsBk&JK|pzI#IlNhuRVUs?g=d8&La5{ht+N z1CQOEP`VOKELv{7k1Ea(&^uVQ=gn*%RcP~BSatv{L>FAlrOS_P=~k9~z{RJ3S6qUu zczTVU^pgr5TvxG^y1>!wq%N>pjZ7E(mabsA;2P}!F1S|L#9Xkk?Ax4pxZpZ9UtO@J zjC-=ZPb~|_nmm??{K%9`w@>42H`!(B6p95a?xij{a}n~YO5hs^wq|x#vQ`eRPxzzY zG}4;cRjD=e$`0*-Cst}rtY%G|RH=Pojn>3Tm3GQ*YvQCzt%=9ACQh!@ns~ggCQhl; znmGLg%KF=t+US}n+*2!6xa%lf7ighyUEtV#)^f`Onij^1s(Zf$&DlK}W5#KMCLSH| z5Z+B1_e@_=xePDGrFHsH71a(4Td*$SAIbuQ>Q4nqOHquvpH*q^{t)(3?>9o3SwzNL zI97%hVtBMO;co_(%3jvXg0Z3IgL{0e)o{=|;LiouXyf?CSX)qS`iG8Hh1a6C>f*77 zNl$piZoUb_n1^DHVac?XJ;K(xWUN)K+qCkQTGXAGpd6aRy$J27al$=0-*j%m-wp07 z*il7yuNs$Cf}_W22^O<5TwpmX!v)YGST+}2rAF{E(x z{;hFZ^2Ra|Vcj^LwtTijB~dp{CGnYE@~X28VjyJM*NoF`ng7^M!PJjaXGa^CwOydy zl$0+G#ULjt*c>|1ex4am3H_FwhIvI4Ki+3t}zaOvc zop(a1%w^r4)aS-i1l%E3N+VB&`}}w^67Bt9d)Y*idSSe_vk$guyL)lGR^;zckr+22 zTD%=VFTzWf%I}UZ<9&_Z%NF|;JIi=*APirL2`e(m!oVvw%~dt-|+1NB3WXqc^@i&Rxk*a zWs~QpQ|zYM3U~d9=Rkq%jQ@O!vfQFuX1}o5+I7SGms51ZJEp&v@5Pm<<%Ls)D{^$` z8wr19$kl?W%9ZumFPNIc)q<%xTX`2uRb9JEd01rgLI>V^SSSh(WIP~+{RmS@tM^|C ze<$d16GR<0h8{arD{8R-#9nrwWv2w@*W3C_DSb8C>gf`vI@65fU;~G!gEg3 zD5}Pf68=pPmrkFKoJOUMexl9q$Z6#gME^40Dt*QpPCl9QxL~&_X(t8S?IB>8Go92U!ZIrv5& zayfF~iuTkr;{5ifn12E)#ozFqMl|yD_Pf(` z+{f%=Pj<$JO*}#ZbAB4rzZFgTcUsc_wxkURI=EFf-UM9jjr%ijEKlCaNAl35* zCjB(5e|Emn2iVT1oy!GR>j*gd05w0b8CEs|j6OhnGImty1~3P>4;xl!$&EQcX9@RV z#)@gVUCggMfNVv3Ki*z;F2{!|i}nTV2Qc2)1GE*^)24KRwPj@-+g-2$TMKd3Vz{Hb zFUBsbx`a)-ZOe5~w=gj70Bc+8vb4S_&I6a;J_p!^1l;@uCc}F4WTG_6RBbwf60P6R zCrn$aa}Jccq%=Pqob>mHM0K^}>;qM%rcz4lf-#lpxd%G!AR^VEZ2XX;GUwXN9V&qD z9H_$Sp`=^@`*`f3Q7MRB{BW^o@^_GDmqs^59$Al*lXKhQ_Df7ByWK;RegjxmrjpZ@ zsa2+=`bgwe*H#V&w3X@1GYlQs|8`i< z-*|u}I%2j^4ldBjg1Z2Q{ToR}TDEql*Qbl3CYkXSNxyKIRS&OC zx9UOmU8+(2nx)SDX|f$s!Eacw?H7M=Y^VwAf|w^lqj)X|R*H{utgOYRK5Tg!H$!+K zA3wl1%keUHhEr9t*g1BF3Lz$YHTIdIYPVg7xA8Mn2(mup0vK)14~gM{nZ+DB&7b^-2r32DQug~78+Nt5j9_`c^z@608= z(~-6g2#%i)<|{ic7+^R2(U4{bPFv#S4UQz&;So=0#|vh76c)*B9Fz1P1}QzlcfLh# zDxaf%bitTP@j_dY7Og`Uv~}o$sKYl&RaBMC+#k@Ak<{wSr2lu8j8{zR)boBvQwE^> zZE5XsFc*oH6lq(=`>~a7m-6%z%M;uR8;${0?XV5)t++r>wo1M}!z0lz@D0N`@rwFx zE(E`3v+>LplJ)^&6>FiIT(qx>^fk+3pytIJHZzvE!ITv74>L$T+S`&ad0X*|t#3T< zzBJ_@lP&JP!hjE}^v^Rq^73p|(q906D#iSICu9fMuq*AItV-sV92d3|!gps7X{5JD zN5j9&P+fPobzJ^shTPcHd-rCO=daEhOCqM+d=uQPlP4^N@lR%WWaWDkl71J(BU?TH zoy`u`7(;HCW z9t%BjQqsSQ^&q3j>X}ZHO8(U|b=W{}y_ESk9*?su@Kszt69?Pz9xw9NX$$4?_m?@(<@jf#->3>ArQd75wylE}m zZkZD;f9FiKD>_a2A>U$2yE{7?>Y-I$o#_!xVRh0k9|2UjPROpOy%ORR7$o}2Ogn$8 zz)RCw39rml!`e6HZxgSm5_K59InyK7mAFZM88E8?`J+Rs3d99tm10x4ppP9EbOcy~ zVNY0f92EBgwr~)0DO%M^cx$E}aM*)e1)%=kvP7YIX4ip9uA!l-aAFt7QLzU2@0l`! zkW=1!zm0NWB&_e5%zz`yFzc``_sLA&>C44*-an3ZY#HmuGBx+zPLSi@7$rE(!xMOT zs4j0k5QN5>ZzkxGU^z~F%u$HL6NpT9UUssSnSgWD8$0w=VD)}jdE6yQ4`kAxXD3Zq z^KT;W_8G})i&!dcu5vy_E4Umw|h;N%$$K+ zs=X8Kj_r1#cMcLE{XHnwllV#NN{h9?OtQ~t4mjvR#NZu3KBGBluV*v|%(^m9BKeHw zB=?NwfZ4_M0_8KBi5QbGt_II&4wz%3_>ATx_l#!YDpodV$TONpA~Sog)XFR~$vvZ4 zRI)(P8a$)vpi9xyi)2>dpVK0Z z&?5Dny+FZ+{?#Vu)0yKNaJF+;=#p}^l>2n%z~RG@48`HonJ6UB*z;O<3%OEXEDN;q|u z)v(qPNJE}?fl3%9H_6$(2^%>$BSpzW;Ltk5-Re}ErM3{%6ua9Y+fH?bT$u-vOZGC! zPJ4_rHsTGu(mUy^mrZ%cvBr?`>KpF;nt15NPM6@7YhA~a8|3B4vfN{g+|PD_A*<_J zaWe?7U%_b1E{@oDJ^)kpEaAo`j4G{IaM@%T`vVzs9lAdI>Xt3MuNB!#Mzx|$O}O#L z;;=*8R*OFNDa)J{Pq`a!8!vuAc5~l-Inl=3Zet$rxyjFat4WpUWVvGfN9df23nu;s zZD%JujU+&H^|jYosfQJ3mkxGv(o9mHfD^9oBY|5i+2!Ky0vots8W%u^tBogG8T?Ty z2l-%c=qaI-Y|NW3Mt0tvY@vG`6!g`=IK@%97gScFUF$`-^W~ttTn`NP-V#x-@51c> z^%$=76#c0d=Pot?xm*F)*SXu_G|6c;$y=;Peg7GrWt;zW8=24UDUpJl$5hmMJi{iq zkOa`J<+?dVe5Q?h=T2~~Gb=sba+Zzw!QnUglf)Y=hUD26ybEnH@ABrXK^hKe;_kqe zQGC|xoU;>HNYBF`OgW9_*%`$>0$oQ2|z8CO~?$k+s1r0>b4B(Oj*5jWm>Gz@|9 z@gE|u8YcwzTJYNKmpE`ALdkf(O>sF}PiP1*?*%qy7uk`839Rp70?j3k3vJvr6aX$p z(Zzu8T4)FP!;C8z`U!QKtRSg$FS6R=JxW*LVlEobMVvx362Va-1ka|>WM3H?oomM5 zv&h~T#mP-)YCd0V;b)8fAiQZyhoHN}#&na4pu+>}&8UV;ZN%w}pphw&v{w*$nT@PC zk4)ewmThL2TlgLpMlxWP1h>I^SJ;Smq;caW5-t3d7W^UkRhH^>htyRz<~?Rmamj6N z-qkkZed%2+iu&u6vG3d1?O}147e|3C{NsC^l-qFt*?7Ax{0*u`>V*1rJXtCJscURI z`!J+r*ORZc5&z2NO%D)XXKkYr>i8vkd14J4Ox+^R7%`u+x&M>77x7s4a`Zyu-C*G# z2{}{_-*M@*g1XU0e#}U#!ke)|=Oz$0+4y&);`;`374ywD_TQ45s)d(;dbiSLh2C;D zg(XTs4_f2kwr#@Qr$Jm2W3~BhHsWGt5&i_z?H2q;lE<|#V%MTfcUX9aY6l9x3kwzK z_;>z7jn&UaV$9IqMx(j|M#0@SM-g*mMWGH|)MEBxD+9Tq%H{pBt<2A|gw&S+7=B_C z7)%JXQQ^4+K-z{nYCXoq3{=7FyTB1G0z9xR3#E_Sh+T}}P|3=+E33b> zaX(|6=v`YoPuP0yN8w4I)n4%%3qMbKg^Xa*ji0pe@2klqR~H)ZDO(Uj8*6bppFZHe zt*0%xc@ugGq0ev&5p_5;Zr-^Yv!*(_2@2DO75bvWLhjvOiW?BIw_^(uBGc92 zC-32}W-7?dL^{8}MYEK!Xp5HDt!!#-YUpl)LVS+rUV!W~wmpbX#-QhI$#${C09paP zV8OecjaY{UAo6~Z&qDx9NjLDre%mMQ}MQm4}|@zn_ASkC4sIdb9eP}Owr z=Ni+?w(0mR02A0@&QG?NAS4zGb1i z2z80oCi;^VvB6w+5>FPfRU7YZOS_YdY45OhqN=EOY&O5I_ttzvuD!8S~}0h>jDu`5J0k=~qZ(|lwZX=H;7i|G=|*z&PW zl41>8{j?4m?i0(yfIc`+mx{Uisf}CHr&bxK&$6_`C-Iq0a5crNNbSX7A_Tcv8?5gU zyR&I+Pjg)ZPM(T&@rBFE{-#-}ma;6CFP%z;c~#xqz81>HBDbaXMf zhhD~w*b-PGS+Q=$74>+HGU9h(B+IMng#QZue7m4goqGke7xxAu0TP>T%o7jCZ(hUgEIyNP?kVcS*86$4<2P@|)+zfW;6}5`X%==J zDdk<6F^4`I3UZ?#v*|ee9Txsul&GiOaQ{KofV|ZDR<{G5LM2hpoR?9$OW6E4i0DVxcZs+WHy-6K1NHeD^kxF06W${!vJa1vF z3)9Jh3hyg2-e`}~2BMPFkwCYh=#|QCumn|nV;qtoo0y$wRJzE1*^xq_Z-QRsRK&;7 zP}S;~&A#6mPZ`=_@ey>0DY8FcoLoB1YKB_3BG4wNcex`bpCq-=P6U>#Nsg-mCUMJp zvR`nPXP5T2K;bZo216%A5k|a#sYW#{e%f;wf_3zr?KnIS_F*;Q;ZTKZq~vS?IC|q+ zM6Se~XNA22#&~lbD;ct)Dt2v87aRhu^_^JVndjpBBi_6N?GZ6SKfLziJv`5tyK9sF z$M6#TU%rgnf!X-Fjotsn+qj5rUEg3LPh&61|M5H6c#*mXZ$#pRbZqnwu`U?p?~?>+(YAoTMYrthg>eNa^F~jWambgefDoNs+PcjqWX9IGu`AJQx*(|g1*chmrsKp<% z97V@m3XWoj9928dM2etqOl+>c2|JRk#&9SN+pwB+ z+Ef$SpGo_k)sDw51JML2CvU?a{=f?fcyS#M>8`>5d2i#7x3FnTZF>!-NC$dM!D=g+ zn)I)S?UU+3B(~WyvD~0NkINu6Ew$|eKg44M6Ys+J3^UM^G>2#+y=&4vD|pIyuI6q} z!-+KSWpIc~G186eo7Z;(Q1d!k4wlBDW$~mPvEwazzVglo-*IoYP$2f_@O>#PF=i3W zhgFKVF%8$&(fWH+x`(mLc)QOr3fgRfe`TYsnF|l3M{IffCH;M{Y@+Z|{oRso1KP#B;rJ|##fHgMSO-;-hofD2S9rUCpCo@VE$RP=WQEY>O30{; zF4yd_bZhI1rY>B!hO1(j4|f>?v;+VM?<$3?p&+l;3@!PCfb|A^T6;LezDBaOqlG>j zax!;4?9Dqo<{=j|_fPsSt6UjzyOV1h(jC&XZk?3qcFU5oYt#73u8j-G$(@?6gL1LI zabtLG98!RAYTF@w<2@#{N%zzPl74cOlft8xv{uEVCBl2GUo?r_k1AqmH;?P@)g)qn zuSvr{YJWGT+l1#|YBJpA_A2S40xbPM34PN3#dK_}3F*J(ir(6~NFI*y-cljYRvz9` zgaImH?)pubF=_1bf;-t*-mzR2NIUe>%d8W zX%BgxWu?CqK2MUN4-M#$%5%~F09KL|)+GrFEpusUYG^V=!d+ldtSJ)q`q^M(Au283 z23iUsP#0)5nd>Nc$L&1q2~>8;YR^GQ|E!SRak=b{+lyTnoyD$85)5dY$2C(I&N%kR zTlSYL`x7k6Rm%QE8(dBHC)vOnvhMveD^|DgAa!{-wq%dD+^H||A9rS1ae`xT#+7AY_QnjqG zO!_Q&tqpV(awiz15Ggj#PWm%QRa*Q- zVW~wAUu2nx^)Fx}yr_?=pt;zF*A%W7Rqn!#g~Fr@wpdAA;*pg|Z+oHG0%OImX)lX&h64R{E~Z~+ zWBN^qDf2gCLLY|>p=Ewa5fWMNAxZx)VVPg_T)PlXU$ppR{iQ@NT9i`emu;Y@XTZJH~Vvq;IH6`h!ZHWFisQErebqqDnPZbPeSe zi!c{VB?>BT<5~(ESukwvjoA7(ng1X`P^wm<#v2w9W=ZTn@zsO`hdP1-&}e#^j0XT{ za7(fld8j256rD;IhDV5-=dn!k_xKeyt63(~!i7k70!Ou6sgmNK<|h62kZPHustv6y zqC&S)F0&*>$`v-ySlDIl4hLz`Zs3BgZ1zZl*-V)-eEGUFv*d=CKW$VE1ooW z&QJP}k*;WlxsGmsY4CF`64kdo+oSQ=YB0?9m_%~(a-_nQwja>Y7jbd4xu0%-S{Dnz> zb4cX0Tp})LiJX>AjuCR;;BQ83tpB+hRJ|x|=gB@MKOhB)T{_zf+S!P> z-{PddlE|fu&pQ@Xt-fe`*YZM4!WWA2cA!-REv9;RkToj&mm(7(RSF*}NAtWKxmrN8 zMN=`)%V8yC)^Z8b_8L3k`-hgDtX+(6C)tz2eh`*jnz;*F?f8K$u9W?sPP)pK3!)qS zmIT?2EVV>bMgUSOUy}513aQ1TZpe{d8wyI^bK#^WXL@F=O`*)Ef;!;f$z@=WH~ zLa;NhaecSbArqrw9Fdo0hv5)O1$tnk*aNy@eL~0o|lyus~0YFkPp0eGgPmAg4y=F@kom?sG%k>2%% zSdSAY;iM=F8121rXCW>O$F?h%1iin#tGX||!6dgLB}vFi4hHGZDVn)WnA_=!%663u zrE)92Nt6t>`-pI`Eh>}?U{dMZEH~W)=Ch37xcRN?| zynCY_@sQT+l{iBf(!0me>o554u^3<~0{?wBbX=j9=YGpfr^$RN(XJdbO6i2DY7 z>Cvt{k2(BSB#$|f2!UT(0zF!~U)kWMLRke@qQAC48pNDsYN4HRV4QNAQNycUP) zLZW|gM72we5J;YIeNGty=djO2=YzkvhRF z@w&R^ww?y;F;kCCbe}pv6J^EP~%Le#33Z$F^azk~q4<#XZFW_45^x$rj0+COc|>B> zW#Ng0!=CeXS$HDzVp+j&V}3m6@@p~K{1iInzVf@LJB0-u`+G|YT-o2-QMB2}ogkCx zC&)wXmhKuoId!nmC+!=Lz^O#iZ<`~BtPWBN2+v2!ZHV;yLOz(|;Cqnr8l>8m^8veA z%;~L6>AK=<#nY04DCTIwR+GLOjoE`tYuh0)$PoukJtiaW*;*~@|DXfwTcrO@AD;LBb04K(;65h; zPOk?b{y6?vpovA#OyD6E9yf}fB}%;gFP&FgS2JgM z?cpotnM|TE(X&!E!X=6-Ev2@VJoA(oC@VMRu>^V|oV1Bz4f}~U_?i}Vn8Y9j1SYn$ zsk;X1DKUifQYkdhr44f$If@Pz6PLa45BO%GC#LJs4>fDANsH+?h&iB;($b>_=?u~j zXhaSX8ojLnEy$r7=m^knhiR&A(=SH8Q#^jVw4r9D!BR7mkzD;zIJiravQ28TQZZ?3 z4o;rT^7b|cWN50Q?hZtP-hP&nNxdj|7c_NKD7=|vjz`KwJ^E-ImlX7rk2hQMm_X&{ z9b!2Q+LnRe8Vz;e9qh*XPUxt)Y=5}gBcHYC&0|Z!RXwJ_k0H3UVP#Xdh#l@j(y7Mx za38HzmX;})5+>(Pz;Ag>I1At3nV7fC;dmo4W3~;f+)@kmNM4xeJNSlG!tyxRV$s_O zH%Ji~nK}l82@<3?6Z^3iReH0sX2UQ*$*`Ps+eFmNH3eT6a;9DZYQ|ER*3<&anS!11 zyYXFxGy{5)DDxS%eoX(7aTNjcEU7+xj`4mdd6+)F8pkZdJU7}r16B~jjmlrlq>ccF zr46XHCDlFk%W?0M==w_q3o&HyeMBsh?-D1X)H&JtFr-Mft0Wt^qQ^?+ko zxQ8^fD!+-LpJ~pPU`g%rDRm3y&6zuIh4Fr_=vz&}^WX@TLT-4L0zNX2oZMQ6Q;*;# z-N6{KL*C92;oFuYrTI2#VqJAxuxL34LmXNrVm#ElEq@Bxcvq9J${)wjUo^B@denOw zSfl*@RYQ$I&vJIRziDAMXygAo8$WJH-)8)GfSz%MR9IhnrsymnK5|t}9kdpdR^7^) zn&owime#JAQ@3Q^%9V2#K!a?vvPH#hsJTA0iE- z#2aR7X{f8EGEb}N*=@t5n#wJj+F?>p6*jnPDC=Uh4Xqxkbu&gw*4r>lT3V%zZX70x zs>;*KdSu&BSKP54OUlF5{bH=HpnECWb|J@_cyua`dHN3`o;4uD&@dBF5rmEQq+1Xh zk9K4Gg#V}PgoP$x?++91eohje$Aks2e?p8&B<$-3b#s=kT!h8MFD3OgOnp#x>R4{- zMYV_HmgNaZ5s%)?EgV0=@_fYn3$vt{H)}B(W@pl`Kz02OOe@UW{~NpNQpoH7+qsc4 zx7Xb0Yv)5e;3@N=PMfk?Q!++J|A!#RnRcswf z>Ti-x+sWT0rl-XO`_ix>9jTAFCxl33&^qkB0ik|jWyK^8mQub@a=}=ER71kXwial8 zxp0RGe&A@>8XN3Mm65`?@g>J$5+^7JIST!>&IWl}X>0mvrMd9xjMUl?L4%!U%E3_0 z-Lu976*Q1oDpzrnv|uEcXom3>lAP#B=1bMNV62~A8L-iQzEs{sOEFN2``Xx!0_{$d zZFIK@PPH7=;Jg6MGf7F(jri(9@;5s25OY(5CU&q`!Et!s-6rT(iZ^Spr_}_1vJ~d8 zZ(EO!`>>KA`rqI?D^2avLV7u*&>=f!TsYQGDZXrx`j*J68t!Q+;0_zn9k2D#l|4bAyHf0__mwIs zzK4&8TC}GAj(H3_G#e;VuE*lP1H~+z4=kPSra$I(+92ARYj~pSOV1;^Z>`7nl6_E+ zE-tNn5tak0*#%<#x>~so@`Wpe3F<5|I^|ZjaKg|pB3X&XMr+I1*nNkv2l4r{k*u;(pxybb%Fk zx3-B3EE%gfziY{CF~KdC*P0g0ZgDY=GD=*};%g^9=vs-p)*`X(%mppZ>n%=HPb#J5 zuW4Dz>vZl@9*M92M(m*o3xBUeC@kM=S#B&qyS?AFO|AO}Y)WXkEfzUl)Re&Qm1AN) z6W?RRE_(IZKI}}3Q+y!-89kn}47U_uM*h4_+(8BC0-*Nq9BLv4xMSJDNUW+2ne4{3~ z22~WbI*JsEZ2)+#&BC*!y|Zbh;we`=#L=%EdnSlSq*oTTT0|?L!Ujb?E`R|7Qx%Qj z@Q@6Y*X6j<>`1xG>_A0N)b02-hv*M*Y+8MOfW>d+G(DS~3!oI|SPJuwt8K>$c$1-i_tp^uxbamF5P)+qg*M*aZC2wWf(XkCI#GV$NcV7jnC&Q;RqwqwO3dOehTEEx+=6X=?(AJfwaAsB0`CX$SO-8lwa zk|L)X+-h$2IR-4SV(~Su`LfP2WC3zW_{m6J-Elp*rxV#`{1FTy+`eudgXfKh$TXv3 z)u?Gx8QI$pk+v}LSR%HHX)Q;Q`HL3gti!}sz>;sng1!r7zA!S;my^+5CTe&1mK(or z(K6il0rFgcj1IsSQgBcn>w|M?CR%9Wejj{oJ?_nk7TJhEA~tuf$Ni}qGtkClvSNfr zv5hFoiVz}$Y{X!Rz_P2wG}yw2hj2+g#DYr%EQj@!@-Q1wq3P=zHsCc>jT&yFs`~N> zt`QbK-p3|}&J8#jVWOkF17I~r%J=nok{|2d(NgbVflP%Q*TZJOI(E5kW-LFziniKB zD=lcIU)PSOjZv3f7)qjJvF1W_vw;rxL*rtJo{hjc!Ml)kUOv~a+tgjZwzVnDFwy&| z#LV}3cLNTh;|AU6ByX;;u)xP@8!UlGr+BpjSO{vC(oBzY-AMUjzYeDo8z-CSJa4%` zY83(|=Ud1sg-kKg1s1YeAyZ9sp@pnb$bKfe$ZHdp8X+cH)zL$3SzG+No;F;h)Ckl| zyrYF99B^RcBAaNh(c4oLCm||f6GZP#%jL8tdY?+#r0cq*l=rKgV`(@qP!kWzUK%(H z60v`wF(+bd*8$7TM&FN~OG4SugJZLyl_p=FH^B1O+#X({-QS~{Sp;?S6qI8@+e&og zb~rk9vyRD-x;KD%aB=YFjNE!$XoKyUbhS z9)fmP+bPeQk0C+oxKBYe1Dn56>9uC+^$bfDGevt(-9^5DNvsl2SiM65zh zJhv5;qck1AMxjDk^=QjQH`$GZU$0>$85O08j{YT6{lC<>(HS0uM;7pQ4;ty2ED(at z8a&GeRUb#sTaU#5g+7kYg$(o50pHwj%gJ3PwdwP%NuCXWkDVfsQ75szkG(TU_n4%g)k zVVy_xq+Q-fR&9h^aq=bz99xM@UbR3ES+;Dk$(zYi#~Ryl`mo9PvAj332~-*#()vw& z58!k&y1=n$br<%V7}y~#zn@10C|!^2ood zAuWHVY;?kq7T6&zf1dYSpyVazpGw+b@aCYBf4|BZ zh82gj{0FtMa!Bg|jzo;@I*;WJI~Ad9=y~sELkmoDH_6tFxg=uG;cvm)_~T`+ zLF14=Cb9w`s}4&h@ddqJv1dsha^d`pACO{$E{Bp=IWpl<21 zxo~f$D*eV98hW~oIaS3(tUX0(Qe%H30PwJsFEORYJtJZ4s9N6Hw8^CQ(QtrblUvMY z5TA&(FqLCK8Jj>@-skuec9dBruV0=q9Fb)7!ss*t;qSR{p~;(Qc>6d50Xnpsse_V(v#-IdAFQy18>|=a~1R=?#82Ue1P|t>Yfe7L#tZ zgHI0Jq&E@|rc);GHcL=AfTbGwFOa9($Vzf37FzT+0AB21{Pb}?Zs2t<=A=7WSPB@k zkmhdC?>b8W5x=7yQ$y0i7X6x&7}aetL^bj1JbVcV?xJcZlWoJ(J$b zY>{%$m-{6eO?unO07T1A$(TI;qRdpNkopAxJPGcl7K%;bBUogafSP*cgY-^cE>5Ho}p>?^~qfwWOC-SQU)lM zrsJT@P#tH9F;o8R?x=-fJLK64djYWajSbvC&w(L*&K_irmA|qZt&n)aR_K{LMwLLQ zBG5r5?^A?XByHxdF&9zB>2oRlf%C8;^bxx0_-{@y>0avd9!x30Ft;9 zpT2-CGhY6)JMIR-!;y$Yguo<|yb57?TDb3CC9^R7D_fbr{woL*C$E}HKfw;i`K_j< zVU+%js*$-S!YgvJkffg^sR3j1Eq=L1&cMz)Fl_uGr*6i?=^4_uZGs}cRjP$fB zp4AGjP!4`ibdmBZpPiBkq-#9KG|}=KJSPpk{UrUo!f*8Q=TLqxuvVkxKlCs}cH#+m zcYkR5MUA-G^Sj%-alcVtDbRdh(#Tsqzo|`T@Ai%x$m3bAO0k{%nb(%)342!^iO+!)`eQ>H)zyG%b$%}X;Xe+ z=Z{B7;uoUqJatOIq~BD;FQiQ#iHC|2W<8NJRw^7}<_}xomnLr=!u%xuOXw1|2&qh| zvGkt1S&fUZ$usN5lU1qo+y1)x?iO4!C-wM_tH(asne?BTi%U&%RSK(AQNDXL;LtEd zTB(0oBf-;)d{^o3X>qP9vK1ov1+z*2RpYKMvQ6f1Y%jO7LhAdk72NF-5g@^)p1F#+nk@Fo4hc4R1?$4%_$ ziX)@x8D5|*c&0ZCD9~jB+sOE^ubv=HA0*e{&^XV!At`;ZN1~DP<(k7?JBD)1vN4AR z+AcN9q-R_Bia-#{wU+5Q9@&YM*Y*MJMZYF}h54LD2BxJDx;jlRr*+w#m zrApU$y^z4*4xE?Lf$FRG9)I?DdcGHka#-MvflQ>}8{Jj0=|#e6w0xHrz<$Ba753iA z^b#9!q8G?bJ2kEAao>(fFSYQK1golmWfpd_XXPM0(4?1J_$l5H>EDNW+Eq_=>9F%K zy}~9s-3uCVy&*v>Jr*fieufw51zXyqu~K8wwce=`_esR$@mDCC0ufEV$-4+p3QfYZ z%+S3>W70=>n-O1_kCmEVLXM9l{G+9z`^Q)bF+_)?znV2q>G*Ek_rIy26TSQa&{_Vs z{t7cXT7D8#8}{q_bwrAu14TXxznE4U@vMX?A}xQ-kHFqQE)x9>!451O`3-(YV~<`l z>o;msGte~0_3-TlbQix#)q2dwB}yB4E!6SGU-yz&=NPnc!znMx@|!j5U_y-FLK2bk z;lAENXUBSfJrl*s_goXV5vqy(V-@}u;JCXP?Xm-RZgLIQZzb_q`8$ZALSqaJ6PO8z z+o*BxT@#1>htpXsvWR`MDPr;b_Hlru&q5TI4o$}Iqy}xr0yV1H@6uv{M0*32Izip8 zq&AssW%hg6Y-pfpLIrM8V9H-8!{LLzYz!Z_3zhy88=UsX3BC@^k;CR0f~k#aoXlEk^JkieIwh{!Wl zB%7Xzs7uI7W}GFpPY$W^mXs-Cs?3A|NMHCA{+xwiVJtH#|7gPZ)nq1r2t$)Kym8t33Ge+N_ScadO&=G~6TQ zh1gWd%ySlyrDJf^>S+{f%fw8LvNSh`rFoVmGGQ|FnVc-~(l6Wu4!x0Cut8u&zTT>p zS-1`1X!#xskS3g2L^J@_N@vP^gOZ4rzf}t@h}4XfN-QvW%uTsVIM3vrjWC5B8f4@) zbLdL|4SN@Hcu~h*Bnz{Gn-z*ZF3q0SgOj@xjTufcdjsF#h>rJiN63^IJIQ29(c3Yy zp3#H3DT5E;no-M&b5L>;3!nQ!q8q*m=XHT{L@O6+7z6kC=Rk~mwBUFHI0x23Sa<{O zH%KrZZKQ{;Ztj-bBsTB(h&$8scflM5X?0{R7a zL9vI%dOv(=>j;c|%0%1W!C0*K{g<|ylCikqP{`SP&u%7}V@|+PKHg>b5>orN@F4o`A;%`MiEM=6NJ@5x(a^s;o_*Q5hHbl69N5YR^GBOzDjdf#o&r zdCXqF18&zzP&RD$UP^`=U?^v|Mo=0l{0608xa?LfdLuoLdAVXgDa=2@W@ss6&k!{L z2a+Ob6c{)0$_%B~HzSs#2n1C8E9_?UVb94PNxjDNZ zQN^RHq*XxMc6HBb-B?2(Nj}wJJi0nJrX8{>&^&7pleY_3Yo3Vu);7PuRM=-uQU|po z28V?B%t^&w&zz)Yy+~oiqkQJ1!aZ}6n*F$D(PvJWgmE=^<|H-8M)8>wya&YFNoA3U zlZ%VK)NEMG#fu~f7@`%NW%NBP5(Kp6K#nhxNSs(*VrB;YY#d)CsSx8WD`WoAdhIA* zBuT_*>S>a!`~^0Nyi0N}lG935X~dNgwaJ6b2^JTb;3BKOK@k*k4Fb&ZbrL)$R@Z?O z8bQ%BnwYPXBw}0xuV81vYP|^t(oKL2e50g-!=ZGe5X?79D%@p;CMZrLGg9-75`wuX z90KKylA58$uxP?Gs#c3=xgJuDSY($sN;cv*4Sy}(2rXWpE#GB=p{s3jzEN@+e$x=L z`qI@~-?iqP_y)tz(ky(Vq+%r^kANEUSJAWpU3tM~4^pr-3Zhx2!o6UVDS1}&@&y|Q z<>s19DU%~RU$CiIxOQa=wvVJL;Tr?27VS0>qq4@~KxiuSF%)#n`{FRz=)ctd_kZav zqsjY!;wXzh*8`%_`%&Tldq-KU{7NMJ-#E%-A3z1M!HE>!xcCe+{lD~^#b%_@7Qupg z#$x9kPE{UmcZkI`%I;K{hDcj@z}afK27EE|Ae`+Ai(N_}eP28>_7&e(Ud1^qc@KtB zTpTz0E)9tDFmKGm2qgnlKM9EID?fC7>|9@oB5p2G*H>Z)Ytg#C5+hkV;`&NV5I9|5iE4q0>nkxc2Etjc zuUoPSIM-KX;{5=pr=okDhjxVB9M1KH-5f-~$yJW)D>}ftTHvuhIJE$Fb0~ao*B5qk zXv9}sU(ta!W^dP5wAe=M?fQxivJrc^zM_LIJlFLV9b&kGR%6cW0=u$!Yw2X1Ttwo8t;JJG#CSvFYHgAA3rEmKQ8~dykG)v{&KZ;*cZYT z9@01GKTxYYL-1lR_We*)B%UflFjl?5fsloUWGV{OjN(F6X zC3zB(XM3fB9IsT+NmQ(9yYwD(tr9?=S1RZx3iV1canVa5M(dRdzQ!vR9PbdTS1Q=b zY*}8ZVB22+P_Gn!QD!3FFELzy3cxgcBGh8je?0sf`y>3y2Z8lU1-r&u#_g0WIFX6i zEu2>>IEhw3wpS`RS(*AeuT*e~#(k|BnNo&6uT&taFP7t#3Pk(G%J=e01?MbAX6uzAp0E{SZIMx@JAuM0)qpUI zBmz#V+@q$DG7iqA^atL86oc@CUa26Tks6P9uS1Ndtq>9e%XYtES@s)Uxcxn8N@4VsT%@k#}Md`J@KdZmIl z6*0Y1B+h!03Wmi^alMoYl1&B*H^t#!MnczJoHKhe|cPjeO{^HJuS}Hd8LBCYMk>*1%G3c$?-}Be}6#` z=6I!o_cb5AQY24)rF&tro`^jQ0pu}PC@G9C?_`H_yi&mjdyrw!Etv5C4!V3~G;m(2 zU?$E*NtgMmS1LFNSC=v_$14>a?2+i#c%_0_HfArcR507Zv%ONm9FOdLtyd~I#CuTU z;FaPJwrHtt$l@7c6~7AcrdDf%+~pN-L8{a@HF%=u4A|Bqm1@?k>XAyd zkOVwZ#W$1cdd7X#5tTYt;a_z`rCLez>m5<4jT$G8s1}f6Nk!6=;pQW`_HzMA{|Qk% z!=FiIJEBruTAD0JRI1w*FxwH8>S0US%Mq2@q`+)PRBE%9JTQeMm)g<=!u?CI2)qYX z=*>=DT6_uNmuWH*ZpMNN+%KuinF@B5$=e@4!ge%D$8@-_h#_^w2b3kQk?3gP3skA^ zuRvmK*}~s~E%@VQh&jWb85%1Y@|f9yAX2eti5O)O!5X|G_`wB;OT;e0-{JS+k4!_q z4vC52`6mi~rM#GkLF)yKMG=$UyO;AbQaI7Tmz~ABDW@1|7Ss9YWScO2|R{RL#Zle$)<(c9~8FvSZ7AY?({s-gk zJX%77{SL~(r0ybNx@S9hKW^%74VIu_WYdkKCUp;k=?(A%JpeSbQ}-1gP2~5x7Rx4p zmSa*6xCSc_>})crA1lbm{wKb2X;ME?Kp+4~@}NR8J}Om`Jfwgk0Z5XcDr7JrW8)5%tW&>K@Bx~3ZO{5v)Z?!dIMWnTcBxD%GZiu zs%I>0xfYI~XDw)p$s*MO=wP9~$hts`68+u>%i!H$vZaNxMvc>53&54a>^T>l*P zwnL2AMbu7sFo8HLPlV?bcuPP};op!&%U)ATwdO4*89s^%FXpKE^biSm>Udq{G5ZZC z;l@#-XcKR~ccduM-Zdkgd-SMhs5ihW3Uf4Z;K0vFHx=}bxd=6idu74t9azg5byf}$ zEKPN;$BqJQi{SQK?|6^o9>w=MNv@Pw<86^?TrWJ1${)K47p~jdyN<^$U2g|-JdH2C zFQj}B-5pX6rUBNI8TGI8ap@A!L?|;xLpSR-9}v=>|Ip>r-}=#t^hYKu%?1rV#T4{ z2W+gc&yBfMEoLN^MxYbCQ@9v{cjWq~{gEskz{dMF)hK+JsKC-H*667mE%1OK03-F5 z?$gj;0J)kFaXrgQU_5%cB#~mAK^=|^!xuv?!(Y4Q}^c>tTyKVfZ9X<^qAwirM)cyDuCIKuLh9arDQ5f+Uc3BSb=%aQWyVgu#Z#b%UW7c3&bgDq<1 zcSywXJNobBl!Dm>2e(_yMU1wR~o96OgQJ7ndK@8LSo$*%camMf3T96Ob=tKzZ<%@4dK zqO>oww59o6kt2&M`(&{N&wGg~am0VC#7X$Li*YqyNc^c>;!ouge=3*wQ`y9SmqYyN zkoeeJLgH&N@^Y~FJVK&x;oAVh6>d|+7ZE0n_TIG<^FRCw2c=nNoHr5;YJJ;rJvjDI z$7&V5;YU4U*?9@BJOrl7bv*5W%htt&>NTv7yr{PR&1T$I;^=J0bFeP|2yF2{-WxB) zHHM)GhT9yr`wow~&O-Cd8*Y*NL_X3c)yf_f)%M>}!HcwAsN0PD&ur$=D}?tYQIB+= zxh(1bJ*2%jm-gb2HjP1Vaa63qUZK4-hxW1@+Aajzop?tm6dZJi&^{sRk?!Z0g(f5S*>rsz%54#FCL58$n%ccEVNSmg$_gYkJ zYo+~%9NK@(q3uGT{g-Uo;Xs#(c_iF?HLjQpi5JA2f))i>5OWQVmb_OG6H{J^53otK z!4<}`8=MPuo6&Phkx@E4H(23D=9r8SB)fYzZmJ~d<5;peG1VqUwaJ{AYO+`bL`9?6 ztBG;Ej`n`sWkz2fV(nSOEYu%{sPQa!)A~(N z*Z)$)MEck3aW&x-$Mc7|h(F9mObg>b`|wtMP-cu+=XGHf42_E{h_m_u+=21)0 zw`JBF8P}RVy29Egqb%SUV5HGe64$z4jXb!;tt2i}irzKUkvJ#jmBxMGjP|~V24F#D z7De+uT<7r0VqB)k8w@ZR7t21+RDFW5%y#-@^o7cZ^7-zg zxSNwQLW`huKM#cjfRy|5xLWx!C$`V6*kDajOkc(ygn3RmtZ$Si;{dBvZYH7e%Pa6` zgJ5)!)lN)aLgluWqO_)^gEd%jM-nRTMk~r_LPgnP#_wB!t8u${gGXH_rQDgMSXr{W z@LiA6RS3LG;PGhDy*R~KbvANQVK%|^-I^4ujmZZ*2Bl4b;Gt8V+dn?3#Wxk$Hi<^F zEqTRg+MH_!rF{X(=}&LFB!l4#u&Me$aqAwxGn3LHiTDwGUlMtJR~vUsd1r_N4i|1! zie%16(t`}kO+|ZFQbpH6N$MjF4g@W5Ao%c_u$xgHPw#GO<}Bjcq}Z4w^y1^V8E`6y z38ia7O49VMN&ZS|EoS}~bzcJC)OF>p_nwfhEXkW>8wdt$!0g_DG)*v&m4JYz4NZ}N z0AZ0#*b06&kR~*-v$RQ5o=np{GD({0f}FI?q$v`Rbf#_WES*Uc?4)U@OC+GlvU( z;w9}q0lXbR&zs0iYd$CGjgA_=Qu}`f=qPRdsdDTgFg6(YV&a#hv@R+L>+nW;t2z0y zD6hUIcu$WI%j8qoc%DR^#t_L6C)?}rWrrap46r?qN*Oi#NxL4w< zbp(3*bUA#~Naf;r0s!(U63Vy5j(X`~>1}x!G34V0=fwH~4@>XDr+_X*l80rz>0#+z z^dBON@UWyL6h|JG-pgead05ulJuH0>%$dpy6CRd3U>mEqdszB?WS2m76CgC2IKR|M_cnEBa5)Bc)ivH4X%d)5uc@Il} zfb8jL9C=vQOAkwbkZUY}J!%#0rpdR`UqMEHBqiU<`kZfN4otq4^*P^4e zBrtKZ9FY4~eteq4L7n2wg}Fv_PPTWVAI#w+@mbXalarno6S|%so z%04`kI-gT_iNhQ*kk&eWRAwE`U;nu8i!9_@Sx6pbgO2^QE&QI zmP}L;gH+^OX+p`jvZRI>B_hbTvVj)GtH>Ys8lB$ES44A0Q9Lo^CFrmVAe0lsM4{90a&?}1c`IJo6(GG6po<7f`XQm|srUy`#zcVO7J^A$ zfBlN(*9n~p+Q=0yE60fv8!0cZh%_oR(&CJ(@=@N_QQBlAaGZcxsycd5ol{vHaX3DF z%FQN%hy52kLHXpl5O+|&xHsh|IIuZ_JLt&XpZ}xooxaO{3C5Fi@AMs{cWIo*z0+rq zE2t(qlXvg*eSz{6xOe)#L_l)yyoCysSDU!MhX9SwFsIEGR0LF`d8f@AIRs9dKgI(U zQnVO9aM~QOhG9ZJWevj%9nZ^Z>N5Wmw}Io)3fu!y$RUPwym&$h_aDcd7*0{XV_Z`Az0Hy2{8p+^PrlqH*&VlMpVH?8}3R4>mi&+@LM{Xmc}yjb>KhnB?Tbo+6dP> zi*KcS+*G6^#$>%{!(A<)rf;Qt{99CK&bQJ%L3mQwF4}NU6eDQ$t#sE?W88nXHbDAT zy6wJ|?rD^W8X|ow-P8Zd0j6)Idxq03+8{34aL*KB@~x!Sx}4Nam|iKD&9~A$n_!-L zWY6J!A?!g26D#Fx7i@I}!X+q(hjGycUCc}I<_LIp$pQobWAsUD3App%piIC^z|9-K zLiqeXj;zqfk!_Pa(C*{Nwo^IeXy`dBE95PB4yA4e)DN9VAEQq)Z*LgC}sf-rSS(7j3BLBcV+pRiwXHy*FX zmwX(V#mAAwDTXMfz{inw6J?q{j-N*&s)Sd7n>T)i=V3mMO!_#o=f-pD7Cw&bd76Rt zn>W}Cg0Bqsabz!2Rps>3Xq*;R9vBt zBRffHhWj|O0Re}P<85dP8>CSk!N-xkDk4Voab&NF$Ps)T+0R7z1wM}K^}T51NIs72 z=OTmM$C3Tw9-iLr6w3!3ValJQ zz;_*W~R zze1*8^X3iq=0iM~_i~};mHXld!`|t1qZ9b0dZIO?B9I1M0 zFP~oA$FUa(@KCNCrr_iF18dmk47Mk4>xd;L^wwd zK}jT|saNbu<)^^F7?1N!-p7$$uTYmp^l@Y>m1lVz`8d*34mBkl zHSlp91eB1*!z1}PvKy4|BR+5)v?o=VJOAj?gpZ@PT4Jcu0kF145TxbW4Q;Ie<^3GB z8=r>=o%3_l)={Ct&v65uC^;u$x_N`@($>F&=2a|&%6&e9p|w(?;SP`5RskRG@QBv{gBVA4c+|FwIPUQH zA=F1*=4i*w8`M2*=QcpR#}Tz2!BWlY@Tlz(-Lg15YHhNom9#WzI*|(mlS(&*+C|9f z;iz?pKI5tlDqq_hK~3Jv%5fnJ=Er^7r^Iy^+NVV_=nwYo!ezzxil8Ef`92X+8Ls}& zJ|i2z&kShy3wn?Z_^cS}dlb>SgCh88y!eZ1)4KamxywlfxSZ5wmy>Yf{Q|U8Zy>=U z?WxMoP%FQ0_M1B*zj+}1kmm_r~RXV=G^AA9|=I-ZBF~KfY{vTv}Xmdz->N-h)8WtHVr%OcvJ@%vP$IVG2q2{X_R_aVAfZf||bmATekWozBl zvUU7Qm6B^Hhy6;GlErs%n0cj2$+Zt4TyUjI$r36iccn_nQo@V4QiXC;Bp*`j3Mn^@ z0uRIQ@b3^N)aN8^YH&&DEI{KHLBA{v+H(2Z+=eT>l-Z=Vz5RK-6lyL!=5SRY_d2Yn z9jj(Ma)2OEzmdtWLBL+Vty=7bIIvLwyKbwdtGYO-Nr0ZXwOUpr?krU1P|HVYuccra z9KSu+8aO06@FqHH!ju>Ajwm!^0*!)l8HtQA+c_rwAeR_s3OJ9h<6a0$xc-Imy!s+u z`GkBm;(dG9egx!?j5WJ1=T~`LyNrjOboa_qzV9`*ImTC$uAD2nc{AbRp-?&B`w3p` zG!JEM=PzxJ@tK9PwrqzfKSugQm=0^J$xOMG6esX;tmekQn@O!g_n$k)KawjNSI~Fx z*jp4T`1n8J6;AoW_nU?DB>VaH&2ZLmqu+kfP)3dZglu#*ycFg0u4>w6!{m~Kv`ykz zyHzyftq#Y;V)C$rO}u#z?)^~W99`6c)_=yEoTwGz-C%~qa}7728`lVAO>oc{7&KVPobc9^$L2vB@$1D>+|Ij3)HaI*huHC{)jqm+(p_-s3${-phwYFM(fa z`+k_O48|KB;yRqKiCSV*qkP^*{g%&`eoKh#_oJfUr-A-U#+W0E)^Jk!o&qD4 zJocY7vCo~to)kpmtl7Y6=1D;_K>rQ_c&e3HrNP_veK{Ti<44V!tARj{n4{zQ?D={J zX22eJQ_1k@cE{weqiwK`uIu1$Hu)DmCe*IBSMZJ~J|^OwC%-TU1+Ue^3qjyOBLGg& zCC2<0Vq7*=V+e6cl0)J9E22gILJ}Ejb4;EOYc2Oo*obS>9m>D*3aPSxe+_Stx)?-& z+xmH<-!f|yZ`Kr>7UPq*R__Yonq=j7B6?f(uB$(s3+)mZ_}x7|BK@~+CDP!n{hh$T zkz1=l4FbY9HpYFoI;MOMZL-Wf?!b#4PEn{$HUEOwP@!FQzr#wV)Ny%NHFiwh!SzZx zz|N^=yQd2EHSP$S=Ho7tWF!-uhab;S?ot#g)cH#|4WZ!ayx=>9APo*TLzZkpdJfFk z1%%$I2ts8u_;fU5zj8o$INq%YF8B2Vj%oV~s@(|wh^YhLR#bW9*LWLMuG)jL+F#x} zBX?D%a*z)S*veF)#KKe+2z~q3sk=mB-3nDgFHmqfNkp3V-$#UWWXpQ%NpmBeey&y+K|+cfk?!A+I}cy7W7B4kbQzKKC{3a2 z#PA6YTu#$;l;#B7b06~O_ApGYg4HV_r>7;rBvLZ1;y9s@H?j{*0h z$#A*^RCo+f5{e^_0r%xHiaZ8p%9W8W?#AS153Cm1gvY?O;Jh>K9s?d9?ebADc?|Hl zyv5(+mvQ7VFtfm8z*GFBC|Y<7kP<*7vE(n2Nw~+rZ;_nz2LcrH-c$OjEQ=bE z_ZaX5NIQ+jk;lMH=`r95HjvAv@ECA8$w)WT^c(P0kUz-#{OpNhKt@S1r1i*YfOfc*Z^@ zlat@TpYTjuWJzk~xDkuV`we);of28dZ(t@7Hu()`t7v&dC%NCiA{fkxkas034=x{9my_>BB>-aC2@Ik8=X29P|+y5`ZA?AOl0pE4m zFVMi80pE3S8qj@LgXbAQ|xKKBb%i|L+mV8SqEtZe1F+ zco`J|)wgNDA9d{-4uM(bhj^euimt{F4EV2D!_bFjtYMfq{$LH~4fqGBpVEMTke*Eg z{-YES27C?|27C^c2K)h}$Q$rIH-JiW4Kl6o-ujyW_Wm62`q_@rKIF|=-+g|C3LwRr z?ban$`8Xgxjs}zA+M9 zXnprxBqN4f-+kj`RDt!~S1sWd>$`7)QcpXJ{0m2XHHx_ZCU1TBO_GSrTi<t&@4ndzAK~HFcVE4d;$vjBzWW-KOL?PA>$`7`vXlez)^{9pPB@Z{bkBM# z6fYbh13gV|et{8lU&`9{(|t=iZjJ1~#gPv8WpXA^1Y~eZ>u}E(Kxd)ZomKul%5ynW z_${U#hf*>YZQ(x-cMGh}7PC9EnBCd9DI6(wvpcI6P}A(r#tVM}^GYK&fl4p9(uhqI z17$V4vs!A5`-rsx((KOcW_LD?5)ogMW_LFII~-t|-Pw$%c-Xwsh|LsXGP_f2T~6vI zF1?~uHnTgMO)$@|@sk^ug|J~GObn1SOE5zfVu~LH@i5Hp0fZ^Ol$a^K-(r#k@B|3Y zK{!|70Y_OE!soZLdkU@Wo^81iw%#P<*-qtfD?7bCI@f~tu(Er0P*dEvn8$XLkjG|a z_w1&k2*J|I?%AX8LCjm(J#AEku(DI)vX8+CD}+&LW%rC=W%uke3l7#*j9FCdxFe?3W@DRl+NPmAwn$ zVODmJw6c4idx_>J$|QY~=XsiNb}PH*1;Iv!TiHD?QdMPM>_4nlc8|@1LRe}gotBUsrzuZoBft?ZuH zMC1rocF)g5`2|*X&+8YVkt12zJwF#2>{fQqFJ|)eb}PH*mt+SXc9W3j*O&3cb}PH* zH=>ity z-E-O;$Nc`w;W zNjTnj!RPyj6)|V7Yvgft!=>3tWT8x*=2+gk;T za3lCop)pu6RhuzbfSl&r8u%Rznohl;b=2}22CZEH?Y3b-Ke+vds?+v9f)=`*RHn;G zjqvV(b@p|PC=9a|YbnY1%{Jr>vt|=4hFJl!7-j{)YM2!ei(ys(tcFj-o7-j_!_n8pxwCC!9O3$Z&${f$Ydj3U( zb2QTADE}?OZlIVcPHCuhPHyDm=%{E1+&M)Imd#M>tP{YTq1HK-%Hf9Ef3sHjt|LH& zJEu{#-Ug^@KTCBvrJ>e2(^l0iS(PI|shqP%A$|Fa__-ayfYX^X)H)kQN=HQg})H)Y$=P=V!>%8_>gbOUS&Lvb#&Qj}K zN{A7bTFOn4e1^kPOSx$nco>%2`w=GG=cF}iuru^3Ko`A^IBp*y9k4j=UqPC=Z=c5P z6j1Ds_qDM8039BA&yy>H}DD z&Z0_X0>^~WHh~v0p%w%ROT_pn(5Xz|qOQRviE!j2>)-;?Z zhM8zHO=itFdVofOzpYByB0%>Xa7^4>iI&m6ex10U1`7z<^QYgr*_U%|x?8mA&$3N- z+uC%u*(Pp;;@c4#@(IEwdG|CvTBYMYwEW6zuaGaZ_%!W$HRI5MapJK4z0?R?T{5n% z9T(Z$P6TV*cVJxGeuwfIQdww5*MVFI@8{Y}BSwJDbbgxya9;bsI9OxI^d8#@)rIm| zuF%xF{#wq=2>XaX+H+K%_LktSQ%v`#972vR%$7|58gYm=~v zz9PB|fH;jS!_EmD1+NHNVB=sO9uUvl#?ehLg92|LlIC2X&4GSkOSxOK>}Ou)sCT50uREq|p!6IP$v0;>;OcpS(@Bw2lGO{))E^f43$sIdA_5{e_M z54&7Ok=3WxZuRjzaKFeVtUh!DZ!OLE{0lXTd?ao_>Qh@_^(iVo zBZ?MQ9}-GM5=;IPnS@(?s$swspA?n)$htpDTThM1TYZWGq%8rQtUk5U z>QfZFNhGFoqAn*Xhii#2=(K221rZH0kkzL)XZ6W}$?8*^v-%WO5~(6JS$zmhR-YV@ zTYX+aRn#?8Bo|$jtse7?Xb89Z{0E+Ciz2#LExMQAb>JniW8aj?$?7u$MtTy_B=a`M zEibu}eY9xYSn@L%rIFRAHgEO0j&yU<>azzaNCJ>@Uae{MaZcPQ^3rKh6G~PeXALDs zcCz|-zJo->;du6Sj!AjTPSHb@UztR+Nt_7v4uF^ek+vRRh9_`2X`z`k{J7_xzZc1Q z0R<;L?;?(*D31G31VmUEL7mDi>m80y{n5>?!*qSW7NUK7Hn#2Fb|Drb_sP9zmNo&D zID&-;Ru%Jg?#@Yvk#OWQpFA0VyM=Sgk15sv>?=OrMU`lR`HGJvz~y;NNKS*F>pXxI z%-QW)N3S$=IJ+r~Es(?gSv>q1r7?Pd>#INu%HD!2@aSD2-CHQB<=r4u8N&8=gAmZ; z9^gsF0YGamtqh)-q5+dB5#EW5dnG)x1ZWySd*B2E$ZYD5 zI%$@}{T3c5nj;t5_G^|byBe?m{xiV7J+v%>1`my@_w&=wdmJvmA_^1lGT)865V+~y zRnGT@P+0JHoO3vFDpx?lSss4V25>=FP)7K8M91z{yjoAhRLGc8OANUOxGH5t&=SEb zsge<+c?7tUENQfakITV%@-Y%Tk%RYaXg6!VNJdN+>2XhrzDpK0PDV}3=iy~lOZY7R zy6qcw-%RfvbWKo}LfZ(tl^?Hr-2h)*SB*k1yn_-Hc*N-L*y(Uhl8C%Sq84v;nJPi^ z{q+7d^Y!(v>B^;im=~cqeK)-*Pv4F*XDf#}@m=L#*WR|_CcGI6a}8py!&R@m&SS3e z<8@a%ck?#|yBd@mcoP=;*AZPhTyvBy9B?galNskLALTVI^UHU)yRKHAENBLe>b#T!-sg30W^7^Bk_6-3n-;SA@Glvad0}e5W~zUap+MQc89!?>iv9 z?c(hRquB?FXMqaYCB%e^^g)Z16ADKmJkxSpjjZ!KOzls)Y!+RU|I8+}c1kD$} zgKdK9=e%SRrZ6V??hV@=YO#O>U3+4fcAGe?M8HP7K&D&phD%CUDq!PW{9UYjIyUTb zsAU2+k(VYwwQKjzji^3wm=E(b*Dl;hq6S51hA1S~8jU&B3Xx+LFGPSU1*p-5 z+h~A#T%x8{?d9dnb*3ZP%V#~PmCaDTxX zHjVg2!MqW_Xbi`JFya@D|1ob?)5VUW*&I$r{Gw(KP6l}+zWXoM3Z^-LaHw5EjFt;zk)oPU5a^ znteHR5|nCpf5HkaDYSn2D)G8LB>g;oOTUgErHo#u%YPi+F%X?C)=%F>u1#0(-GyuJ z@QSr@&mtY+-FoQQS1q7U*RE^mzB}J|s-BiA@j@5h1S%cYPnR%NuAr&wns%z7ggv851>-!wOX_SZ>BCVgk>GyL0+OUG|7xv9K#KX)b4jubu zim(serq&iYshdU4>6FT5{q)TynEN<>a(G?naKC5`EBP; zV7zouGw_mk|1BE07&l(J>4|X2yM&FXI{?56q~~+L(hqd8a3WU{`IX8;VljB5^)n`95&UK$U8;k z#9T&)|1N=+$vF_e6U%?Mz~8idF%JJdBI&F=Or-skNZSaG8s#|o^h(}`xvo8%KMr9N z!*MT>12Dsw{<2tmI*ns~tn~+%;FWpp5jw%(0o1%J5gjPA+w;)Vi z63kWLU2{|rj{Wx&_A7sg6!d}-GG6)(7nV^SYd*#;PBBC=1;$H%H&LcEUbaa4@zUQf2lKgJkSdi)>M;NFkMnU`TbNwh|7!qmqd1ltna6Lc@0jgPYlJ&Vt^-$7Q8~m!FcH+6&xktQ{yD1A>*Zq z4RN8He?Y*$p%nj`@Ha@KO2$hU-}mPburxWy>s_IhyUjy!#^u7(qqyF z2S)?^zxWYP|B~XuRs9ei1!jIp;tClrCAP&z-v8^9Jn^7LlV_c%z~TRmC>X{|H&ssK z#0MCwB^6GwW|;ElDDYi}JBu)VdHlQJB}5S_X+&TPbC>IzMWQ-j;T?{RY{OxOilkrjv>YKmh!Fz%(bI{)s-AM%Hfbjgh zWQYG>MO;r%lFaY+@=-k;6t&Q}{QhlT;4=`o_U&00-Mtehd;D*Ud@x?Rsd{QJpI$It z7CGMn0^F2~5^+paI@}JZ6LVpk@zVd!e;`BE50T*8psewl|1!ld*x!65h9WR!{F2Ca zfnUjiZc(VMv>|BSL0~Sb`WGlv35=B@#~$q8HuATo`xnZX5Bs@52)0L24*wzv|A?O# zypCQg@4sB3=D=8)2jZ?|q9=#{3gs0Zcbmga4@A+tlfcEB2E;^&^jS8i*i zSDg7*NcbJRRKWs1Bw?M3!~>s!4*zu$jw8Z+et%dIQ}r%09S&vsKOz&|qxj)eMz3i1 zU$0P?$XMwIE84Ifd$G-!?;MLO6&E*Jz*y;~ryOcZIBJR=?n*!jX*@jA5n=xg%AXML zOCsT;z~g9dg-h(Wy_M8JVy7E-;q{}NaEG+FN`O>sF2t*Ny`u$}6}t)V7!iWjK<*~I zV+F)lTmk;-y-0*gi+vOtCqh9-1=Z}WCYy>cNX8ZfcX=oB9hA3*Ak++V2j#65kY+L8 z9NtNyoK3t|hj+3F#vmg=Y3=Y%5#enP_hgim!%>r?g6i?sJ%wt=Z9tTQ2}s&5X}1|e z`m!v(Lmz;lLYzGqOM5)cc>_ zJ){UiB3kM&;g3r=wZ|55L`G2gwurA2uG}8jl5)fAlq5f4HK2q+kdGL{F2dfVb8gl_ z7zB6=Y$bP6GJXaN09?Sofd||8aY>G3erXGh8!=#Pg^HY{X`1*8S^B2dJvWQuKd<~0 zy`%D{{{i<6qmCL(mYuk~-Jv`{$@%F<=((U&GXeZ~;}>Y$sR_h&c%5J5w+Nul>Rr55 zUwT8d3YF8QzQ{=gJ@FpcJoqs&(CwC;;;7Z*TvI^}AjR)bs1f|2*kfF+fFqHdQXZqM zuo%+0GyxDzVAbM~;I~EU_2P8jcSPhSOa*@EM~3;SI{Cb<`lfCCqTcTk4(P~Jk&}cn z_k*a28Y@|L_3|BUOZZ_P|NV%;s}E>o0VF-TQcOz>>@)lr{*UTZPqxcGW@*%^QV$E$^TTQp@8gP@z%CxA0479wKcX2#YLdAX=HJgAkLg7$vXeQ;eFo1Y^ofp* zU=AuCJ1CRG4CAhX9fTG^PIx7bkuG&V*3Ska%uSW`6NF-Y^4L^>u ziPwp|h325L8cL4rWDbJPLn(#6xlEbD0$vS1-k2Vh4vk&vz0A7=6GNNq(2Bj@1z3@s zcx2*nREfh2h>QMEDtACp0$wj=LQDL){Fh+Qvz+n@2bB`wrK8QF^q|Z>YDs`{RG6Iu`sXFBu&TMayy;ok!v?MUsM_GL482ZgI z9I?&T*1ZqHAp*0LjvOqH=va|i?r_q{(*_N$-)v^F+02rW`&w%6YZ=Y*ayym+l(UdF zg1lU;uNC>kVhk&-07BV+jv#aLSm#xK)cM@P%rd*g%r1HC^j&19Z?8a^FOM?6eYO?b zQTG2og6!S<&zTSUZ{Z*~3x;9N5uo3W&0>Mgk~}s`O$sP8xmLO0S|-~WCD{(L$Z9|> zvJ#hwtCUTaNvmWm1wmS)Wlqci>>Djf5jR#gUe1q;WV?9MaduMA^P6fAyKD*(=J-6N zQg8x-me`4Tc9&;~H6zUhTw7r-6I9M5D#zp(lkIIWS9PYdIKy73S=US}IFF23RA)PKmj9QHCuT4i2H4&`_#uUE`f(puDrowoM${jCym!o2q!$29TEDa2(H zbB4>wms`P#&)5GFd;d%A{V%g;GYQ4Adi?hn^+L%iFDp^kE!@kKA5dEVitKI6ld;#{ zB_D#8Iq$dkusBb;G~gvBX>rzvG5;SJ>YQx&-b0;}C3F1Sq;O1OE)a-GP;8PMdSjgr zBu(Zd-7=H2mz$hDAUJ!_!kP!V`-oEXX9&>;>g1Z~91F)yA^(X=h5-g2ux#L&M>4%(l~Jy`452^05oK zph}Ec4vqjc@ll0XPYjvH8VwdPb7aySU_@qR;m{W>{NqHb;c`v}ID4T5{Xgt}^?`L3}asLd6C0Xrf>+k0c6K3Y$b-zgVSi*2k zycO$t>h$IN&KaiJ_hNIrOU$MBee}WF^igtN%e{~*&zy*r(Sk3Bmx3cK_|$O0&a8MX zWc~Ku`b{JjGJQK1O#GGR#u?Z$fdwmKK7vTgLXiQJ!3u^dcsv+bh3qIMBK54&$`-3E z?XXetXgk@`mYkE6m^x$aRD6-0ir>fhnCQ6x8q4>)kjm_6D5N*pwh<=1t;00!CI8~n z-riwTNR#ZCWEKlLtRsX%&4I(+ZlXxyw<99ON}lgeR6Eax-YgK)&Q9%KJGBp2I24F$ zW*`0&Va+5t$fx;PZRY)(cKL56vgA=jTXoBnFEQm3XfKG>jbW zg}No#U>|BJ6|;1VY>b?xcHzZ}-8_AbvlD)`oRpH%X&)+kM+7~=T8247T%-{^%>?ni zsN8EyLHXk;~q$JJC{f8h+n>>47)v(DS z2;1+6EC0<{)NndA39-~9SV)=FymC7&z8}`~|AtPjglCRNA!D+p$&c&=J2$iLwroOu zjh%>VNyg;LvAkr@)nj7htyE^CS+j9SVOhltLvYTZE z{O=_@lkTzUG065Z_|2HxMMLlM){2}iPI4M zOsTri5GYqFDLWSG;_U-u)ybRGa2}>(GN<=cYN2rk9U??oB9G8Q{ z*q9kCQjnEA3K@-cNNJ26c(nn}+Wm!Od*$CDOkzB^ppS5U!=Bw69S!=P-3_ffHg3~5 zZEm=!73Vvw5L=*u9CLW=w$_^(q8m3hw9dKY;@LQe5!=u<8_pg2-iEpLP4&%Yd3eJf zd>Xgo#10PWp<2A=7l)f$ckZaiQ3@X1v0)pYHU3NHN|xNV~M6{IE-)80|^$; z)!KkMC74Qwo7n=r{l*4%h_y88jhf!3`PFGklVH~BZ4qR?|L0HY9 z&4y;jrVX370~H)ImL8jr=n*x&?aNN4l`5?RMl>BsCFX1$Q0s!xV-dE1Kb%M#-#W|; z-m15GtG@A{wCX~~?)+rHsl()H=_!HNPj`Ba=Rd(Rx36_ki9}cK<1AQ!-27N1v#_9XW|74$W`S;(T+xI<)ZU>d9 z!8&=j)!GXAH^}=h!$#B|VZng`BxKn#j)q<2v*DmuSDt5@^U2;&Ur!(IgG!U%oTn0w zD4MSucI>f6o`(h4X!!z5-=*KQt##x13*Q0HIecw3zCVU@feoS4$+l*^XFkEkfEF?A z5=VmEO~S@(H6KCaqN9TUfceE75cK!p$PQhvfRLC4IDCR<_~A%yCZJ*>VK^le@t853 zvEk9=aRMrM9MZP#+}O5lw!H!3`g73+>Mx$)LWP%YNx4w}eSTQ(6 zJW`7}??uaKroP?-lKq)O>FbEAlPhl3JP#U8Es4au)>H=klhKblEr4HxUDop*&2zN9 zyV)Ru~w4b`jD1N7&Qp_I(d^>`m*eA)3en$Wp8(-OoPHo6*O*QVI2g6;alU2DYg4 zs?>#*Q5K^5T2LJeu{dwp@MiU~AxahIjS5nu9z>(EXjGK73=Iv1n__Wx=|fG2k|{&S zyiGMFbzS|85>We;O4g@Nt3crk)kT%+bwPD;5WnBWQni59;0hWl^8-|-{Jky^T{Co; z-Iz(ALNouMP79u5E$wWX==@-7_EaD18A|o=uGdo6lR!&Fbg+*l1|*o{_tazQ4iuY7 z$5~DE*fF5Jse&*QWetg#u3jt=kyINh)cGSKq9XC_y-C)NeqSC)vIe!WLR}c>Y2BL0 zq!ax>+{G2@j6fpM)JlLpuqp{?ejw2kXM;m5pzS~MDBBTX=|m)vWer0KwW+FUUmA3g zV0}?mGk{VT1%|XX)}|Go47c8rP69EFJWj{oAY$3`>Z0I~ww2XuV@`&*#dH>mMcFwv z7*(eP(rP_$XZ|@B6T#zb0Kj9cU!4_5#wD=Zn6p<0En5EdSf26tzJi6RkzMn%vsx9t zmFz4H>lE<`#@S&V(#Aff1Ap3%qgutu@Yb7IG=|xs16b$(TDW=ZGIoqDOf)8%LXG%s zT;9k!LyasMYFrU&>Q!e2G52EWJ{G3|89LnBj^SXvnwOo7u-*j!suu@=y#VWG-56+m z0FJRhg2m-CL?Qm1WwA7UdJwKvw+ADTochx0#$bdsqz|k06>C{6*$7-x{9i!bdQ^|U z{7|^5MQsX%n-0ZTZxqc~9iBr%Rx4}3EMQ%ca5$2}luPx8oAyOBgX$%Lme!csT*p&(1xV1~LOzzps04&a!c_Ad@~iqfke>m7QGrW)&1>ne`1n*PHt zq|=yLHJGdFHGxBix*uvi)~U{@V4Z-mPp}ru)ezE$jvb4Fc|_y=YBQ2O)WmASP30|5DAv zCdOL2w?;Dq14avYhdQkk$PKF(gB9@4T=N0J3wsVPZ%3O`AiK2sp@2HSgjFS4dpp$D zp!!7xccR745wEd)SYukfrAph!(43Qqh-0$NEe6x?1ve~*oWZ#0b@D$Ey=-!VRi@1E zCS(%ZvfnV0EI>dUW8a7ygVt@u;Y}%qnadPyDe{XfLgs>KdBi%6LN?um6%MN!Uz@Q< zpcR&{#ss5%1J-L=@&4nqlZ}b4U~`^}vdD4F6V{hvO=?4BR&A*2X^utJ89^?3lgqK{ z`2G2DAq9-#64wYaQ9)WeUPj(byuV%9$Mwzn<}Em&ED)HJR)D9xaATKfOjHVF3Bf}m zY5i{@76g<-(e11zt}Y*&8R$&heF((-feJPz^La3kS-~V0pYFuncNs%NzdtdwH)af^ zn(u7KRH`*Vk)b4e>CX%+ND|ksDa!AFM%B@Ceq_EU8Hr770S@yL?g;osr#I%YVfNHc zG&vlRl(u<0NCfdjBKQ0&dS9x<+OapmqJu>%-qO4!tTqNY#4!4>21eO^&qSMJtXA)1 z$=2?K<&l%mn2V{$O(^oc#rF#$A1ik3w3FZ7U+5;V0FCzI%qd!sD39y+znh>5e%|7S zN$pZt$-SPLzHSj%SkA8n$&V>lnyO6$82dz;(LZOx)T@K~;yLuIEnTX$u=-?-%|U5e(UH{98Yadm1yU0I3uP@YX`B}ZBK7~pAjHZ4B}d#A@x zo68_htM%9d1hjTqt9@9iQ36kg%;E#_3Cof?yYwMVr$l~+b*h4=K~|KdHk3hGLgny} z)&{i}-mev~TzXREkFZVS%T7uU`#~>U}31kxSfiGi0 z6+-4iiA22b8!teNVtqWdZWspTN+jCpkNn3$MknI<6HBHcj6g`_|D$--wUH)?fR=gu zX@+=E{F3H93GSLS)VeaQ^+9dyNxokLM5}o4PJLhYbYC{Zdd{KWQ-bJNPhTA6q}cDC z);icx&AW=lOvsDu8P=bMxD?JpHeyXOi#opolG;?rmgWyiP^Xrt)2i~I+*1&x=^6Iq z)7teY{sXK&O~nE4jn)?M6cBl1*dNseAQ)%VD+Bl#ztPqo)n=Vk*9KGA{(J<#L+z1x zxEJcWy+<_fvyo)jU?1yYJw}4{X4yG|)p88?^z{yf*F?hcNOFx9Y)gX@W-07kZ>n7n zC-uH;NY5g*J^+Dxa$rq@af+-9tU*s^2e1{Z3v{iCqsEIX*aD2+06V9Cq6(2SMPz6V zH^D>VcI{Q6Td8E zU?6%^hgejPf$C9Ez5h{NPleb}^tsd;YV)DQP)a`$M}t`{%EKRIr$;Qei-Yu#VBs`= zDT;$BN$9xVo&Vb#O2-L;3_a}6EH#Lzsq9=IvS5VHu|S+>rf7Wiw7R$giqpz&RC*Xm z5C)JQs7QR@cg=M))|e0D>Q&BoJ_K?uBX${3}#9O6R-#TDXy*vuwQ*m+lh^3@MJ8d zA18kBk${fPleR{ks%X>B>ezpruf*txC90E3sK^Hki;SYkX^K{NRx3V|WT!wBvxBGA zc>!#9gV?@q2+*z}6iS1mghD;kl9iRbJ;6{k#-oTMVJGy_0NUNB-K5S?w3?GNy=Mfl ztDv-$Ac$R25*&rC4q^YL&KSdt)Ic1nYjt6To?=NzC%tSSbWEpx0QmGJ6`1Iq$JEt< zAw1}8QeSEynqp_5=13=qJI>>L4_pxy;CCMO%tlJBgJvWU(bX%1#1iqTgI*mKmmExJ z#dmaOvFxzt^l(CtV9$?=R)qDv5e%E5M|x8rq404%9>Hu+61RvR(<8JizapsX2Ids> zyHhJ7hM_Je{;aD@1K6bUrz-;8nrD^fZ`(?29{cCIAR8L$W1X)KMbHFd5BwK9$G%sg z5J~gtR79o~~!2;?p)|bpO z-G~fhqN** z><5i+^`k58t7GTbaVQKhxdx6|KBx3s*0O~ReBx5ptm|Nsn)eMh(2v4SsWX8WDXyzz2#hq?#T0=EH0?v@I-(L1_d_fmCxEnNRE5PtcbqsV|r( zjr8dr(t<}IUa`5m@>ASkAH;l ze~N1?L_&;b2GT33BPT^)$uNoN5HqAhsV!3}U^9s9`9T>Xtxk09*88Hdniu zM87fY4s)!~+(upd#wXgepJ}Wfnq@g&xlt=S(#@X3B!C7R(+O19gHM9>>ml?d8jbd( zfesQ8SnaEzg`Yvgyz)V{$BA)0R3I(!pa5lrk5)P)Vu9U7qwEd|+u(CYJ~fchON zDzljpQ}luO!Vog3!i;)tfa#$K6%-4xLHxyc8QK%#C=RhG9z%_TP$MF}*0B^q?;xHa z45a$d98SkzB1jcO5%_EkePJVnHi*2&DI?1Jg>@(t=|Qh}Kf|%mY8J+JWHO*^LGHVn zgHbM8w>;QK_4iX7X>!!C?X>q|#&5A+W?6)O<00xE`T~PQYADnQrO`Ei#^TAY`W{WK z>(m(~U|dL%!I$^X{E4blgVe8x8l@(LV^|D;ZF)ot`43?LpXXWcHIGn}Kz40QwUP&E zLxTuv7+6yZt3&*8W;|wo?qmjiKrU|~6|I|CFFK(HgsM@DBKt5T)ab3DIW+M@A??{) zmukn=lZ5Xs47PfSOxFi&9Nr4?p&Q-A9&8oYccfV&N+i~>47|GanD)h6mTGT0S^bdq z$fzTS_Cga)yFgfAXp)nny9XcAt3v;aHLQk(F~#UnE29NU+jAt9Jd;ZP7SDj5A`4SL z6q3!50Fq}Imc+MDBZ^`ppgg3&--hJr_z=`k#cUl((Nu22V4GPZF@X&BudRJ?8vYui z$I!~_*|NSgY35l7+qZ#Kx3NFHcL0b>cgC^TF<2m)O&D7HL9LjT8(j&kRfo=DVb8{( z^QNUV8y`9cKD_@Z)VHgEkLb|6L#@lynN`_TB-MohsAey+F0e^j(jcd%?n*_M^@1#- z@l+@oK}D={8H>dl)8U4mFi~(hm{z!fOiWtQD(}-ewqOowj~rM9RXYTWP&}^Qr3C&D`y73p+KtZNTM1Ru*emwv_8v;^ePdyX@#{&o+LE zJ%fJ7SWC7w5&|QEnljYegMN3i+9;c?&aHr2kF}gyu^Jn(d%n#2P7j3N`V~qK#a?F9 zC?Aj#WuL|Vus$#p?Hh_1p~lc+c6kEDVvXv72kbDDqE^#Dro=zO%kY1ILNJF| zQ^8Gj{AZA*q*`dU|52^Do?>a{!RQ0W3j9E>i?K|1HlJ!ptExYYZthF45I9PZb`WSe z$SDXpJQw01YJ?d*(i5^kM+N-@{+}Z$UOWy9@I>b*tt}O$vqtfF^G8O?Tqe{SghmJ- z#QYJ+n>m^`f;A~@pRmT5sN{{$qw=_XOk>0P1lU9TM=(=jL4brl^s%NBTq=Ur>{38! zL)QR1@#H`@l>+EQCrsreE4Gv90w`8s}JJF)E++5X*$&KCC zBHLQHf_Qx1A2fcyS*oq zfpKa*i_mlGYPhQi%@s|l&@z;Ty+U+rDx~R9>l8l=bp>`IL8|w3XAFA)Y$`2Y97EJTKB-y{}NB~S{G0SQL z=Td42TT^hH7UFe4?aWHVq`K6r5iVh$V~DzrqMl~UQY3VOefF}39wUZHwjmJ1rW@MC zx{`U(MykFp5dIf!>lSSiJ8C4_v5PeHE@<`HKmSt-n*0SpUIGXxkm~Q&dx3bp>zl{* z@YC28Q`x~T))2#RY5SpNWIMEqwjs#T9j&}G$B6EL0TJi{K|uL43)I1LAsmQ5o;rj- z*hO!Nl7~b0@l*oqR9q`-18bz+Kdm#^d}B#kmJ2gzG_aPoXQ_y+w)LPkmX)VCm8A?U z=mGX|_As;raAHG#ZQfC|39H>h55YKGo>DKPQd7Vs{&3Z7UEn3QKMl4@Lz;@jzj-=2 zfPXqEKY`*V)_80PQqi6OcEfep4YPw0ijNP;l~CJv65RbDcp%dO#F9u0()!e6aBND% zVlP9!fCYE(99kPOvdI}QV#es|2LnTCuvdx42*mgrw4Dr)6EzPMIoO5;covLCjPw!c z%IsA{>}$@60)mgR7O2@MMs330ga&an+EuSMkHxBDHl}eER#xgsOW?b(cPG-?-lIqfm4%V*obeN4GMq%d z4M!C!0s;z6Tv6Wj>a?-w7;S_wK`~2bSEw^9`a!5v*>_R31-3 z0#+A8!hsE;tY_%))CxXK;EJI*7TE8zIRDZ19U)_IGgJ#h2DHG*=sRjNcE$lV8lAyj z2m-LSZ%Yb&W(%;M5NKIQXUig_%?Ssf+X5tD7~Sg1fO;wDL)*_*{Xz&(na8y)OSNjY zD)#G#6G>tlO(CuHNH?)g@Xck(SHVAm=>ceppo5n)ER8rK=L9B_@zuk`EFj<21_f5L zEJ`|I->M|m{}y(xE6Uf)bVAoQ9?@#fLg8@mVRD@y*2sT*AduE#oS^K0&t|y^2foe2p7{39nXIN{J4d}c#XYrJLEg5QJsifYR)UH{o zEx>NE0lFgZgP#NbpjrgtvD9<^N{rxYF+eaN+@V#}r<;%v#11?|5lVkn3;LQCeEDI_ z>z+hrC=rgpWrTdg+7npq8i&sC)cb=dA2tq1f1Q~jZEro8))7t;Yaz6vQ+$H_k*BT0 z0C5(3y;?sOlb&cOGKlWyr(4sh`DnV{h_6@L>IgEMDGI- zbh_9L><~CHWJVT^V6Nde(MgMIlBPL)YPvApW|y#s%1i=>_GH>Z$1$ok>R z^Oh~oYADQYfHj#u_6l0p`K@f^eP&(zt!(mtFi)_s>9YQj;Ew@k!|@x|_Nif*QO{~S z)eQ>Pnj<%Y%4rlDqw3{BGX4@rg<}jJFxMwl*v2NTYwcS!-&t)vjm{)?WKAwNwk9Jd zy_v*}|MLlUL^}*+T`vgmt!!5&`OBwu>`$N_hsvgbYa#)t~?Ih7)T0~gCIWgK9SMzngn_f-xg`mgK!-aw!2XVXfn&!CO9GMF{%1)}6sXgatgGvW3-Rh?btr%}&7@)oBp&<#z2Q$;zx)==iG!~W! zDuV27O#(Om1gF{+LJ$5)$j-F*O_h7*vUTM~p_(;%8V|nSP6(pM^neeoB zGaO8-)Ml8B(Jm?UWrr}f>@MgrLF#OvJ*>{Eq{IlNSqt?foA@qtL0`wyDRlrH;bQh_ z79)#y5UT16$@dd8pXPbP+Swf8z9$|e8VIM+g;U(>Zl2o2_z?^e~wUg8Y@pc+sVEPo%((VoDj5U1fXk=P@`cu zz;X^BirvlN%w)c;U|UF`MjD_7*4GCa94h({xImxw@ugaT)eo}X)ES-iw0E-0SYr}X zjvOjabe zyMa?!Yp~GB8oH1~^SuFoOK>HW(HIywgE)iz_!z1V!aH|={SPS7DK!$nS~+k!nPhud zJYjql>|t0!v`{2F^Humu|M%mA_TntTXHuu3D*Y-fdzPt1bM9-g)M@LK!!jR~Qw}q( zeMl>RFr{my;JxbgRq;PySm+D)W<4T_^)K*8C$j!>#MUELU30IyXX5fvasc|mZVnEh=?%= zWyV9RvxA0_A|8Vnh#&A_FKdEF6BMuQhx=)j>&GS!Q)GD+tu3@MB&tba_ZsgYr46(lj2 zZ)dL_iR#dHu)feaSiXATD8drjt~PD|Np0*|lpTU49mrEJtxzwkg!YLDZvcfu@WNz3 z#&Aeo>Bn|W`?$Ii9>?qsn3FT87hF`Pk`*i?;c|c-4mFBOZswItK!yzWg`qsdGQkWm zkjBOhqYHg4{e`~)bg*EXfe?ioCA?AlXq#4l5_M=xw`d=vQqNl;DT$CdNQL&wLN7zx zvJm^IKn`ovR<>ykyuc+}v`bN7cH{!7J;*BBD2qd@WhG{TLHG?77AVkEh^G(=j8O~q zHRK-E-WZGZh4g0rtcBaO8N5v^wrKOrPQor>NA>$E;tc3*fjOj&d`Jn4`t~V z?z!bz?USRPJw?dHe0*H|fj?YjR{P9;wMEhXI1089I!F*?J%i@wI4B*{1`H#KT_+sh zj7Ta%+Bc|3KLDSEea~vXXZs0oWuR|BKcwsXuxm{r4`y2xI1AQIqDjbgu&4AUwIX%0 z0#(8);t7cxSqNJpIIU^=5t8h#XaBbDJ3OX6qwB}PT3|Baye0d30-Pj~;x>n4cvPoV z<`U}bv#cYHAqZnB!H)kR{n?K7W;|P(Jxz-NS)nid+laLCTb0p|i+UnBdqhLi5@)l% zhXpbFxh%XXk3&$I8T=fc*c{?9SUG~3OkAA-r=ZH?U3n06V%Q#6bmqwf3SyGJr_p+& z?Oh626>NhbJqOvdoI@BUJ>?RHAkTw8z*4hQT|)`)SPLgYPPdSg7DAv$VWkN=2O z8BusWBv}H7))Mef#VQD4Usn7)Ou<}d37y)uRXE+W6pj*@GqXuajqK5A4}$9+PZky7TUTH&mq|#eCH2ftB^Y)>@lqB#EKGHWgFoA2$D|4vcUTt^rgeenDwT-0gH7qiS9|(lWvIv-7@+au z0axO4iRQaI+0S)783tkqXWTCUgg%go>Bormr&4r~ zFARqskTPU292PSmh|_q@2x>8G^~XYm40R)Tb(Uv?2PaNv22-?i@T|h~9P{~bufdk6 z4P&y|-aa_<0rzay!^c50^bE7@?8;v9Jn!!%Ppuc&(D96+pMViU&%jY|D5F2ZDmpOn zFt6ZmXh6|;W431_$++ID!$eLB>x4J+NkuV$Q^_f6*%Jv2LN?y8EM9$FE3+h z&Hsk3wXI@(EmCV`OBu{}Q%W((X|vJ*UzL~PHiH&N+0!ig%hX!11(+qK2Qq6| z!)oM2HQ))C!=L|UHieA!h5->0QyI#0EVZDMB+J0I1N{Rz%nwmA=p$0_+|fB0#+9qy z&=%A)FlQ=iT}3abD4d{XUmg^Ruy@ zM0@{%gW5Rp&);8@&Dy%@M7>)|hEdERTV_T!5Z)tecaE}ByWEovBbA_O*$IdgP zO*je@A9ReyR%02V?@#Gex_uB#cR{cp{sSQ>%NGYi4DDRi)Js7%G9IlCGr74-82 zPlaMBZ6}#$p2em)rCr;mUB>3?dp}192L1q50M4mK*=5*%V~FF7gsLdptTsc4$C*Ls zto;Z32YcfESvHHUfSm!Zu;dH^z`%!EuH^YTkD?e@ri7RSE^v1r$SQWu6 zSTgwobVnD45ehv577WNdo2itxuZhBN`1lnNF7{b(RfGQ^f&sPX_ z|KK>uLft9&W@G-G_k$MMKXaQ~&pma#rK!KCiyWtBRM8lw5m--+E)2xG6RltZfxd-@ zL13^!tJBJ0fI){@C`yy^vxn1%w$g47!uvosPD9gWBQM~@k?OeR{Kw%64ouk(X^nhd z&_Rcewrp=3egM!sxdQQEJG$2?Be-Yi@+SdawX@h;{gfTBp zN0Bf+x?s44_ddH}u6juj$9|e|?B}fUDHa;gI~w6?SOOCatll^}!c&q35pxUf;?w;9 zW_(JAeY&nfM^vpW1nWpUIr5{B?J^cdvo3XhfYM+Q1^>E#E)E4DjsL9Cx?pbWvY7E% zET=V*p6If4Dw>L>6S2fOb{Fm^&~84djXpbfD^jG5#yCr+)TzZ!8%>=9%ULFgjxHw; z)IbcX+P0{u^9S73?;TfC=!ZSqO7XFOpW?~EoT#;Fi?*jTQ7ldKgPAB?wbl958&=Z__v9hg+0+T2?<(d-2mP z9qb|QGyymjp}$uV&Ae&c%%StsGe-^4LJn#nP>~5D+aOl*z0l+yO*RdzfPmUHNS7=S z$jjOwETs~AqwR3HI>kb0KFb=1GK+CqAko?ifBrdTtfQr=gLo!7)zAZX6HHzVJl3t( zh;7!kQftC}@PfmS)((d#S$84qE-;SHSe%>|pnCQ{V|1Vl++#41h6V!!IFODXgFi%w ze03X0|1z(V8c+#=kkmTrd2CZy=tj99e-`CgIqPoDtp5W)BzlCZq?0~DChnWXWttVSYxT}iy9BDUh*fpH5@iUv~ zxc%&9?%+2Lf)Y!VxpSv`cdY`7s+6eyYCLVU$GS;gE;(z=>4(6Iiwxj{o5J~gy#r!g zmgJ{yT9D$n7NwIuWZfb2aZ?l*TJ+(6jgD)lussW7@oa(rL(~}R3u|NQb>c=K)v$K+ zmX>G}=KA=0c0~-6dm9;GUk34bIZ}mD5rea!9_zy- zZ5;a5Bj=#MP0>aMengj6z>R{^>dUD}N{opU!$~V!hMru81(m52L#h{J6~KX1)p5mz zj~mA#UgtJ^0Epry-vo39lzmVvX1ZAVHum|1R73W&SvqGE5~ z|NoqO=AIjZufFg1{k{v6=lMU+b9z6woC`5cJGkR=Ygz$sUUbow8!YfXCQ zW?h1tgLqc8%^Q7=n2LDaJM%9q=Ju(_(noJte2d;w@BBb|j=l@IUNVnwr;V$ z{GHPGGuzwOg~B5t;nV22vEi~2yky5vKAXQNNSK3ykIuBp9c(LJ@xkqOAi zc^589YkYL$UOjjHeHeGwqa(#8!?Vw0;Yej|?m~PaWA5TbH96eE!J8}6oL8elwDuNk zy;`^}HQJW{_&exQrOeCE<|}f+=a5h}?c3d8?PP^b+6LzOf9?9${N4BFIDEBU z^27avRj4vuzN`BK-gwSi=fCk~x~5uw0s(oQZcG}+&Gg{)bbc$syv&YQ*7E}q-kWDn zOB;R*3$WQ+_jrHazUmH^Jv2Y?2hVJ2gAL!scVChZK1i{o3FW<0tG5<&N3lchc zvvXdKUS=s?%);olbOmmzU-hQO-x`k(6@5K^`EzB<(wLay72G~MF5uh8 zcz_qrfS@D7gOUaQx`G|vz>;Fd_y_Q}6P6Wd5qo#QE_Umw9q{TX_IK9jbj5e~IG*Uf z%ka!(7fkJz>Ao{`$AX5gSXi}h$?tZ?@4tVgM{emcZd{jte=m9&%qXx5nS*x<@C_bB z4sVlVn;K7N4WEPg&!Qu+sKWC-IM=V$U}RuxZ}ab~%>UPR+H4sTR>=Ra>S`Fm@A}Y0 zv-tg?Mj`e1kM}*u5T*UV>K#{ZspS`Ob8;t;!jQ7K-r?T8PPt?K^fvUwX?_du0j zznV{IV$!0I89!cQs)MhL^~qt}!DpUwrH>VC=jX{ZX`` z?$~_6OC)F?r_5V5?^*17+>ITu^_c6Nj2FYoI-X?yu69u=to5Q(mf;C-tb59LYCXE+ z+|{i|?x4HjoeK_`AMw@V!PKEQ~nLi z3+_6X4@SP@>FSSX;#NN144sl&x`4sq4G|lF@k<=Q|AN#yEXbDTmVQ-JgT3$hcqfLD z+ka@Mo+7N2@2ASQVVGuHeuw3&x#aQ1<1bX{}3k&dtwViFfE0&s)WJrJp;S zZxSzQt-Ic{v|#(=W}H;J8V^$N>8bU2U85jZJ%9C;1?kxZdpxsxUfI$SGp)X7OM2`L zwF$jAxCN6^?!m$Y!`}$LU_N(!L7UkHQ>*7)QBa5H#h;m%c49GKLDYj%K2(DpX}ml&v9@-@>ZSM`!+hM5sqCB! z@OUzlxgO60Ur>;oU9k5v|8JWi-+oV^Wy^k-S?T|5w(m1#SEJ&e#OeH;Pw@aZzAdtP z)k*UAWcgcyzw=g=uE+DRC96yDJP&qzP!F-6ylC~()!*V_MC^i;UXk|%FH`@9C)?7K zk0V}eHeQrnjZH&*GX;%$^=iBaxdQF*fStbTwybXWS@UYXSb)}yG2>tJ_`2G*U0ZkS zyu5bvnt9J+`*bPBnZ;!LbQr$;qz&A>oZ0&I)_C|*AG2z~Cs?}U1~J~##dhcntR^-a z@)aJTA;iCeBzEtM@qF;t8(R0<361JHIA-GlEx7Dl-M-*EY_2^kH~>5vCo7TrI(G6r-8wYG#1PB8MQMxH=MH^)%E7qN9~07clBFojH_n^PW8#F z`AL^6^cgiX=_$I>^qN38H!qy?+$t-LSxg%EV$)kRk<#0R>o)5(YyBrb3 zcgGm%<%o)2w&oT_)!T)0;8Ge&*x6ob8FTQU$$`Gg?+gb zGiCi1dIt74Ch{4td$y6ITp zxPE$WADII0bTs*U z&{$603C!3071Uy^Xnj?A=d6CmPu35&{ zj*=bL;B^{~nA_>u3zj~MJ;uK1C-9Omy{lb}=k~tBhD6^s6f-=a2=tXKV3!$iBIg@#QAm9>bTh@NG=|c;D{# z{dkYB1Nss?lV<;vkdr@UOG~j*$hE$r6^2gqZQXSl7p1tdQ_^ZZ*6+x%-~8Y43SENl znHCk7snS)BZpF@5ogG{)c8ATW^C!!ys7!U-SP@TmS9PMgIO?CbF3M zW8H|f^ZInsDifr;R5CzdVO`_wF5gjY7_EnAJ-0yT5-6=J=3?t(HrSA?%; zoQ%&X|D%nI(eHdFq{pyJ_fT++|hnW{A@m2F7Xp{qwm*?NPzWm(iFI{=^#*#Q7- zeyasFr@p~AUoRAS!msAJ32>QTd2(GD1X}B1aB%CQ9c|*+ur(h5Z*ghKh~$^1Zq0{x ztc+v+i^|x!RT`6@rOUZReYl=E{-n}rZ_XpY;}j>Y;)1fvSDR1LE7I5U`FVL-yU)q3 z58_jF{Erc6|6O=@uP>@zzm79z%$SMK?RLjUknz42`?DT=q3mFMxo_9Sr4#311~vm9 zWx*Hl@vFrrFZ9uT{scFj@LGmm&!-`3-kgID75nbXt|-X(cn;jJ75uEZBY^{B5cywm zwenh>rQ0Yq3pKSPQ-q5LMhpk--&SAHdcgLDR(?6;eOr*f0D1csc-aM`~ckWq=*rq)&b*8`AW#YaO7L_<2%~p zFopviTlzuyJCK*PAa8q<(ucGl?+tlN{v;rG{n-p#VO%MH5b}~1rW{b3py?&FYm0=4=7Kc%4-&7Pms z=P@GI4bwpRkqhwQ;TGiOkn;c+YtOK0UvZ1lgU|(7`LG#<7cvKV@D%me-mdgbj=N)L z6nNHck2{rK(1KeVmp2wGJ+_6o9B_})hqoaA6XYpJZo^p$`BL;HHjXxbtbXzXN^d}+ zTfI$#)t|CN=}TJB+ca)is`Q>t8V4bbHVtaI(*JVeWaTe!MSk-NrH^*}vSGaSC=QZw z}EO}&gqXS{SnH+rp>ykcv9)OllOyAX4cL9&ni8?g*cZ#r}Sfv+~&_t z&nvywkq?y`VEQ!Hfv=%2aKf_TeD|`_0~~i&e&j1kAJu|92YGc1^0y&x-Ul+=&me!o zvA1cz?^UHIIdZqWc7F}|;^=G|&xHI$Ck?iaSU+EVQ|YFyl);dwKrooHLL zeyMkre%Y~i%lh^AP@Ycw*q*F^OWs#{u%ol`pCKRW$ZeViuT}aur(Fz~p)O?KXXA1C zI^=7!cv!a!)+@a07}hJ>rnc5^zJnjn#L=x1QX7s=0orPnE86+z)o@D*c}Zy*sX0e{Y5SgBIMi6j!F}dHBUIbYJ1P zvGUzMSNh8qz4o z-qCUI)+vU)d*4ERztfHocS)Pgs}~0r>b6cEvwhLsyF&`~k&eH|27NGfokkT#`e*Cc zaU%=wep2G7V6WT^0MJ|ys1zxbL4LOWWKxveU}#M-4{0(>P!pr z3G)l}TP@_*k+&7g_F;=uGljD=aNF5bn?+H(|wl~ z>d`I4v1wVMe$OVPUZ1d8_WyGdJJ@q&0&=cPl>eWtO zTlY4uH~d(r|K^12=EGpG2#?^0>9B5X*neqVq4&Ma{-X@rMS6%cRy8k|IbRp)R~`4( zUDdZm`Xfhf<81Tk*zb$2%y!zb^Q(NT(gSjl<`VyJMvt zhizEv3u5{jCtut$Ijbn9JMOS$p4u>H?-bKjPCK{q&7EUxN&s_U1ItJN5}lIey-a)riV7u*?1hfZ%j{i^2Ew-f!y6Qv3_;iFQ$)o?A>r? zLASn{&iYrse@y?^(b>E|<$##J#gW^*x9)y{{tZWO{*ytsQzPjKXR%|_jH=>FvB7%t^+K;F%fTfesH5lsjEVj0lQFz9Y@+}JX(Zr4Ho zo}+i;@z@bDeTJj6ejeR3rjK*-#+^Sh%nN(P^wCb9TfGhQu_I%8XUDxQ6S`el4!$mh*k2m7f9mzK(xZe)BOgeXC<{<3FHpOz-E|+dQ%EYWl@=x#P~tAAvmE zg8b0_Ez56){42-arhm?WSY&_8&GS13#`Gx1jg9j+kZ*G2&EvdbP)wii=xtcFgSQ^m zxkI91*>wI3@~a%bti1BrmgV0CsL&HqK8&?xw}91H+Ds z>Dm_D+z0t7PMNxHwjUAGmpX22dai9IxAER*WK2Ke*xPtp{kza-oqpfeZ|m>qv9ZXW ziFE0qc)sAkY65+M}9wpZRL6BeMj%sqkiQr=hGdKZ_Ul_6)}CC6DMnQ_MD`E>Ah9%bc;@v+F>nU(K%Qf!O+3iPLJEAqaOk7>dG%OO9r1^Koo$Miuh$h$$_ z=*XE540j>qm5$t&DRqUX#5AU|TcoWWN-`&bc5rc&3}e<0d#IyHf}{VvBsJ-z zZd+hpSlz#%yTlDA80Q$y3ANFF*1Gu=a(Dc3{W~qaWqNJ=euB<*XXOnOV>;o)!OCCU zio9gfmi;K>yL2n^A$74W_QPpE3-ado*C>At@;)uZXUF=Op4Ni=63E@UX5)WgLu`wE zWBOkY`TQ3A**+6(b2h&-kYDN4f9Chr>i(ywJqpUNhWt4v&#Zrm zb7Fd-Be!EnX^w#LmkZU)sL{`96r89T#l=Sa)B~jp@yfJ1hU>ikNQg#KFq{b7f5bJmjp?>d{B8Mtc01Zu`z_1Q z>dPL9>7=u_V(X&~@2aO_dM_uxY#u)V`Du=vZQQzP|8z|M-O*Y36OixZ#L>#%d?woO zwA2*R}F?^Ac)^U-w++hQ{MAvh+52D+L zUX1COUwKj(DL56wZ=HcBR#`JBDf7ETQJnq;V_x(SP z=~G)p{bK%5ci+aC-qpzmD}N61pB*{#hxX5W64QM4&z6zBe{A(_K8@-BIC{4)qWf<@ zkFFD1iZ|mhVIR-qBSTj^abVt1z5#N#9oc?}y3Lznc%>wapY`j&uVVT~$1f}2XLC#! zIeBBlIOuEaVK{P@S$x>&_>f^E279@NrgTk1s;U_0L3>TxV$`zJ zmZg5iPt?WJ4NZQcA(`?TGg&_l|AH5S;>oIPyfKwcXR5r$L^e?$uTH1xs=Q3PsxH;w z)nzh`UMAkxWN>r8SDj5wMxFiAz^1UF) zcwM^5_iQ?tL~3(QUOdiImg8}HbV4@mr|6S;09qmsvBWgp)EGyCYy4WTu`1ywyhe)i zIcjqY?;xT;8sdqns;p!sawN=~s?^kIIi<4MOx8vk@gE>*iWFt&K9ZD(jU=HVQIFEg zW@_TX;Xr5>BS}N9-pi(ZsWX7pbv4mgG^JRwemc`o<}qzdDB_LSmKoCB!yB^k%2Z9d z!K+V9jVF>xl%&_J=CB(0sj0p^_02@b%e)}V{IrjfqqlTklg;EBy`VT7ePq;@6{|Yo z*QQYOpp_^kvRMz$zs8Mex}gz)QCZy>Pi7jb5znSLYlN3*N~Y6s#zlflHRR%cePg^K zQr?fWh@O%2LBx1t zRc_1r%upqo5*os&OC_pJT&gpcV?#?Y~%Abg<>sK6-thLo4gWwY@x3gQ?} zaw!Qns0+5>Z2pvbQn`bQftcb!SW{2gYcl>*GTAD(O0Y^H5_}-mHVhP8zRK3K0_PKH zgE3j}Npym+A{|25Qi25J+YuRd+VZ|flko@bR6J%8q?3~XrL3ycS@fCIl*3W~Y&J1% z1agX6UK(Y$mN>i@R_Zq-c*DxquGYVM`lJ=V@X*8@SenjGE2LV!KK)RtOXn`!M zMhQ;*9e|OAKB4Cz2||i^HDzR3E{qrAppV;G>Xm1ch)58NEz=PRAz$a*dYtb~^3N&9IZh-q z^^KVZRuHCm>zznEo@>Z8rK-v}M%6KKxk}a+HU{=Q(qFXHH8ks=`RqTMU45g}HM+*Y zD}!7<)`_}AwjQk;ePtLsScVa2mt?FMX&bfDW&;YNl|)!xP0E)Rg>fm_Qa3LNz=vT> zJWL+Yv?+yVLnfbhThAX!|Nk;4B4cVW)+0zh?jDTuel~$#iBZYt5_<*|+o+7me>65v z268*6h}4KICJy2pSz#E7D!ND?^CjUWry8VVa;r^#ij~Ctj58XvR!pbzIT9AiAE{0M z=gN~!)n_ntNQClP;#8b4TG6@^$(1nOEu=W~VatS>dd`}QJ_GLu{NEdcna=&MQ&Nk; zW*WL1l#H8{E#mom8YpMtm}2t<3N!u4$ErG;N>!zsCYdRWaFP6^i|QsBaNd(F(UI7=^*@Cd1FbqTgYUP9&30_dN@{Rt{3oi ztJ!0+B8(dGNc`w8>1e~toi;w@@q7K{U2E5t_#oq#B0a?L@^tA*!iRAnKH2CM>8Xa- zq!$Pu+7e%A^on$r;WgGil%?3M-b4I=Xu=}m^$q|-Y^ZHdnlnXgD^7+#ZZyIa(jcsr5#igbI!YtjR;_2tHa z_#lz_iu4e}YtpZU57S2cjnOO8?+mX=AKN49FY)6d^A+inhS#LO>>0Hs{#9hYB5k!7 z^}Z(UTpYC}-bG}-BHhjKn)IqJQCs4xMdmBgYYneSr|uiIC7vcS)L+mu4X;U8qmy;> zjChU6d`0?};WgJU$b3b* zyWutI?xj&%;ypy>E7H9TuSri6J}hJ6xX~-pgyA*mb;5_X#Mc|WBE8Y@n)FxULtA36 zjPdf7P{ZripgRg5+7h=ndPUmN@S5~>;X_;EH;i79t}(nO?bj`u55)aN<}1>HhS#L? zgb)2Co^SMu^cKTw(rye55eP}G+ADUtb#^cllz z(mjVpZBZk)I+x?yL~h$8K1^i3B0b#jnzTyzFm1o(?*mY}{u2K~WWFMO$nf%}%|Dv? zOU$qMu?>+fF}x<-rP-W-cvq33e*oRx@S4Si|bhyMlv_()` zjjze;(3W@!e#~FeM+`4dpq(aRgto+S6Rsjn7+#ZJrlNU9{AZE*iu7{BYtr#MMs0~t z5*g+@pr;sKlRn%&YD@fx$b3b*%)Zv}dz6Puxpnz9K!+@S1ce7HDoh5DycXuSka*UX%V<9 zigdc+HR*+?M{S8O5}B_^FE+d;y=i9DmiT6o`HFPD;Wg=L7e#G}<08Xa1TLTd`0@M;Wg=tcSmiBUlN(GNMA9$ChfNt`V89NYjSbr0*_`+7iDfGGCFdHM}PMX+_kQ_-B#%iu6~*Ytql2iP{o>E;3({ zZZfNye9q2 zo>5!k%SGlZ(m96Lq$lnbwIv=eGGCFNY9bmHkzTjEI~!&(ot-te0AsL4@V;-f|8E7D^OuSvf=KWa<-mB@TW`nBOT z=`A-$ZHX6(408g|+YGNsKYJl+OZ>UW&{uHLGEw!{lW<}1>LhS#KHadXD) z&xpr~%vYophS#Krmqu-gOGM@?(lWzq(stdVw!}M%%vYox46jK~>>jlx9xpQV)u1OE zUX#8cd{}pgUo?6}`m*6QX}m|&U*ZWO^A%~O;Wg<4!iWA6|HJ4N=|hIsq}Lr0^_Td1 zk@<@BM#F2;Sv{k+#21UqSEQF3UXvc&D{4!8h{$|JdYIugsn6{iFU8djlxL zUM8vGHECbrLw||;iOg4|0}QW8&m9=`mw39!d_{V`;WcR&Y|^-O9Wy}>TMZHi(gMTF zZQ28c592_5kkM~(zi?JFTjGlYThdDnFK_L=Cw%BH@%u)vNIx*VCfyN{a^p*kshGr< zw4>oQ=~&@Ie~HH#y&|nJye7r)67iS#Gox3e7*ZI9CVdvg&cIg$B_^k0V8q=S%w zt}XFkk>Q>&=&^>^q<>LSTjF3(N0H7Ey{}21EsEL_KPNK80rX#n*Q9G>QCs22cdd zZHb4A%vYo%4X;TvZKAfsjUw|EY1Z(X^fBSX_!2*E^osOJ!)wy++eiH+?jbT?k@hsa zCjG1Mp})kp8@(dE)9{+~y0%e&iLVzK`bp3m4X;V>-63jAe4ogCMS8#CHR&(HhjAeO z)#w#zt9JAY^GVRpg%53s|7-M$^b5ml(#9R5aUecjWWFM8GQ1|eNcR3he~D+A{Xj)} ziQzS=*)t4niQh1KMY_iDnsj1^XdH+qi45~!(0apb(qDxS{Uzq>9@3|h8eWrLFMMcA ze1p*|(whvgNvH1=jRWy{BEx-C&>4o;q%R5|`b+$h(JRtd46jMY?i}@(c$~;E*8r_B zye55E_|RYCM~q&PE;GC)-KlfbU*erb<}1?9hS#L?g%ABDUSRZ!bfMuj=^?Ub8`=^d zYW8szX;;H*()GfJw!|BZUXgAzye2(ik7#^}PZXK2NKZ1nCVf!&&|l(*j9!sGYuqImw0=T`HFN0!)wyP!iWA64>5X0I@Iu*^flo_TjJM^UXiXgye1vGS2Pa9!$gMt zU(n%(*QECfANostpV2GQ`wg#2_brb4OT3@Rd_{VI;Wg=U;X{8tTo}rvU65kH5^eECN4X;UG z6h5>ie#z(+=_`iUq6!iToRHyFJly~*&J^l{-sTjD2- zUXea!cum@^Sy>Qw7n!d}k1)I@y-N7dU*fBcUXfmFcuhKA_|TSkfzd0{g@)Ip4+GRD>7e^_BXsHypJYS58}$9XZRf5M0U65nm~igdBzaTYkn*kE5y?2yKb?G3x|Hx}V`SX_fGyEpf`|6={v(HR-*=hqlD` z8NDLC-|(9BGvPy9;?Ip)+6p_;03eDbl+Q zuSrKpJqm4qE6)};%U|MqO#Um<`wXv1_mMma{UzSl`R zH@qf&O!&~2_;I6Gq)!@NlfEE)XiNN}(JRuI4X;VRXtvfP{!(O^Pl9eXye3^QYq`*0 z;teA673oI9YtoNpeHPjhZ!~K*Mfz{UYtoNo%@x`buQTf~MY_T8n)Jy|(Yj9jl*sT* z8R#>H*QASO%@z7fe2-a&Dbo84uSx4=9TnOVH<-1RB5gFhCjCJ8(3bc^qgSNs46jMg z+%+0s;G!gh3*$@t zgIV7x(w_{kN%xVpQD{rNugH8wy1(Hy>B!<}9EeAW%vYpi46jL(U81(cRU-2hX|>@s z>AZcTw#4&A<}1=$46jMwJ|JpK{EoDSqk9$F+=t9WL-gZLzl`sy( zl_JC36ST_k@-@&x74?_6NMybu)rQxk56jpQ`b+$X8BY}HGQ(@qYh*qc+7e$YGGCEi zZ+K05b1WJM;&~#&`T}%;;WgOye7R&`oYka_|K+qRHT<1UXzx}UQcL?YPHpR#xIb#^Bv;T zMCL2f35J)iZcGtA^p|+5(JRt346jLj8Jj~};+z?;73mbiYtkiBKSNvMhfSSTq&#_q z?Sgcn)T7Xr_*PT56zN|LuSvfbKD7O8+B^(3bc%lXgXV zyWutI8fmAYE%BSC?JCl@4X;UGm2`%-#IKpOE7CU%uSwsOb{g6ezh&C4B7Mj3nzVQG zeCXOVt=>;mdR_5ysG+r%!?#mX*+#Ex172S3+JC^X!+gB`-L{6S81$m`1$+-ZkBj#$Wk%L|42#pN1+Up9$%js*P9Uoz7Ie zwhAsS^13GdOtuNZ88R^mCA>`3r;`XS1JCfMtN3mFsl*32y5gm5d=LOi^EN3y?9fny zkDvq)$7t~l&^(rxQmtuaWi~b0TFM6w0*%DZDv(>2t-~wNzx&z^mZ%h{%~+YAr*wA! zOa}88b-eb$4}~UnLt)1iN-?m#PyysB#oup!{WU}XYGGFkyFjCf9KM#qnDb?)jG~eLi~04UpMz z86W;m#P1gyzds{>Sh+Pq#&D^(_BG(qfs1Sn?AE{z6Un@uc8H3&wRW3ew~78Ce$+F4 z)@~Yj#uWpTH(`#_6VNkb5}UtlxIQG-ZYu1i!fq2C1sCo3I~PA|*LbbcjfmVG9Fl{J zdB^Jl{H$H)A7Z-m8NqjvMH{B)(!h>+&y%oEM9lLh0YX>{) zhwI-80A?%0?FhS$uzLwS>j5viVVa-DkLjS@I@qmi!9UtQ@7QgG-A33wL5IOb8~$F$ z&-%A=uGTBtBmWKxj6jM5_H9sx&v4f+)%u;IlsEl$#@bxP0bL8~1mn@}ZUz)wR`&_8 z<*Az0Pk9qqh{0ub-vL{ms*MAXjzae76EgcO?M2M~^heYm*0fe$ zTkm751f~AJp!PgS`uANkeE||?&swCu4HFt%biXt3TGWRU$Xa2<#)H&eyDPM;h>3dx zt7Tz+4FtwH%9<^a`cc3;1A_=Y8H{%9CjuYwV@$K~|CVib`g;xU1o{HshF7&;DO?~Nvv&}qj0`S^Ee=TsoE74xy0qy6}zX!GM7wGRI zUa^g4Pr~>ZuIAbyJYm~Ha-ZQ^r6`~`6P6}CQf_I{-Pm(cyT&Y-~bbOfG&@Y${z zpJL!^&(rz((z}`cK;Yu@wS51V<#$RmeHz$)H=gx@b5;Ajc;Xze{Z2gbdBEL~UX!1l zGt|Mm0grI-e!ydZQ61rbXRnkFgNy$4X@-XZ zuS9&tz=rV|4Sb^G{zTwY9RE|m6C8aOxDnXq-!$MV$Noa#S_jVsu5<7LVEbKbrvF~r z2j8(K<_?6t82`tBr^CHX-*dp{IhZT>nU4Q&0?%^v>wzzJ@E5?BIQSRfOC7u|3aZ^h zVSm>F_%i5WCi%NJ@Pv=s>)Ap3KNNV=#`bxA8Sre!z8~Jlu@k_w=yUoP!0o!j{6aNR;et((xOJMt*X5ycL?KhZ-3lXo5$ZwOs zoxHZd{W@)z&(Ga~Cjfgd#U%dw1KW%BqYSth?rnWO3b@rL?eq0zIIse?<@YDx>9C(I z<=M%bK=(_uW;3aTK!L)xFc)Fus4?NSs-vHZ-{&7=dKJ>P|#DLed z>5xzV4!|pcIrC$DI|18o2Q$2VfbBPfi4O<9)d}xtVEgT0>W2Z};pk5SzT3f*fbVti znZOS?_%dMo&0+d?1Mo`d(bY@*xcg}5dtU1uy@#9OXMyc}w-vU3*EZ8{ZiZzh7R=x1 zUuSmI4n73f&aYeHkd%S5yoR9wI0r}vnBzL} z83E=@nfU4e&j|2c!1g?x_Q;PV)_tIVHozkT`~k2%N1gUx0WWak_cQP<4(1aXys(6m z@b@Ohc) z{s*|<>9zUrHdFr(%-2AezMp~D2JM0F+n6Pu_aO9iUkp6Raeo-FJrj=M_XD=yRwo_` zY`+aoTmfAC<5T(YPX!+8_%{i-5$geTg9xvUcP6ks!R$=;hX(p}z?+=<{a@g<@P9MPgZ_UHykjuG zBikf?su!1pR#<82j+D&evCh# zoLPtXnflk+I~~}b*F*PHf!Dx)HVek@eBiZCc$Wd&GpT5Q6|g7Io(_x%GJb6#x92d>zb?S*oceem zusz?B`ZD0pupZ?)leiD?*G_zg0^76Dsps9ajgEhDV0-Q`^**pSD=d$*fR%$U2Daw{ z(*8PNd-f^u?ZEczbK)h$!8x_WPXXKW=ZIefwr401zXx25@N9nY38muMwfXY>9+=l^ z{FtBHVN1oHF-rG40oyZbi4P`*d)vSC2DVo*n4!(^DZut@F1oL#e)|qGp0j)!fZI6r zeFiZ1bBzCOy-R@YnV)ojEpR`CU$WAa?_I$5Y+CA<0rOggAJg+vfO`aZJ+M8Oo%UY< zPj~vO?}6=EHq;klT(sxB6L$c%XG0So0Bp~2CGH7q&srcp7MNEJ`&-cQ!1nwZ>eImX z+#%u|u-)Hk?`>$_C*r3GmsFG5lu( ze0zZ34REW#ep7&Xe}ML_xP{h~&W|tcfEBPU|6PFXSxbyh7hro%4{=vu?YQp=Y|q!A zegH79$@nq6iU8LHI0bCa0jGTfusyGV_)K7XZXfZVf$dqm#5V);vi%$1@UdqWQ@;Xu zTPJ?60{`hArBiT2J)g?6=cy2X3T)4ECH@h(_f1M47}ytJVPMbUpuQt;8~AVg)4hOs z^~8_qEdzcrI18Ni{ekWI#Kgx3_NNEsQw_Ymq}AJ10M00B-O2w+6VQqhAkf&&FbWzXZ1D%MvSWJiNRd=f(%&b>c=u zTQfgqeclh)oB%$-$Qz-A4Ke@Wqn0FhVF5d;>Y}}1fKm(Omp9i^O-u@!+#I! z3)=Jkmp$W;{+|at|EY<2|Ncz-UFzhnGVN~!wr32|{&wnj?2sSt76VWFROv$`{5Iah zz`W)K04c*I%P<=g8J;4#1`7O@`#yf5ZUh_2uy@PSVH>VPM}-s;Z)KCD%t zJS{>0F9v?##<0H60p`VSgX}H%bMp$NkCyzvenX(=eHXH;@Tby=-z&hIg8gFVKi@{H za`c}A+jE;4KDXqzamI@_z!kyzobKBL+cUCgUkq%|W+pxy_}w9enooQa9|LU9<bz z__hBk`HCCyslZFoA8?<9m~X&MNBq1A+^a@^41DoCrH_>KqyGV}Jl32qM*C}l?fJ39 z3xMr;qQrLsPk-mOe188Ocs}q?&zSOg68OjkO7l(u?Oy@D@wUI_%Xb5?J*SWQ&w+Ve z6XZAF%$pB;Zu~I5ZGjJT=F6Rccl%uFFX4vn_o4mqcjf)>1*0=eAeq9j%djmW%uzxJT+=pd+-Uqhl zt}(oiflE-I?fCRHusv^!dS!0e$bD_P?*!c4u`dQ5^0tz*+-ZL(@U~8UI|BGtCw~S3 z+p}J2KN^^q89&gLfO|Rq*82JxFn&XTSLVX{btiO&SS z9P@EAJ|RDVd0m4a{aXlZ&rYQMJ%N65p#Nup?fCWzusuhW_HP5Pyg}(N#J-I@O?=?L zmF^Ybuc3be@wN3SW^U=_=M%dC+jH;e-~P??eFOYM5T7x?&p7^_0{jBf$F$IW4e(m% zy%N*EoDKZMTpfhpNxmNZ&A$uvpSZ6F`?=7MLI2Y`aDOB4&+p^;ngHJkY|s6q{ojEv z-K4ac|Dk>WuYADVpWu4%6<}U0cE;(W0B;P+|7+lVaCYw_qHp8<3cU8Vhw}NeJvO>Z z(7#~$CH>8w!1nxbhJOIC_t%H?bhKagM~4I3vx=$j4SXxc*AD{!hXKF!sM7dolce`# zV0*SV?Q4LKM*FhkTL##k3r_tMU|x27ngwjn$))~EV0*?o@vXqq?|3NRAKg#)!Tl)4 z_etRMpttFJ9oU}nO80Al?fJdLp8;P6ds~0L1-9oNQm=wrz{3y>^LuAtd*(Csdji|@ z+KCSWp8SB)8!*2iJ_?xkm#zOJfq5N(AN`91&vwG+)9OEMRQk{$Kc@kI>g-2c0Bp}_ zrT?>muXOTbA+S9IkNSIo=R<6C(g=|G^AF%TUl-|D zgYtPgu(#`p)xi7hh4U)|{b#_Rp?sbY|Jryz0NZn18D1gs$@@o`{#}T1S^o|K-ocp< z^Z|ZpaiRVK`?_>L3U~tQuXo@+5EEls_B?Rn_knp; z;>Ys;8rYsWO#RQm)8QYYC;n}NM{3UK6Vv+!;dKN)A9_I1?+$#&z?dAILiYy%f7dOR z-w!w(_ycGE@EG8qoc?w!@L5GM-4Xi;be{&^u2-SnF<76R1#Hifrv4&edoCsMRlxHR zpTUR_(|-%_`Uk`KEd}N^3O}az#Q1h_YryfA;2dk3Uw!}TWCKP_`bUe z^kLQH;C`T02c>(e&xZQcTE4D z25yV}98>>s|CRPj!t{L*xc^(=elxIw-qx2wdW`E7{1|?xVmv46==TGzcv9(jFn=op z9{XIO-WC%ShTj)hJNCnY*B8X}H9>os0Q}D-g*qAFCg5vtSNbMNUmNdS;0Mv(N<8D= zMZmM)DbnWz_E!TJ!+&q>_EKN&0)7Yc2bklQ>leR1ME$kl{gjo!yi9vU-%*VC1m`9* zz8?bfIut*q_uFFh=WzcL3V`*oRTsEDFD!2jY|rMV`%b{TZo-f5O9OmyfQQh%Gd~>* z+-`Zee{m|XJAGi7c5wJb;o%a6)J|FzO3%)`{;>U>_LXOa4~? zfBs{U{x;}OlEC&HYsM!FJQel`UhFRbKEv_va^Pp2^~X)XygtE?@wo^1EGN82f!jLc z#k0WnTx*8+7O=woPYgo{56|ZS&vfd?_rSaNE!6i1`Li9y(eIr8b64Q$PJFune~bN= z8zeq$yi(wPPJKBNcvc=<=_Wyj|?lQ-}6QJJ->$9rBza;R!aDQ`vCj#^0bA(LKS-^wWDt(+X`E?2K?ysT$ zgO2IH9=PASLS2S%i2nx6YchUx{|NAfy>QNXpnn{=<4uKnndmXT11HXj>4gD)5BLJq zcRL^a9GF)h{ODiNerR9Gr}O>YcEIbL_0t}}Lr`A^h&{%0U|zcg={XX3n;tRU4>HF0 zSl}fUICne1qk&I;vk+efHTp{6*-m|}1Lk$P%^%<^o&3Ed(DOM&#`k*QYoP~}`gI%d zd|*!*{2=h+s|)qlg(kemfCqa;dRUNOF9JW(FRbrx0`oc=Kl=Y);5A3Z^5e(%z=!T@ z&K_s_6cV=CsW0t;%cd0ScY^+8FW_$+eHk+X*Hie>|AD~s9}D}JKLMAm!1#{)Z1g`3 zJYrL!o*MXf2Jm)H|8XhZqdt1?>>}yE8h9oA+Z%qfz1;@f;R<`dx|4SwaHmm)`SJCi zz`WqS#OD>@mr#GY1oeF_@Q3iv=I|&B z5}(R_v zdT5c+cLTO(!qdOLz$+2os*NVUhXYR-j`oXv6qbJlaMQ9v{b&%MO5j^if9C|@*8^{I z^7Aa{Vl-TJLPvT@bfzt=`Vx!^)T?*6ASe= z!FuQ^V0S+CFW{4RE7G&HN#EPRypF<8+8=PgA!GH*%guftKl6E6$3i_E`yEXGp1_-( z_#XhQ-c|bLApSjoc`e3|{tX5G4)(S_p9cKUsWJU+V4nuAL4Qy#_SkO){=u=I2K*DS z?f)+T=5+#o^#7Uw-zNUySu^0`$Dh(qbT#F%40sUsGlz>ko~H}!ZGXN#z;-?N9q_r= z#q_~J{M5m4h^r@l46jpw*=-RY1ibExus=DH`ZrG1(?M7t1_AdO7t@ymGyg^cuXpS# zX^(3&e)KO3eDg73d7lm3i2FZD(YNs~1>Okvw!Pm#_g|v_MR_v3zXHF}J*K+__V)p2 zGBJH+P(L04Ua?D2zJFZ>>|?*#&PQGYo{soi|KA6GwKN=GJ_h!F26X%Z)HJv z1ze~&_wzae&xe0rqn7yX3;YT8M_?uQM~?zl&i$W}z-_T#u_5s9G~l~GjOp8g_Ff09 z9skb(-W}uJb%FgQz`SbkV}9NUe9rYse=QjIyMXz=A|UkJdbb0AgwV(^_d19!i%GFlUcvX$C=Gtac*yXV8v*h z?mVo#A|3}C6hX%g%&Yh=E>2aR+OY4Esmcq}3mt^BZ$G)EI(e zQ-1&QffYEQ+VQ_suTN*Z`Xo=IpO}$CzVz(d+P5siQuBAPh2@;pk94~>#tLuG4vPuqN@7kmH5v9mC zlz&CV_(+ZF)~%aIb5nm>G$}1D6O)FNpG-8u(^1L(Ro%)!2A1Ow%B?(;oRq>b@uLQM zD8VuDp@aM5EOqG0+59N-MwT7lKa|4_k82-;m)Cg|yLdvu$fg=%b0E8T5=Y$~77+}q zINtg^5=Xg9)bPqW;?>9l+EZCH6V%EO^zJ1m&ksJmA~VU$mHXMjr!+@{MrR%El4&=0O9JDQ8SwJq-r|MDdo6D)zTr8Y36EpK<)aY!V(wnjLlitwTr{Y(bP!bB?%h2I8q&$Upc@4U*BX=&=bBPkD?nY5 z!lrNXnF&Nq;u4Re%CQ7ZzZQ(s7)~GyL}(*k{MZqr2lO8iA3bD9`QVCpMgIXK26NPo zIu=XUDN>F)AD1fP`sNA(n?d78^&dHGpx0EJnG#Q--<}o}VY0d=PLKJ)jUal}7@?Z_ z^*eUNumJ<(WnD|WL?zmmD~QK21~+8Ti6#?1J{IEY(0GyK_+W=C?9Z;hY>;%$Xx{ZG zBUg=DEpdWdS1g||$>uP~m==;{&tMv>%v5rI3fYlDqhU|c)R={XYS)8oCgaD^-le6a zS(#bcIYWq#>3{6t_?XedMpejoTaG*!iNPyTlL|6MN^Q#2WLX?vMDc254pg71%3<^~ z-mrH=9Y7n1*NPv5(%Dqf7oX7JF(_4;s~M83 zt7GMCOjo%HsY_%0WHH$kdH5tsF3#>Q-jJz6Q}VMiEpi<>5yV)Pn3Rg+Qz|IiRD5!x zE|>Caaflka?*rp3*0G6=m)RjNPd5Di{XizQX8jOj|7-O=tjxGr$mQFUA z%tftgKp%yP(Jsbe3E}mSj^k$Q*R^?9{yh z$*PLX@kew=cq~LD%1_mx#RauD&M}5nJl>R;jONZfus^~I1S zy}g(avo?o|CN5i!n;ah(#A#q1##nq!$kf_NH|lQX(niXodp9;)aFJ-ps?4ZVa;g1dg!- zGY!@0np`#|^B)sV65VADCh452a~77!Vjj*CGhId4Ol9;#!%Nm?-7qnE$oiEj46BSy zmf^8(m)D~5oAxgipH*zw$T6eGRg}l8vEr!mg8nfqDQWMVD!JZsBu&*vB!0Fb**MJ= zp`SuBqV8(3fO2h^Bo4Re*RbAUzGDJ}#)SBmV`l7~Ff}4unh*JrsAg_Y* zVEa#Cy(mM|n4CYjDOr)}-`Hq+4vZ+N^kh3Gu}MjN;#!#5FP)t6*A$gxhw;nLF-Jw}U4wDxNrHZv z`67{Y^@v6=pqsd1Iub1Iq|2#gS&qwBK4T-jCPv;g`XM%rF<7G@<7{tkjJPD{V%Nzb znPZMa0b>LlinPYjs@cmhC)vv&f=$t37h`x;dNRjw)+^haU?4-@mL7pFAvxJPmhlpO zf3<03gH9MdZcy2P@fCxE;lj)^{47667L2CojNmDIXE#TJaf?$jP6*he#AW>Os_QbD zNO7V+XhKia=$RN{0cJ+xGGtodx(RIvdm1R1Om>=AKMf6Jikrcx*USMnQIl2Z;gT$+ zV6>VXjHV_o>{2-p8YD9$qAh)CWslF~>W7cjLM0!Q>*Y)1r>9b;+M z`$2*$l8xwE8!(|8Ser^tlICh6)s({8!tP!$FpRr0jM@3EjA$$ZFlFc|JZVBQMP=;G zWS|ipQ_3&(%2WOznfS@%KsHw}(g(vlYA_o>dRPM%`&-QKWW|R8can^el6H1H%=Ge9 zy-Zb@mC0HzD`f~Z%{bRomr6xCx%jZrNOl#b30T$0+LBcuQ(cva^vR6MxK!i7TG@9) zhsbHCpNW*EnFh#2qB@(3bQY*8N#8Lp^D2=E7}}B;+^5x7X6l^E!*Po%T+>m?v{yzi zJI%p*njK)KG1Y)Fa2pVJq8NP{_3hBf-9VH2CgglDVqj&F!OATDb3Q&q?ws(el8T2l9{R_XJwROQ017I z+6f9LKMAzZ=%P!O>dE?g))r1hM`p6Aawb$V0nMHboO^TC)pfb1+DLZgTU$`EO*YA5 zD!*Vb6U9c(^Q4I)0XZ%YFpEPPgZ9m`s7gnAC`4yauJL$|Lmqbr8zUK<&P4L1#H*O< z56skMP%N??Y^t#AP)cRUVAoOd)vjaAd`33o+$2f=kZNi~Z^Y6|%0!i0e#y|Pn^)bG zN=*s{C1wXDSddBI#tMMxb3TL84eXAbZOfn%a9GCr3p;1%4WwS6954atUsoqpehEtA!>=c6x?RiNZT`KXa&%4JN%o=7F4 zEnBWls70*$oU*fCj7!(ln%(CCnA?s^@nfGU+4&op!_<>mE%V4gLnAL)mzLpSU~NTa zC}s^C_aK2m3@uF-$AFKeH#n4xcLznO`*T{Z03o zbGpP5v&@h^BzVap8(3S8!K<2$D~xZcnfQd0o?zxJQ@C=3Gm@)b<~{ZZYy4U)!cdQb zF^w}4GxxwCDl(boDv@M$LA)ezD8zzI%ogj!~Q~s#@trUovD>5aN4$e#-PzyL% zN;1*xqP1B@#9A{VqBC#G*qvB*Fu`8_m=qSIm=JRQ>vR+0-5B-=UNr{AuoOyIfX!-+ znIlMsW-2Fgq9C8L4Mu0~c1j~sB*fV*&1=l5MCd{ai^8GA&O zUs!4oV1v8)7Ff6z<7~wA9L9}!h%l_m&dPW)NZ6LFXugIrC;DrphcbGtVmAc<83)&bIiO5e?Hp2Zey*`O;oqc{6>Ha_VkmyS& ztZ4`3a9_sk%V5TaS}zMM(?EkwZfAk&q0g?!V9sVnHl!GNRaYHU9A|r{mU~kTO}ydL zY}^k^B;W6{8D`A5ZkF@d$z-x*wBZy1Jq&LYnf*qSGg7_G>_UdMW^;vRLtRM_Ls_3l zH!jO98H$iiDelQsPvLaSEo#~2ktH%LBwsKJaXvOERcC6c**Og-lojL03=Xz0Ogg16 zLo4(uMq(cf_Z67b5t%7yj;zX@?=WrEEwnWsTVRn^I%JsA(+3l$9+sXkoG<7RrJ zJO7ZKUDkjGY_Pi?m?#EC$@MMR%;ZQIVUe<9Wh=*O0)H{B3KNKW=$Dq1)CYSaL2HPV zmup>LkNbFajUL8NZb!r`29A-*4p)6a?O@7Ki<|FjnAuW1j!$`;LB|`xZ7z1T^=Pr~ zlni}su!o6?D6@ME6b>$VEeUrDp84h1u|XE;-(7=i_Keh zdzo3%{~}6^Ks2Vf;fPL${Q-i({Ml5#u<+nWmf=CS%O&Rj)7H84rV#`|cz=Y1G#oE%}YdZ;D+ESs)i;@o^0FpwV;goBLExvo$R$SK0MC!5% z8x@AD_hA|AqICiYbU&Fn$-Q5zs*78HOtRJtXYsc>~%F2$Z8-w3-A z^B-V8c2Ytc)VD{P$2Gdf_D7H4#{~jUCPub5h>oN$?+ArIm?d%b(5=xsE~PqPjVZdp zJ-hi1$m!u!9mH3t{?MEnhg{!?4!FS4Pe>g;hyjq}(8-%kS zwM1QpX379N?<-d~^Nx$Z8|jVL;1NSwCLTU+S#q^YQiR-*qwXncj|v++*+#pF8evYy z!jHC3FKVU$3eDBc`Qt2Sv#W@YiL~){YI*r(u^9_6ImHTXtS+IYjm4a;QW1ja#Pvg}V#CpZX0X-i~%PJ!{kPO}V5ORupLwo;bJw2I7(=Uf#!69p?nCyS<8iPso(3 z=KbMlxX)@G^>?Aze4CNUG*7}1$GWR<)grt98U6{wOf z=}mbKP>_$x{D}IBI-agUd``WF6pqfdSxTCm%O_(ftz5P>6h%rXe!1IfFCuElI!CSU zD9V(ur9bBYb}rP(6oW-d)#T>t^z-Qnchc?_?P2-0`FS#buc&q)SniT)tRhkoA(5sT zmU)68@ou}7&G4|jo6B97#}h503k_GRV%0f~hB3%)0|Mj@KFkLf&c;habrB_TgxJ|X D)@F_p literal 0 HcmV?d00001 diff --git a/omc/plat/iptrans/generate_iptrans b/omc/plat/iptrans/generate_iptrans new file mode 100644 index 0000000..6ae9508 --- /dev/null +++ b/omc/plat/iptrans/generate_iptrans @@ -0,0 +1,3 @@ +#!/bin/bash +#gcc -o iptrans ./src/iptrmain.c -Llib/ -liptrans -L../debug/lib -ldebug -lcurses -L../snmp/lib -lsnmp -L../public/lib -lpublic -lm +gcc -o iptrans ./src/iptrmain.c -Llib/ -liptrans -L../debug/lib -ldebug -L../snmp/lib -lsnmp -L../public/lib -lpublic -lm diff --git a/omc/plat/iptrans/iptrans b/omc/plat/iptrans/iptrans new file mode 100644 index 0000000000000000000000000000000000000000..017a0e36eed352af44a237248662703ae1e2f6e9 GIT binary patch literal 576328 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�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