summaryrefslogtreecommitdiffstats
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
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
-rw-r--r--src/host/layer23/include/osmocom/bb/mobile/gsm411_sms.h2
-rw-r--r--src/host/layer23/include/osmocom/bb/mobile/primitives.h2
-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
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 d3074fb..3ed6710 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 39b4945..034b202 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]; /*<! Service Centre Address. For SubmitMS */
+
bool cause_valid;
int cause;
};
diff --git a/src/host/layer23/src/mobile/gsm411_sms.c b/src/host/layer23/src/mobile/gsm411_sms.c
index 6d9d56e..9090697 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 fd486ea..c3f28a5 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 1b80c48..14ab58f 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;
}