aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2013-12-09 14:32:03 +0100
committerHolger Hans Peter Freyther <holger@moiji-mobile.com>2013-12-13 13:48:04 +0100
commit2c2ca4df382110c4bebdb91d7410838fbf20d493 (patch)
tree241626de22b87eb2dadd0b5147e60b0241739407
parentba477d2ba3d6ff667eb38a8b42731a7886781266 (diff)
mgcp: Put local connection options into a struct
Currently the local connection options have been stored as a string. This patch replaces this string by a struct (that still contains a string) along with the parsed fields (only the packetization period at the moment). It also re-adds the calls to set_local_cx_options() to the handle_create_con() and handle_modify_con() functions. Except for the test program this has no side effects, since the LCO values aren't used yet.
-rw-r--r--openbsc/include/openbsc/mgcp_internal.h8
-rw-r--r--openbsc/src/libmgcp/mgcp_protocol.c33
-rw-r--r--openbsc/tests/mgcp/mgcp_test.c9
-rw-r--r--openbsc/tests/mgcp/mgcp_test.ok8
4 files changed, 47 insertions, 11 deletions
diff --git a/openbsc/include/openbsc/mgcp_internal.h b/openbsc/include/openbsc/mgcp_internal.h
index d59c5d7cb..20c433a2e 100644
--- a/openbsc/include/openbsc/mgcp_internal.h
+++ b/openbsc/include/openbsc/mgcp_internal.h
@@ -114,6 +114,12 @@ struct mgcp_rtp_tap {
struct sockaddr_in forward;
};
+struct mgcp_lco {
+ char *string;
+ int pkt_period_min; /* time in ms */
+ int pkt_period_max; /* time in ms */
+};
+
enum mgcp_type {
MGCP_RTP_DEFAULT = 0,
MGCP_RTP_TRANSCODED,
@@ -123,7 +129,7 @@ struct mgcp_endpoint {
int allocated;
uint32_t ci;
char *callid;
- char *local_options;
+ struct mgcp_lco local_options;
int conn_mode;
int orig_mode;
diff --git a/openbsc/src/libmgcp/mgcp_protocol.c b/openbsc/src/libmgcp/mgcp_protocol.c
index ab941645e..c4ff757c3 100644
--- a/openbsc/src/libmgcp/mgcp_protocol.c
+++ b/openbsc/src/libmgcp/mgcp_protocol.c
@@ -614,6 +614,25 @@ static int parse_sdp_data(struct mgcp_rtp_end *rtp, struct mgcp_parse_data *p)
return found_media;
}
+/* Set the LCO from a string (see RFC 3435).
+ * The string is stored in the 'string' field. A NULL string is handled excatly
+ * like an empty string, the 'string' field is never NULL after this function
+ * has been called. */
+static void set_local_cx_options(void *ctx, struct mgcp_lco *lco,
+ const char *options)
+{
+ char *p_opt;
+
+ talloc_free(lco->string);
+ lco->pkt_period_min = lco->pkt_period_max = 0;
+ lco->string = talloc_strdup(ctx, options ? options : "");
+
+ p_opt = strstr(lco->string, "p:");
+ if (p_opt && sscanf(p_opt, "p:%d-%d",
+ &lco->pkt_period_min, &lco->pkt_period_max) == 1)
+ lco->pkt_period_max = lco->pkt_period_min;
+}
+
void mgcp_rtp_end_config(struct mgcp_endpoint *endp, int expect_ssrc_change,
struct mgcp_rtp_end *rtp)
{
@@ -712,8 +731,8 @@ mgcp_header_done:
/* copy some parameters */
endp->callid = talloc_strdup(tcfg->endpoints, callid);
- if (local_options)
- endp->local_options = talloc_strdup(tcfg->endpoints, local_options);
+ set_local_cx_options(endp->tcfg->endpoints, &endp->local_options,
+ local_options);
if (parse_conn_mode(mode, &endp->conn_mode) != 0) {
error_code = 517;
@@ -789,6 +808,7 @@ static struct msgb *handle_modify_con(struct mgcp_parse_data *p)
int error_code = 500;
int silent = 0;
char *line;
+ const char *local_options = NULL;
if (p->found != 0)
return create_err_response(NULL, 510, "MDCX", p->trans);
@@ -812,7 +832,7 @@ static struct msgb *handle_modify_con(struct mgcp_parse_data *p)
break;
}
case 'L':
- /* skip */
+ local_options = (const char *) line + 3;
break;
case 'M':
if (parse_conn_mode(line + 3, &endp->conn_mode) != 0) {
@@ -838,6 +858,9 @@ static struct msgb *handle_modify_con(struct mgcp_parse_data *p)
}
}
+ set_local_cx_options(endp->tcfg->endpoints, &endp->local_options,
+ local_options);
+
/* policy CB */
if (p->cfg->policy_cb) {
int rc;
@@ -1148,8 +1171,8 @@ void mgcp_free_endp(struct mgcp_endpoint *endp)
talloc_free(endp->callid);
endp->callid = NULL;
- talloc_free(endp->local_options);
- endp->local_options = NULL;
+ talloc_free(endp->local_options.string);
+ endp->local_options.string = NULL;
mgcp_rtp_end_reset(&endp->bts_end);
mgcp_rtp_end_reset(&endp->net_end);
diff --git a/openbsc/tests/mgcp/mgcp_test.c b/openbsc/tests/mgcp/mgcp_test.c
index bea977156..8b5e17ddc 100644
--- a/openbsc/tests/mgcp/mgcp_test.c
+++ b/openbsc/tests/mgcp/mgcp_test.c
@@ -319,7 +319,14 @@ static void test_messages(void)
endp->net_end.packet_duration_ms);
else
printf("Packet duration not set\n");
- printf("Requested packetization period not set\n");
+ if (endp->local_options.pkt_period_min ||
+ endp->local_options.pkt_period_max)
+ printf("Requested packetetization period: "
+ "%d-%d\n",
+ endp->local_options.pkt_period_min,
+ endp->local_options.pkt_period_max);
+ else
+ printf("Requested packetization period not set\n");
endp->net_end.packet_duration_ms = -1;
}
diff --git a/openbsc/tests/mgcp/mgcp_test.ok b/openbsc/tests/mgcp/mgcp_test.ok
index 509958aa1..24f9b336c 100644
--- a/openbsc/tests/mgcp/mgcp_test.ok
+++ b/openbsc/tests/mgcp/mgcp_test.ok
@@ -17,19 +17,19 @@ Testing MDCX1
Testing MDCX2
Testing CRCX
Packet duration not set
-Requested packetization period not set
+Requested packetetization period: 20-20
Testing MDCX3
Packet duration not set
Requested packetization period not set
Testing MDCX4
Packet duration not set
-Requested packetization period not set
+Requested packetetization period: 20-20
Testing MDCX4_PT1
Packet duration not set
-Requested packetization period not set
+Requested packetetization period: 20-40
Testing MDCX4_PT2
Packet duration not set
-Requested packetization period not set
+Requested packetetization period: 20-20
Testing MDCX4_PT3
Packet duration not set
Requested packetization period not set