This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
Harald Welte gerrit-no-reply at lists.osmocom.org
Review at https://gerrit.osmocom.org/3407
ggsn: Send proper errors in create_context_ind()
When we receive PDP context requests for unknown PDP types or if
we run out of dynamic addresses, we need to inform the SGSN that
PDP context creation failed.
Change-Id: Ibf199c1726130d27c8f80230b30ee51101c93b06
---
M ggsn/ggsn.c
M lib/ippool.c
M lib/ippool.h
3 files changed, 20 insertions(+), 11 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/openggsn refs/changes/07/3407/1
diff --git a/ggsn/ggsn.c b/ggsn/ggsn.c
index 6ef7e54..c1cea7e 100644
--- a/ggsn/ggsn.c
+++ b/ggsn/ggsn.c
@@ -178,6 +178,7 @@
{
struct in46_addr addr;
struct ippoolm_t *member;
+ int rc;
DEBUGP(DGGSN, "Received create PDP context request\n");
@@ -190,11 +191,16 @@
pdp->qos_neg.l = pdp->qos_req.l;
if (in46a_from_eua(&pdp->eua, &addr)) {
- addr.v4.s_addr = 0; /* Request dynamic */
+ SYS_ERR(DGGSN, LOGL_ERROR, 0, "Cannot decode EUA from MS/SGSN: %s",
+ osmo_hexdump(pdp->eua.v, pdp->eua.l));
+ gtp_create_context_resp(gsn, pdp, GTPCAUSE_UNKNOWN_PDP);
+ return 0;
}
- if (ippool_newip(ippool, &member, &addr, 0)) {
- gtp_create_context_resp(gsn, pdp, GTPCAUSE_NO_RESOURCES);
+ rc = ippool_newip(ippool, &member, &addr, 0);
+ if (rc < 0) {
+ SYS_ERR(DGGSN, LOGL_ERROR, 0, "Cannot allocate IP address in pool\n");
+ gtp_create_context_resp(gsn, pdp, -rc);
return 0; /* Allready in use, or no more available */
}
@@ -206,6 +212,8 @@
if (gtp_kernel_tunnel_add(pdp) < 0) {
SYS_ERR(DGGSN, LOGL_ERROR, 0,
"Cannot add tunnel to kernel: %s\n", strerror(errno));
+ gtp_create_context_resp(gsn, pdp, GTPCAUSE_SYS_FAIL);
+ return 0;
}
if (!send_trap(gsn, pdp, member, "imsi-ass-ip")) { /* TRAP with IP assignment */
diff --git a/lib/ippool.c b/lib/ippool.c
index 9a3d0b3..305aae2 100644
--- a/lib/ippool.c
+++ b/lib/ippool.c
@@ -403,7 +403,7 @@
if (!this->allowstat) {
SYS_ERR(DIP, LOGL_ERROR, 0,
"Static IP address not allowed");
- return -1;
+ return -GTPCAUSE_NOT_SUPPORTED;
}
if (!in46a_within_mask(addr, &this->stataddr, this->stataddrprefixlen)) {
SYS_ERR(DIP, LOGL_ERROR, 0, "Static out of range");
@@ -413,7 +413,7 @@
if (!this->allowdyn) {
SYS_ERR(DIP, LOGL_ERROR, 0,
"Dynamic IP address not allowed");
- return -1;
+ return -GTPCAUSE_NOT_SUPPORTED;
}
}
@@ -439,7 +439,7 @@
if (!this->firstdyn) {
SYS_ERR(DIP, LOGL_ERROR, 0,
"No more IP addresses available");
- return -1;
+ return -GTPCAUSE_ADDR_OCCUPIED;
} else
p2 = this->firstdyn;
}
@@ -448,12 +448,12 @@
if (p2->inuse) {
SYS_ERR(DIP, LOGL_ERROR, 0,
"IP address allready in use");
- return -1; /* Allready in use / Should not happen */
+ return -GTPCAUSE_SYS_FAIL; /* Allready in use / Should not happen */
}
if (p2->addr.len != addr->len) {
SYS_ERR(DIP, LOGL_ERROR, 0, "MS requested unsupported PDP context type");
- return -1;
+ return -GTPCAUSE_UNKNOWN_PDP;
}
/* Remove from linked list of free dynamic addresses */
@@ -482,13 +482,13 @@
if (!this->firststat) {
SYS_ERR(DIP, LOGL_ERROR, 0,
"No more IP addresses available");
- return -1; /* No more available */
+ return -GTPCAUSE_ADDR_OCCUPIED; /* No more available */
} else
p2 = this->firststat;
if (p2->addr.len != addr->len) {
SYS_ERR(DIP, LOGL_ERROR, 0, "MS requested unsupported PDP context type");
- return -1;
+ return -GTPCAUSE_UNKNOWN_PDP;
}
/* Remove from linked list of free static addresses */
@@ -513,7 +513,7 @@
SYS_ERR(DIP, LOGL_ERROR, 0,
"Could not allocate IP address");
- return -1; /* Should never get here. TODO: Bad code */
+ return -GTPCAUSE_SYS_FAIL; /* Should never get here. TODO: Bad code */
}
int ippool_freeip(struct ippool_t *this, struct ippoolm_t *member)
diff --git a/lib/ippool.h b/lib/ippool.h
index e3c1c92..ba92a56 100644
--- a/lib/ippool.h
+++ b/lib/ippool.h
@@ -13,6 +13,7 @@
#define _IPPOOL_H
#include "../lib/in46_addr.h"
+#include "../gtp/gtp.h"
/* Assuming that the address space is fragmented we need a hash table
in order to return the addresses.
--
To view, visit https://gerrit.osmocom.org/3407
To unsubscribe, visit https://gerrit.osmocom.org/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: Ibf199c1726130d27c8f80230b30ee51101c93b06
Gerrit-PatchSet: 1
Gerrit-Project: openggsn
Gerrit-Branch: master
Gerrit-Owner: Harald Welte <laforge at gnumonks.org>