#include #include #include #include #include #include #include #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; }