diff options
Diffstat (limited to 'tests/sccp/ni_test.c')
-rw-r--r-- | tests/sccp/ni_test.c | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/tests/sccp/ni_test.c b/tests/sccp/ni_test.c new file mode 100644 index 0000000..860c5a0 --- /dev/null +++ b/tests/sccp/ni_test.c @@ -0,0 +1,124 @@ +#include <osmocom/core/logging.h> +#include <osmocom/core/application.h> + +#include <osmocom/sigtran/osmo_ss7.h> +#include <osmocom/sigtran/sccp_sap.h> +#include <osmocom/sigtran/xua_msg.h> +#include <osmocom/sigtran/protocol/m3ua.h> +#include <osmocom/sigtran/sccp_helpers.h> + +#include "xua_internal.h" + +void *ctx = NULL; + +static int sccp_sap_up(struct osmo_prim_hdr *oph, void *_scu) +{ + struct osmo_scu_prim *scu_prim = (struct osmo_scu_prim *)oph; + int rc = 0; + + printf("%s\n", msgb_hexdump(oph->msg)); + + switch (OSMO_PRIM_HDR(&scu_prim->oph)) { + case OSMO_PRIM(OSMO_SCU_PRIM_N_CONNECT, PRIM_OP_INDICATION): + printf("inbound connection indication\n"); + break; + + case OSMO_PRIM(OSMO_SCU_PRIM_N_DATA, PRIM_OP_INDICATION): + printf("incoming connection oriented data\n"); + break; + + case OSMO_PRIM(OSMO_SCU_PRIM_N_UNITDATA, PRIM_OP_INDICATION): + printf("Handle inbound UNITDATA\n"); + break; + + default: + printf("Unhandled SIGTRAN primitive: %u:%u\n", oph->primitive, oph->operation); + break; + } + + return rc; +} + +static struct msgb *create_msg(void) +{ + struct msgb *msg = msgb_alloc_headroom(128, 128, "test msg"); + OSMO_ASSERT(msg); + + msgb_printf(msg, "test msg"); + msg->l3h = msg->data; + + return msg; +} + +static const struct log_info_cat default_categories[] = { + [0] = { + .name = "DSCCP", + .description = "DSCP", + .enabled = 1, .loglevel = LOGL_DEBUG, + }, +}; + +const struct log_info log_info = { + .cat = default_categories, + .num_cat = ARRAY_SIZE(default_categories), +}; + +struct osmo_ss7_asp *asp; +struct osmo_sccp_addr addr1; +struct osmo_ss7_instance *ss7; + +/* override, requires '-Wl,--wrap=m3ua_tx_xua_as' */ +int __real_m3ua_tx_xua_as(struct osmo_ss7_as *as, struct xua_msg *xua); +int __wrap_m3ua_tx_xua_as(struct osmo_ss7_as *as, struct xua_msg *xua) +{ + printf("sio = 0x%02x ==> ni = %u\n", xua->mtp.sio, xua->mtp.sio >> 6); + /* loopback to self */ + xua->mtp.dpc = ss7->cfg.primary_pc; + return m3ua_hmdc_rx_from_l2(ss7, xua); +} + +int main(void) +{ + struct osmo_ss7_as *as; + struct osmo_sccp_user *user1; + struct osmo_sccp_addr addr2; + osmo_sccp_make_addr_pc_ssn(&addr1, 1, 1); + osmo_sccp_make_addr_pc_ssn(&addr2, 2, 1); + + int ss7_id = 0; + + osmo_init_logging(&log_info); + osmo_ss7_init(); + + ss7 = osmo_ss7_instance_find_or_create(ctx, ss7_id); + OSMO_ASSERT(ss7); + + as = osmo_ss7_as_find_or_create(ss7, "as", OSMO_SS7_ASP_PROT_M3UA); + OSMO_ASSERT(as); + + asp = osmo_ss7_asp_find_or_create(ss7, "asp", 0, 0, OSMO_SS7_ASP_PROT_M3UA); + OSMO_ASSERT(asp); + osmo_ss7_as_add_asp(as, asp->cfg.name); + + osmo_ss7_route_create(ss7->rtable_system, 0, 0, as->cfg.name); + ss7->cfg.primary_pc = addr1.pc; + + asp->cfg.is_server = false; + + ss7->sccp = osmo_sccp_instance_create(ss7, NULL); + OSMO_ASSERT(ss7->sccp); + + ss7->cfg.network_indicator = 2; + + user1 = osmo_sccp_user_bind(ss7->sccp, "user1", sccp_sap_up, 1); + osmo_sccp_user_bind(ss7->sccp, "user2", sccp_sap_up, 2); + + osmo_sccp_tx_unitdata_msg(user1, &addr1, &addr2, create_msg()); + + osmo_ss7_asp_destroy(asp); + osmo_ss7_as_destroy(as); + osmo_ss7_instance_destroy(ss7); + + return 0; +} + |