aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-08-03 00:00:23 +0200
committerHarald Welte <laforge@gnumonks.org>2017-08-09 22:09:34 +0200
commitd1bf1e11ba72a5e46c0d85b845110bd56d8d6e20 (patch)
tree5422c87b814ace5c3f2f8fc2bb228a3d6943a764 /lib
parenta0d281db1cd2f122fb8f0adfd9e4a82e60efbd2f (diff)
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
Diffstat (limited to 'lib')
-rw-r--r--lib/ippool.c16
-rw-r--r--lib/ippool.h1
2 files changed, 9 insertions, 8 deletions
diff --git a/lib/ippool.c b/lib/ippool.c
index 3ca1b86..007dc50 100644
--- a/lib/ippool.c
+++ b/lib/ippool.c
@@ -402,7 +402,7 @@ int ippool_newip(struct ippool_t *this, struct ippoolm_t **member,
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");
@@ -412,7 +412,7 @@ int ippool_newip(struct ippool_t *this, struct ippoolm_t **member,
if (!this->allowdyn) {
SYS_ERR(DIP, LOGL_ERROR, 0,
"Dynamic IP address not allowed");
- return -1;
+ return -GTPCAUSE_NOT_SUPPORTED;
}
}
@@ -438,7 +438,7 @@ int ippool_newip(struct ippool_t *this, struct ippoolm_t **member,
if (!this->firstdyn) {
SYS_ERR(DIP, LOGL_ERROR, 0,
"No more IP addresses available");
- return -1;
+ return -GTPCAUSE_ADDR_OCCUPIED;
} else
p2 = this->firstdyn;
}
@@ -447,12 +447,12 @@ int ippool_newip(struct ippool_t *this, struct ippoolm_t **member,
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 */
@@ -481,13 +481,13 @@ int ippool_newip(struct ippool_t *this, struct ippoolm_t **member,
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 */
@@ -512,7 +512,7 @@ int ippool_newip(struct ippool_t *this, struct ippoolm_t **member,
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.