aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/gprs/gprs_subscriber.c
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2014-12-18 12:46:47 +0100
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2015-01-18 13:17:50 +0100
commit39f040d62b16b2d99352f5facd83ce098fa2f462 (patch)
tree28c0c215666e744fa702c37459300e14cb477f10 /openbsc/src/gprs/gprs_subscriber.c
parentbb23dc17f8f56be836dc50c925c04a5aeaec979c (diff)
sgsn: Integrate the GSUP client into the SGSN
This commit adds GSUP client configuration (via VTY), connection set up, and real message sending. The following configuration commands are added: - gsup remote-ip A.B.C.D set server IP address - gsup remote-port PORT set server TCP port Ticket: OW#1338 Sponsored-by: On-Waves ehf
Diffstat (limited to 'openbsc/src/gprs/gprs_subscriber.c')
-rw-r--r--openbsc/src/gprs/gprs_subscriber.c52
1 files changed, 47 insertions, 5 deletions
diff --git a/openbsc/src/gprs/gprs_subscriber.c b/openbsc/src/gprs/gprs_subscriber.c
index 461b3a573..04debff24 100644
--- a/openbsc/src/gprs/gprs_subscriber.c
+++ b/openbsc/src/gprs/gprs_subscriber.c
@@ -20,6 +20,7 @@
*/
#include <openbsc/gsm_subscriber.h>
+#include <openbsc/gprs_gsup_client.h>
#include <openbsc/sgsn.h>
#include <openbsc/gprs_sgsn.h>
@@ -28,10 +29,47 @@
#include <openbsc/debug.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
extern void *tall_bsc_ctx;
-void gprs_subscr_init(struct sgsn_instance *sgi)
+static int gsup_read_cb(struct gprs_gsup_client *gsupc, struct msgb *msg);
+
+/* TODO: Some functions are specific to the SGSN, but this file is more general
+ * (it has gprs_* name). Either move these functions elsewhere, split them and
+ * move a part, or replace the gprs_ prefix by sgsn_. The applies to
+ * gprs_subscr_init, gsup_read_cb, and gprs_subscr_tx_gsup_message.
+ */
+
+int gprs_subscr_init(struct sgsn_instance *sgi)
+{
+ const char *addr_str;
+
+ if (!sgi->cfg.gsup_server_addr.sin_addr.s_addr)
+ return 0;
+
+ addr_str = inet_ntoa(sgi->cfg.gsup_server_addr.sin_addr);
+
+ sgi->gsup_client = gprs_gsup_client_create(
+ addr_str, sgi->cfg.gsup_server_port,
+ &gsup_read_cb);
+
+ if (!sgi->gsup_client)
+ return -1;
+
+ return 1;
+}
+
+static int gsup_read_cb(struct gprs_gsup_client *gsupc, struct msgb *msg)
{
+ int rc;
+
+ rc = gprs_subscr_rx_gsup_message(msg);
+ if (rc < 0)
+ return -1;
+
+ return rc;
}
static struct sgsn_subscriber_data *sgsn_subscriber_data_alloc(void *ctx)
@@ -96,17 +134,21 @@ void gprs_subscr_put_and_cancel(struct gsm_subscriber *subscr)
static int gprs_subscr_tx_gsup_message(struct gsm_subscriber *subscr,
struct gprs_gsup_message *gsup_msg)
{
- struct msgb *msg = msgb_alloc(4096, __func__);
+ struct msgb *msg = gprs_gsup_msgb_alloc();
strncpy(gsup_msg->imsi, subscr->imsi, sizeof(gsup_msg->imsi) - 1);
gprs_gsup_encode(msg, gsup_msg);
LOGMMCTXP(LOGL_INFO, subscr->sgsn_data->mm,
- "Sending GSUP NYI, would send: %s\n", msgb_hexdump(msg));
- msgb_free(msg);
+ "Sending GSUP, will send: %s\n", msgb_hexdump(msg));
+
+ if (!sgsn->gsup_client) {
+ msgb_free(msg);
+ return -ENOTSUP;
+ }
- return -ENOTSUP;
+ return gprs_gsup_client_send(sgsn->gsup_client, msg);
}
static int gprs_subscr_handle_gsup_auth_res(struct gsm_subscriber *subscr,