aboutsummaryrefslogtreecommitdiffstats
path: root/openbsc/src/libmgcp
diff options
context:
space:
mode:
authorHolger Hans Peter Freyther <zecke@selfish.org>2012-09-14 17:18:12 +0200
committerHolger Hans Peter Freyther <zecke@selfish.org>2012-11-12 10:42:05 +0100
commit0bf15a81878c9fce83d7cff8842c52b5839564b9 (patch)
tree7d64612dcbe5efa16bfc254da7f34d8c544b3dbb /openbsc/src/libmgcp
parent2e8e659586e7f625b45921c28bf44aba69e99504 (diff)
mgcp: Include statistics at the end of a connection
Follow the MGCP specification and send the collected statistics at the end of a call. Right now this does not include jitter, packet loss and delay.
Diffstat (limited to 'openbsc/src/libmgcp')
-rw-r--r--openbsc/src/libmgcp/mgcp_protocol.c45
1 files changed, 36 insertions, 9 deletions
diff --git a/openbsc/src/libmgcp/mgcp_protocol.c b/openbsc/src/libmgcp/mgcp_protocol.c
index 719a4c743..d57ad0024 100644
--- a/openbsc/src/libmgcp/mgcp_protocol.c
+++ b/openbsc/src/libmgcp/mgcp_protocol.c
@@ -107,9 +107,9 @@ static struct msgb *mgcp_msgb_alloc(void)
return msg;
}
-struct msgb *mgcp_create_response_with_data(int code, const char *txt,
- const char *msg, const char *trans,
- const char *data)
+static struct msgb *create_resp(int code, const char *txt, const char *msg,
+ const char *trans, const char *param,
+ const char *sdp)
{
int len;
struct msgb *res;
@@ -118,10 +118,12 @@ struct msgb *mgcp_create_response_with_data(int code, const char *txt,
if (!res)
return NULL;
- if (data) {
- len = snprintf((char *) res->data, 2048, "%d %s%s\r\n%s", code, trans, txt, data);
- } else {
- len = snprintf((char *) res->data, 2048, "%d %s%s\r\n", code, trans, txt);
+ len = snprintf((char *) res->data, 2048, "%d %s%s%s\r\n%s",
+ code, trans, txt, param ? param : "", sdp ? sdp : "");
+ if (len < 0) {
+ LOGP(DMGCP, LOGL_ERROR, "Failed to sprintf MGCP response.\n");
+ msgb_free(res);
+ return NULL;
}
res->l2h = msgb_put(res, len);
@@ -129,9 +131,22 @@ struct msgb *mgcp_create_response_with_data(int code, const char *txt,
return res;
}
+struct msgb *mgcp_create_response_with_data(int code, const char *txt,
+ const char *msg, const char *trans,
+ const char *data)
+{
+ return create_resp(code, txt, msg, trans, NULL, data);
+}
+
+static struct msgb *create_ok_resp_with_param(int code, const char *msg,
+ const char *trans, const char *param)
+{
+ return create_resp(code, " OK", msg, trans, param, NULL);
+}
+
static struct msgb *create_ok_response(int code, const char *msg, const char *trans)
{
- return mgcp_create_response_with_data(code, " OK", msg, trans, NULL);
+ return create_ok_resp_with_param(code, msg, trans, NULL);
}
static struct msgb *create_err_response(int code, const char *msg, const char *trans)
@@ -707,6 +722,7 @@ static struct msgb *handle_delete_con(struct mgcp_config *cfg, struct msgb *msg)
int error_code = 400;
int silent = 0;
char *line, *save;
+ char stats[1048];
for_each_line((char *) msg->l3h, line, save) {
/* skip first line */
@@ -769,6 +785,9 @@ static struct msgb *handle_delete_con(struct mgcp_config *cfg, struct msgb *msg)
LOGP(DMGCP, LOGL_DEBUG, "Deleted endpoint on: 0x%x Server: %s:%u\n",
ENDPOINT_NUMBER(endp), inet_ntoa(endp->net_end.addr), ntohs(endp->net_end.rtp_port));
+ /* save the statistics of the current call */
+ mgcp_format_stats(endp, stats, sizeof(stats));
+
delete_transcoder(endp);
mgcp_free_endp(endp);
if (cfg->change_cb)
@@ -776,7 +795,7 @@ static struct msgb *handle_delete_con(struct mgcp_config *cfg, struct msgb *msg)
if (silent)
goto out_silent;
- return create_ok_response(250, "DLCX", trans_id);
+ return create_ok_resp_with_param(250, "DLCX", trans_id, stats);
error3:
return create_err_response(error_code, "DLCX", trans_id);
@@ -1099,3 +1118,11 @@ int mgcp_reset_transcoder(struct mgcp_config *cfg)
return send_trans(cfg, mgcp_reset, sizeof mgcp_reset -1);
}
+
+void mgcp_format_stats(struct mgcp_endpoint *endp, char *msg, size_t size)
+{
+ snprintf(msg, size, "\r\nP: PS=%u, OS=%u, PR=%u, OR=%u",
+ endp->bts_end.packets, endp->bts_end.octets,
+ endp->net_end.packets, endp->net_end.octets);
+ msg[size - 1] = '\0';
+}