aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmocom/gsm/gsm0411_smr.h3
-rw-r--r--src/gsm/gsm0411_smr.c99
2 files changed, 70 insertions, 32 deletions
diff --git a/include/osmocom/gsm/gsm0411_smr.h b/include/osmocom/gsm/gsm0411_smr.h
index 5ea8584d..b0614924 100644
--- a/include/osmocom/gsm/gsm0411_smr.h
+++ b/include/osmocom/gsm/gsm0411_smr.h
@@ -11,6 +11,7 @@
#define GSM411_SM_RL_REPORT_IND 0x406
struct gsm411_smr_inst {
+ uint64_t id; /* a unique id for the SMS */
int network; /* is this a MO (0) or MT (1) transfer */
int (*rl_recv) (struct gsm411_smr_inst *inst, int msg_type,
struct msgb *msg);
@@ -24,7 +25,7 @@ struct gsm411_smr_inst {
extern const struct value_string gsm411_rp_cause_strs[];
/* init a new instance */
-void gsm411_smr_init(struct gsm411_smr_inst *inst, int network,
+void gsm411_smr_init(struct gsm411_smr_inst *inst, uint64_t id, int network,
int (*rl_recv) (struct gsm411_smr_inst *inst, int msg_type,
struct msgb *msg),
int (*mn_send) (struct gsm411_smr_inst *inst, int msg_type,
diff --git a/src/gsm/gsm0411_smr.c b/src/gsm/gsm0411_smr.c
index 7dd8f723..61ffacf3 100644
--- a/src/gsm/gsm0411_smr.c
+++ b/src/gsm/gsm0411_smr.c
@@ -49,6 +49,7 @@
#include <string.h>
#include <errno.h>
+#include <inttypes.h>
#include <osmocom/core/msgb.h>
#include <osmocom/core/logging.h>
#include <osmocom/core/timer.h>
@@ -59,16 +60,19 @@
#include <osmocom/gsm/gsm0411_smr.h>
#include <osmocom/gsm/protocol/gsm_04_08.h>
+#define SMR_LOG_STR "SMR(%" PRIu64 ") "
+
static void rp_timer_expired(void *data);
/* init a new instance */
-void gsm411_smr_init(struct gsm411_smr_inst *inst, int network,
+void gsm411_smr_init(struct gsm411_smr_inst *inst, uint64_t id, int network,
int (*rl_recv) (struct gsm411_smr_inst *inst, int msg_type,
struct msgb *msg),
int (*mn_send) (struct gsm411_smr_inst *inst, int msg_type,
struct msgb *msg))
{
memset(inst, 0, sizeof(*inst));
+ inst->id = id;
inst->network = network;
inst->rp_state = GSM411_RPS_IDLE;
inst->rl_recv = rl_recv;
@@ -76,13 +80,16 @@ void gsm411_smr_init(struct gsm411_smr_inst *inst, int network,
inst->rp_timer.data = inst;
inst->rp_timer.cb = rp_timer_expired;
- LOGP(DLSMS, LOGL_INFO, "New SMR instance created\n");
+ LOGP(DLSMS, LOGL_INFO,
+ SMR_LOG_STR "instance created for %d\n",
+ inst->id, inst->network);
}
/* clear instance */
void gsm411_smr_clear(struct gsm411_smr_inst *inst)
{
- LOGP(DLSMS, LOGL_INFO, "Clear SMR instance\n");
+ LOGP(DLSMS, LOGL_INFO,
+ SMR_LOG_STR "clearing SMR instance\n", inst->id);
osmo_timer_del(&inst->rp_timer);
}
@@ -127,7 +134,8 @@ const struct value_string gsm411_rp_cause_strs[] = {
static void new_rp_state(struct gsm411_smr_inst *inst,
enum gsm411_rp_state state)
{
- LOGP(DLSMS, LOGL_INFO, "New RP state %s -> %s\n",
+ LOGP(DLSMS, LOGL_INFO,
+ SMR_LOG_STR "new RP state %s -> %s\n", inst->id,
smr_state_names[inst->rp_state], smr_state_names[state]);
inst->rp_state = state;
@@ -160,8 +168,9 @@ static int gsm411_send_rp_error(struct gsm411_smr_inst *inst,
msgb_tv_put(msg, 1, cause);
- LOGP(DLSMS, LOGL_NOTICE, "TX: SMS RP ERROR, cause %d (%s)\n", cause,
- get_value_string(gsm411_rp_cause_strs, cause));
+ LOGP(DLSMS, LOGL_NOTICE,
+ SMR_LOG_STR "TX: SMS RP ERROR, cause %d (%s)\n", inst->id,
+ cause, get_value_string(gsm411_rp_cause_strs, cause));
return gsm411_rp_sendmsg(inst, msg,
(inst->network) ? GSM411_MT_RP_ERROR_MT : GSM411_MT_RP_ERROR_MO,
@@ -172,7 +181,8 @@ static int gsm411_send_release(struct gsm411_smr_inst *inst)
{
struct msgb *msg = gsm411_msgb_alloc();
- LOGP(DLSMS, LOGL_DEBUG, "TX: MNSMS-REL-REQ\n");
+ LOGP(DLSMS, LOGL_DEBUG,
+ SMR_LOG_STR "TX: MNSMS-REL-REQ\n", inst->id);
return inst->mn_send(inst, GSM411_MNSMS_REL_REQ, msg);
}
@@ -181,8 +191,10 @@ static int gsm411_send_abort(struct gsm411_smr_inst *inst)
{
struct msgb *msg = gsm411_msgb_alloc();
+ LOGP(DLSMS, LOGL_DEBUG,
+ SMR_LOG_STR "TX: MNSMS-ABORT-REQ\n", inst->id);
+
msgb_tv_put(msg, 1, 111); //FIXME: better idea ? */
- LOGP(DLSMS, LOGL_DEBUG, "TX: MNSMS-ABORT-REQ\n");
return inst->mn_send(inst, GSM411_MNSMS_ABORT_REQ, msg);
}
@@ -191,14 +203,16 @@ static int gsm411_send_report(struct gsm411_smr_inst *inst)
{
struct msgb *msg = gsm411_msgb_alloc();
- LOGP(DLSMS, LOGL_DEBUG, "Sending empty SM_RL_REPORT_IND\n");
+ LOGP(DLSMS, LOGL_DEBUG,
+ SMR_LOG_STR "Sending empty SM_RL_REPORT_IND\n", inst->id);
return inst->rl_recv(inst, GSM411_SM_RL_REPORT_IND, msg);
}
static int gsm411_rl_data_req(struct gsm411_smr_inst *inst, struct msgb *msg)
{
- LOGP(DLSMS, LOGL_DEBUG, "TX SMS RP-DATA\n");
+ LOGP(DLSMS, LOGL_DEBUG,
+ SMR_LOG_STR "TX SMS RP-DATA\n", inst->id);
/* start TR1N and enter 'wait for RP-ACK state' */
osmo_timer_schedule(&inst->rp_timer, GSM411_TMR_TR1M);
new_rp_state(inst, GSM411_RPS_WAIT_FOR_RP_ACK);
@@ -208,7 +222,8 @@ static int gsm411_rl_data_req(struct gsm411_smr_inst *inst, struct msgb *msg)
static int gsm411_rl_report_req(struct gsm411_smr_inst *inst, struct msgb *msg)
{
- LOGP(DLSMS, LOGL_DEBUG, "TX SMS REPORT\n");
+ LOGP(DLSMS, LOGL_DEBUG,
+ SMR_LOG_STR "TX SMS REPORT\n", inst->id);
new_rp_state(inst, GSM411_RPS_IDLE);
inst->mn_send(inst, GSM411_MNSMS_DATA_REQ, msg);
@@ -225,7 +240,9 @@ static int gsm411_mnsms_est_ind(struct gsm411_smr_inst *inst, struct msgb *msg)
/* check direction */
if (inst->network == (msg_type & 1)) {
- LOGP(DLSMS, LOGL_NOTICE, "Invalid RP type 0x%02x\n", msg_type);
+ LOGP(DLSMS, LOGL_NOTICE,
+ SMR_LOG_STR "Invalid RP type 0x%02x\n",
+ inst->id, msg_type);
gsm411_send_rp_error(inst, rp_data->msg_ref,
GSM411_RP_CAUSE_MSG_INCOMP_STATE);
new_rp_state(inst, GSM411_RPS_IDLE);
@@ -236,21 +253,25 @@ static int gsm411_mnsms_est_ind(struct gsm411_smr_inst *inst, struct msgb *msg)
switch (msg_type) {
case GSM411_MT_RP_DATA_MT:
case GSM411_MT_RP_DATA_MO:
- LOGP(DLSMS, LOGL_DEBUG, "RX SMS RP-DATA\n");
+ LOGP(DLSMS, LOGL_DEBUG,
+ SMR_LOG_STR "RX SMS RP-DATA\n", inst->id);
/* start TR2N and enter 'wait to send RP-ACK state' */
osmo_timer_schedule(&inst->rp_timer, GSM411_TMR_TR2M);
new_rp_state(inst, GSM411_RPS_WAIT_TO_TX_RP_ACK);
rc = inst->rl_recv(inst, GSM411_SM_RL_DATA_IND, msg);
break;
case GSM411_MT_RP_SMMA_MO:
- LOGP(DLSMS, LOGL_DEBUG, "RX SMS RP-SMMA\n");
+ LOGP(DLSMS, LOGL_DEBUG,
+ SMR_LOG_STR "RX SMS RP-SMMA\n", inst->id);
/* start TR2N and enter 'wait to send RP-ACK state' */
osmo_timer_schedule(&inst->rp_timer, GSM411_TMR_TR2M);
new_rp_state(inst, GSM411_RPS_WAIT_TO_TX_RP_ACK);
rc = inst->rl_recv(inst, GSM411_SM_RL_DATA_IND, msg);
break;
default:
- LOGP(DLSMS, LOGL_NOTICE, "Invalid RP type 0x%02x\n", msg_type);
+ LOGP(DLSMS, LOGL_NOTICE,
+ SMR_LOG_STR "invalid RP type 0x%02x\n",
+ inst->id, msg_type);
gsm411_send_rp_error(inst, rp_data->msg_ref,
GSM411_RP_CAUSE_MSGTYPE_NOTEXIST);
new_rp_state(inst, GSM411_RPS_IDLE);
@@ -271,7 +292,9 @@ static int gsm411_mnsms_data_ind_tx(struct gsm411_smr_inst *inst,
/* check direction */
if (inst->network == (msg_type & 1)) {
- LOGP(DLSMS, LOGL_NOTICE, "Invalid RP type 0x%02x\n", msg_type);
+ LOGP(DLSMS, LOGL_NOTICE,
+ SMR_LOG_STR "invalid RP type 0x%02x\n",
+ inst->id, msg_type);
gsm411_send_rp_error(inst, rp_data->msg_ref,
GSM411_RP_CAUSE_MSG_INCOMP_STATE);
new_rp_state(inst, GSM411_RPS_IDLE);
@@ -282,20 +305,24 @@ static int gsm411_mnsms_data_ind_tx(struct gsm411_smr_inst *inst,
switch (msg_type) {
case GSM411_MT_RP_ACK_MO:
case GSM411_MT_RP_ACK_MT:
- LOGP(DLSMS, LOGL_DEBUG, "RX SMS RP-ACK\n");
+ LOGP(DLSMS, LOGL_DEBUG,
+ SMR_LOG_STR "RX SMS RP-ACK\n", inst->id);
new_rp_state(inst, GSM411_RPS_IDLE);
inst->rl_recv(inst, GSM411_SM_RL_REPORT_IND, msg);
gsm411_send_release(inst);
return 0;
case GSM411_MT_RP_ERROR_MO:
case GSM411_MT_RP_ERROR_MT:
- LOGP(DLSMS, LOGL_DEBUG, "RX SMS RP-ERROR\n");
+ LOGP(DLSMS, LOGL_DEBUG,
+ SMR_LOG_STR "RX SMS RP-ERROR\n", inst->id);
new_rp_state(inst, GSM411_RPS_IDLE);
inst->rl_recv(inst, GSM411_SM_RL_REPORT_IND, msg);
gsm411_send_release(inst);
return 0;
default:
- LOGP(DLSMS, LOGL_NOTICE, "Invalid RP type 0x%02x\n", msg_type);
+ LOGP(DLSMS, LOGL_NOTICE,
+ SMR_LOG_STR "Invalid RP type 0x%02x\n",
+ inst->id, msg_type);
gsm411_send_rp_error(inst, rp_data->msg_ref,
GSM411_RP_CAUSE_MSGTYPE_NOTEXIST);
new_rp_state(inst, GSM411_RPS_IDLE);
@@ -309,7 +336,8 @@ static int gsm411_mnsms_data_ind_tx(struct gsm411_smr_inst *inst,
static int gsm411_mnsms_error_ind_tx(struct gsm411_smr_inst *inst,
struct msgb *msg)
{
- LOGP(DLSMS, LOGL_DEBUG, "RX SMS MNSMS-ERROR-IND\n");
+ LOGP(DLSMS, LOGL_DEBUG,
+ SMR_LOG_STR "RX SMS MNSMS-ERROR-IND\n", inst->id);
new_rp_state(inst, GSM411_RPS_IDLE);
inst->rl_recv(inst, GSM411_SM_RL_REPORT_IND, msg);
gsm411_send_release(inst);
@@ -319,7 +347,8 @@ static int gsm411_mnsms_error_ind_tx(struct gsm411_smr_inst *inst,
static int gsm411_mnsms_error_ind_rx(struct gsm411_smr_inst *inst,
struct msgb *msg)
{
- LOGP(DLSMS, LOGL_DEBUG, "RX SMS MNSMS-ERROR-IND\n");
+ LOGP(DLSMS, LOGL_DEBUG,
+ SMR_LOG_STR "RX SMS MNSMS-ERROR-IND\n", inst->id);
new_rp_state(inst, GSM411_RPS_IDLE);
return inst->rl_recv(inst, GSM411_SM_RL_REPORT_IND, msg);
}
@@ -328,11 +357,13 @@ static int gsm411_mnsms_error_ind_rx(struct gsm411_smr_inst *inst,
static void rp_timer_expired(void *data)
{
struct gsm411_smr_inst *inst = data;
+ const char *str;
+
+ str = inst->rp_state == GSM411_RPS_WAIT_TO_TX_RP_ACK
+ ? "TR2N" : "TR1N";
- if (inst->rp_state == GSM411_RPS_WAIT_TO_TX_RP_ACK)
- LOGP(DLSMS, LOGL_DEBUG, "TR2N\n");
- else
- LOGP(DLSMS, LOGL_DEBUG, "TR1N\n");
+ LOGP(DLSMS, LOGL_DEBUG,
+ SMR_LOG_STR "%s expired\n", inst->id, str);
gsm411_send_report(inst);
gsm411_send_abort(inst);
}
@@ -372,13 +403,16 @@ int gsm411_smr_send(struct gsm411_smr_inst *inst, int msg_type,
break;
}
if (i == SMRDOWNSLLEN) {
- LOGP(DLSMS, LOGL_NOTICE, "Message %u unhandled at this state "
- "%s.\n", msg_type, smr_state_names[inst->rp_state]);
+ LOGP(DLSMS, LOGL_NOTICE,
+ SMR_LOG_STR "message %u unhandled at this state "
+ "%s.\n", inst->id, msg_type,
+ smr_state_names[inst->rp_state]);
msgb_free(msg);
return 0;
}
- LOGP(DLSMS, LOGL_INFO, "Message %s received in state %s\n",
+ LOGP(DLSMS, LOGL_INFO,
+ SMR_LOG_STR "message %s received in state %s\n", inst->id,
smrdownstatelist[i].name, smr_state_names[inst->rp_state]);
rc = smrdownstatelist[i].rout(inst, msg);
@@ -437,12 +471,15 @@ int gsm411_smr_recv(struct gsm411_smr_inst *inst, int msg_type,
break;
}
if (i == SMRDATASLLEN) {
- LOGP(DLSMS, LOGL_NOTICE, "Message %u unhandled at this state "
- "%s.\n", msg_type, smr_state_names[inst->rp_state]);
+ LOGP(DLSMS, LOGL_NOTICE,
+ SMR_LOG_STR "message %u unhandled at this state "
+ "%s.\n", inst->id, msg_type,
+ smr_state_names[inst->rp_state]);
return 0;
}
- LOGP(DLSMS, LOGL_INFO, "Message %s received in state %s\n",
+ LOGP(DLSMS, LOGL_INFO,
+ SMR_LOG_STR "message %s received in state %s\n", inst->id,
smrdatastatelist[i].name, smr_state_names[inst->rp_state]);
rc = smrdatastatelist[i].rout(inst, msg);