diff options
author | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2014-12-19 19:15:55 +0100 |
---|---|---|
committer | Holger Hans Peter Freyther <holger@moiji-mobile.com> | 2015-01-18 18:02:09 +0100 |
commit | e154d8bdd45974fa6e9408b9d543eb9e9ea94b79 (patch) | |
tree | 32b4321c3c474eed32ab8199c2b7c477dd403681 /openbsc/src | |
parent | 69e16b9ea5dc991f8373c11b9fcf45b7b1a8e940 (diff) |
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
Diffstat (limited to 'openbsc/src')
-rw-r--r-- | openbsc/src/gprs/gprs_gsup_client.c | 25 | ||||
-rw-r--r-- | openbsc/src/gprs/gprs_subscriber.c | 1 |
2 files changed, 26 insertions, 0 deletions
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; |