Review at  https://gerrit.osmocom.org/7992

move creation of insert subscriber data messages to a common function

Move code to create an Insert Subscriber Data message into a common
function which can be shared by hlr.c and luop.c.

Change-Id: I6a92ca34cdaadca9eacc774bb1ca386c325ba865
Requested-by: neels
Related: OS#2785
---
M src/gsup_server.c
M src/gsup_server.h
M src/hlr.c
M src/luop.c
4 files changed, 98 insertions(+), 57 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-hlr refs/changes/92/7992/1

diff --git a/src/gsup_server.c b/src/gsup_server.c
index 24ba738..e4329a3 100644
--- a/src/gsup_server.c
+++ b/src/gsup_server.c
@@ -24,6 +24,7 @@
 #include <osmocom/core/linuxlist.h>
 #include <osmocom/abis/ipa.h>
 #include <osmocom/abis/ipaccess.h>
+#include <osmocom/gsm/gsm48_ie.h>
 #include <osmocom/gsm/apn.h>
 
 #include "gsup_server.h"
@@ -351,3 +352,47 @@
        /* FIXME: use real value: */
        gsup->pdp_infos[0].context_id = 1;
 }
+
+struct osmo_gsup_message *
+osmo_gsup_create_insert_subscriber_data_msg(char *imsi, char *msisdn, enum 
osmo_gsup_cn_domain cn_domain)
+{
+       struct osmo_gsup_message *gsup;
+       int len;
+       uint8_t *msisdn_enc;
+
+       gsup = talloc_zero(NULL, struct osmo_gsup_message);
+       if (gsup == NULL) {
+               LOGP(DLGSUP, LOGL_ERROR, "IMSI='%s': cannot allocate Insert 
Subscriber Data Message\n", imsi);
+               return NULL;
+       }
+       gsup->message_type = OSMO_GSUP_MSGT_INSERT_DATA_REQUEST;
+
+       osmo_strlcpy(gsup->imsi, imsi, GSM23003_IMSI_MAX_DIGITS + 1);
+
+       msisdn_enc = talloc_size(gsup, OSMO_GSUP_MAX_CALLED_PARTY_BCD_LEN);
+       if (msisdn_enc == NULL) {
+               LOGP(DLGSUP, LOGL_ERROR, "%s: Error: cannot encode MSISDN '%s'; 
could not allocate buffer\n",
+                    imsi, msisdn);
+               talloc_free(gsup);
+               return NULL;
+       }
+       len = gsm48_encode_bcd_number(msisdn_enc, 
OSMO_GSUP_MAX_CALLED_PARTY_BCD_LEN, 0, msisdn);
+       if (len < 1) {
+               LOGP(DLGSUP, LOGL_ERROR, "%s: Error: cannot encode MSISDN 
'%s'\n", imsi, msisdn);
+               talloc_free(gsup);
+               return NULL;
+       }
+       gsup->msisdn_enc = msisdn_enc;
+       gsup->msisdn_enc_len = len;
+
+       #pragma message "FIXME: deal with encoding the following data: 
gsup.hlr_enc"
+
+       gsup->cn_domain = cn_domain;
+       if (gsup->cn_domain == OSMO_GSUP_CN_DOMAIN_PS) {
+               /* FIXME: PDP infos - use more fine-grained access control
+                  instead of wildcard APN */
+               osmo_gsup_configure_wildcard_apn(gsup);
+       }
+
+       return gsup;
+}
diff --git a/src/gsup_server.h b/src/gsup_server.h
index 3d36bff..55a8c3e 100644
--- a/src/gsup_server.h
+++ b/src/gsup_server.h
@@ -6,6 +6,10 @@
 #include <osmocom/abis/ipaccess.h>
 #include <osmocom/gsm/gsup.h>
 
+#ifndef OSMO_GSUP_MAX_CALLED_PARTY_BCD_LEN
+#define OSMO_GSUP_MAX_CALLED_PARTY_BCD_LEN     43 /* TS 24.008 10.5.4.7 */
+#endif
+
 struct osmo_gsup_conn;
 
 /* Expects message in msg->l2h */
@@ -54,3 +58,5 @@
 void osmo_gsup_server_destroy(struct osmo_gsup_server *gsups);
 
 void osmo_gsup_configure_wildcard_apn(struct osmo_gsup_message *gsup);
+struct osmo_gsup_message *osmo_gsup_create_insert_subscriber_data_msg(char 
*imsi, char *msisdn,
+                                                                     enum 
osmo_gsup_cn_domain cn_domain);
diff --git a/src/hlr.c b/src/hlr.c
index 195e5d2..36aad94 100644
--- a/src/hlr.c
+++ b/src/hlr.c
@@ -26,7 +26,6 @@
 #include <osmocom/core/logging.h>
 #include <osmocom/core/application.h>
 #include <osmocom/gsm/gsup.h>
-#include <osmocom/gsm/gsm48_ie.h>
 #include <osmocom/vty/vty.h>
 #include <osmocom/vty/command.h>
 #include <osmocom/vty/telnet_interface.h>
@@ -61,46 +60,28 @@
                return;
 
        llist_for_each_entry(co, &g_hlr->gs->clients, list) {
-               struct osmo_gsup_message gsup = {
-                       .message_type = OSMO_GSUP_MSGT_INSERT_DATA_REQUEST
-               };
+               struct osmo_gsup_message *gsup;
+               struct msgb *msg_out;
                uint8_t *peer;
                int peer_len;
-               uint8_t msisdn_enc[43]; /* TODO use constant; TS 24.008 
10.5.4.7 */
-               int len;
-               struct msgb *msg_out;
+               enum osmo_gsup_cn_domain cn_domain;
 
-               peer_len = osmo_gsup_conn_ccm_get(co, &peer, IPAC_IDTAG_SERNR);
-               if (peer_len < 0) {
+               if (co->supports_ps)
+                       cn_domain = OSMO_GSUP_CN_DOMAIN_PS;
+               else if (co->supports_cs)
+                       cn_domain = OSMO_GSUP_CN_DOMAIN_CS;
+               else {
+                       /* We have not yet received a location update from this 
subscriber .*/
+                       continue;
+               }
+
+               gsup = 
osmo_gsup_create_insert_subscriber_data_msg(subscr->imsi, subscr->msisdn, 
cn_domain);
+               if (gsup == NULL) {
                        LOGP(DMAIN, LOGL_ERROR,
-                              "IMSI='%s': Cannot notify GSUP client, cannot 
get peer name "
+                              "IMSI='%s': Cannot notify GSUP client; could not 
allocate gsup message "
                               "for %s:%u\n", subscr->imsi,
                               co && co->conn && co->conn->server? 
co->conn->server->addr : "unset",
                               co && co->conn && co->conn->server? 
co->conn->server->port : 0);
-                       continue;
-               }
-
-               osmo_strlcpy(gsup.imsi, subscr->imsi, GSM23003_IMSI_MAX_DIGITS 
+ 1);
-
-               len = gsm48_encode_bcd_number(msisdn_enc, sizeof(msisdn_enc), 
0, subscr->msisdn);
-               if (len < 1) {
-                       LOGP(DMAIN, LOGL_ERROR, "%s: Error: cannot encode 
MSISDN '%s'\n",
-                            subscr->imsi, subscr->msisdn);
-                       continue;
-               }
-               gsup.msisdn_enc = msisdn_enc;
-               gsup.msisdn_enc_len = len;
-
-               if (co->supports_ps) {
-                       gsup.cn_domain = OSMO_GSUP_CN_DOMAIN_PS;
-
-                       /* FIXME: PDP infos - use more fine-grained access 
control
-                          instead of wildcard APN */
-                       osmo_gsup_configure_wildcard_apn(&gsup);
-               } else if (co->supports_cs) {
-                       gsup.cn_domain = OSMO_GSUP_CN_DOMAIN_CS;
-               } else {
-                       /* We have not yet received a location update from this 
subscriber .*/
                        continue;
                }
 
@@ -112,10 +93,23 @@
                               "for %s:%u\n", subscr->imsi,
                               co && co->conn && co->conn->server? 
co->conn->server->addr : "unset",
                               co && co->conn && co->conn->server? 
co->conn->server->port : 0);
+                       talloc_free(gsup);
+                       gsup = NULL;
+                       continue;
+               }
+               osmo_gsup_encode(msg_out, gsup);
+               talloc_free(gsup);
+               gsup = NULL;
+
+               peer_len = osmo_gsup_conn_ccm_get(co, &peer, IPAC_IDTAG_SERNR);
+               if (peer_len < 0) {
+                       LOGP(DMAIN, LOGL_ERROR,
+                              "IMSI='%s': cannot get peer name for connection 
%s:%u\n", subscr->imsi,
+                              co && co->conn && co->conn->server? 
co->conn->server->addr : "unset",
+                              co && co->conn && co->conn->server? 
co->conn->server->port : 0);
                        continue;
                }
 
-               osmo_gsup_encode(msg_out, &gsup);
                if (osmo_gsup_addr_send(g_hlr->gs, peer, peer_len, msg_out) < 
0) {
                        LOGP(DMAIN, LOGL_ERROR,
                               "IMSI='%s': Cannot notify GSUP client; send 
operation failed "
diff --git a/src/luop.c b/src/luop.c
index 7150b64..2d257f3 100644
--- a/src/luop.c
+++ b/src/luop.c
@@ -25,7 +25,6 @@
 #include <errno.h>
 
 #include <osmocom/core/logging.h>
-#include <osmocom/gsm/gsm48_ie.h>
 #include <osmocom/gsm/gsup.h>
 
 #include "gsup_server.h"
@@ -51,6 +50,11 @@
        struct msgb *msg_out;
 
        msg_out = msgb_alloc_headroom(1024+16, 16, "GSUP LUOP");
+       if (msg_out == NULL) {
+               LOGP(DMAIN, LOGL_ERROR,
+                      "IMSI='%s': Cannot encode GSUP message; could not 
allocate msg buffer\n", luop->subscr.imsi);
+               return;
+       }
        osmo_gsup_encode(msg_out, gsup);
 
        osmo_gsup_addr_send(luop->gsup_server, luop->peer,
@@ -231,37 +235,29 @@
 /*! Transmit Insert Subscriber Data to new VLR/SGSN */
 void lu_op_tx_insert_subscr_data(struct lu_operation *luop)
 {
-       struct osmo_gsup_message gsup;
-       uint8_t msisdn_enc[43]; /* TODO use constant; TS 24.008 10.5.4.7 */
-       int l;
+       struct hlr_subscriber *subscr = &luop->subscr;
+       struct osmo_gsup_message *gsup;
+       enum osmo_gsup_cn_domain cn_domain;
 
        OSMO_ASSERT(luop->state == LU_S_LU_RECEIVED ||
                    luop->state == LU_S_CANCEL_ACK_RECEIVED);
 
-       fill_gsup_msg(&gsup, luop, OSMO_GSUP_MSGT_INSERT_DATA_REQUEST);
+       if (luop->is_ps)
+               cn_domain = OSMO_GSUP_CN_DOMAIN_PS;
+       else
+               cn_domain = OSMO_GSUP_CN_DOMAIN_CS;
 
-       l = gsm48_encode_bcd_number(msisdn_enc, sizeof(msisdn_enc), 0,
-                                   luop->subscr.msisdn);
-       if (l < 1) {
+       gsup = osmo_gsup_create_insert_subscriber_data_msg(subscr->imsi, 
subscr->msisdn, cn_domain);
+       if (gsup == NULL) {
                LOGP(DMAIN, LOGL_ERROR,
-                    "%s: Error: cannot encode MSISDN '%s'\n",
-                    luop->subscr.imsi, luop->subscr.msisdn);
-               lu_op_tx_error(luop, GMM_CAUSE_PROTO_ERR_UNSPEC);
+                      "IMSI='%s': Cannot notify GSUP client; could not 
allocate gsup message "
+                      "for %s\n", subscr->imsi, luop->peer);
                return;
-       }
-       gsup.msisdn_enc = msisdn_enc;
-       gsup.msisdn_enc_len = l;
-
-       #pragma message "FIXME: deal with encoding the following data: 
gsup.hlr_enc"
-
-       if (luop->is_ps) {
-               /* FIXME: PDP infos - use more fine-grained access control
-                  instead of wildcard APN */
-               osmo_gsup_configure_wildcard_apn(&gsup);
        }
 
        /* Send ISD to new VLR/SGSN */
-       _luop_tx_gsup(luop, &gsup);
+       _luop_tx_gsup(luop, gsup);
+       talloc_free(gsup);
 
        lu_op_statechg(luop, LU_S_ISD_SENT);
        osmo_timer_schedule(&luop->timer, ISD_TIMEOUT_SECS, 0);

-- 
To view, visit https://gerrit.osmocom.org/7992
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I6a92ca34cdaadca9eacc774bb1ca386c325ba865
Gerrit-PatchSet: 1
Gerrit-Project: osmo-hlr
Gerrit-Branch: master
Gerrit-Owner: Stefan Sperling <ssperl...@sysmocom.de>

Reply via email to