From a8130aba91247e07df83d2612f14d58d9a45eaa7 Mon Sep 17 00:00:00 2001 From: Holger Hans Peter Freyther Date: Tue, 26 Dec 2017 12:46:30 +0800 Subject: mobile: Send SMS through the primitive interface Make this symmetric and send the SMS through the primitive interface. Construct and copy the sms into the prim, store the SCA in the prim as well. In 04.11 we see we can store 2*10 digits in the destination address and a NUL. Change-Id: I91d7537f4f6ce5ba00218c58f3456947ec7bc662 --- .../layer23/include/osmocom/bb/mobile/gsm411_sms.h | 2 ++ .../layer23/include/osmocom/bb/mobile/primitives.h | 2 ++ src/host/layer23/src/mobile/gsm411_sms.c | 2 +- src/host/layer23/src/mobile/primitives.c | 16 ++++++++++++++++ src/host/layer23/src/mobile/script_lua.c | 21 ++++++++++++++++++--- 5 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/host/layer23/include/osmocom/bb/mobile/gsm411_sms.h b/src/host/layer23/include/osmocom/bb/mobile/gsm411_sms.h index d3074fb3..3ed6710c 100644 --- a/src/host/layer23/include/osmocom/bb/mobile/gsm411_sms.h +++ b/src/host/layer23/include/osmocom/bb/mobile/gsm411_sms.h @@ -35,5 +35,7 @@ struct gsm_sms *sms_from_text(const char *receiver, int dcs, const char *text); int gsm411_rcv_sms(struct osmocom_ms *ms, struct msgb *msg); int sms_send(struct osmocom_ms *ms, const char *sms_sca, const char *number, const char *text, uint8_t msg_ref); +int gsm411_tx_sms_submit(struct osmocom_ms *ms, const char *sms_sca, + struct gsm_sms *sms); #endif /* _GSM411_SMS_H */ diff --git a/src/host/layer23/include/osmocom/bb/mobile/primitives.h b/src/host/layer23/include/osmocom/bb/mobile/primitives.h index 39b49454..034b2029 100644 --- a/src/host/layer23/include/osmocom/bb/mobile/primitives.h +++ b/src/host/layer23/include/osmocom/bb/mobile/primitives.h @@ -62,6 +62,8 @@ struct mobile_shutdown_param { struct mobile_sms_param { struct gsm_sms sms; + char sca[20+1]; /*sms; + + /* Force a NUL at the end of the string */ + param->sca[sizeof(param->sca) - 1] = '\0'; + + return gsm411_tx_sms_submit(intf->ms, param->sca, sms); +} + int mobile_prim_intf_req(struct mobile_prim_intf *intf, struct mobile_prim *prim) { int rc = 0; @@ -184,6 +197,9 @@ int mobile_prim_intf_req(struct mobile_prim_intf *intf, struct mobile_prim *prim case OSMO_PRIM(PRIM_MOB_TIMER_CANCEL, PRIM_OP_REQUEST): rc = cancel_timer(intf, &prim->u.timer); break; + case OSMO_PRIM(PRIM_MOB_SMS, PRIM_OP_REQUEST): + rc = send_sms(intf, &prim->u.sms); + break; default: LOGP(DPRIM, LOGL_ERROR, "Unknown primitive: %d\n", OSMO_PRIM_HDR(&prim->hdr)); break; diff --git a/src/host/layer23/src/mobile/script_lua.c b/src/host/layer23/src/mobile/script_lua.c index 1b80c485..14ab58fd 100644 --- a/src/host/layer23/src/mobile/script_lua.c +++ b/src/host/layer23/src/mobile/script_lua.c @@ -372,7 +372,9 @@ static int lua_ms_shutdown(lua_State *L) static int lua_ms_sms_send_simple(lua_State *L) { const char *sms_sca, *number, *text; - int msg_ref, rc; + struct mobile_prim *prim; + struct gsm_sms *sms; + int msg_ref; luaL_argcheck(L, lua_isnumber(L, -1), 4, "msg_ref needs to be a number"); luaL_argcheck(L, lua_isstring(L, -2), 3, "text must be a string"); @@ -384,8 +386,21 @@ static int lua_ms_sms_send_simple(lua_State *L) number = lua_tostring(L, -3); sms_sca = lua_tostring(L, -4); - rc = sms_send(get_primitive(L)->ms, sms_sca, number, text, msg_ref); - lua_pushinteger(L, rc); + prim = mobile_prim_alloc(PRIM_MOB_SMS, PRIM_OP_REQUEST); + + sms = sms_from_text(number, 0, text); + if (!sms) { + lua_pushinteger(L, -ENOMEM); + msgb_free(prim->hdr.msg); + return 1; + } + + prim->u.sms.sms = *sms; + prim->u.sms.sms.msg_ref = msg_ref; + osmo_strlcpy(prim->u.sms.sca, sms_sca, sizeof(prim->u.sms.sca)); + mobile_prim_intf_req(get_primitive(L), prim); + + lua_pushinteger(L, 0); return 1; } -- cgit v1.2.3