Hi,
currently, when OpenBSC receives any mobile originated Supplementary
Service request, it always treats it as an USSD request (because the
only SS it supports is a USSD request for sending back the extension of
the subscriber).
What I think the code in handle_rcv_ussd is meant to be doing is:
If the request contained an USSD string, and if that string is equal to
"*#100#", return the subscriber extension. In all other cases reject the
request with "unrecognized component".
But currently it returns the extension even when the SS request wasn't
even an USSD request.
That causes several phones with Qualcomm baseband to hang and reboot
after a while because in some situations they send an interrogateSS
request to query if any call forwardings are active and cannot handle
the wrong answer they receive.
(Strangely, that happens with most "modern" HTC phones i have tried
right after logging into the network, rendering them completely useless
for use with OpenBSC)
Here is a patch:
--- a/openbsc/src/libmsc/ussd.c
+++ b/openbsc/src/libmsc/ussd.c
@@ -54,7 +54,7 @@ int handle_rcv_ussd(struct gsm_subscriber_connection
*conn, struct msgb *msg)
if (req.text[0] == 0xFF) /* Release-Complete */
return 0;
- if (strstr(USSD_TEXT_OWN_NUMBER, req.text) != NULL) {
+ if (strcmp(USSD_TEXT_OWN_NUMBER, (const char *) req.text) == 0) {
DEBUGP(DMM, "USSD: Own number requested\n");
rc = send_own_number(conn, msg, &req);
} else {
-Tobias