msg: fix response code on exhausted endp resources
When all endpoints are seized and a call agent tries to allocate
another one, then 500 is returned as response code, which means
that the endpoint was not found. This does not match.
- Return 403 which is defined as "Insufficient resources available
at this time"
Change-Id: Idf241b47e711e35e9f9b5a43f3cea5c0298ea30b
diff --git a/src/libosmo-mgcp/mgcp_msg.c b/src/libosmo-mgcp/mgcp_msg.c
index 3aa93b7..4055a0c 100644
--- a/src/libosmo-mgcp/mgcp_msg.c
+++ b/src/libosmo-mgcp/mgcp_msg.c
@@ -224,11 +224,15 @@
/* Search the endpoint pool for the endpoint that had been selected via the
* MGCP message (helper function for mgcp_analyze_header()) */
static struct mgcp_endpoint *find_endpoint(struct mgcp_config *cfg,
- const char *mgcp)
+ const char *mgcp,
+ int *cause)
{
char *endptr = NULL;
unsigned int gw = INT_MAX;
const char *endpoint_number_str;
+ struct mgcp_endpoint *endp;
+
+ *cause = 0;
/* Check if the domainname in the request is correct */
if (check_domain_name(cfg, mgcp)) {
@@ -237,8 +241,12 @@
}
/* Check if the E1 trunk is requested */
- if (strncmp(mgcp, "ds/e1", 5) == 0)
- return find_e1_endpoint(cfg, mgcp);
+ if (strncmp(mgcp, "ds/e1", 5) == 0) {
+ endp = find_e1_endpoint(cfg, mgcp);
+ if (!endp)
+ *cause = -500;
+ return endp;
+ }
/* Check if the virtual trunk is addressed (new, correct way with prefix) */
if (strncmp
@@ -247,10 +255,12 @@
endpoint_number_str =
mgcp + strlen(MGCP_ENDPOINT_PREFIX_VIRTUAL_TRUNK);
if (endpoint_number_str[0] == '*') {
- return find_free_endpoint(cfg->trunk.endpoints,
+ endp = find_free_endpoint(cfg->trunk.endpoints,
cfg->trunk.number_endpoints);
+ if (!endp)
+ *cause = -403;
+ return endp;
}
-
gw = strtoul(endpoint_number_str, &endptr, 16);
if (gw < cfg->trunk.number_endpoints && endptr[0] == '@')
return &cfg->trunk.endpoints[gw];
@@ -265,6 +275,7 @@
return &cfg->trunk.endpoints[gw];
LOGP(DLMGCP, LOGL_ERROR, "Not able to find the endpoint: '%s'\n", mgcp);
+ *cause = -500;
return NULL;
}
@@ -277,6 +288,7 @@
{
int i = 0;
char *elem, *save = NULL;
+ int cause;
/*! This function will parse the header part of the received
* MGCP message. The parsing results are stored in pdata.
@@ -294,11 +306,11 @@
pdata->trans = elem;
break;
case 1:
- pdata->endp = find_endpoint(pdata->cfg, elem);
+ pdata->endp = find_endpoint(pdata->cfg, elem, &cause);
if (!pdata->endp) {
LOGP(DLMGCP, LOGL_ERROR,
"Unable to find Endpoint `%s'\n", elem);
- return -500;
+ return cause;
}
break;
case 2: