aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/reg-proxy/ussd_proxy.c
diff options
context:
space:
mode:
authorSergey Kostanbaev <sergey.kostanbaev@gmail.com>2015-10-26 14:25:09 +0300
committerIvan Kluchnikov <kluchnikovi@gmail.com>2017-02-07 18:59:53 +0300
commit2f4878a90f11fb4d10493478c9f63abada6ad3fe (patch)
treea38a29390fa511f8f0bea7985ed0be46dee4b42f /openbsc/src/reg-proxy/ussd_proxy.c
parent70e6f2ec7459041f6ab9b7612a69a78333178974 (diff)
ussd_proxy: handle basic errors to release channel
Diffstat (limited to 'openbsc/src/reg-proxy/ussd_proxy.c')
-rw-r--r--openbsc/src/reg-proxy/ussd_proxy.c52
1 files changed, 35 insertions, 17 deletions
diff --git a/openbsc/src/reg-proxy/ussd_proxy.c b/openbsc/src/reg-proxy/ussd_proxy.c
index 06d75dbc8..a19dd5cd3 100644
--- a/openbsc/src/reg-proxy/ussd_proxy.c
+++ b/openbsc/src/reg-proxy/ussd_proxy.c
@@ -213,7 +213,8 @@ int response_to_options(sip_t const *sip);
static
int ussd_send_data(operation_t *op, int last, const char* lang, unsigned lang_len,
const char* msg, unsigned msg_len);
-
+static
+int ussd_send_data_ss(isup_connection_t *conn, struct ss_request* reply);
static const char* get_unknown_header(sip_t const *sip, const char *header)
{
@@ -227,9 +228,11 @@ static const char* get_unknown_header(sip_t const *sip, const char *header)
}
-int sup_server_send(operation_t *op, struct msgb *msg)
+int sup_server_send(isup_connection_t *conn, struct msgb *msg)
{
- if (!op->ussd.conn) {
+ ssize_t sz;
+
+ if (!conn) {
msgb_free(msg);
return -ENOTCONN;
}
@@ -242,10 +245,10 @@ int sup_server_send(operation_t *op, struct msgb *msg)
// FIXME ugly hack!!!
// TODO place message in send queue !!!!
- send(op->ussd.conn->isup_conn_socket, msg->data, msg->len, 0);
+ sz = send(conn->isup_conn_socket, msg->data, msg->len, 0);
msgb_free(msg);
- return 0;
+ return ((unsigned)sz == msg->len) ? 0 : -1;
}
static int ussd_parse_xml(const char *xml,
@@ -367,7 +370,9 @@ void proxy_r_bye(int status,
// TODO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
rc = ussd_send_data(hmagic, 1, language, language_len,
msg, msg_len);
-
+ if (rc < 0) {
+ fprintf(stderr, "*** unable to send to SUP\n");
+ }
// TODO handle err, if socket is unavailable we MUST
// terminate sip session
} else {
@@ -435,7 +440,7 @@ operation_t *open_ussd_session_mo(context_t* ctx,
/* Destination address */
- url_escape(escaped_to, ss->ussd_text, RFC3986_RESERVED_CHARS);
+ url_escape(escaped_to, (const char*)ss->ussd_text, RFC3986_RESERVED_CHARS);
to_url = *ctx->to_url;
to_url.url_user = escaped_to;
to_url_str = url_as_string(ctx->home, &to_url);
@@ -565,6 +570,14 @@ static int rx_sup_uss_message(isup_connection_t *sup_conn, const uint8_t* data,
{
if (ctx->operations) {
LOGP(DLCTRL, LOGL_ERROR, "Doesn't support multiple sessions. Failing this for now\n");
+ struct ss_request ess;
+ memset(&ess, 0, sizeof(ess));
+ ess.message_type = GSM0480_MTYPE_RELEASE_COMPLETE;
+ ess.component_type = GSM0480_CTYPE_REJECT;
+ ess.invoke_id = ss.invoke_id;
+ ess.opcode = ss.opcode;
+
+ ussd_send_data_ss(sup_conn, &ess);
return -1;
}
@@ -588,6 +601,19 @@ static int rx_sup_uss_message(isup_connection_t *sup_conn, const uint8_t* data,
return 0;
}
+int ussd_send_data_ss(isup_connection_t *conn, struct ss_request* reply)
+{
+ struct msgb *outmsg = msgb_alloc_headroom(4000, 64, __func__);
+ subscr_uss_message(outmsg,
+ reply,
+ NULL);
+
+ LOGP(DLCTRL, LOGL_ERROR,
+ "Sending USS, will send: %s\n", msgb_hexdump(outmsg));
+
+ return sup_server_send(conn, outmsg);
+}
+
int ussd_send_data(operation_t *op, int last, const char* lang, unsigned lang_len,
const char* msg, unsigned msg_len)
{
@@ -616,21 +642,13 @@ int ussd_send_data(operation_t *op, int last, const char* lang, unsigned lang_le
}
ss.ussd_text_len = msg_len;
- strncpy(ss.ussd_text, msg, msg_len);
+ strncpy((char*)ss.ussd_text, msg, msg_len);
} else {
ss.ussd_text_len = 0;
ss.ussd_text[0] = 0;
}
- struct msgb *outmsg = msgb_alloc_headroom(4000, 64, __func__);
- subscr_uss_message(outmsg,
- &ss,
- NULL);
-
- LOGP(DLCTRL, LOGL_ERROR,
- "Sending USS, will send: %s\n", msgb_hexdump(outmsg));
-
- return sup_server_send(op, outmsg);
+ return ussd_send_data_ss(op->ussd.conn, &ss);
}
static int isup_handle_connection(context_t *cli, su_wait_t *w, void *p)