diff options
author | Pau Espin Pedrol <pespin@sysmocom.de> | 2019-12-10 19:29:22 +0100 |
---|---|---|
committer | laforge <laforge@osmocom.org> | 2020-01-06 10:26:46 +0000 |
commit | 65a0d1d19be543573ff1b5e4099a0e2da9c9dca5 (patch) | |
tree | 012939a3b8acf8581b949d49dfb4571baf82c64a | |
parent | 5530f12f71862ff0bf6357e4d12f7034151abb96 (diff) |
Support Gb PAGING-CS
The paging is sent over PACCH towards MS with an active TBF.
Related: OS#2406
Change-Id: I9501e02e1d7f6944497e724dbccb9a19c3f5221f
-rw-r--r-- | src/gprs_bssgp_pcu.cpp | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/gprs_bssgp_pcu.cpp b/src/gprs_bssgp_pcu.cpp index 33b2ded8..955b8cda 100644 --- a/src/gprs_bssgp_pcu.cpp +++ b/src/gprs_bssgp_pcu.cpp @@ -171,6 +171,26 @@ static int gprs_bssgp_pcu_rx_dl_ud(struct msgb *msg, struct tlv_parsed *tp) ms_class, egprs_ms_class, delay_csec, data, len); } +static int gprs_bssgp_pcu_rx_paging_cs(struct msgb *msg, struct tlv_parsed *tp) +{ + const uint8_t *mi; + uint8_t mi_len; + uint8_t *chan_needed = (uint8_t *)TLVP_VAL(tp, BSSGP_IE_CHAN_NEEDED); + + if (TLVP_PRESENT(tp, BSSGP_IE_TMSI)) { + mi_len = TLVP_LEN(tp, BSSGP_IE_TMSI); + mi = TLVP_VAL(tp, BSSGP_IE_TMSI); + } else if (TLVP_PRESENT(tp, BSSGP_IE_IMSI)) { /* Use IMSI if TMSI not available: */ + mi_len = TLVP_LEN(tp, BSSGP_IE_IMSI); + mi = TLVP_VAL(tp, BSSGP_IE_IMSI); + } else { + LOGP(DBSSGP, LOGL_ERROR, "Neither TMSI IE nor IMSI IE is present\n"); + return bssgp_tx_status(BSSGP_CAUSE_COND_IE_ERR, NULL, msg); + } + + return BTS::main_bts()->add_paging(chan_needed ? *chan_needed : 0, mi, mi_len); +} + static int gprs_bssgp_pcu_rx_paging_ps(struct msgb *msg, struct tlv_parsed *tp) { char imsi[16]; @@ -308,6 +328,9 @@ static int gprs_bssgp_pcu_rx_sign(struct msgb *msg, struct tlv_parsed *tp, struc the_pcu.bvc_reset = 1; bvc_timeout(NULL); break; + case BSSGP_PDUT_PAGING_CS: + gprs_bssgp_pcu_rx_paging_cs(msg, tp); + break; case BSSGP_PDUT_PAGING_PS: gprs_bssgp_pcu_rx_paging_ps(msg, tp); break; @@ -320,7 +343,6 @@ static int gprs_bssgp_pcu_rx_sign(struct msgb *msg, struct tlv_parsed *tp, struc break; case BSSGP_PDUT_SUSPEND_NACK: case BSSGP_PDUT_RESUME_NACK: - case BSSGP_PDUT_PAGING_CS: case BSSGP_PDUT_FLUSH_LL: case BSSGP_PDUT_SGSN_INVOKE_TRACE: LOGP(DBSSGP, LOGL_INFO, "Rx BSSGP BVCI=%d (SIGN) PDU type %s not implemented\n", |