This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
pespin gerrit-no-reply at lists.osmocom.orgpespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-hnodeb/+/26001 )
Change subject: Allocate g_hnb as a pointer, move code to hnb.c/h
......................................................................
Allocate g_hnb as a pointer, move code to hnb.c/h
Change-Id: I5ec61d2a72d55d182e1498939209b30b6e652467
---
M include/osmocom/hnodeb/hnodeb.h
M src/osmo-hnodeb/Makefile.am
A src/osmo-hnodeb/hnb.c
M src/osmo-hnodeb/main.c
M src/osmo-hnodeb/vty.c
5 files changed, 178 insertions(+), 127 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-hnodeb refs/changes/01/26001/1
diff --git a/include/osmocom/hnodeb/hnodeb.h b/include/osmocom/hnodeb/hnodeb.h
index b283145..261fc3a 100644
--- a/include/osmocom/hnodeb/hnodeb.h
+++ b/include/osmocom/hnodeb/hnodeb.h
@@ -97,6 +97,8 @@
struct hnb_chan *chan;
} cs;
};
+struct hnb *hnb_alloc(void *tall_ctx);
+int hnb_connect(struct hnb *hnb);
void hnb_rx_iu_release(struct hnb *hnb);
void hnb_rx_paging(struct hnb *hnb, const char *imsi);
@@ -106,4 +108,4 @@
struct msgb *gen_initue_lu(int is_ps, uint32_t conn_id, const char *imsi);
extern void *tall_hnb_ctx;
-extern struct hnb g_hnb;
+extern struct hnb *g_hnb;
diff --git a/src/osmo-hnodeb/Makefile.am b/src/osmo-hnodeb/Makefile.am
index d782a4a..54c7083 100644
--- a/src/osmo-hnodeb/Makefile.am
+++ b/src/osmo-hnodeb/Makefile.am
@@ -32,6 +32,7 @@
main.c \
debug.c \
hnbap.c \
+ hnb.c \
ranap.c \
rua.c \
vty.c \
diff --git a/src/osmo-hnodeb/hnb.c b/src/osmo-hnodeb/hnb.c
new file mode 100644
index 0000000..335fd3a
--- /dev/null
+++ b/src/osmo-hnodeb/hnb.c
@@ -0,0 +1,161 @@
+/* (C) 2015 by Daniel Willmann <dwillmann at sysmocom.de>
+ * (C) 2021 by sysmocom - s.f.m.c. GmbH <info at sysmocom.de>
+ * Author: Pau Espin Pedrol <pespin at sysmocom.de>
+ * 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 <http://www.gnu.org/lienses/>.
+ *
+ */
+
+#include "config.h"
+
+#include <errno.h>
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netinet/sctp.h>
+#include <arpa/inet.h>
+
+#include <osmocom/core/socket.h>
+#include <osmocom/core/talloc.h>
+#include <osmocom/netif/stream.h>
+
+#include <osmocom/hnodeb/hnbap.h>
+#include <osmocom/hnodeb/rua.h>
+#include <osmocom/hnodeb/hnodeb.h>
+
+static int sctp_sock_init(int fd)
+{
+ struct sctp_event_subscribe event;
+ int rc;
+
+ /* subscribe for all events */
+ memset((uint8_t *)&event, 1, sizeof(event));
+ rc = setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS,
+ &event, sizeof(event));
+
+ return rc;
+}
+
+static int hnb_read_cb(struct osmo_fd *fd)
+{
+ struct hnb *hnb = 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 */
+ close(fd->fd);
+ osmo_fd_unregister(fd);
+ return rc;
+ } else if (rc == 0) {
+ LOGP(DMAIN, LOGL_INFO, "Connection to HNB closed\n");
+ close(fd->fd);
+ osmo_fd_unregister(fd);
+ fd->fd = -1;
+
+ return -1;
+ } else {
+ msgb_put(msg, rc);
+ }
+
+ if (flags & MSG_NOTIFICATION) {
+ LOGP(DMAIN, LOGL_DEBUG, "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 message received\n");
+ rc = hnb_hnbap_rx(hnb, msg);
+ break;
+ case IUH_PPI_RUA:
+ printf("RUA message received\n");
+ rc = hnb_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 *ctx = fd->data; */
+ struct sctp_sndrcvinfo sinfo = {
+ .sinfo_ppid = htonl(msgb_sctp_ppid(msg)),
+ .sinfo_stream = 0,
+ };
+ int rc;
+
+ printf("Sending: %s\n", osmo_hexdump(msgb_data(msg), msgb_length(msg)));
+ 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;
+}
+
+struct hnb *hnb_alloc(void *tall_ctx)
+{
+ struct hnb *hnb;
+ hnb = talloc_zero(tall_ctx, struct hnb);
+ if (!hnb)
+ return NULL;
+
+ hnb->gw_addr = "127.0.0.1",
+ hnb->gw_port = IUH_DEFAULT_SCTP_PORT,
+
+ osmo_wqueue_init(&hnb->wqueue, 16);
+ hnb->wqueue.bfd.data = hnb;
+ hnb->wqueue.read_cb = hnb_read_cb;
+ hnb->wqueue.write_cb = hnb_write_cb;
+
+ return hnb;
+}
+
+int hnb_connect(struct hnb *hnb)
+{
+ int rc;
+ rc = osmo_sock_init_ofd(&hnb->wqueue.bfd, AF_INET, SOCK_STREAM,
+ IPPROTO_SCTP, hnb->gw_addr,
+ hnb->gw_port, OSMO_SOCK_F_CONNECT);
+ if (rc < 0)
+ return rc;
+ sctp_sock_init(hnb->wqueue.bfd.fd);
+ return 0;
+}
diff --git a/src/osmo-hnodeb/main.c b/src/osmo-hnodeb/main.c
index 3abfc7c..dc662aa 100644
--- a/src/osmo-hnodeb/main.c
+++ b/src/osmo-hnodeb/main.c
@@ -28,20 +28,11 @@
#include <errno.h>
#include <signal.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <netinet/sctp.h>
-#include <arpa/inet.h>
-
#include <osmocom/core/application.h>
#include <osmocom/core/talloc.h>
#include <osmocom/core/select.h>
#include <osmocom/core/logging.h>
-#include <osmocom/core/socket.h>
#include <osmocom/core/msgb.h>
-#include <osmocom/core/write_queue.h>
-#include <osmocom/netif/stream.h>
#include <osmocom/gsm/tlv.h>
#include <osmocom/gsm/gsm48.h>
@@ -72,11 +63,7 @@
#include <osmocom/hnodeb/hnodeb.h>
void *tall_hnb_ctx;
-
-struct hnb g_hnb = {
- .gw_addr = "127.0.0.1",
- .gw_port = IUH_DEFAULT_SCTP_PORT,
-};
+struct hnb *g_hnb;
struct msgb *rua_new_udt(struct msgb *inmsg);
@@ -130,7 +117,7 @@
}
rua = rua_new_dt(chan->is_ps, chan->conn_id, txm);
- osmo_wqueue_enqueue(&g_hnb.wqueue, rua);
+ osmo_wqueue_enqueue(&hnb->wqueue, rua);
return 0;
}
@@ -360,105 +347,11 @@
extern void direct_transfer_nas_pdu_print(ANY_t *in);
-static int hnb_read_cb(struct osmo_fd *fd)
-{
- struct hnb *hnb = 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 */
- close(fd->fd);
- osmo_fd_unregister(fd);
- return rc;
- } else if (rc == 0) {
- LOGP(DMAIN, LOGL_INFO, "Connection to HNB closed\n");
- close(fd->fd);
- osmo_fd_unregister(fd);
- fd->fd = -1;
-
- return -1;
- } else {
- msgb_put(msg, rc);
- }
-
- if (flags & MSG_NOTIFICATION) {
- LOGP(DMAIN, LOGL_DEBUG, "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 message received\n");
- rc = hnb_hnbap_rx(hnb, msg);
- break;
- case IUH_PPI_RUA:
- printf("RUA message received\n");
- rc = hnb_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 *ctx = fd->data; */
- struct sctp_sndrcvinfo sinfo = {
- .sinfo_ppid = htonl(msgb_sctp_ppid(msg)),
- .sinfo_stream = 0,
- };
- int rc;
-
- printf("Sending: %s\n", osmo_hexdump(msgb_data(msg), msgb_length(msg)));
- 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 struct vty_app_info vty_info = {
.name = "OsmohNodeB",
.version = "0",
};
-static int sctp_sock_init(int fd)
-{
- struct sctp_event_subscribe event;
- int rc;
-
- /* subscribe for all events */
- memset((uint8_t *)&event, 1, sizeof(event));
- rc = setsockopt(fd, IPPROTO_SCTP, SCTP_EVENTS,
- &event, sizeof(event));
-
- return rc;
-}
-
struct msgb *gen_initue_lu(int is_ps, uint32_t conn_id, const char *imsi)
{
@@ -509,10 +402,10 @@
switch (c) {
case 'u':
- g_hnb.ues = atoi(optarg);
+ g_hnb->ues = atoi(optarg);
break;
case 'g':
- g_hnb.gw_addr = optarg;
+ g_hnb->gw_addr = optarg;
break;
}
}
@@ -538,6 +431,8 @@
log_set_print_category(osmo_stderr_target, 0);
log_set_print_category_hex(osmo_stderr_target, 0);
+ g_hnb = hnb_alloc(tall_hnb_ctx);
+
vty_init(&vty_info);
hnb_vty_init();
@@ -549,19 +444,11 @@
handle_options(argc, argv);
- osmo_wqueue_init(&g_hnb.wqueue, 16);
- g_hnb.wqueue.bfd.data = &g_hnb;
- g_hnb.wqueue.read_cb = hnb_read_cb;
- g_hnb.wqueue.write_cb = hnb_write_cb;
-
- rc = osmo_sock_init_ofd(&g_hnb.wqueue.bfd, AF_INET, SOCK_STREAM,
- IPPROTO_SCTP, g_hnb.gw_addr,
- g_hnb.gw_port, OSMO_SOCK_F_CONNECT);
+ rc = hnb_connect(g_hnb);
if (rc < 0) {
perror("Error connecting to Iuh port");
exit(1);
}
- sctp_sock_init(g_hnb.wqueue.bfd.fd);
while (1) {
rc = osmo_select_main(0);
diff --git a/src/osmo-hnodeb/vty.c b/src/osmo-hnodeb/vty.c
index a1bb885..b8dc7da 100644
--- a/src/osmo-hnodeb/vty.c
+++ b/src/osmo-hnodeb/vty.c
@@ -51,7 +51,7 @@
DEFUN(hnb_register, hnb_register_cmd,
"hnbap hnb register", HNBAP_STR HNB_STR "Send HNB-REGISTER REQUEST")
{
- hnb_send_register_req(&g_hnb);
+ hnb_send_register_req(g_hnb);
return CMD_SUCCESS;
}
@@ -59,7 +59,7 @@
DEFUN(hnb_deregister, hnb_deregister_cmd,
"hnbap hnb deregister", HNBAP_STR HNB_STR "Send HNB-DEREGISTER REQUEST")
{
- hnb_send_deregister_req(&g_hnb);
+ hnb_send_deregister_req(g_hnb);
return CMD_SUCCESS;
}
@@ -67,7 +67,7 @@
DEFUN(ue_register, ue_register_cmd,
"hnbap ue register IMSI", HNBAP_STR UE_STR "Send UE-REGISTER REQUEST")
{
- hnb_ue_register_tx(&g_hnb, argv[0]);
+ hnb_ue_register_tx(g_hnb, argv[0]);
return CMD_SUCCESS;
}
@@ -97,7 +97,7 @@
msg = ranap_new_msg_reset(is_ps, &cause);
rua = rua_new_udt(msg);
//msgb_free(msg);
- osmo_wqueue_enqueue(&g_hnb.wqueue, rua);
+ osmo_wqueue_enqueue(&g_hnb->wqueue, rua);
return CMD_SUCCESS;
}
@@ -124,13 +124,13 @@
msg = gen_initue_lu(chan->is_ps, chan->conn_id, chan->imsi);
rua = rua_new_conn(chan->is_ps, chan->conn_id, msg);
- osmo_wqueue_enqueue(&g_hnb.wqueue, rua);
+ osmo_wqueue_enqueue(&g_hnb->wqueue, rua);
vty->index = chan;
vty->node = CHAN_NODE;
if (!chan->is_ps)
- g_hnb.cs.chan = chan;
+ g_hnb->cs.chan = chan;
return CMD_SUCCESS;
--
To view, visit https://gerrit.osmocom.org/c/osmo-hnodeb/+/26001
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-hnodeb
Gerrit-Branch: master
Gerrit-Change-Id: I5ec61d2a72d55d182e1498939209b30b6e652467
Gerrit-Change-Number: 26001
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin at sysmocom.de>
Gerrit-MessageType: newchange
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20211027/c0cdaaba/attachment.htm>