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/.
Harald Welte gerrit-no-reply at lists.osmocom.org
Review at https://gerrit.osmocom.org/2282
WIP: Add IPA/SCCPlite stacking
Change-Id: I9098574cddeba10fcf8f1b6c196a7069a6805c56
---
M include/osmocom/sigtran/osmo_ss7.h
M src/osmo_ss7.c
M src/sccp_scrc.c
3 files changed, 134 insertions(+), 9 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmo-sccp refs/changes/82/2282/1
diff --git a/include/osmocom/sigtran/osmo_ss7.h b/include/osmocom/sigtran/osmo_ss7.h
index 2d5eba9..e33a9ad 100644
--- a/include/osmocom/sigtran/osmo_ss7.h
+++ b/include/osmocom/sigtran/osmo_ss7.h
@@ -254,6 +254,7 @@
OSMO_SS7_ASP_PROT_NONE,
OSMO_SS7_ASP_PROT_SUA,
OSMO_SS7_ASP_PROT_M3UA,
+ OSMO_SS7_ASP_PROT_IPA,
_NUM_OSMO_SS7_ASP_PROT
};
diff --git a/src/osmo_ss7.c b/src/osmo_ss7.c
index e55d55c..f9770c7 100644
--- a/src/osmo_ss7.c
+++ b/src/osmo_ss7.c
@@ -41,6 +41,7 @@
#include <osmocom/core/socket.h>
#include <osmocom/netif/stream.h>
+#include <osmocom/netif/ipa.h>
#include "sccp_internal.h"
#include "xua_internal.h"
@@ -68,11 +69,24 @@
{ OSMO_SS7_ASP_PROT_NONE, "none" },
{ OSMO_SS7_ASP_PROT_SUA, "sua" },
{ OSMO_SS7_ASP_PROT_M3UA, "m3ua" },
+ { OSMO_SS7_ASP_PROT_IPA, "ipa" },
{ 0, NULL }
};
#define LOGSS7(inst, level, fmt, args ...) \
LOGP(DLSS7, level, "%u: " fmt, inst ? (inst)->cfg.id : 0, ## args)
+
+static int asp_proto_to_ip_proto(enum osmo_ss7_asp_protocol proto)
+{
+ switch (proto) {
+ case OSMO_SS7_ASP_PROT_IPA:
+ return IPPROTO_TCP;
+ case OSMO_SS7_ASP_PROT_SUA:
+ case OSMO_SS7_ASP_PROT_M3UA:
+ default:
+ return IPPROTO_SCTP;
+ }
+}
int osmo_ss7_find_free_rctx(struct osmo_ss7_instance *inst)
{
@@ -786,7 +800,8 @@
as->cfg.proto = proto;
as->cfg.mode = OSMO_SS7_AS_TMOD_LOADSHARE;
as->cfg.recovery_timeout_msec = 2000;
- as->fi = xua_as_fsm_start(as, LOGL_DEBUG);
+ if (proto != OSMO_SS7_ASP_PROT_IPA)
+ as->fi = xua_as_fsm_start(as, LOGL_DEBUG);
llist_add_tail(&as->list, &inst->as_list);
}
@@ -1020,6 +1035,7 @@
}
static int xua_cli_read_cb(struct osmo_stream_cli *conn);
+static int ipa_cli_read_cb(struct osmo_stream_cli *conn);
static int xua_cli_connect_cb(struct osmo_stream_cli *cli);
int osmo_ss7_asp_restart(struct osmo_ss7_asp *asp)
@@ -1049,10 +1065,13 @@
osmo_stream_cli_set_port(asp->client, asp->cfg.remote.port);
osmo_stream_cli_set_local_addr(asp->client, asp->cfg.local.host);
osmo_stream_cli_set_local_port(asp->client, asp->cfg.local.port);
- osmo_stream_cli_set_proto(asp->client, IPPROTO_SCTP);
+ osmo_stream_cli_set_proto(asp->client, asp_proto_to_ip_proto(asp->cfg.proto));
osmo_stream_cli_set_reconnect_timeout(asp->client, 5);
osmo_stream_cli_set_connect_cb(asp->client, xua_cli_connect_cb);
- osmo_stream_cli_set_read_cb(asp->client, xua_cli_read_cb);
+ if (asp->cfg.proto == OSMO_SS7_ASP_PROT_IPA)
+ osmo_stream_cli_set_read_cb(asp->client, ipa_cli_read_cb);
+ else
+ osmo_stream_cli_set_read_cb(asp->client, xua_cli_read_cb);
osmo_stream_cli_set_data(asp->client, asp);
rc = osmo_stream_cli_open2(asp->client, 1);
if (rc < 0) {
@@ -1079,7 +1098,8 @@
/* (re)start the ASP FSM */
if (asp->fi)
osmo_fsm_inst_term(asp->fi, OSMO_FSM_TERM_REQUEST, NULL);
- asp->fi = xua_asp_fsm_start(asp, role, LOGL_DEBUG);
+ if (asp->cfg.proto != OSMO_SS7_ASP_PROT_IPA)
+ asp->fi = xua_asp_fsm_start(asp, role, LOGL_DEBUG);
return 0;
}
@@ -1162,6 +1182,64 @@
notif->sn_header.sn_type));
break;
}
+}
+
+static int ipa_rx_msg(struct osmo_ss7_asp *asp, struct msgb *msg)
+{
+ struct osmo_mtp_prim *omp;
+
+ /* FIXME: pull the IPA header */
+
+ /* Generate an MTP-TRANSFER.ind and hand it into the MTP core
+ * so it can dispatch it to SCCP */
+ omp = (struct osmo_mtp_prim *) msgb_push(msg, sizeof(*omp));
+ osmo_prim_init(&omp->oph, MTP_SAP_USER,
+ OSMO_MTP_PRIM_TRANSFER, PRIM_OP_INDICATION, msg);
+ omp->u.transfer.opc = 0;
+ omp->u.transfer.dpc = 0;
+ omp->u.transfer.sio = MTP_SI_SCCP;
+ omp->u.transfer.sls = 0;
+
+ return osmo_ss7_mtp_to_user(asp->inst, omp);
+}
+
+/* netif code tells us we can read something from the socket */
+static int ipa_srv_conn_cb(struct osmo_stream_srv *conn)
+{
+ struct osmo_fd *ofd = osmo_stream_srv_get_ofd(conn);
+ struct osmo_ss7_asp *asp = osmo_stream_srv_get_data(conn);
+ struct msgb *msg = msgb_alloc(ASP_MSGB_SIZE, "xUA Server Rx");
+ int rc;
+
+ if (!msg)
+ return -ENOMEM;
+
+ /* read xUA message from socket and process it */
+ rc = osmo_stream_srv_recv(conn, msg);
+ LOGPASP(asp, DLSS7, LOGL_DEBUG, "%s(): recvmsg() returned %d\n",
+ __func__, rc);
+ if (rc < 0) {
+ osmo_stream_srv_destroy(conn);
+ goto out;
+ } else if (rc == 0) {
+ osmo_stream_srv_destroy(conn);
+ goto out;
+ }
+ if (osmo_ipa_process_msg(msg) < 0) {
+ LOGPASP(asp, DLSS7, LOGL_ERROR, "Bad IPA message\n");
+ osmo_stream_srv_destroy(conn);
+ goto out;
+ }
+ msg->dst = asp;
+
+ /* Handle IPA PING, PONG and ID_ACK messages */
+ if (osmo_ipa_rcvmsg_base(msg, ofd, 1))
+ return 0;
+
+ rc = ipa_rx_msg(asp, msg);
+out:
+ msgb_free(msg);
+ return rc;
}
/* netif code tells us we can read something from the socket */
@@ -1251,6 +1329,40 @@
}
return 0;
+}
+
+/* read call-back for IPA/SCCPlite socket */
+static int ipa_cli_read_cb(struct osmo_stream_cli *conn)
+{
+ struct osmo_fd *ofd = osmo_stream_cli_get_ofd(conn);
+ struct osmo_ss7_asp *asp = osmo_stream_cli_get_data(conn);
+ struct msgb *msg = msgb_alloc(ASP_MSGB_SIZE, "IPA Client Rx");
+ int rc;
+
+ if (!msg)
+ return -ENOMEM;
+
+ rc = osmo_stream_cli_recv(conn, msg);
+ if (rc <= 0) {
+ LOGPASP(asp, DLSS7, LOGL_ERROR, "Cannot receive message\n");
+ osmo_stream_cli_reconnect(conn);
+ goto out;
+ }
+ if (osmo_ipa_process_msg(msg) < 0) {
+ LOGPASP(asp, DLSS7, LOGL_ERROR, "Bad IPA message\n");
+ osmo_stream_cli_reconnect(conn);
+ goto out;
+ }
+
+ /* Handle IPA PING, PONG and ID_ACK messages */
+ if (osmo_ipa_rcvmsg_base(msg, ofd, 0))
+ return 0;
+
+ msg->dst = asp;
+ rc = ipa_rx_msg(asp, msg);
+out:
+ msgb_free(msg);
+ return rc;
}
static int xua_cli_read_cb(struct osmo_stream_cli *conn)
@@ -1345,9 +1457,15 @@
LOGP(DLSS7, LOGL_INFO, "%s: New SCTP connection accepted\n",
sock_name);
- srv = osmo_stream_srv_create(oxs, link, fd,
- xua_srv_conn_cb,
- xua_srv_conn_closed_cb, NULL);
+ if (oxs->cfg.proto == OSMO_SS7_ASP_PROT_IPA) {
+ srv = osmo_stream_srv_create(oxs, link, fd,
+ ipa_srv_conn_cb,
+ xua_srv_conn_closed_cb, NULL);
+ } else {
+ srv = osmo_stream_srv_create(oxs, link, fd,
+ xua_srv_conn_cb,
+ xua_srv_conn_closed_cb, NULL);
+ }
if (!srv) {
LOGP(DLSS7, LOGL_ERROR, "%s: Unable to create stream server "
"for SCTP connection\n", sock_name);
@@ -1413,6 +1531,10 @@
break;
case OSMO_SS7_ASP_PROT_M3UA:
msgb_sctp_ppid(msg) = M3UA_PPID;
+ break;
+ case OSMO_SS7_ASP_PROT_IPA:
+ /* do we really want to do this here? */
+ osmo_ipa_msg_push_header(msg, FIXME);
break;
default:
OSMO_ASSERT(0);
@@ -1489,7 +1611,7 @@
osmo_stream_srv_link_set_addr(oxs->server, oxs->cfg.local.host);
osmo_stream_srv_link_set_port(oxs->server, oxs->cfg.local.port);
- osmo_stream_srv_link_set_proto(oxs->server, IPPROTO_SCTP);
+ osmo_stream_srv_link_set_proto(oxs->server, asp_proto_to_ip_proto(proto));
rc = osmo_stream_srv_link_open(oxs->server);
if (rc < 0) {
diff --git a/src/sccp_scrc.c b/src/sccp_scrc.c
index f9df075..80c8126 100644
--- a/src/sccp_scrc.c
+++ b/src/sccp_scrc.c
@@ -142,6 +142,7 @@
case OSMO_SS7_ASP_PROT_SUA:
return sua_tx_xua_as(as, xua);
case OSMO_SS7_ASP_PROT_M3UA:
+ case OSMO_SS7_ASP_PROT_IPA:
return sua2sccp_tx_m3ua(inst, xua);
default:
LOGP(DLSCCP, LOGL_ERROR, "MTP-TRANSFER.req for "
@@ -295,7 +296,8 @@
const struct osmo_sccp_addr *called)
{
struct osmo_sccp_user *scu;
-
+ /* it is not really clear that called->pc will be set to
+ * anything here, in the case of a SSN-only CalledAddr */
scu = sccp_user_find(inst, called->ssn, called->pc);
/* Is subsystem equipped? */
--
To view, visit https://gerrit.osmocom.org/2282
To unsubscribe, visit https://gerrit.osmocom.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I9098574cddeba10fcf8f1b6c196a7069a6805c56
Gerrit-PatchSet: 1
Gerrit-Project: libosmo-sccp
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>