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 <[email protected]>

Reply via email to