aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Willmann <dwillmann@sysmocom.de>2016-05-21 00:53:42 +0200
committerNeels Hofmeyr <nhofmeyr@sysmocom.de>2016-09-01 23:44:45 +0200
commit6b7b319d543ad4fb34154725c05fa5976dc2ed6a (patch)
treedbcaaa7f3a981bd18916dbddeebf8be6fe37e7b5
parent61329d45b8560c2575ed51074fa59958ccb1deed (diff)
IuPS: add Iu response to create_pdp_conf()
-rw-r--r--openbsc/include/openbsc/gprs_gmm.h2
-rw-r--r--openbsc/src/gprs/gprs_gmm.c25
-rw-r--r--openbsc/src/gprs/sgsn_libgtp.c8
3 files changed, 35 insertions, 0 deletions
diff --git a/openbsc/include/openbsc/gprs_gmm.h b/openbsc/include/openbsc/gprs_gmm.h
index 28467d768..d210a3547 100644
--- a/openbsc/include/openbsc/gprs_gmm.h
+++ b/openbsc/include/openbsc/gprs_gmm.h
@@ -30,4 +30,6 @@ int gprs_gmm_rx_resume(struct gprs_ra_id *raid, uint32_t tlli,
time_t gprs_max_time_to_idle(void);
+int iu_rab_act_ps(uint8_t rab_id, struct sgsn_pdp_ctx *pdp, bool use_x213_nsap);
+
#endif /* _GPRS_GMM_H */
diff --git a/openbsc/src/gprs/gprs_gmm.c b/openbsc/src/gprs/gprs_gmm.c
index cc0caf4a9..8b8bdd1d2 100644
--- a/openbsc/src/gprs/gprs_gmm.c
+++ b/openbsc/src/gprs/gprs_gmm.c
@@ -2419,3 +2419,28 @@ int gprs_gmm_rx_resume(struct gprs_ra_id *raid, uint32_t tlli,
mmctx->mm_state = GMM_REGISTERED_NORMAL;
return 0;
}
+
+#ifdef BUILD_IU
+int iu_rab_act_ps(uint8_t rab_id, struct sgsn_pdp_ctx *pdp, bool use_x213_nsap)
+{
+ struct msgb *msg;
+ struct sgsn_mm_ctx *mm = pdp->mm;
+ struct ue_conn_ctx *uectx;
+ uint32_t ggsn_ip;
+
+ uectx = mm->iu.ue_ctx;
+
+ /* Get the IP address for ggsn user plane */
+ memcpy(&ggsn_ip, pdp->lib->gsnru.v, pdp->lib->gsnru.l);
+ ggsn_ip = htonl(ggsn_ip);
+
+ LOGP(DRANAP, LOGL_DEBUG, "Assigning RAB: rab_id=%d, ggsn_ip=%x,"
+ " teid_gn=%x, use_x213_nsap=%d\n",
+ rab_id, ggsn_ip, pdp->lib->teid_gn, use_x213_nsap);
+
+ msg = ranap_new_msg_rab_assign_data(rab_id, ggsn_ip,
+ pdp->lib->teid_gn, use_x213_nsap);
+ msg->l2h = msg->data;
+ return iu_rab_act(uectx, msg);
+}
+#endif
diff --git a/openbsc/src/gprs/sgsn_libgtp.c b/openbsc/src/gprs/sgsn_libgtp.c
index 4a14cf611..45eff6376 100644
--- a/openbsc/src/gprs/sgsn_libgtp.c
+++ b/openbsc/src/gprs/sgsn_libgtp.c
@@ -366,6 +366,14 @@ static int create_pdp_conf(struct pdp_t *pdp, void *cbp, int cause)
/* Activate the SNDCP layer */
sndcp_sm_activate_ind(&pctx->mm->gb.llme->lle[pctx->sapi], pctx->nsapi);
return send_act_pdp_cont_acc(pctx);
+ } else if (pctx->mm->ran_type == MM_CTX_T_UTRAN_Iu) {
+#ifdef BUILD_IU
+ /* Activate a radio bearer */
+ iu_rab_act_ps(pdp->nsapi, pctx, 1);
+ return 0;
+#else
+ return -ENOTSUP;
+#endif
}
LOGP(DGPRS, LOGL_ERROR, "Unknown ran_type %d\n",