diff options
-rw-r--r-- | src/host/layer23/include/osmocom/bb/mobile/gsm411_sms.h | 2 | ||||
-rw-r--r-- | src/host/layer23/include/osmocom/bb/mobile/primitives.h | 2 | ||||
-rw-r--r-- | src/host/layer23/src/mobile/gsm411_sms.c | 2 | ||||
-rw-r--r-- | src/host/layer23/src/mobile/primitives.c | 16 | ||||
-rw-r--r-- | 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]; /*<! 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; } |