lynxis lazus has submitted this change. ( 
https://gerrit.osmocom.org/c/osmo-iuh/+/38946?usp=email )

Change subject: iu_client: add ranap_iu_page_cs2/ranap_iu_page_ps2
......................................................................

iu_client: add ranap_iu_page_cs2/ranap_iu_page_ps2

ranap_iu_page_cs2 and ranap_iu_page_ps2 are using the newer osmocom
osmo_location_area_id or osmo_routing_area_id which also contain
the PLMN.

Change-Id: I1f07e96642737160d387de3e4c3f71d288d356dd
---
M TODO-RELEASE
M include/osmocom/ranap/iu_client.h
M src/iu_client.c
3 files changed, 104 insertions(+), 3 deletions(-)

Approvals:
  Jenkins Builder: Verified
  lynxis lazus: Looks good to me, approved




diff --git a/TODO-RELEASE b/TODO-RELEASE
index 34f3506..ac52f44 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -9,3 +9,4 @@
 #library       what                    description / commit summary line
 libosmo-ranap add API         ranap_ran_rx_co_decode2()
 libosmo-ranap deprecate API   ranap_ran_rx_co_decode()
+libosmo-ranap  add API                 iu_client.h: add 
ranap_iu_page_cs2/ranap_iu_page_ps2
diff --git a/include/osmocom/ranap/iu_client.h 
b/include/osmocom/ranap/iu_client.h
index 2e72839..86ae874 100644
--- a/include/osmocom/ranap/iu_client.h
+++ b/include/osmocom/ranap/iu_client.h
@@ -2,6 +2,7 @@

 #include <stdbool.h>

+#include <osmocom/core/defs.h>
 #include <osmocom/core/linuxlist.h>
 #include <osmocom/gsm/gsm48.h>
 #include <osmocom/sigtran/sccp_sap.h>
@@ -65,8 +66,14 @@

 int ranap_iu_tx(struct msgb *msg, uint8_t sapi);

-int ranap_iu_page_cs(const char *imsi, const uint32_t *tmsi, uint16_t lac);
-int ranap_iu_page_ps(const char *imsi, const uint32_t *ptmsi, uint16_t lac, 
uint8_t rac);
+int ranap_iu_page_cs(const char *imsi, const uint32_t *tmsi, uint16_t lac)
+       OSMO_DEPRECATED("Use ranap_iu_page_cs2 instead");
+
+int ranap_iu_page_ps(const char *imsi, const uint32_t *ptmsi, uint16_t lac, 
uint8_t rac)
+       OSMO_DEPRECATED("Use ranap_iu_page_ps2 instead");
+
+int ranap_iu_page_cs2(const char *imsi, const uint32_t *tmsi, const struct 
osmo_location_area_id *lai);
+int ranap_iu_page_ps2(const char *imsi, const uint32_t *ptmsi, const struct 
osmo_routing_area_id *rai);

 int ranap_iu_rab_act(struct ranap_ue_conn_ctx *ue_ctx, struct msgb *msg);
 int ranap_iu_rab_deact(struct ranap_ue_conn_ctx *ue_ctx, uint8_t rab_id);
diff --git a/src/iu_client.c b/src/iu_client.c
index a9999c0..ce3030e 100644
--- a/src/iu_client.c
+++ b/src/iu_client.c
@@ -814,7 +814,7 @@
                            bool is_ps, uint32_t paging_cause)
 {
        struct msgb *msg;
-       msg = ranap_new_msg_paging_cmd(imsi, tmsi, is_ps? 1 : 0, paging_cause);
+       msg = ranap_new_msg_paging_cmd(imsi, tmsi, is_ps ? 1 : 0, paging_cause);
        msg->l2h = msg->data;
        return osmo_sccp_tx_unitdata_msg(g_scu, &g_local_sccp_addr, 
called_addr, msg);
 }
@@ -856,16 +856,109 @@
        return paged;
 }

+/*! Old paging() doesn't use PLMN and transmit paging command only to the 
first RNC  */
 int ranap_iu_page_cs(const char *imsi, const uint32_t *tmsi, uint16_t lac)
 {
        return iu_page(imsi, tmsi, lac, 0, false);
 }

+/*! Old paging() doesn't use PLMN and transmit paging command only to the 
first RNC  */
 int ranap_iu_page_ps(const char *imsi, const uint32_t *ptmsi, uint16_t lac, 
uint8_t rac)
 {
        return iu_page(imsi, ptmsi, lac, rac, true);
 }

+/*! Transmit a single page request towards all RNCs serving the specific LAI 
(no page retransmission).
+ *
+ * \param imsi the imsi as human readable string
+ * \param tmsi NULL or pointer to the tmsi
+ * \param lai full Location Area Identifier
+ * \return amount of paged RNCs. 0 when no RNC found.
+ */
+int ranap_iu_page_cs2(const char *imsi, const uint32_t *tmsi, const struct 
osmo_location_area_id *lai)
+{
+       struct ranap_iu_rnc *rnc;
+       struct iu_lac_rac_entry *entry;
+       char log_msg[32] = {};
+       int paged = 0;
+       int rc = 0;
+
+       /* find all RNCs which are serving this LA */
+       llist_for_each_entry(rnc, &rnc_list, entry) {
+               llist_for_each_entry(entry, &rnc->lac_rac_list, entry) {
+                       if (osmo_lai_cmp(&entry->rai.lac, lai))
+                               continue;
+
+                       rc = iu_tx_paging_cmd(&rnc->sccp_addr, imsi, tmsi, 
false, 0);
+                       if (rc > 0) {
+                               LOGPIU(LOGL_ERROR, "IuCS: Failed to tx Paging 
RNC %s for LAC %s for IMSI %s / TMSI %08x",
+                                      osmo_rnc_id_name(&rnc->rnc_id),
+                                      osmo_lai_name(lai), imsi, tmsi ? *tmsi : 
GSM_RESERVED_TMSI);
+                       }
+                       paged++;
+                       break;
+               }
+       }
+
+       if (tmsi)
+               snprintf(log_msg, sizeof(log_msg), "for TMSI %08x\n", *tmsi);
+       else
+               snprintf(log_msg, sizeof(log_msg) - 1, "for IMSI %s\n", imsi);
+
+       if (paged)
+               LOGPIU(LOGL_DEBUG, "IuPS: Paged %d RNCs on LAI %s for %s", 
paged, osmo_lai_name(lai), log_msg);
+       else
+               LOGPIU(LOGL_INFO, "IuPS: Found no RNC to Page on LAI %s for 
%s", osmo_lai_name(lai), log_msg);
+
+
+       return paged;
+}
+
+/*! Transmit a single page request towards all RNCs serving the specific RAI 
(no page retransmission).
+ *
+ * \param imsi the imsi as human readable string
+ * \param ptmsi NULL or pointer to the tmsi
+ * \param rai full Location Area Identifier
+ * \return amount of paged RNCs. 0 when no RNC found.
+ */
+int ranap_iu_page_ps2(const char *imsi, const uint32_t *ptmsi, const struct 
osmo_routing_area_id *rai)
+{
+       struct ranap_iu_rnc *rnc;
+       struct iu_lac_rac_entry *entry;
+       char log_msg[32] = {};
+       int paged = 0;
+       int rc = 0;
+
+       /* find all RNCs which are serving this RAC */
+       llist_for_each_entry(rnc, &rnc_list, entry) {
+               llist_for_each_entry(entry, &rnc->lac_rac_list, entry) {
+                       if (osmo_rai_cmp(&entry->rai, rai))
+                               continue;
+
+                       rc = iu_tx_paging_cmd(&rnc->sccp_addr, imsi, ptmsi, 
true, 0);
+                       if (rc > 0) {
+                               LOGPIU(LOGL_ERROR, "IuPS: Failed to tx Paging 
RNC %s for RAC %s for IMSI %s / P-TMSI %08x",
+                                      osmo_rnc_id_name(&rnc->rnc_id),
+                                      osmo_rai_name2(rai), imsi, ptmsi ? 
*ptmsi : GSM_RESERVED_TMSI);
+                       }
+                       paged++;
+                       break;
+               }
+       }
+
+       if (ptmsi)
+               snprintf(log_msg, sizeof(log_msg) - 1, "for PTMSI %08x\n", 
*ptmsi);
+       else
+               snprintf(log_msg, sizeof(log_msg) - 1, "for IMSI %s\n", imsi);
+
+       if (paged)
+               LOGPIU(LOGL_DEBUG, "IuPS: Paged %d RNCs on RAI %s for %s", 
paged, osmo_rai_name2(rai), log_msg);
+       else
+               LOGPIU(LOGL_INFO, "IuPS: Found no RNC to Page on RAI %s for 
%s", osmo_rai_name2(rai), log_msg);
+
+       return paged;
+}
+

 /***********************************************************************
  *

--
To view, visit https://gerrit.osmocom.org/c/osmo-iuh/+/38946?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings?usp=email

Gerrit-MessageType: merged
Gerrit-Project: osmo-iuh
Gerrit-Branch: master
Gerrit-Change-Id: I1f07e96642737160d387de3e4c3f71d288d356dd
Gerrit-Change-Number: 38946
Gerrit-PatchSet: 20
Gerrit-Owner: lynxis lazus <lyn...@fe80.eu>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: daniel <dwillm...@sysmocom.de>
Gerrit-Reviewer: laforge <lafo...@osmocom.org>
Gerrit-Reviewer: lynxis lazus <lyn...@fe80.eu>
Gerrit-Reviewer: neels <nhofm...@sysmocom.de>
Gerrit-Reviewer: pespin <pes...@sysmocom.de>

Reply via email to