summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 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]; /*<! 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 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;
}