From 97374c039b7094d48f9dcc48794db2aa3caf6f59 Mon Sep 17 00:00:00 2001 From: Daniel Willmann Date: Thu, 3 Dec 2015 09:37:58 +0100 Subject: tests: Add hnb-test to connect to hnbgw and tests its functions Only connects currently --- src/tests/Makefile | 14 +++- src/tests/hnb-test.c | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++ src/tests/hnb-test.h | 64 ++++++++++++++++++ 3 files changed, 256 insertions(+), 1 deletion(-) create mode 100644 src/tests/hnb-test.c create mode 100644 src/tests/hnb-test.h diff --git a/src/tests/Makefile b/src/tests/Makefile index 1c9f63d..0cedab9 100644 --- a/src/tests/Makefile +++ b/src/tests/Makefile @@ -3,10 +3,22 @@ PKG_INCLUDES:=$(shell pkg-config --cflags libosmocore libosmovty libosmogsm liba PKG_LDFLAGS:=$(shell pkg-config --libs libosmocore libosmovty libosmogsm libasn1c) CFLAGS:=-g -Wall $(PKG_INCLUDES) -I.. -I../hnbap -LDFLAGS:=$(PKG_LDFLAGS) +LDFLAGS:=$(PKG_LDFLAGS) -lsctp test-helpers: ../iu_helpers.o ../asn1helpers.o test-helpers.c $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ test-hnbap: ../iu_helpers.o ../asn1helpers.o ../hnbap_common.o ../hnbap_decoder.o test-hnbap.c ../hnbap/libosmo-asn1-hnbap.a $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ + +HNBAP_OBJS=../hnbap_encoder.o ../hnbap_decoder.o ../hnbap_common.o +RUA_OBJS=../rua_encoder.o ../rua_decoder.o ../rua_common.o +RANAP_OBJS=../ranap_common.o #ranap_encoder.o ranap_decoder.o + +LIBS=../hnbap/libosmo-asn1-hnbap.a ../rua/libosmo-asn1-rua.a ../ranap/libosmo-asn1-ranap.a + +hnb-test: $(HNBAP_OBJS) $(RUA_OBJS) $(RANAP_OBJS) ../iu_helpers.o ../asn1helpers.o hnb-test.o $(LIBS) + $(CC) $(LDFLAGS) -o $@ $^ + +clean: + @rm -f hnb-test test-helpers test-hnbap *.o diff --git a/src/tests/hnb-test.c b/src/tests/hnb-test.c new file mode 100644 index 0000000..583222a --- /dev/null +++ b/src/tests/hnb-test.c @@ -0,0 +1,179 @@ +/* Test HNB */ + +/* (C) 2015 by Daniel Willmann + * (C) 2015 by Sysmocom s.f.m.c. GmbH + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#include "hnb-test.h" + +static void *tall_hnb_ctx; +void *talloc_asn1_ctx; + +struct hnb_test g_hnb_test = { + .gw_port = IUH_DEFAULT_SCTP_PORT, +}; + +static int hnb_read_cb(struct osmo_fd *fd) +{ + struct hnb_test *hnb_test = fd->data; + struct sctp_sndrcvinfo sinfo; + struct msgb *msg = msgb_alloc(IUH_MSGB_SIZE, "Iuh rx"); + int flags = 0; + int rc; + + if (!msg) + return -ENOMEM; + + rc = sctp_recvmsg(fd->fd, msgb_data(msg), msgb_tailroom(msg), + NULL, NULL, &sinfo, &flags); + if (rc < 0) { + LOGP(DMAIN, LOGL_ERROR, "Error during sctp_recvmsg()\n"); + /* FIXME: clean up after disappeared HNB */ + return rc; + } else + msgb_put(msg, rc); + + if (flags & MSG_NOTIFICATION) { + LOGP(DMAIN, LOGL_INFO, "Ignoring SCTP notification\n"); + msgb_free(msg); + return 0; + } + + sinfo.sinfo_ppid = ntohl(sinfo.sinfo_ppid); + + switch (sinfo.sinfo_ppid) { + case IUH_PPI_HNBAP: + printf("HNBAP mesage received\n"); +// rc = hnbgw_hnbap_rx(hnb, msg); + break; + case IUH_PPI_RUA: + printf("RUA mesage received\n"); +// rc = hnbgw_rua_rx(hnb, msg); + break; + case IUH_PPI_SABP: + case IUH_PPI_RNA: + case IUH_PPI_PUA: + LOGP(DMAIN, LOGL_ERROR, "Unimplemented SCTP PPID=%u received\n", + sinfo.sinfo_ppid); + rc = 0; + break; + default: + LOGP(DMAIN, LOGL_ERROR, "Unknown SCTP PPID=%u received\n", + sinfo.sinfo_ppid); + rc = 0; + break; + } + + msgb_free(msg); + return rc; +} + +static int hnb_write_cb(struct osmo_fd *fd, struct msgb *msg) +{ + struct hnb_test *ctx = fd->data; + struct sctp_sndrcvinfo sinfo = { + .sinfo_ppid = htonl(msgb_ppid(msg)), + .sinfo_stream = 0, + }; + int rc; + + rc = sctp_send(fd->fd, msgb_data(msg), msgb_length(msg), + &sinfo, 0); + /* we don't need to msgb_free(), write_queue does this for us */ + return rc; +} + +static const struct log_info_cat log_cat[] = { + [DMAIN] = { + .name = "DMAIN", .loglevel = LOGL_DEBUG, .enabled = 1, + .color = "", + .description = "Main program", + }, +}; + +static const struct log_info hnb_test_log_info = { + .cat = log_cat, + .num_cat = ARRAY_SIZE(log_cat), +}; + +static struct vty_app_info vty_info = { + .name = "OsmoHNB-Test", + .version = "0", +}; + +int main(int argc, const char *argv) +{ + int rc; + + tall_hnb_ctx = talloc_named_const(NULL, 0, "hnb_context"); + talloc_asn1_ctx = talloc_named_const(NULL, 0, "asn1_context"); + + rc = osmo_init_logging(&hnb_test_log_info); + if (rc < 0) + exit(1); + + vty_init(&vty_info); + + osmo_wqueue_init(&g_hnb_test.wqueue, 16); + g_hnb_test.wqueue.bfd.data = &g_hnb_test; + g_hnb_test.wqueue.read_cb = hnb_read_cb; + g_hnb_test.wqueue.write_cb = hnb_write_cb; + + rc = osmo_sock_init_ofd(&g_hnb_test.wqueue.bfd, AF_INET, SOCK_STREAM, + IPPROTO_SCTP, "127.0.0.1", + g_hnb_test.gw_port, OSMO_SOCK_F_CONNECT); + if (rc < 0) { + perror("Error connecting to Iuh port"); + exit(1); + } +// sctp_sock_init(g_hnb_test.conn_fd); + + while (1) { + rc = osmo_select_main(0); + if (rc < 0) + exit(3); + } + + /* not reached */ + exit(0); +} diff --git a/src/tests/hnb-test.h b/src/tests/hnb-test.h new file mode 100644 index 0000000..6a8491e --- /dev/null +++ b/src/tests/hnb-test.h @@ -0,0 +1,64 @@ +#pragma once + +#include +#include +#include + +#define DEBUG +#include + +#define msgb_ppid(msg) (msg)->cb[0] + +enum { + DMAIN, +}; + + +/* 25.467 Section 7.1 */ +#define IUH_DEFAULT_SCTP_PORT 29169 +#define RNA_DEFAULT_SCTP_PORT 25471 + +#define IUH_PPI_RUA 19 +#define IUH_PPI_HNBAP 20 +#define IUH_PPI_SABP 31 +#define IUH_PPI_RNA 42 +#define IUH_PPI_PUA 55 + +#define IUH_MSGB_SIZE 2048 + +struct umts_cell_id { + uint16_t mcc; /*!< Mobile Country Code */ + uint16_t mnc; /*!< Mobile Network Code */ + uint16_t lac; /*!< Locaton Area Code */ + uint16_t rac; /*!< Routing Area Code */ + uint16_t sac; /*!< Service Area Code */ + uint32_t cid; /*!< Cell ID */ +}; + +struct ue_context { + /*! Entry in the HNB-global list of UE */ + struct llist_head list; + /*! Unique Context ID for this UE */ + uint32_t context_id; + char imsi[16+1]; +}; + +struct hnb_test { + uint16_t gw_port; + /*! SCTP listen socket for incoming connections */ + struct osmo_fd conn_fd; + + /*! SCTP socket + write queue for Iuh to this specific HNB */ + struct osmo_wqueue wqueue; + /*! copied from HNB-Identity-Info IE */ + char identity_info[256]; + /*! copied from Cell Identity IE */ + struct umts_cell_id id; + + /*! SCTP stream ID for HNBAP */ + uint16_t hnbap_stream; + /*! SCTP stream ID for RUA */ + uint16_t rua_stream; +}; + +extern struct hnb_test g_hnb_test; -- cgit v1.2.3