summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/host/layer23/include/osmocom/bb/mobile/gsm411_sms.h6
-rw-r--r--src/host/layer23/include/osmocom/bb/mobile/primitives.h19
-rw-r--r--src/host/layer23/src/mobile/gsm411_sms.c4
-rw-r--r--src/host/layer23/src/mobile/primitives.c18
4 files changed, 46 insertions, 1 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 a94d1aa7..d3074fb3 100644
--- a/src/host/layer23/include/osmocom/bb/mobile/gsm411_sms.h
+++ b/src/host/layer23/include/osmocom/bb/mobile/gsm411_sms.h
@@ -4,6 +4,12 @@
#define SMS_HDR_SIZE 128
#define SMS_TEXT_SIZE 256
+#include <stdint.h>
+#include <time.h>
+
+struct osmocom_ms;
+struct msgb;
+
struct gsm_sms {
unsigned long validity_minutes;
uint8_t reply_path_req;
diff --git a/src/host/layer23/include/osmocom/bb/mobile/primitives.h b/src/host/layer23/include/osmocom/bb/mobile/primitives.h
index 4d81ba10..6804fc0e 100644
--- a/src/host/layer23/include/osmocom/bb/mobile/primitives.h
+++ b/src/host/layer23/include/osmocom/bb/mobile/primitives.h
@@ -1,5 +1,7 @@
#pragma once
+#include <osmocom/bb/mobile/gsm411_sms.h>
+
#include <osmocom/core/prim.h>
struct mobile_prim;
@@ -16,6 +18,7 @@ enum mobile_prims {
PRIM_MOB_TIMER_CANCEL,
PRIM_MOB_STARTED,
PRIM_MOB_SHUTDOWN,
+ PRIM_MOB_SMS,
};
struct mobile_prim_intf {
@@ -52,15 +55,27 @@ struct mobile_shutdown_param {
int new_state;
};
+/**
+ * SMS related configs.
+ */
+struct mobile_sms_param {
+ struct gsm_sms sms;
+
+ bool cause_valid;
+ int cause;
+};
+
struct mobile_prim {
struct osmo_prim_hdr hdr; /*!< Primitive base class */
union {
struct mobile_timer_param timer;
struct mobile_started_param started;
struct mobile_shutdown_param shutdown;
+ struct mobile_sms_param sms;
} u;
};
+
struct mobile_prim_intf *mobile_prim_intf_alloc(struct osmocom_ms *ms);
int mobile_prim_intf_req(struct mobile_prim_intf *intf, struct mobile_prim *hdr);
void mobile_prim_intf_free(struct mobile_prim_intf *intf);
@@ -68,4 +83,6 @@ void mobile_prim_intf_free(struct mobile_prim_intf *intf);
struct mobile_prim *mobile_prim_alloc(unsigned int primitive, enum osmo_prim_operation op);
void mobile_prim_ntfy_started(struct osmocom_ms *ms, bool started);
-void mobile_prim_ntfy_shutdown(struct osmocom_ms *ms, int old_state, int new_state); \ No newline at end of file
+void mobile_prim_ntfy_shutdown(struct osmocom_ms *ms, int old_state, int new_state);
+void mobile_prim_ntfy_sms_new(struct osmocom_ms *ms, struct gsm_sms *sms);
+void mobile_prim_ntfy_sms_status(struct osmocom_ms *ms, struct gsm_sms *sms, uint8_t cause);
diff --git a/src/host/layer23/src/mobile/gsm411_sms.c b/src/host/layer23/src/mobile/gsm411_sms.c
index b635bb2f..6d9d56ec 100644
--- a/src/host/layer23/src/mobile/gsm411_sms.c
+++ b/src/host/layer23/src/mobile/gsm411_sms.c
@@ -40,6 +40,7 @@
#include <osmocom/gsm/gsm0411_utils.h>
#include <osmocom/core/talloc.h>
#include <osmocom/bb/mobile/vty.h>
+#include <osmocom/bb/mobile/primitives.h>
#define UM_SAPI_SMS 3
@@ -129,6 +130,7 @@ static int gsm411_sms_report(struct osmocom_ms *ms, struct gsm_sms *sms,
vty_notify(ms, "SMS to %s failed: %s\n", sms->address,
get_value_string(gsm411_rp_cause_strs, cause));
+ mobile_prim_ntfy_sms_status(ms, sms, cause);
return 0;
}
/*
@@ -186,6 +188,8 @@ static int gsm340_rx_sms_deliver(struct osmocom_ms *ms, struct msgb *msg,
char vty_text[sizeof(gsms->text)], *p;
FILE *fp;
+ mobile_prim_ntfy_sms_new(ms, gsms);
+
/* remove linefeeds and show at VTY */
strcpy(vty_text, gsms->text);
for (p = vty_text; *p; p++) {
diff --git a/src/host/layer23/src/mobile/primitives.c b/src/host/layer23/src/mobile/primitives.c
index dde34bcc..0902139e 100644
--- a/src/host/layer23/src/mobile/primitives.c
+++ b/src/host/layer23/src/mobile/primitives.c
@@ -126,6 +126,24 @@ void mobile_prim_ntfy_shutdown(struct osmocom_ms *ms, int old_state, int new_sta
dispatch(ms, prim);
}
+void mobile_prim_ntfy_sms_new(struct osmocom_ms *ms, struct gsm_sms *sms)
+{
+ struct mobile_prim *prim = mobile_prim_alloc(PRIM_MOB_SMS, PRIM_OP_INDICATION);
+
+ prim->u.sms.sms = *sms;
+ dispatch(ms, prim);
+}
+
+void mobile_prim_ntfy_sms_status(struct osmocom_ms *ms, struct gsm_sms *sms, uint8_t cause)
+{
+ struct mobile_prim *prim = mobile_prim_alloc(PRIM_MOB_SMS, PRIM_OP_INDICATION);
+
+ prim->u.sms.sms = *sms;
+ prim->u.sms.cause_valid = true;
+ prim->u.sms.cause = cause;
+ dispatch(ms, prim);
+}
+
static int cancel_timer(struct mobile_prim_intf *intf, struct mobile_timer_param *param)
{
struct timer_closure *closure;