From 37b99ef99ea4ec011bd5d9f587079ea985bcc092 Mon Sep 17 00:00:00 2001 From: Sukchan Lee Date: Mon, 6 Feb 2017 19:12:10 +0900 Subject: [PATCH] move ./lib/asn/test to ./test --- Makefile.am | 2 +- configure.ac | 2 +- lib/asn/Makefile.am | 2 +- lib/asn/src/asn1c/asn_internal.h | 2 + src/Makefile.am | 9 +- src/context.c | 8 +- src/context.h | 7 +- src/s1ap_message.c | 63 +++++ src/s1ap_message.h | 372 ++++++++++++++++++++++++++++ {lib/asn/test => test}/Makefile.am | 12 +- {lib/asn/test => test}/abts.c | 0 {lib/asn/test => test}/abts.h | 0 {lib/asn/test => test}/abts_tests.h | 0 {lib/asn/test => test}/s1ap_test.c | 17 +- {lib/asn/test => test}/testutil.c | 0 {lib/asn/test => test}/testutil.h | 0 16 files changed, 475 insertions(+), 21 deletions(-) create mode 100644 src/s1ap_message.c create mode 100644 src/s1ap_message.h rename {lib/asn/test => test}/Makefile.am (70%) rename {lib/asn/test => test}/abts.c (100%) rename {lib/asn/test => test}/abts.h (100%) rename {lib/asn/test => test}/abts_tests.h (100%) rename {lib/asn/test => test}/s1ap_test.c (88%) rename {lib/asn/test => test}/testutil.c (100%) rename {lib/asn/test => test}/testutil.h (100%) diff --git a/Makefile.am b/Makefile.am index 48bd3d9f1..f2d1c57bf 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2,7 +2,7 @@ ACLOCAL_AMFLAGS = -I m4 -SUBDIRS = lib src +SUBDIRS = lib src test bin_PROGRAMS = cellwired diff --git a/configure.ac b/configure.ac index b8fd56c95..fdc11e43e 100644 --- a/configure.ac +++ b/configure.ac @@ -256,10 +256,10 @@ AC_CONFIG_FILES([lib/core/Makefile]) AC_CONFIG_FILES([lib/logger/Makefile]) AC_CONFIG_FILES([lib/asn/src/asn1c/Makefile]) AC_CONFIG_FILES([lib/asn/src/Makefile]) -AC_CONFIG_FILES([lib/asn/test/Makefile]) AC_CONFIG_FILES([lib/asn/Makefile]) AC_CONFIG_FILES([lib/Makefile]) AC_CONFIG_FILES([src/Makefile]) +AC_CONFIG_FILES([test/Makefile]) AC_CONFIG_FILES([Makefile]) AC_OUTPUT diff --git a/lib/asn/Makefile.am b/lib/asn/Makefile.am index 381986edc..3260d3a53 100644 --- a/lib/asn/Makefile.am +++ b/lib/asn/Makefile.am @@ -1,6 +1,6 @@ ## Process this file with automake to produce Makefile.in -SUBDIRS = src test +SUBDIRS = src MAINTAINERCLEANFILES = Makefile.in MOSTLYCLEANFILES = *.stackdump diff --git a/lib/asn/src/asn1c/asn_internal.h b/lib/asn/src/asn1c/asn_internal.h index 53f9583be..99b10cd24 100644 --- a/lib/asn/src/asn1c/asn_internal.h +++ b/lib/asn/src/asn1c/asn_internal.h @@ -19,6 +19,8 @@ extern "C" { #endif +#define EMIT_ASN_DEBUG 1 + /* Environment version might be used to avoid running with the old library */ #define ASN1C_ENVIRONMENT_VERSION 924 /* Compile-time version */ int get_asn1c_environment_version(void); /* Run-time version */ diff --git a/src/Makefile.am b/src/Makefile.am index 2039730fc..6220a17a1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -3,15 +3,16 @@ noinst_LTLIBRARIES = libcellwire.la libcellwire_la_SOURCES = \ - cellwire.h context.h + cellwire.h context.h s1ap_message.h nodist_libcellwire_la_SOURCES = \ - init.c context.c + init.c context.c s1ap_message.c AM_CPPFLAGS = \ -I$(top_srcdir)/include \ - -I$(top_srcdir)/lib/core \ - -I$(top_srcdir)/lib/core/include + -I$(top_srcdir)/lib/core/include \ + -I$(top_srcdir)/lib/asn/src/asn1c \ + -I$(top_srcdir)/lib/asn/src AM_CFLAGS = \ -Wall -Werror diff --git a/src/context.c b/src/context.c index 04e515003..626d94119 100644 --- a/src/context.c +++ b/src/context.c @@ -25,13 +25,13 @@ status_t context_init() /* Initialize MME context */ memset(&self, 0, sizeof(mme_ctx_t)); - self.plmn_id.num_mnc_digits = 2; + self.plmn_id.len = 2; self.plmn_id.mcc[2] = 1; self.plmn_id.mnc[1] = 1; - self.mme_capacity = 0xff; + self.relative_capacity = 0xff; - self.srvd_gummei.num_of_plmn = 1; - self.srvd_gummei.plmn_id[0].num_mnc_digits = 2; + self.srvd_gummei.num_of_plmn_id = 1; + self.srvd_gummei.plmn_id[0].len = 2; self.srvd_gummei.plmn_id[0].mcc[0] = 0; self.srvd_gummei.plmn_id[0].mcc[1] = 0; self.srvd_gummei.plmn_id[0].mcc[2] = 1; diff --git a/src/context.h b/src/context.h index df43962a1..9b5291973 100644 --- a/src/context.h +++ b/src/context.h @@ -2,6 +2,7 @@ #define __CELLWIRE_CONTEXT_H__ #include "core_list.h" +#include "core_errno.h" #ifdef __cplusplus extern "C" { @@ -12,13 +13,13 @@ extern "C" { #define CODE_PER_MME 256 /* According to spec it is 256*/ typedef struct _plmn_id_t { - c_uint8_t num_mnc_digits; + c_uint8_t len; c_uint8_t mcc[3]; c_uint8_t mnc[3]; } plmn_id_t; typedef struct _served_gummei { - c_uint32_t num_of_plmn; + c_uint32_t num_of_plmn_id; plmn_id_t plmn_id[MAX_PLMN_ID]; c_uint32_t num_of_grp_id; @@ -32,7 +33,7 @@ typedef struct _served_gummei { typedef struct _mme_ctx_t { plmn_id_t plmn_id; - c_uint8_t mme_capacity; + c_uint8_t relative_capacity; srvd_gummei_t srvd_gummei; } mme_ctx_t; diff --git a/src/s1ap_message.c b/src/s1ap_message.c new file mode 100644 index 000000000..3beda3fb4 --- /dev/null +++ b/src/s1ap_message.c @@ -0,0 +1,63 @@ +#define TRACE_MODULE _s1msg + +#include "context.h" +#include "s1ap_message.h" + +status_t s1ap_build_setup_rsp(pkbuf_t **pkbuf) +{ + int erval; + int i, j; + + s1ap_message message; + S1ap_S1SetupResponseIEs_t *ies = NULL; + int num_of_gummei = 0; + S1ap_ServedGUMMEIsItem_t servedGUMMEI; + S1ap_PLMNidentity_t plmn_id; + S1ap_MME_Group_ID_t grp_id; + S1ap_MME_Code_t code; + + memset(&message, 0, sizeof(s1ap_message)); + + ies = &message.msg.s1ap_S1SetupResponseIEs; + ies->relativeMMECapacity = mme_self()->relative_capacity; + + num_of_gummei = 1; + for (i = 0; i < num_of_gummei; i++) + { + srvd_gummei_t *srvd_gummei = &mme_self()->srvd_gummei; + + for (j = 0; i < srvd_gummei->num_of_plmn_id; j++) + { + plmn_id.buf = calloc(3, sizeof(uint8_t)); \ + plmn_id.buf[0] = 0xf1; + plmn_id.buf[1] = 0xea; + plmn_id.buf[2] = 0xaa; + plmn_id.size = 3; + ASN_SEQUENCE_ADD(&servedGUMMEI.servedPLMNs.list, &plmn_id); + } + + for (j = 0; i < srvd_gummei->num_of_grp_id; j++) + { + INT16_TO_OCTET_STRING(srvd_gummei->grp_id[j], &grp_id); + ASN_SEQUENCE_ADD(&servedGUMMEI.servedGroupIDs.list, &grp_id); + } + + for (j = 0; i < srvd_gummei->num_of_code; j++) + { + INT16_TO_OCTET_STRING(srvd_gummei->code[j], &code); + ASN_SEQUENCE_ADD(&servedGUMMEI.servedMMECs.list, &code); + } + } + + ASN_SEQUENCE_ADD(&ies->servedGUMMEIs, &servedGUMMEI); + message.procedureCode = S1ap_ProcedureCode_id_S1Setup; + message.direction = S1AP_PDU_PR_successfulOutcome; + + erval = s1ap_encode_pdu(pkbuf, &message); + if (erval < 0) + return CORE_ERROR; + + return CORE_OK; +} + + diff --git a/src/s1ap_message.h b/src/s1ap_message.h new file mode 100644 index 000000000..1aa974af1 --- /dev/null +++ b/src/s1ap_message.h @@ -0,0 +1,372 @@ +#ifndef _S1AP_MESSAGE_H__ +#define _S1AP_MESSAGE_H__ + +#include "s1ap_codecs.h" + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +#define S1AP_SDU_SIZE 2048 + +#define BUFFER_TO_INT8(buf, x) (x = ((buf)[0])) + +#define INT8_TO_BUFFER(x, buf) ((buf)[0] = (x)) + +/* Convert an integer on 16 bits to the given bUFFER */ +#define INT16_TO_BUFFER(x, buf) \ +do { \ + (buf)[0] = (x) >> 8; \ + (buf)[1] = (x); \ +} while(0) + +/* Convert an array of char containing vALUE to x */ +#define BUFFER_TO_INT16(buf, x) \ +do { \ + x = ((buf)[0] << 8) | \ + ((buf)[1]); \ +} while(0) + +/* Convert an integer on 32 bits to the given bUFFER */ +#define INT32_TO_BUFFER(x, buf) \ +do { \ + (buf)[0] = (x) >> 24; \ + (buf)[1] = (x) >> 16; \ + (buf)[2] = (x) >> 8; \ + (buf)[3] = (x); \ +} while(0) + +/* Convert an array of char containing vALUE to x */ +#define BUFFER_TO_INT32(buf, x) \ +do { \ + x = ((buf)[0] << 24) | \ + ((buf)[1] << 16) | \ + ((buf)[2] << 8) | \ + ((buf)[3]); \ +} while(0) + +/* Convert an integer on 32 bits to an octet string from aSN1c tool */ +#define INT32_TO_OCTET_STRING(x, aSN) \ +do { \ + (aSN)->buf = calloc(4, sizeof(uint8_t)); \ + INT32_TO_BUFFER(x, ((aSN)->buf)); \ + (aSN)->size = 4; \ +} while(0) + +#define INT32_TO_BIT_STRING(x, aSN) \ +do { \ + INT32_TO_OCTET_STRING(x, aSN); \ + (aSN)->bits_unused = 0; \ +} while(0) + +#define INT16_TO_OCTET_STRING(x, aSN) \ +do { \ + (aSN)->buf = calloc(2, sizeof(uint8_t)); \ + (aSN)->size = 2; \ + INT16_TO_BUFFER(x, (aSN)->buf); \ +} while(0) + +#define INT8_TO_OCTET_STRING(x, aSN) \ +do { \ + (aSN)->buf = calloc(1, sizeof(uint8_t)); \ + (aSN)->size = 1; \ + INT8_TO_BUFFER(x, (aSN)->buf); \ +} while(0) + +#define MME_CODE_TO_OCTET_STRING INT8_TO_OCTET_STRING +#define M_TMSI_TO_OCTET_STRING INT32_TO_OCTET_STRING +#define MME_GID_TO_OCTET_STRING INT16_TO_OCTET_STRING + +#define OCTET_STRING_TO_INT8(aSN, x) \ +do { \ + d_assert((aSN)->size == 1, , "invalid size(%d)", (aSN)->size); \ + BUFFER_TO_INT8((aSN)->buf, x); \ +} while(0) + +#define OCTET_STRING_TO_INT16(aSN, x) \ +do { \ + d_assert((aSN)->size == 2, , "invalid size(%d)", (aSN)->size); \ + BUFFER_TO_INT16((aSN)->buf, x); \ +} while(0) + +#define OCTET_STRING_TO_INT32(aSN, x) \ +do { \ + d_assert((aSN)->size == 4, , "invalid size(%d)", (aSN)->size); \ + BUFFER_TO_INT32((aSN)->buf, x); \ +} while(0) + +#define BIT_STRING_TO_INT32(aSN, x) \ +do { \ + d_assert((aSN)->bits_unused == 0, , "unused bits(%d)", (aSN)->bits_unused); \ + OCTET_STRING_TO_INT32(aSN, x); \ +} while(0) + +#define BIT_STRING_TO_CELL_IDENTITY(aSN, vALUE) \ +do { \ + d_assert((aSN)->bits_unused == 4, , "unused bits(%d)", (aSN)->bits_unused); \ + vALUE.enb_id = ((aSN)->buf[0] << 12) | ((aSN)->buf[1] << 4) | \ + ((aSN)->buf[2] >> 4); \ + vALUE.cell_id = ((aSN)->buf[2] << 4) | ((aSN)->buf[3] >> 4); \ +} while(0) + +#define MCC_HUNDREDS(vALUE) \ + ((vALUE) / 100) +/* When MNC is only composed of 2 digits, set the hundreds unit to 0xf */ +#define MNC_HUNDREDS(vALUE, mNCdIGITlENGTH) \ + ( mNCdIGITlENGTH == 2 ? 15 : (vALUE) / 100) +#define MCC_MNC_DECIMAL(vALUE) \ + (((vALUE) / 10) % 10) +#define MCC_MNC_DIGIT(vALUE) \ + ((vALUE) % 10) + +#define MCC_TO_BUFFER(mCC, bUFFER) \ +do { \ + d_assert(bUFFER, , "Null param"); \ + (bUFFER)[0] = MCC_HUNDREDS(mCC); \ + (bUFFER)[1] = MCC_MNC_DECIMAL(mCC); \ + (bUFFER)[2] = MCC_MNC_DIGIT(mCC); \ +} while(0) + +#define MCC_MNC_TO_PLMNID(mCC, mNC, mNCdIGITlENGTH, oCTETsTRING) \ +do { \ + (oCTETsTRING)->buf = calloc(3, sizeof(uint8_t)); \ + (oCTETsTRING)->buf[0] = (MCC_MNC_DECIMAL(mCC) << 4) | MCC_HUNDREDS(mCC); \ + (oCTETsTRING)->buf[1] = (MNC_HUNDREDS(mNC,mNCdIGITlENGTH) << 4) | MCC_MNC_DIGIT(mCC); \ + (oCTETsTRING)->buf[2] = (MCC_MNC_DIGIT(mNC) << 4) | MCC_MNC_DECIMAL(mNC); \ + (oCTETsTRING)->size = 3; \ +} while(0) + +#define MCC_MNC_TO_TBCD(mCC, mNC, mNCdIGITlENGTH, tBCDsTRING) \ +do { \ + char _buf[3]; \ + d_assert((mNCdIGITlENGTH == 3) || (mNCdIGITlENGTH == 2),, "Invalid Length(%d)", mNCdIGITlENGTH); \ + _buf[0] = (MCC_MNC_DECIMAL(mCC) << 4) | MCC_HUNDREDS(mCC); \ + _buf[1] = (MNC_HUNDREDS(mNC,mNCdIGITlENGTH) << 4) | MCC_MNC_DIGIT(mCC);\ + _buf[2] = (MCC_MNC_DIGIT(mNC) << 4) | MCC_MNC_DECIMAL(mNC); \ + OCTET_STRING_fromBuf(tBCDsTRING, _buf, 3); \ +} while(0) + +#define TBCD_TO_MCC_MNC(tBCDsTRING, mCC, mNC, mNCdIGITlENGTH) \ +do { \ + int mNC_hundred; \ + d_assert((tBCDsTRING)->size == 3, , "invalid size(%d)", (tBCDsTRING)->size); \ + mNC_hundred = (((tBCDsTRING)->buf[1] & 0xf0) >> 4); \ + if (mNC_hundred == 0xf) { \ + mNC_hundred = 0; \ + mNCdIGITlENGTH = 2; \ + } else { \ + mNCdIGITlENGTH = 3; \ + } \ + mCC = (((((tBCDsTRING)->buf[0]) & 0xf0) >> 4) * 10) + \ + ((((tBCDsTRING)->buf[0]) & 0x0f) * 100) + \ + (((tBCDsTRING)->buf[1]) & 0x0f); \ + mNC = (mNC_hundred * 100) + \ + ((((tBCDsTRING)->buf[2]) & 0xf0) >> 4) + \ + ((((tBCDsTRING)->buf[2]) & 0x0f) * 10); \ +} while(0) + +#define TBCD_TO_PLMN_T(tBCDsTRING, pLMN) \ +do { \ + d_assert((tBCDsTRING)->size == 3, , "invalid size(%d)", (tBCDsTRING)->size); \ + (pLMN)->mcc_digit2 = (((tBCDsTRING)->buf[0] & 0xf0) >> 4); \ + (pLMN)->mcc_digit1 = ((tBCDsTRING)->buf[0] & 0x0f); \ + (pLMN)->mnc_digit3 = (((tBCDsTRING)->buf[1] & 0xf0) >> 4); \ + (pLMN)->mcc_digit3 = ((tBCDsTRING)->buf[1] & 0x0f); \ + (pLMN)->mnc_digit2 = (((tBCDsTRING)->buf[2] & 0xf0) >> 4); \ + (pLMN)->mnc_digit1 = ((tBCDsTRING)->buf[2] & 0x0f); \ +} while(0) + +#define PLMN_T_TO_TBCD(pLMN, tBCDsTRING, mNClENGTH) \ +do { \ + tBCDsTRING[0] = (pLMN.mcc_digit2 << 4) | pLMN.mcc_digit1; \ + /* ambiguous (think about len 2) */ \ + if (mNClENGTH == 2) { \ + tBCDsTRING[1] = (0x0F << 4) | pLMN.mcc_digit3; \ + tBCDsTRING[2] = (pLMN.mnc_digit2 << 4) | pLMN.mnc_digit1; \ + } else { \ + tBCDsTRING[1] = (pLMN.mnc_digit3 << 4) | pLMN.mcc_digit3; \ + tBCDsTRING[2] = (pLMN.mnc_digit2 << 4) | pLMN.mnc_digit1; \ + } \ +} while(0) + +#define PLMN_T_TO_MCC_MNC(pLMN, mCC, mNC, mNCdIGITlENGTH) \ +do { \ + mCC = pLMN.mcc_digit3 * 100 + pLMN.mcc_digit2 * 10 + pLMN.mcc_digit1; \ + mNCdIGITlENGTH = (pLMN.mnc_digit3 == 0xF ? 2 : 3); \ + mNC = (mNCdIGITlENGTH == 2 ? 0 : pLMN.mnc_digit3 * 100) \ + + pLMN.mnc_digit2 * 10 + pLMN.mnc_digit1; \ +} while(0) + +/* + * TS 36.413 v10.9.0 section 9.2.1.37: + * Macro eNB ID: + * Equal to the 20 leftmost bits of the Cell + * Identity IE contained in the E-UTRAN CGI + * IE (see subclause 9.2.1.38) of each cell + * served by the eNB. + */ +#define MACRO_ENB_ID_TO_BIT_STRING(mACRO, bITsTRING) \ +do { \ + (bITsTRING)->buf = calloc(3, sizeof(uint8_t)); \ + (bITsTRING)->buf[0] = ((mACRO) >> 12); \ + (bITsTRING)->buf[1] = (mACRO) >> 4; \ + (bITsTRING)->buf[2] = ((mACRO) & 0x0f) << 4; \ + (bITsTRING)->size = 3; \ + (bITsTRING)->bits_unused = 4; \ +} while(0) +/* + * TS 36.413 v10.9.0 section 9.2.1.38: + * E-UTRAN CGI/Cell Identity + * The leftmost bits of the Cell + * Identity correspond to the eNB + * ID (defined in subclause 9.2.1.37). + */ +#define MACRO_ENB_ID_TO_CELL_IDENTITY(mACRO, cELL_iD, bITsTRING) \ +do { \ + (bITsTRING)->buf = calloc(4, sizeof(uint8_t)); \ + (bITsTRING)->buf[0] = ((mACRO) >> 12); \ + (bITsTRING)->buf[1] = (mACRO) >> 4; \ + (bITsTRING)->buf[2] = (((mACRO) & 0x0f) << 4) | ((cELL_iD) >> 4); \ + (bITsTRING)->buf[3] = ((cELL_iD) & 0x0f) << 4; \ + (bITsTRING)->size = 4; \ + (bITsTRING)->bits_unused = 4; \ +} while(0) + +/* Used to format an uint32_t containing an ipv4 address */ +#define IPV4_ADDR "%u.%u.%u.%u" +#define IPV4_ADDR_FORMAT(aDDRESS) \ + (uint8_t)((aDDRESS) & 0x000000ff), \ + (uint8_t)(((aDDRESS) & 0x0000ff00) >> 8 ), \ + (uint8_t)(((aDDRESS) & 0x00ff0000) >> 16), \ + (uint8_t)(((aDDRESS) & 0xff000000) >> 24) + +#define IPV4_ADDR_DISPLAY_8(aDDRESS) \ + (aDDRESS)[0], (aDDRESS)[1], (aDDRESS)[2], (aDDRESS)[3] + +#define TAC_TO_ASN1 INT16_TO_OCTET_STRING +#define GTP_TEID_TO_ASN1 INT32_TO_OCTET_STRING +#define OCTET_STRING_TO_TAC OCTET_STRING_TO_INT16 +#define OCTET_STRING_TO_MME_CODE OCTET_STRING_TO_INT8 +#define OCTET_STRING_TO_M_TMSI OCTET_STRING_TO_INT32 +#define OCTET_STRING_TO_MME_GID OCTET_STRING_TO_INT16 +#define OCTET_STRING_TO_CSG_ID OCTET_STRING_TO_INT27 + +/* Convert the IMSI contained by a char string NULL terminated to uint64_t */ +#define IMSI_STRING_TO_IMSI64(sTRING, iMSI64_pTr) sscanf(sTRING, IMSI_64_FMT, iMSI64_pTr) +#define IMSI64_TO_STRING(iMSI64, sTRING) snprintf(sTRING, IMSI_BCD_DIGITS_MAX+1, IMSI_64_FMT, iMSI64) +#define IMSI_TO_IMSI64(iMsI_t_PtR,iMsI_u64) \ + {\ + uint64_t mUlT = 1; \ + iMsI_u64 = (iMsI_t_PtR)->u.num.digit1; \ + if ((iMsI_t_PtR)->u.num.digit15 != 0xf) { \ + iMsI_u64 = (iMsI_t_PtR)->u.num.digit15 + \ + (iMsI_t_PtR)->u.num.digit14 *10 + \ + (iMsI_t_PtR)->u.num.digit13 *100 + \ + (iMsI_t_PtR)->u.num.digit12 *1000 + \ + (iMsI_t_PtR)->u.num.digit11 *10000 + \ + (iMsI_t_PtR)->u.num.digit10 *100000 + \ + (iMsI_t_PtR)->u.num.digit9 *1000000 + \ + (iMsI_t_PtR)->u.num.digit8 *10000000 + \ + (iMsI_t_PtR)->u.num.digit7 *100000000; \ + mUlT = 1000000000; \ + } else { \ + iMsI_u64 = (iMsI_t_PtR)->u.num.digit14 + \ + (iMsI_t_PtR)->u.num.digit13 *10 + \ + (iMsI_t_PtR)->u.num.digit12 *100 + \ + (iMsI_t_PtR)->u.num.digit11 *1000 + \ + (iMsI_t_PtR)->u.num.digit10 *10000 + \ + (iMsI_t_PtR)->u.num.digit9 *100000 + \ + (iMsI_t_PtR)->u.num.digit8 *1000000 + \ + (iMsI_t_PtR)->u.num.digit7 *10000000; \ + mUlT = 100000000; \ + } \ + if ((iMsI_t_PtR)->u.num.digit6 != 0xf) {\ + iMsI_u64 += (iMsI_t_PtR)->u.num.digit6 *mUlT; \ + iMsI_u64 += (iMsI_t_PtR)->u.num.digit5 *mUlT*10; \ + iMsI_u64 += (iMsI_t_PtR)->u.num.digit4 *mUlT*100; \ + iMsI_u64 += (iMsI_t_PtR)->u.num.digit3 *mUlT*1000; \ + iMsI_u64 += (iMsI_t_PtR)->u.num.digit2 *mUlT*10000; \ + iMsI_u64 += (iMsI_t_PtR)->u.num.digit1 *mUlT*100000; \ + } else { \ + iMsI_u64 += (iMsI_t_PtR)->u.num.digit5 *mUlT; \ + iMsI_u64 += (iMsI_t_PtR)->u.num.digit4 *mUlT*10; \ + iMsI_u64 += (iMsI_t_PtR)->u.num.digit3 *mUlT*100; \ + iMsI_u64 += (iMsI_t_PtR)->u.num.digit2 *mUlT*1000; \ + iMsI_u64 += (iMsI_t_PtR)->u.num.digit1 *mUlT*10000; \ + } \ + } +/*#define IMSI_TO_STRING(iMsI_t_PtR,iMsI_sTr, MaXlEn) \ + {\ + int l_offset = 0;\ + int l_ret = 0;\ + l_ret = snprintf(iMsI_sTr + l_offset, MaXlEn - l_offset, "%u%u%u%u%u",\ + (iMsI_t_PtR)->u.num.digit1, (iMsI_t_PtR)->u.num.digit2,\ + (iMsI_t_PtR)->u.num.digit3, (iMsI_t_PtR)->u.num.digit4,\ + (iMsI_t_PtR)->u.num.digit5);\ + if (((iMsI_t_PtR)->u.num.digit6 != 0xf) && (l_ret > 0)) {\ + l_offset += l_ret;\ + l_ret = snprintf(iMsI_sTr + l_offset, MaXlEn - l_offset, "%u", (iMsI_t_PtR)->u.num.digit6);\ + }\ + if (l_ret > 0) {\ + l_offset += l_ret;\ + l_ret = snprintf(iMsI_sTr + l_offset, MaXlEn - l_offset, "%u%u%u%u%u%u%u%u",\ + (iMsI_t_PtR)->u.num.digit7, (iMsI_t_PtR)->u.num.digit8,\ + (iMsI_t_PtR)->u.num.digit9, (iMsI_t_PtR)->u.num.digit10,\ + (iMsI_t_PtR)->u.num.digit11, (iMsI_t_PtR)->u.num.digit12,\ + (iMsI_t_PtR)->u.num.digit13, (iMsI_t_PtR)->u.num.digit14);\ + }\ + if (((iMsI_t_PtR)->u.num.digit15 != 0x0) && (l_ret > 0)) {\ + l_offset += l_ret;\ + l_ret = snprintf(iMsI_sTr + l_offset, MaXlEn - l_offset, "%u", (iMsI_t_PtR)->u.num.digit15);\ + }\ + }*/ + +#define IMSI_TO_STRING(iMsI_t_PtR,iMsI_sTr, MaXlEn) \ + do { \ + int l_i = 0; \ + int l_j = 0; \ + while((l_i < IMSI_BCD8_SIZE) && (l_j < MaXlEn - 1)){ \ + if((((iMsI_t_PtR)->u.value[l_i] & 0xf0) >> 4) > 9) \ + break; \ + sprintf(((iMsI_sTr) + l_j), "%u",(((iMsI_t_PtR)->u.value[l_i] & 0xf0) >> 4)); \ + l_j++; \ + if(((iMsI_t_PtR)->u.value[l_i] & 0xf) > 9 || (l_j >= MaXlEn - 1)) \ + break; \ + sprintf(((iMsI_sTr) + l_j), "%u", ((iMsI_t_PtR)->u.value[l_i] & 0xf)); \ + l_j++; \ + l_i++; \ + } \ + for(; l_j < MaXlEn; l_j++) \ + iMsI_sTr[l_j] = '\0'; \ + } while (0);\ + +#define IMEI_TO_STRING(iMeI_t_PtR,iMeI_sTr, MaXlEn) \ + {\ + int l_offset = 0;\ + int l_ret = 0;\ + l_ret = snprintf(iMeI_sTr + l_offset, MaXlEn - l_offset, "%u%u%u%u%u%u%u%u",\ + (iMeI_t_PtR)->u.num.tac1, (iMeI_t_PtR)->u.num.tac2,\ + (iMeI_t_PtR)->u.num.tac3, (iMeI_t_PtR)->u.num.tac4,\ + (iMeI_t_PtR)->u.num.tac5, (iMeI_t_PtR)->u.num.tac6,\ + (iMeI_t_PtR)->u.num.tac7, (iMeI_t_PtR)->u.num.tac8);\ + if (l_ret > 0) {\ + l_offset += l_ret;\ + l_ret = snprintf(iMeI_sTr + l_offset, MaXlEn - l_offset, "%u%u%u%u%u%u",\ + (iMeI_t_PtR)->u.num.snr1, (iMeI_t_PtR)->u.num.snr2,\ + (iMeI_t_PtR)->u.num.snr3, (iMeI_t_PtR)->u.num.snr4,\ + (iMeI_t_PtR)->u.num.snr5, (iMeI_t_PtR)->u.num.snr6);\ + }\ + if (((iMeI_t_PtR)->u.num.parity != 0x0) && (l_ret > 0)) {\ + l_offset += l_ret;\ + l_ret = snprintf(iMeI_sTr + l_offset, MaXlEn - l_offset, "%u", (iMeI_t_PtR)->u.num.cdsd);\ + }\ + } + +CORE_DECLARE(status_t) s1ap_build_setup_rsp(pkbuf_t **pkbuf); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif + diff --git a/lib/asn/test/Makefile.am b/test/Makefile.am similarity index 70% rename from lib/asn/test/Makefile.am rename to test/Makefile.am index 96a3cc827..e5922796b 100644 --- a/lib/asn/test/Makefile.am +++ b/test/Makefile.am @@ -1,27 +1,29 @@ ## Process this file with automake to produce Makefile.in. -bin_PROGRAMS = testasn +bin_PROGRAMS = testcellwire -testasn_SOURCES = \ +testcellwire_SOURCES = \ abts.h abts_tests.h testutil.h \ abts.c testutil.c \ s1ap_test.c -testasn_LDADD = \ +testcellwire_LDADD = \ $(top_srcdir)/lib/core/src/libcore.la \ $(top_srcdir)/lib/asn/src/libasn.la \ + $(top_srcdir)/src/libcellwire.la \ -lpthread -lsctp AM_CPPFLAGS = \ -I$(top_srcdir)/lib/core/include \ -I$(top_srcdir)/lib/asn/src/asn1c \ - -I$(top_srcdir)/lib/asn/src + -I$(top_srcdir)/lib/asn/src \ + -I$(top_srcdir)/src AM_CFLAGS = \ -Wall -Werror @OSCFLAGS@ \ -Wno-unused-function -TESTS = testasn +TESTS = testcellwire MAINTAINERCLEANFILES = Makefile.in MOSTLYCLEANFILES = core *.stackdump diff --git a/lib/asn/test/abts.c b/test/abts.c similarity index 100% rename from lib/asn/test/abts.c rename to test/abts.c diff --git a/lib/asn/test/abts.h b/test/abts.h similarity index 100% rename from lib/asn/test/abts.h rename to test/abts.h diff --git a/lib/asn/test/abts_tests.h b/test/abts_tests.h similarity index 100% rename from lib/asn/test/abts_tests.h rename to test/abts_tests.h diff --git a/lib/asn/test/s1ap_test.c b/test/s1ap_test.c similarity index 88% rename from lib/asn/test/s1ap_test.c rename to test/s1ap_test.c index 36906f2b5..57f0b90b9 100644 --- a/lib/asn/test/s1ap_test.c +++ b/test/s1ap_test.c @@ -68,17 +68,30 @@ static void s1ap_test3(abts_case *tc, void *data) ABTS_INT_EQUAL(tc, 0, result); } +static void s1ap_test4(abts_case *tc, void *data) +{ + status_t rv; + pkbuf_t *pkbuf; + + rv = s1ap_build_setup_rsp(&pkbuf); + printf("rv = %d\n", rv); + printf("pkbuf = %p\n", pkbuf); +} + abts_suite *test_s1ap(abts_suite *suite) { suite = ADD_SUITE(suite) { - extern int _decoder; - d_trace_level(&_decoder, 100); + extern int _s1dec; + d_trace_level(&_s1dec, 100); } abts_run_test(suite, s1ap_test1, NULL); abts_run_test(suite, s1ap_test2, NULL); abts_run_test(suite, s1ap_test3, NULL); +#if 0 + abts_run_test(suite, s1ap_test4, NULL); +#endif return suite; } diff --git a/lib/asn/test/testutil.c b/test/testutil.c similarity index 100% rename from lib/asn/test/testutil.c rename to test/testutil.c diff --git a/lib/asn/test/testutil.h b/test/testutil.h similarity index 100% rename from lib/asn/test/testutil.h rename to test/testutil.h