Forward GPRS SUSPEND REQ from BTS to SGSN using BSSGP
As specified in 3GPP TS 03.60 Section 16.2.1 and 44.018 Section 3.4.15, a Class B MS is sending a "RR GPRS SUSPEND REQ" via a DCCH to the BTS if it wants to suspend GPRS services. As of Change-Id I3c1af662c8f0d3d22da200638480f6ef05c3ed1f, OsmoBTS forwards this via the PCU socket, so we need to pick it up and send it via BSSGP to the SGSN. Change-Id: I7b4beb413a6f974373a404b5a11c44d86ba695d3 Closes: OS#2249
This commit is contained in:
parent
1473b377c2
commit
3447c4a8a4
|
@ -12,6 +12,7 @@
|
|||
#define PCU_IF_MSG_DATA_REQ 0x00 /* send data to given channel */
|
||||
#define PCU_IF_MSG_DATA_CNF 0x01 /* confirm (e.g. transmission on PCH) */
|
||||
#define PCU_IF_MSG_DATA_IND 0x02 /* receive data from given channel */
|
||||
#define PCU_IF_MSG_SUSP_REQ 0x03 /* BTS forwards GPRS SUSP REQ to PCU */
|
||||
#define PCU_IF_MSG_RTS_REQ 0x10 /* ready to send request */
|
||||
#define PCU_IF_MSG_DATA_CNF_DT 0x11 /* confirm (with direct tlli) */
|
||||
#define PCU_IF_MSG_RACH_IND 0x22 /* receive RACH */
|
||||
|
@ -171,6 +172,13 @@ struct gsm_pcu_if_pag_req {
|
|||
uint8_t identity_lv[9];
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* BTS tells PCU about a GPRS SUSPENSION REQUEST received on DCCH */
|
||||
struct gsm_pcu_if_susp_req {
|
||||
uint32_t tlli;
|
||||
uint8_t ra_id[6];
|
||||
uint8_t cause;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct gsm_pcu_if {
|
||||
/* context based information */
|
||||
uint8_t msg_type; /* message type */
|
||||
|
@ -182,6 +190,7 @@ struct gsm_pcu_if {
|
|||
struct gsm_pcu_if_data data_cnf;
|
||||
struct gsm_pcu_if_data_cnf_dt data_cnf_dt;
|
||||
struct gsm_pcu_if_data data_ind;
|
||||
struct gsm_pcu_if_susp_req susp_req;
|
||||
struct gsm_pcu_if_rts_req rts_req;
|
||||
struct gsm_pcu_if_rach_ind rach_ind;
|
||||
struct gsm_pcu_if_txt_ind txt_ind;
|
||||
|
|
|
@ -604,6 +604,22 @@ static int pcu_rx_pag_req(struct gsm_pcu_if_pag_req *pag_req)
|
|||
pag_req->identity_lv);
|
||||
}
|
||||
|
||||
static int pcu_rx_susp_req(struct gsm_pcu_if_susp_req *susp_req)
|
||||
{
|
||||
struct bssgp_bvc_ctx *bctx = gprs_bssgp_pcu_current_bctx();
|
||||
struct gprs_ra_id ra_id;
|
||||
|
||||
gsm48_parse_ra(&ra_id, susp_req->ra_id);
|
||||
|
||||
LOGP(DL1IF, LOGL_INFO, "GPRS Suspend request received: TLLI=0x%08x RAI=%s\n",
|
||||
susp_req->tlli, osmo_rai_name(&ra_id));
|
||||
|
||||
if (!bctx)
|
||||
return -1;
|
||||
|
||||
return bssgp_tx_suspend(bctx->nsei, susp_req->tlli, &ra_id);
|
||||
}
|
||||
|
||||
int pcu_rx(uint8_t msg_type, struct gsm_pcu_if *pcu_prim)
|
||||
{
|
||||
int rc = 0;
|
||||
|
@ -630,6 +646,9 @@ int pcu_rx(uint8_t msg_type, struct gsm_pcu_if *pcu_prim)
|
|||
case PCU_IF_MSG_PAG_REQ:
|
||||
rc = pcu_rx_pag_req(&pcu_prim->u.pag_req);
|
||||
break;
|
||||
case PCU_IF_MSG_SUSP_REQ:
|
||||
rc = pcu_rx_susp_req(&pcu_prim->u.susp_req);
|
||||
break;
|
||||
default:
|
||||
LOGP(DL1IF, LOGL_ERROR, "Received unknwon PCU msg type %d\n",
|
||||
msg_type);
|
||||
|
|
Loading…
Reference in New Issue