pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/libosmo-sigtran/+/41410?usp=email )
Change subject: mtp: Support MTP-TRANSFER.req of raw IPA messages
......................................................................
mtp: Support MTP-TRANSFER.req of raw IPA messages
This is needed ie. in SCCPLite, where MGCP and CTRL messages need to be
sent over the same IPA multiplex TCP conn as the SCCPLite (SCCP/IPA) one
towards a given MSC.
Prior to this, osmo-bsc-sccplite was doing lots of manual
libosmo-sigtran APIs to obtain a route, an AS, and ASP, sending over an
ASP, etc. Tons of stuff which should really be done properly inside
libosmo-sigtran.
Related: SYS#6880
Change-Id: I9fedb26ccd3434fc7f272feb3c45cf4bdb80c7ae
---
M TODO-RELEASE
M include/osmocom/sigtran/protocol/mtp.h
M src/ipa.c
3 files changed, 40 insertions(+), 16 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmo-sigtran refs/changes/10/41410/1
diff --git a/TODO-RELEASE b/TODO-RELEASE
index 2ecfd57..6f04a07 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -10,3 +10,4 @@
libosmo-netif >1.6.0 stream OSMO_STREAM_{CLI,SRV}_TCP_SOCKOPT_KEEP*
libosmo-sigtran add enum mtp_network_indicator, mtp_network_indicator_vals
libosmo-sigtran add osmo_ss7_instance_get_network_indicator()
+libosmo-sigtran add MTP_SI_NI11_OSMO_IPA
diff --git a/include/osmocom/sigtran/protocol/mtp.h b/include/osmocom/sigtran/protocol/mtp.h
index 21e3d60..c0a1230 100644
--- a/include/osmocom/sigtran/protocol/mtp.h
+++ b/include/osmocom/sigtran/protocol/mtp.h
@@ -23,6 +23,18 @@
};
extern const struct value_string mtp_si_vals[];
+/* Q.704 14.2.2: "In the case of only one national signalling network the spare code of the
+ * network indicator reserved for national use can be used, for example, to define an additional
+ * 16 User Parts (making a total of 32 User Parts) for that national signalling network."
+ * Hence, we keep service indicators for Network Indicator "International network" (00) the same
+ * as for "National network" (10), and use "Reserved for national use" to specify extension
+ * service indicators.
+ * Note we pick enum values reserved in NI00 above in order to allow forming a
+ * superset so it can still be used with other NI values. */
+enum mtp_si_ni11 {
+ MTP_SI_NI11_OSMO_IPA = 2, /* Contains an IPA header + payload */
+};
+
/* Q.704 14.2.2 Sub-service field (Network Indicator) */
enum mtp_network_indicator {
MTP_NI_INTERNATIONAL = 0,
diff --git a/src/ipa.c b/src/ipa.c
index c748f22..46c611b 100644
--- a/src/ipa.c
+++ b/src/ipa.c
@@ -81,28 +81,39 @@
return NULL;
data_hdr = (struct m3ua_data_hdr *) data_ie->dat;
- if (data_hdr->si != MTP_SI_SCCP) {
- LOGP(DLSS7, LOGL_ERROR, "Cannot transmit non-SCCP SI (%u) to IPA peer\n",
- data_hdr->si);
- return NULL;
- }
-
/* and even the data part still has the header prepended */
src = data_ie->dat + sizeof(struct m3ua_data_hdr);
src_len = data_ie->len - sizeof(struct m3ua_data_hdr);
- /* sufficient headroom for osmo_ipa_msg_push_header() */
- msg = ipa_msg_alloc(16);
- if (!msg)
+ if (src_len == 0) {
+ LOGP(DLSS7, LOGL_NOTICE, "Discarding Tx empty IPA msg/payload\n");
return NULL;
+ }
- dst = msgb_put(msg, src_len);
- memcpy(dst, src, src_len);
-
- /* TODO: if we ever need something beyond SCCP, we can use the
- * M3UA SIO to determine the protocol */
- osmo_ipa_msg_push_header(msg, IPAC_PROTO_SCCP);
- return msg;
+ switch (data_hdr->si) {
+ case MTP_SI_SCCP:
+ /* sufficient headroom for osmo_ipa_msg_push_header() */
+ msg = ipa_msg_alloc(16);
+ if (!msg)
+ return NULL;
+ dst = msgb_put(msg, src_len);
+ memcpy(dst, src, src_len);
+ osmo_ipa_msg_push_header(msg, IPAC_PROTO_SCCP);
+ return msg;
+ case MTP_SI_NI11_OSMO_IPA:
+ /* Process our SI extension: full IPA with hdr + payload, used in SCCPlite
+ * between BSC and MSC to send MGCP and CTRL over IPA multiplex */
+ msg = msgb_alloc(src_len, "MTP_SI_NI11_OSMO_IPA");
+ if (!msg)
+ return NULL;
+ dst = msgb_put(msg, src_len);
+ memcpy(dst, src, src_len);
+ return msg;
+ default:
+ LOGP(DLSS7, LOGL_ERROR, "Cannot transmit non-SCCP SI (%u) to IPA peer\n",
+ data_hdr->si);
+ return NULL;
+ }
}
/*! \brief Send a given xUA message via a given IPA "Application Server"
--
To view, visit https://gerrit.osmocom.org/c/libosmo-sigtran/+/41410?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: newchange
Gerrit-Project: libosmo-sigtran
Gerrit-Branch: master
Gerrit-Change-Id: I9fedb26ccd3434fc7f272feb3c45cf4bdb80c7ae
Gerrit-Change-Number: 41410
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>