osmith has submitted this change. ( https://gerrit.osmocom.org/c/osmo-bsc-nat/+/27478 )
Change subject: README: add Manual Testing With osmo-dev
......................................................................
README: add Manual Testing With osmo-dev
Describe the manual testing that can be done with osmo-dev with the
changes up to I78ef36c72ff9a7b801e922eccc89dc44fbba7f23.
Related: SYS#5560
Change-Id: I3c3369b6d1a50ec3af19ee826cf2f94530d5d7fd
---
M README.md
1 file changed, 23 insertions(+), 0 deletions(-)
Approvals:
osmith: Looks good to me, approved; Verified
laforge: Looks good to me, approved
pespin: Looks good to me, but someone else must approve
diff --git a/README.md b/README.md
index 8ed9954..ca367a2 100644
--- a/README.md
+++ b/README.md
@@ -42,6 +42,29 @@
[Osmocom Mailing List Rules](https://osmocom.org/projects/cellular-infrastructure/wiki/Mailing_Li…
when posting.
+Manual Testing With osmo-dev
+----------
+
+With [osmo-dev](https://git.osmocom.org/osmo-dev/) it is possible to
+build all Osmocom components for a full test network with OsmoBSCNAT,
+and run the network on your PC. Set up the make directory as described
+in osmo-dev's README, then build components with:
+
+```
+$ make cn-bsc-nat
+```
+
+Set up a network as described in osmo-dev's net/README, then put the
+following in your configuration to let it run osmo-bsc-nat with one
+virtual BSC, BTS and MS (can be used next to a real BSC/BTS/MS):
+
+```
+BSC_COUNT=2
+BTS1_RUN_IN_OSMO_DEV=1
+STP_RAN_IP="127.0.0.2"
+MS_RUN_IN_OSMO_DEV=1
+```
+
Contributing
------------
--
To view, visit https://gerrit.osmocom.org/c/osmo-bsc-nat/+/27478
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-bsc-nat
Gerrit-Branch: master
Gerrit-Change-Id: I3c3369b6d1a50ec3af19ee826cf2f94530d5d7fd
Gerrit-Change-Number: 27478
Gerrit-PatchSet: 5
Gerrit-Owner: osmith <osmith(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: osmith <osmith(a)sysmocom.de>
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: merged
osmith has submitted this change. ( https://gerrit.osmocom.org/c/osmo-bsc-nat/+/27472 )
Change subject: Store BSCs
......................................................................
Store BSCs
Once a BSC has sent a RESET to BSCNAT, store it. This will be used in
future patches to build connection mappings between MSC and BSCs, and to
block messages from BSCs that did not send a RESET.
I've considered using a FSM, but at least right now there doesn't seem
to be multiple states worth storing. We only have the BSC before it has
done the RESET (and then it's simply not in our list) and after it did
the RESET (in the list).
Don't use the stored BSCs in the forwarding logic just yet, a future
commit will replace the current forwarding code with proper connection
mappings.
Related: SYS#5560
Change-Id: Icd7316c49ef26fb45ad45a2ccc1a7916bfb0a387
---
M include/osmocom/bsc_nat/Makefile.am
A include/osmocom/bsc_nat/bsc.h
M include/osmocom/bsc_nat/bsc_nat.h
M src/osmo-bsc-nat/Makefile.am
A src/osmo-bsc-nat/bsc.c
M src/osmo-bsc-nat/bsc_nat.c
M src/osmo-bsc-nat/bssap.c
7 files changed, 110 insertions(+), 0 deletions(-)
Approvals:
Jenkins Builder: Verified
pespin: Looks good to me, but someone else must approve
laforge: Looks good to me, approved
diff --git a/include/osmocom/bsc_nat/Makefile.am b/include/osmocom/bsc_nat/Makefile.am
index 76aada0..398b0aa 100644
--- a/include/osmocom/bsc_nat/Makefile.am
+++ b/include/osmocom/bsc_nat/Makefile.am
@@ -1,4 +1,5 @@
noinst_HEADERS = \
+ bsc.h \
bsc_nat.h \
bsc_nat_fsm.h \
bssap.h \
diff --git a/include/osmocom/bsc_nat/bsc.h b/include/osmocom/bsc_nat/bsc.h
new file mode 100644
index 0000000..34590b9
--- /dev/null
+++ b/include/osmocom/bsc_nat/bsc.h
@@ -0,0 +1,31 @@
+/* (C) 2021 by sysmocom - s.f.m.c. GmbH <info(a)sysmocom.de>
+ * Author: Oliver Smith <osmith(a)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/>.
+ *
+ */
+
+#pragma once
+
+#include <osmocom/sigtran/sccp_sap.h>
+
+struct bsc {
+ struct llist_head list;
+ struct osmo_sccp_addr addr;
+};
+
+struct bsc *bsc_alloc(struct osmo_sccp_addr *addr);
+struct bsc *bsc_get_by_pc(uint32_t pointcode);
+void bsc_free(struct bsc *bsc);
diff --git a/include/osmocom/bsc_nat/bsc_nat.h b/include/osmocom/bsc_nat/bsc_nat.h
index 3d863f1..aac06ab 100644
--- a/include/osmocom/bsc_nat/bsc_nat.h
+++ b/include/osmocom/bsc_nat/bsc_nat.h
@@ -44,6 +44,7 @@
struct {
struct bsc_nat_sccp_inst *sccp_inst;
+ struct llist_head bscs; /* list of struct bsc */
} ran;
};
diff --git a/src/osmo-bsc-nat/Makefile.am b/src/osmo-bsc-nat/Makefile.am
index 445c098..bb8e990 100644
--- a/src/osmo-bsc-nat/Makefile.am
+++ b/src/osmo-bsc-nat/Makefile.am
@@ -25,6 +25,7 @@
$(NULL)
osmo_bsc_nat_SOURCES = \
+ bsc.c \
bsc_nat.c \
bsc_nat_fsm.c \
bssap.c \
diff --git a/src/osmo-bsc-nat/bsc.c b/src/osmo-bsc-nat/bsc.c
new file mode 100644
index 0000000..2ad6e0e
--- /dev/null
+++ b/src/osmo-bsc-nat/bsc.c
@@ -0,0 +1,59 @@
+/* (C) 2021 by sysmocom - s.f.m.c. GmbH <info(a)sysmocom.de>
+ * Author: Oliver Smith <osmith(a)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 <osmocom/bsc_nat/bsc.h>
+#include <osmocom/bsc_nat/bsc_nat.h>
+#include <osmocom/bsc_nat/logging.h>
+
+struct bsc *bsc_alloc(struct osmo_sccp_addr *addr)
+{
+ struct bsc *bsc = talloc_zero(g_bsc_nat, struct bsc);
+
+ OSMO_ASSERT(bsc);
+ talloc_set_name(bsc, "BSC(PC=%s)", osmo_ss7_pointcode_print(NULL, addr->pc));
+
+ LOGP(DMAIN, LOGL_DEBUG, "Add %s\n", talloc_get_name(bsc));
+
+ bsc->addr = *addr;
+
+ INIT_LLIST_HEAD(&bsc->list);
+ llist_add(&bsc->list, &g_bsc_nat->ran.bscs);
+
+ return bsc;
+}
+
+struct bsc *bsc_get_by_pc(uint32_t pointcode)
+{
+ struct bsc *bsc;
+
+ llist_for_each_entry(bsc, &g_bsc_nat->ran.bscs, list) {
+ if (bsc->addr.pc == pointcode)
+ return bsc;
+ }
+
+ return NULL;
+}
+
+void bsc_free(struct bsc *bsc)
+{
+ LOGP(DMAIN, LOGL_DEBUG, "Del %s\n", talloc_get_name(bsc));
+ llist_del(&bsc->list);
+ talloc_free(bsc);
+}
diff --git a/src/osmo-bsc-nat/bsc_nat.c b/src/osmo-bsc-nat/bsc_nat.c
index 409bf74..8baa096 100644
--- a/src/osmo-bsc-nat/bsc_nat.c
+++ b/src/osmo-bsc-nat/bsc_nat.c
@@ -20,8 +20,10 @@
#include "config.h"
#include <osmocom/core/talloc.h>
#include <osmocom/core/utils.h>
+#include <osmocom/bsc_nat/bsc.h>
#include <osmocom/bsc_nat/bsc_nat.h>
#include <osmocom/bsc_nat/bsc_nat_fsm.h>
+#include <osmocom/bsc_nat/logging.h>
struct bsc_nat *bsc_nat_alloc(void *tall_ctx)
{
@@ -38,6 +40,8 @@
OSMO_ASSERT(bsc_nat->ran.sccp_inst);
talloc_set_name_const(bsc_nat->ran.sccp_inst, "struct bsc_nat_sccp_inst (RAN)");
+ INIT_LLIST_HEAD(&bsc_nat->ran.bscs);
+
bsc_nat_fsm_alloc(bsc_nat);
return bsc_nat;
@@ -45,11 +49,17 @@
void bsc_nat_free(struct bsc_nat *bsc_nat)
{
+ struct bsc *bsc, *b;
+
if (bsc_nat->fi) {
osmo_fsm_inst_free(bsc_nat->fi);
bsc_nat->fi = NULL;
}
+ llist_for_each_entry_safe(bsc, b, &bsc_nat->ran.bscs, list) {
+ bsc_free(bsc);
+ }
+
talloc_free(bsc_nat);
}
diff --git a/src/osmo-bsc-nat/bssap.c b/src/osmo-bsc-nat/bssap.c
index e5c8ca2..83eec99 100644
--- a/src/osmo-bsc-nat/bssap.c
+++ b/src/osmo-bsc-nat/bssap.c
@@ -22,12 +22,19 @@
#include <osmocom/gsm/gsm0808.h>
#include <osmocom/sigtran/sccp_helpers.h>
#include <osmocom/sigtran/sccp_sap.h>
+#include <osmocom/bsc_nat/bsc.h>
#include <osmocom/bsc_nat/bsc_nat.h>
#include <osmocom/bsc_nat/logging.h>
static int bssap_ran_handle_reset(struct osmo_sccp_addr *addr, struct msgb *msg, unsigned int length)
{
struct bsc_nat_sccp_inst *sccp_inst = g_bsc_nat->ran.sccp_inst;
+ struct bsc *bsc;
+
+ /* Store the BSC, since RESET was done the BSCNAT should accept its messages */
+ bsc = bsc_get_by_pc(addr->pc);
+ if (!bsc)
+ bsc = bsc_alloc(addr);
LOGP(DMAIN, LOGL_NOTICE, "Rx RESET from %s\n", bsc_nat_print_addr_ran(addr));
--
To view, visit https://gerrit.osmocom.org/c/osmo-bsc-nat/+/27472
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-bsc-nat
Gerrit-Branch: master
Gerrit-Change-Id: Icd7316c49ef26fb45ad45a2ccc1a7916bfb0a387
Gerrit-Change-Number: 27472
Gerrit-PatchSet: 4
Gerrit-Owner: osmith <osmith(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: osmith <osmith(a)sysmocom.de>
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: merged
osmith has submitted this change. ( https://gerrit.osmocom.org/c/osmo-bsc-nat/+/27473 )
Change subject: Store MSC
......................................................................
Store MSC
Expect one MSC to be configured in the address book (part of the cs7
section in the config, see doc/examples/osmo-bsc-nat/osmo-bsc-nat.cfg)
and store it on start up.
Store the MSC in a list, as we may potentially support multiple MSCs in
the future. Also that makes it symmetric to the BSC list.
Don't use the stored MSCs in the forwarding logic just yet, a future
commit will replace the current forwarding code with proper connection
mappings.
Related: SYS#5560
Change-Id: I711df0c649728f1007857fbfda500ed5ef69287b
---
M include/osmocom/bsc_nat/Makefile.am
M include/osmocom/bsc_nat/bsc_nat.h
A include/osmocom/bsc_nat/msc.h
M src/osmo-bsc-nat/Makefile.am
M src/osmo-bsc-nat/bsc_nat.c
M src/osmo-bsc-nat/bsc_nat_fsm.c
M src/osmo-bsc-nat/main.c
A src/osmo-bsc-nat/msc.c
8 files changed, 120 insertions(+), 16 deletions(-)
Approvals:
Jenkins Builder: Verified
pespin: Looks good to me, but someone else must approve
laforge: Looks good to me, approved
diff --git a/include/osmocom/bsc_nat/Makefile.am b/include/osmocom/bsc_nat/Makefile.am
index 398b0aa..1c675f7 100644
--- a/include/osmocom/bsc_nat/Makefile.am
+++ b/include/osmocom/bsc_nat/Makefile.am
@@ -4,5 +4,6 @@
bsc_nat_fsm.h \
bssap.h \
logging.h \
+ msc.h \
vty.h \
$(NULL)
diff --git a/include/osmocom/bsc_nat/bsc_nat.h b/include/osmocom/bsc_nat/bsc_nat.h
index aac06ab..9e58a79 100644
--- a/include/osmocom/bsc_nat/bsc_nat.h
+++ b/include/osmocom/bsc_nat/bsc_nat.h
@@ -40,6 +40,7 @@
struct {
struct bsc_nat_sccp_inst *sccp_inst;
+ struct llist_head mscs; /* list of struct msc */
} cn;
struct {
diff --git a/include/osmocom/bsc_nat/msc.h b/include/osmocom/bsc_nat/msc.h
new file mode 100644
index 0000000..1f91de0
--- /dev/null
+++ b/include/osmocom/bsc_nat/msc.h
@@ -0,0 +1,34 @@
+/* (C) 2021 by sysmocom - s.f.m.c. GmbH <info(a)sysmocom.de>
+ * Author: Oliver Smith <osmith(a)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/>.
+ *
+ */
+
+#pragma once
+
+#include <osmocom/sigtran/sccp_sap.h>
+
+struct msc {
+ struct llist_head list;
+ struct osmo_sccp_addr addr;
+};
+
+struct msc *msc_alloc(struct osmo_sccp_addr *addr);
+int msc_alloc_from_addr_book(void);
+
+struct msc *msc_get(void);
+
+void msc_free(struct msc *msc);
diff --git a/src/osmo-bsc-nat/Makefile.am b/src/osmo-bsc-nat/Makefile.am
index bb8e990..1dd82fd 100644
--- a/src/osmo-bsc-nat/Makefile.am
+++ b/src/osmo-bsc-nat/Makefile.am
@@ -31,6 +31,7 @@
bssap.c \
logging.c \
main.c \
+ msc.c \
vty.c \
$(NULL)
diff --git a/src/osmo-bsc-nat/bsc_nat.c b/src/osmo-bsc-nat/bsc_nat.c
index 8baa096..23d7498 100644
--- a/src/osmo-bsc-nat/bsc_nat.c
+++ b/src/osmo-bsc-nat/bsc_nat.c
@@ -24,6 +24,7 @@
#include <osmocom/bsc_nat/bsc_nat.h>
#include <osmocom/bsc_nat/bsc_nat_fsm.h>
#include <osmocom/bsc_nat/logging.h>
+#include <osmocom/bsc_nat/msc.h>
struct bsc_nat *bsc_nat_alloc(void *tall_ctx)
{
@@ -40,6 +41,7 @@
OSMO_ASSERT(bsc_nat->ran.sccp_inst);
talloc_set_name_const(bsc_nat->ran.sccp_inst, "struct bsc_nat_sccp_inst (RAN)");
+ INIT_LLIST_HEAD(&bsc_nat->cn.mscs);
INIT_LLIST_HEAD(&bsc_nat->ran.bscs);
bsc_nat_fsm_alloc(bsc_nat);
@@ -49,6 +51,7 @@
void bsc_nat_free(struct bsc_nat *bsc_nat)
{
+ struct msc *msc, *m;
struct bsc *bsc, *b;
if (bsc_nat->fi) {
@@ -56,6 +59,10 @@
bsc_nat->fi = NULL;
}
+ llist_for_each_entry_safe(msc, m, &bsc_nat->cn.mscs, list) {
+ msc_free(msc);
+ }
+
llist_for_each_entry_safe(bsc, b, &bsc_nat->ran.bscs, list) {
bsc_free(bsc);
}
diff --git a/src/osmo-bsc-nat/bsc_nat_fsm.c b/src/osmo-bsc-nat/bsc_nat_fsm.c
index 07b9eb5..4193ae9 100644
--- a/src/osmo-bsc-nat/bsc_nat_fsm.c
+++ b/src/osmo-bsc-nat/bsc_nat_fsm.c
@@ -186,22 +186,7 @@
case OSMO_PRIM(OSMO_SCU_PRIM_N_UNITDATA, PRIM_OP_INDICATION):
/* connection-less data received */
- addr = &prim->u.unitdata.calling_addr;
-
- if (sccp_sap_get_peer_addr_out(sccp_inst, addr, &peer_addr_out) < 0)
- goto error;
-
- LOGP(DMAIN, LOGL_DEBUG, "Fwd to %s\n", bsc_nat_print_addr_ran(&peer_addr_out));
-
- /* oph->msg stores oph and unitdata msg. Move oph->msg->data to
- * unitdata msg and send it again. */
- msgb_pull_to_l2(oph->msg);
- osmo_sccp_tx_unitdata(g_bsc_nat->ran.sccp_inst->scu,
- &g_bsc_nat->ran.sccp_inst->addr,
- &peer_addr_out,
- oph->msg->data,
- msgb_length(oph->msg));
- rc = 0;
+ rc = bssap_handle_udt(sccp_inst, &prim->u.unitdata.calling_addr, oph->msg, msgb_l2len(oph->msg));
break;
default:
diff --git a/src/osmo-bsc-nat/main.c b/src/osmo-bsc-nat/main.c
index c0b65ea..6cb1e0f 100644
--- a/src/osmo-bsc-nat/main.c
+++ b/src/osmo-bsc-nat/main.c
@@ -30,6 +30,7 @@
#include <osmocom/bsc_nat/bsc_nat.h>
#include <osmocom/bsc_nat/bsc_nat_fsm.h>
#include <osmocom/bsc_nat/logging.h>
+#include <osmocom/bsc_nat/msc.h>
#include <osmocom/bsc_nat/vty.h>
static const char *const copyright =
@@ -199,6 +200,9 @@
bsc_nat_fsm_start(g_bsc_nat);
+ if (msc_alloc_from_addr_book() < 0)
+ exit(1);
+
while (!osmo_select_shutdown_done())
osmo_select_main_ctx(0);
diff --git a/src/osmo-bsc-nat/msc.c b/src/osmo-bsc-nat/msc.c
new file mode 100644
index 0000000..70f9d76
--- /dev/null
+++ b/src/osmo-bsc-nat/msc.c
@@ -0,0 +1,71 @@
+/* (C) 2021 by sysmocom - s.f.m.c. GmbH <info(a)sysmocom.de>
+ * Author: Oliver Smith <osmith(a)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 <osmocom/bsc_nat/msc.h>
+#include <osmocom/bsc_nat/bsc_nat.h>
+#include <osmocom/bsc_nat/logging.h>
+
+struct msc *msc_alloc(struct osmo_sccp_addr *addr)
+{
+ struct msc *msc = talloc_zero(g_bsc_nat, struct msc);
+
+ OSMO_ASSERT(msc);
+ talloc_set_name(msc, "MSC(PC=%s)", osmo_ss7_pointcode_print(NULL, addr->pc));
+
+ LOGP(DMAIN, LOGL_DEBUG, "Add %s\n", talloc_get_name(msc));
+
+ msc->addr = *addr;
+
+ INIT_LLIST_HEAD(&msc->list);
+ llist_add(&msc->list, &g_bsc_nat->cn.mscs);
+
+ return msc;
+}
+
+int msc_alloc_from_addr_book(void)
+{
+ struct osmo_sccp_addr addr;
+
+ /* For now only one MSC is supported */
+ if (osmo_sccp_addr_by_name_local(&addr, "msc", g_bsc_nat->cn.sccp_inst->ss7_inst) < 0) {
+ LOGP(DMAIN, LOGL_ERROR, "Configuration error, MSC not found in address book\n");
+ return -ENOENT;
+ }
+
+ msc_alloc(&addr);
+ return 0;
+}
+
+struct msc *msc_get(void)
+{
+ /* For now only one MSC is supported */
+
+ OSMO_ASSERT(!llist_empty(&g_bsc_nat->cn.mscs));
+
+ return llist_first_entry(&g_bsc_nat->cn.mscs, struct msc, list);
+}
+
+void msc_free(struct msc *msc)
+{
+ LOGP(DMAIN, LOGL_DEBUG, "Del %s\n", talloc_get_name(msc));
+ llist_del(&msc->list);
+ talloc_free(msc);
+}
--
To view, visit https://gerrit.osmocom.org/c/osmo-bsc-nat/+/27473
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-bsc-nat
Gerrit-Branch: master
Gerrit-Change-Id: I711df0c649728f1007857fbfda500ed5ef69287b
Gerrit-Change-Number: 27473
Gerrit-PatchSet: 4
Gerrit-Owner: osmith <osmith(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: osmith <osmith(a)sysmocom.de>
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: merged
osmith has submitted this change. ( https://gerrit.osmocom.org/c/osmo-bsc-nat/+/27471 )
Change subject: Reply to BSC's RESET with RESET ACK directly
......................................................................
Reply to BSC's RESET with RESET ACK directly
Let the BSCNAT directly reply to RESET sent from BSC with RESET ACK.
bssap_ran_handle_reset() is a bit empty right now but will be used in a
future patch to store the BSC.
Related: SYS#5560
Related: https://osmocom.org/projects/osmo-bscnat/wiki/AoIP_OsmoBSCNAT#RESET
Change-Id: I3223409e25c93b625d67634caf68efe9772e2558
---
M include/osmocom/bsc_nat/Makefile.am
A include/osmocom/bsc_nat/bssap.h
M src/osmo-bsc-nat/Makefile.am
M src/osmo-bsc-nat/bsc_nat_fsm.c
A src/osmo-bsc-nat/bssap.c
5 files changed, 130 insertions(+), 1 deletion(-)
Approvals:
Jenkins Builder: Verified
pespin: Looks good to me, but someone else must approve
laforge: Looks good to me, approved
diff --git a/include/osmocom/bsc_nat/Makefile.am b/include/osmocom/bsc_nat/Makefile.am
index 90f44a7..76aada0 100644
--- a/include/osmocom/bsc_nat/Makefile.am
+++ b/include/osmocom/bsc_nat/Makefile.am
@@ -1,6 +1,7 @@
noinst_HEADERS = \
bsc_nat.h \
bsc_nat_fsm.h \
+ bssap.h \
logging.h \
vty.h \
$(NULL)
diff --git a/include/osmocom/bsc_nat/bssap.h b/include/osmocom/bsc_nat/bssap.h
new file mode 100644
index 0000000..996cb69
--- /dev/null
+++ b/include/osmocom/bsc_nat/bssap.h
@@ -0,0 +1,25 @@
+/* (C) 2022 by sysmocom - s.f.m.c. GmbH <info(a)sysmocom.de>
+ * Author: Oliver Smith <osmith(a)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/>.
+ *
+ */
+
+#pragma once
+
+#include <osmocom/bsc_nat/bsc_nat.h>
+
+int bssap_handle_udt(struct bsc_nat_sccp_inst *sccp_inst, struct osmo_sccp_addr *addr, struct msgb *msgb,
+ unsigned int length);
diff --git a/src/osmo-bsc-nat/Makefile.am b/src/osmo-bsc-nat/Makefile.am
index 6a759cb..445c098 100644
--- a/src/osmo-bsc-nat/Makefile.am
+++ b/src/osmo-bsc-nat/Makefile.am
@@ -27,6 +27,7 @@
osmo_bsc_nat_SOURCES = \
bsc_nat.c \
bsc_nat_fsm.c \
+ bssap.c \
logging.c \
main.c \
vty.c \
diff --git a/src/osmo-bsc-nat/bsc_nat_fsm.c b/src/osmo-bsc-nat/bsc_nat_fsm.c
index 4ce60ce..0c36607 100644
--- a/src/osmo-bsc-nat/bsc_nat_fsm.c
+++ b/src/osmo-bsc-nat/bsc_nat_fsm.c
@@ -27,6 +27,7 @@
#include <osmocom/sigtran/sccp_helpers.h>
#include <osmocom/bsc_nat/bsc_nat.h>
#include <osmocom/bsc_nat/bsc_nat_fsm.h>
+#include <osmocom/bsc_nat/bssap.h>
#include <osmocom/bsc_nat/logging.h>
#define DEFAULT_PC_RAN "0.23.1" /* same as default for OsmoMSC */
@@ -299,6 +300,10 @@
case OSMO_PRIM(OSMO_SCU_PRIM_N_UNITDATA, PRIM_OP_INDICATION):
/* connection-less data received */
+ rc = bssap_handle_udt(sccp_inst, &prim->u.unitdata.calling_addr, oph->msg, msgb_l2len(oph->msg));
+
+ /* FIXME: don't forward this to the MSC anymore, as soon as the
+ * BSCNAT is able to do the RESET to MSC by itself. */
addr = &prim->u.unitdata.calling_addr;
if (sccp_sap_get_peer_addr_out(sccp_inst, addr, &peer_addr_out) < 0)
@@ -314,7 +319,6 @@
&peer_addr_out,
oph->msg->data,
msgb_length(oph->msg));
- rc = 0;
break;
default:
diff --git a/src/osmo-bsc-nat/bssap.c b/src/osmo-bsc-nat/bssap.c
new file mode 100644
index 0000000..c054db6
--- /dev/null
+++ b/src/osmo-bsc-nat/bssap.c
@@ -0,0 +1,98 @@
+/* (C) 2022 by sysmocom - s.f.m.c. GmbH <info(a)sysmocom.de>
+ * Author: Oliver Smith <osmith(a)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 <osmocom/core/msgb.h>
+#include <osmocom/gsm/gsm0808.h>
+#include <osmocom/sigtran/sccp_helpers.h>
+#include <osmocom/sigtran/sccp_sap.h>
+#include <osmocom/bsc_nat/bsc_nat.h>
+#include <osmocom/bsc_nat/logging.h>
+
+static int bssap_ran_handle_reset(struct osmo_sccp_addr *addr, struct msgb *msg, unsigned int length)
+{
+ struct bsc_nat_sccp_inst *sccp_inst = g_bsc_nat->ran;
+
+ LOGP(DMAIN, LOGL_NOTICE, "Rx RESET from %s\n", bsc_nat_print_addr(sccp_inst, addr));
+
+ LOGP(DMAIN, LOGL_NOTICE, "Tx RESET ACK to %s\n", bsc_nat_print_addr(sccp_inst, addr));
+ msg = gsm0808_create_reset_ack();
+ return osmo_sccp_tx_unitdata_msg(sccp_inst->scu, &sccp_inst->addr, addr, msg);
+}
+
+static int bssap_ran_rcvmsg_udt(struct osmo_sccp_addr *addr, struct msgb *msg, unsigned int length)
+{
+ int ret = 0;
+
+ switch (msg->l3h[0]) {
+ case BSS_MAP_MSG_RESET:
+ ret = bssap_ran_handle_reset(addr, msg, length);
+ break;
+ default:
+ LOGP(DMAIN, LOGL_NOTICE, "Unimplemented BSSMAP UDT %s\n", gsm0808_bssap_name(msg->l3h[0]));
+ break;
+ }
+
+ return ret;
+}
+
+static int bssap_rcvmsg_udt(struct bsc_nat_sccp_inst *sccp_inst, struct osmo_sccp_addr *addr, struct msgb *msg,
+ unsigned int length)
+{
+ if (length < 1) {
+ LOGP(DMAIN, LOGL_ERROR, "Not enough room: %u\n", length);
+ return -1;
+ }
+
+ LOGP(DMAIN, LOGL_NOTICE, "Rx UDT BSSMAP %s\n", gsm0808_bssap_name(msg->l3h[0]));
+
+ /* NOTE: bssap_cn_rcvmsg_udt() will be added in a future patch */
+ return bssap_ran_rcvmsg_udt(addr, msg, length);
+}
+
+int bssap_handle_udt(struct bsc_nat_sccp_inst *sccp_inst, struct osmo_sccp_addr *addr, struct msgb *msgb,
+ unsigned int length)
+{
+ struct bssmap_header *bs;
+ int rc = -1;
+
+ LOGP(DMAIN, LOGL_DEBUG, "Rx UDT: %s\n", osmo_hexdump(msgb->l2h, length));
+
+ if (length < sizeof(*bs)) {
+ LOGP(DMAIN, LOGL_ERROR, "The header is too short\n");
+ return -1;
+ }
+
+ bs = (struct bssmap_header *)msgb->l2h;
+ if (bs->length < length - sizeof(*bs)) {
+ LOGP(DMAIN, LOGL_ERROR, "Failed to parse BSSMAP header\n");
+ return -1;
+ }
+
+ switch (bs->type) {
+ case BSSAP_MSG_BSS_MANAGEMENT:
+ msgb->l3h = &msgb->l2h[sizeof(*bs)];
+ rc = bssap_rcvmsg_udt(sccp_inst, addr, msgb, length - sizeof(*bs));
+ break;
+ default:
+ LOGP(DMAIN, LOGL_NOTICE, "Unimplemented msg type: %s\n", gsm0808_bssap_name(bs->type));
+ }
+
+ return rc;
+}
--
To view, visit https://gerrit.osmocom.org/c/osmo-bsc-nat/+/27471
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings
Gerrit-Project: osmo-bsc-nat
Gerrit-Branch: master
Gerrit-Change-Id: I3223409e25c93b625d67634caf68efe9772e2558
Gerrit-Change-Number: 27471
Gerrit-PatchSet: 4
Gerrit-Owner: osmith <osmith(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: osmith <osmith(a)sysmocom.de>
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: merged