aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2019-08-21 15:24:29 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2019-08-23 14:39:35 +0200
commitd950134c530526f03ed908dcf5e02f88b3f1c9fc (patch)
treea6d7c60cda3be694e0578e580c97350b906c42e9
parent623c5b36e9453f1623bc443e04627c2c31cb2619 (diff)
libgtp: announce pdp ctx deletion upon CreatePdpCtx being rejected
The libgtp application may have already allocated related resources associated to the pdp context, so we need to signal its deletion in order to let the application free the resources. This should fix the duplication of pdp contexts seen in osmo-ggsn when "show pdp-context" related VTY commands are used. It was spotted due to some MS requesting a v4v6 context on a v4-only APN, where first v4 address was allocated, and then upon v6 allocation create_context_ind() called gtp_create_context_resp(GTPCAUSE_MISSING_APN) but the first address was not freed. Upon receiving the callback, osmo-ggsn should now free the related resources. Related: OS#4154 Change-Id: I6c6215a4ce478afabc78ffaf5ffb0cf829e41226
-rw-r--r--ggsn/ggsn.c2
-rw-r--r--gtp/gtp.c5
2 files changed, 3 insertions, 4 deletions
diff --git a/ggsn/ggsn.c b/ggsn/ggsn.c
index 95371a2..d71855d 100644
--- a/ggsn/ggsn.c
+++ b/ggsn/ggsn.c
@@ -386,7 +386,7 @@ static int delete_context(struct pdp_t *pdp)
LOGPPDP(LOGL_ERROR, pdp, "Cannot find/free IP Pool member\n");
}
- if (apn->cfg.gtpu_mode == APN_GTPU_MODE_KERNEL_GTP) {
+ if (apn && apn->cfg.gtpu_mode == APN_GTPU_MODE_KERNEL_GTP) {
if (gtp_kernel_tunnel_del(pdp, apn->tun.cfg.dev_name)) {
LOGPPDP(LOGL_ERROR, pdp, "Cannot delete tunnel from kernel:%s\n",
strerror(errno));
diff --git a/gtp/gtp.c b/gtp/gtp.c
index 799f8a7..f0318f7 100644
--- a/gtp/gtp.c
+++ b/gtp/gtp.c
@@ -1301,9 +1301,8 @@ int gtp_create_context_resp(struct gsn_t *gsn, struct pdp_t *pdp, int cause)
/* Now send off a reply to the peer */
gtp_create_pdp_resp(gsn, pdp->version, pdp, cause);
- if (cause != GTPCAUSE_ACC_REQ) {
- pdp_freepdp(pdp);
- }
+ if (cause != GTPCAUSE_ACC_REQ)
+ gtp_freepdp(gsn, pdp);
return 0;
}