IuPS: Change GTP-U endpoint to SGSN in PMM_IDLE and page UE when data arrives
Change-Id: I47b73a40cbdda6b7c31fb2767f74f9f93d84056b
This commit is contained in:
parent
c17cdb40b5
commit
21b269f814
|
@ -138,6 +138,7 @@ struct sgsn_pdp_ctx *sgsn_create_pdp_ctx(struct sgsn_ggsn_ctx *ggsn,
|
||||||
uint16_t nsapi,
|
uint16_t nsapi,
|
||||||
struct tlv_parsed *tp);
|
struct tlv_parsed *tp);
|
||||||
int sgsn_delete_pdp_ctx(struct sgsn_pdp_ctx *pctx);
|
int sgsn_delete_pdp_ctx(struct sgsn_pdp_ctx *pctx);
|
||||||
|
void sgsn_pdp_upd_gtp_u(struct sgsn_pdp_ctx *pdp, void *addr, size_t alen);
|
||||||
|
|
||||||
/* gprs_sndcp.c */
|
/* gprs_sndcp.c */
|
||||||
|
|
||||||
|
|
|
@ -109,6 +109,16 @@ static const struct tlv_definition gsm48_sm_att_tlvdef = {
|
||||||
|
|
||||||
static int gsm48_gmm_authorize(struct sgsn_mm_ctx *ctx);
|
static int gsm48_gmm_authorize(struct sgsn_mm_ctx *ctx);
|
||||||
|
|
||||||
|
static void mmctx_change_gtpu_endpoints_to_sgsn(struct sgsn_mm_ctx *mm_ctx)
|
||||||
|
{
|
||||||
|
struct sgsn_pdp_ctx *pdp;
|
||||||
|
llist_for_each_entry(pdp, &mm_ctx->pdp_list, list) {
|
||||||
|
sgsn_pdp_upd_gtp_u(pdp,
|
||||||
|
&sgsn->cfg.gtp_listenaddr.sin_addr,
|
||||||
|
sizeof(sgsn->cfg.gtp_listenaddr.sin_addr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void mmctx_set_pmm_state(struct sgsn_mm_ctx *ctx, enum gprs_pmm_state state)
|
void mmctx_set_pmm_state(struct sgsn_mm_ctx *ctx, enum gprs_pmm_state state)
|
||||||
{
|
{
|
||||||
if (ctx->pmm_state == state)
|
if (ctx->pmm_state == state)
|
||||||
|
@ -120,7 +130,8 @@ void mmctx_set_pmm_state(struct sgsn_mm_ctx *ctx, enum gprs_pmm_state state)
|
||||||
{
|
{
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case PMM_IDLE:
|
case PMM_IDLE:
|
||||||
/* TODO: Change GTP-U endpoints to SGSN, start RA Upd timer */
|
/* TODO: start RA Upd timer */
|
||||||
|
mmctx_change_gtpu_endpoints_to_sgsn(ctx);
|
||||||
break;
|
break;
|
||||||
case PMM_CONNECTED:
|
case PMM_CONNECTED:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -401,6 +401,13 @@ reject:
|
||||||
return EOF;
|
return EOF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sgsn_pdp_upd_gtp_u(struct sgsn_pdp_ctx *pdp, void *addr, size_t alen)
|
||||||
|
{
|
||||||
|
pdp->lib->gsnlu.l = alen;
|
||||||
|
memcpy(pdp->lib->gsnlu.v, addr, alen);
|
||||||
|
gtp_update_context(pdp->ggsn->gsn, pdp->lib, pdp, &pdp->lib->hisaddr0);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef BUILD_IU
|
#ifdef BUILD_IU
|
||||||
/* Callback for RAB assignment response */
|
/* Callback for RAB assignment response */
|
||||||
int sgsn_ranap_rab_ass_resp(struct sgsn_mm_ctx *ctx, RANAP_RAB_SetupOrModifiedItemIEs_t *setup_ies)
|
int sgsn_ranap_rab_ass_resp(struct sgsn_mm_ctx *ctx, RANAP_RAB_SetupOrModifiedItemIEs_t *setup_ies)
|
||||||
|
@ -621,6 +628,18 @@ static int cb_data_ind(struct pdp_t *lib, void *packet, unsigned int len)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (mm->ran_type == MM_CTX_T_UTRAN_Iu) {
|
||||||
|
#ifdef BUILD_IU
|
||||||
|
/* Ignore the packet for now and page the UE to get the RAB
|
||||||
|
* reestablished */
|
||||||
|
iu_page_ps(mm->imsi, &mm->p_tmsi, mm->ra.lac, mm->ra.rac);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
#else
|
||||||
|
return -ENOTSUP;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
msg = msgb_alloc_headroom(len+256, 128, "GTP->SNDCP");
|
msg = msgb_alloc_headroom(len+256, 128, "GTP->SNDCP");
|
||||||
ud = msgb_put(msg, len);
|
ud = msgb_put(msg, len);
|
||||||
memcpy(ud, packet, len);
|
memcpy(ud, packet, len);
|
||||||
|
|
Loading…
Reference in New Issue