From e154d8bdd45974fa6e9408b9d543eb9e9ea94b79 Mon Sep 17 00:00:00 2001 From: Jacob Erlbeck Date: Fri, 19 Dec 2014 19:15:55 +0100 Subject: gprs: Handle incoming IPA CCM message in gsup_client_read_cb Currently the IPA CCM messages are not handled by the GSUP client. This means, that the client doesn't answer to PING and ID_GET and logs notices when receiving PONG or ID_ACK. At least the PING functionality (remotely originated PING) shall be supported. This patch extends gsup_client_read_cb by a call to ipaccess_bts_handle_ccm. Only when the return code is 0, the message is processed further and checked for an OSMO/GSUP message. ID_GET messages are answered by a dummy description, where only the unit_name is set to 'SGSN'. Sponsored-by: On-Waves ehf --- openbsc/src/gprs/gprs_gsup_client.c | 25 +++++++++++++++++++++++++ openbsc/src/gprs/gprs_subscriber.c | 1 + 2 files changed, 26 insertions(+) diff --git a/openbsc/src/gprs/gprs_gsup_client.c b/openbsc/src/gprs/gprs_gsup_client.c index 7bf67b7d9..986542953 100644 --- a/openbsc/src/gprs/gprs_gsup_client.c +++ b/openbsc/src/gprs/gprs_gsup_client.c @@ -105,6 +105,31 @@ static int gsup_client_read_cb(struct ipa_client_conn *link, struct msgb *msg) struct ipaccess_head *hh = (struct ipaccess_head *) msg->data; struct ipaccess_head_ext *he = (struct ipaccess_head_ext *) msgb_l2(msg); struct gprs_gsup_client *gsupc = (struct gprs_gsup_client *)link->data; + int rc; + static struct ipaccess_unit ipa_dev = { + .unit_name = "SGSN" + }; + + msg->l2h = &hh->data[0]; + + rc = ipaccess_bts_handle_ccm(link, &ipa_dev, msg); + + if (rc < 0) { + LOGP(DGPRS, LOGL_NOTICE, + "GSUP received an invalid IPA/CCM message from %s:%d\n", + link->addr, link->port); + /* Link has been closed */ + gsupc->is_connected = 0; + msgb_free(msg); + return -1; + } + + if (rc == 1) { + /* CCM message */ + + msgb_free(msg); + return 0; + } if (hh->proto != IPAC_PROTO_OSMO) goto invalid; diff --git a/openbsc/src/gprs/gprs_subscriber.c b/openbsc/src/gprs/gprs_subscriber.c index 04debff24..2f3ae96de 100644 --- a/openbsc/src/gprs/gprs_subscriber.c +++ b/openbsc/src/gprs/gprs_subscriber.c @@ -66,6 +66,7 @@ static int gsup_read_cb(struct gprs_gsup_client *gsupc, struct msgb *msg) int rc; rc = gprs_subscr_rx_gsup_message(msg); + msgb_free(msg); if (rc < 0) return -1; -- cgit v1.2.3