summaryrefslogtreecommitdiffstats
path: root/src/host/layer23/src/mobile
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <holger@moiji-mobile.com>2017-12-26 12:46:30 +0800
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2017-12-27 10:07:17 +0800
commita8130aba91247e07df83d2612f14d58d9a45eaa7 (patch)
treec72730d9c1edb60e2716b70a4b5a1fbca383a9be /src/host/layer23/src/mobile
parentf02c04f4441ae0d05f46f5fdfd1aa8181ede57a8 (diff)
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
Diffstat (limited to 'src/host/layer23/src/mobile')
-rw-r--r--src/host/layer23/src/mobile/gsm411_sms.c2
-rw-r--r--src/host/layer23/src/mobile/primitives.c16
-rw-r--r--src/host/layer23/src/mobile/script_lua.c21
3 files changed, 35 insertions, 4 deletions
diff --git a/src/host/layer23/src/mobile/gsm411_sms.c b/src/host/layer23/src/mobile/gsm411_sms.c
index 6d9d56ec..90906973 100644
--- a/src/host/layer23/src/mobile/gsm411_sms.c
+++ b/src/host/layer23/src/mobile/gsm411_sms.c
@@ -624,7 +624,7 @@ static int gsm340_gen_tpdu(struct msgb *msg, struct gsm_sms *sms)
}
/* Take a SMS in gsm_sms structure and send it. */
-static int gsm411_tx_sms_submit(struct osmocom_ms *ms, const char *sms_sca,
+int gsm411_tx_sms_submit(struct osmocom_ms *ms, const char *sms_sca,
struct gsm_sms *sms)
{
struct msgb *msg;
diff --git a/src/host/layer23/src/mobile/primitives.c b/src/host/layer23/src/mobile/primitives.c
index fd486ea2..c3f28a5a 100644
--- a/src/host/layer23/src/mobile/primitives.c
+++ b/src/host/layer23/src/mobile/primitives.c
@@ -173,6 +173,19 @@ static int cancel_timer(struct mobile_prim_intf *intf, struct mobile_timer_param
return -1;
}
+static int send_sms(struct mobile_prim_intf *intf, struct mobile_sms_param *param)
+{
+ struct gsm_sms *sms;
+
+ sms = sms_alloc();
+ *sms = param->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;
}