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
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 @@
 		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 @@
 		if (!this->allowdyn) {
 			SYS_ERR(DIP, LOGL_ERROR, 0,
 				"Dynamic IP address not allowed");
-			return -1;
+			return -GTPCAUSE_NOT_SUPPORTED;
 		}
 	}
 
@@ -438,7 +438,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;
 	}
@@ -447,12 +447,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 */
@@ -481,13 +481,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 */
@@ -512,7 +512,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.