aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2021-02-16 13:59:05 +0100
committerPau Espin Pedrol <pespin@sysmocom.de>2021-02-16 13:59:07 +0100
commit11ccc4305d8a29969018111a1f6dfad062842f47 (patch)
tree2b86f5f2d22cf3894be992a4128a0dad0f7a6cc4
parent901ed14c898ef229c654009ac0dc078d09d7b054 (diff)
Fix nsei+bvci not updated on rx UL SNDCP data
msgid2mmctx() was already being called for signalling messages in gsm0408_gprs_rcvmsg_gb() before calling gprs_gb_recv_pdu(), but it was not called in sndcp_llunitdata_ind(). Let's move msgid2mmctx() inside gprs_gb_recv_pdu() since we want to always update the nsei+bvci, regardless of message containing data or control content. This commit fixes the scenario where an MS changes to a new cell (PCU) and then continues transmitting UL data. Prior to this patch, the SGSN kept sending DL content to the old cell (PCU nsei+bvci) instead of the new one even after the MS transmitted Ul content fro mthe new cell. Related: SYS#4909 Change-Id: I2c14e1d65575f54212924f7c5f0a2f4c1b76ec81
-rw-r--r--include/osmocom/sgsn/gprs_gb.h2
-rw-r--r--src/sgsn/gprs_gb.c6
-rw-r--r--src/sgsn/gprs_sndcp.c2
3 files changed, 5 insertions, 5 deletions
diff --git a/include/osmocom/sgsn/gprs_gb.h b/include/osmocom/sgsn/gprs_gb.h
index c98dd3448..916236761 100644
--- a/include/osmocom/sgsn/gprs_gb.h
+++ b/include/osmocom/sgsn/gprs_gb.h
@@ -8,7 +8,7 @@
int gsm0408_gprs_rcvmsg_gb(struct msgb *msg, struct gprs_llc_llme *llme,
bool drop_cipherable);
/* Has to be called whenever any PDU (signaling, data, ...) has been received */
-void gprs_gb_recv_pdu(struct sgsn_mm_ctx *mmctx);
+void gprs_gb_recv_pdu(struct sgsn_mm_ctx *mmctx, const struct msgb *msg);
/* page a MS in its routing area */
int gprs_gb_page_ps_ra(struct sgsn_mm_ctx *mmctx);
diff --git a/src/sgsn/gprs_gb.c b/src/sgsn/gprs_gb.c
index 2585d6dc2..cddd1b1e1 100644
--- a/src/sgsn/gprs_gb.c
+++ b/src/sgsn/gprs_gb.c
@@ -38,7 +38,8 @@
#include <osmocom/sgsn/debug.h>
/* Has to be called whenever any PDU (signaling, data, ...) has been received */
-void gprs_gb_recv_pdu(struct sgsn_mm_ctx *mmctx) {
+void gprs_gb_recv_pdu(struct sgsn_mm_ctx *mmctx, const struct msgb *msg) {
+ msgid2mmctx(mmctx, msg);
if (mmctx->gb.llme)
osmo_fsm_inst_dispatch(mmctx->gb.mm_state_fsm, E_MM_PDU_RECEPTION, NULL);
}
@@ -56,10 +57,9 @@ int gsm0408_gprs_rcvmsg_gb(struct msgb *msg, struct gprs_llc_llme *llme,
bssgp_parse_cell_id(&ra_id, msgb_bcid(msg));
mmctx = sgsn_mm_ctx_by_tlli(msgb_tlli(msg), &ra_id);
if (mmctx) {
- msgid2mmctx(mmctx, msg);
rate_ctr_inc(&mmctx->ctrg->ctr[GMM_CTR_PKTS_SIG_IN]);
mmctx->gb.llme = llme;
- gprs_gb_recv_pdu(mmctx);
+ gprs_gb_recv_pdu(mmctx, msg);
}
/* MMCTX can be NULL */
diff --git a/src/sgsn/gprs_sndcp.c b/src/sgsn/gprs_sndcp.c
index b237bf9ad..6692f1ae5 100644
--- a/src/sgsn/gprs_sndcp.c
+++ b/src/sgsn/gprs_sndcp.c
@@ -808,7 +808,7 @@ int sndcp_llunitdata_ind(struct msgb *msg, struct gprs_llc_lle *lle,
lle, lle->llme->tlli, lle->sapi, sch->nsapi);
return -EIO;
}
- gprs_gb_recv_pdu(mmctx);
+ gprs_gb_recv_pdu(mmctx, msg);
if (scomph) {
sne->defrag.pcomp = scomph->pcomp;