mgcp: Synchronize conn mode bits and output enabled flags

This patch changes implementation and the mgcp_connection_mode enum
in a way that net_end.output_enabled (bts_end.output_enabled) flag
always matches the MGCP_CONN_SEND_ONLY (MGCP_CONN_RECV_ONLY) bit of
conn_mode.

Based on this, the conn_mode bits are then used instead of the
output_enabled fields within mgcp_protocol.c.

Sponsored-by: On-Waves ehf
This commit is contained in:
Jacob Erlbeck 2014-01-16 16:50:40 +01:00 committed by Holger Hans Peter Freyther
parent b866d3bd4f
commit f31886142a
3 changed files with 34 additions and 32 deletions

View file

@ -32,7 +32,7 @@ enum mgcp_connection_mode {
MGCP_CONN_RECV_ONLY = 1,
MGCP_CONN_SEND_ONLY = 2,
MGCP_CONN_RECV_SEND = MGCP_CONN_RECV_ONLY | MGCP_CONN_SEND_ONLY,
MGCP_CONN_LOOPBACK = 4,
MGCP_CONN_LOOPBACK = 4 | MGCP_CONN_RECV_SEND,
};
enum mgcp_trunk_type {

View file

@ -504,28 +504,10 @@ static int parse_conn_mode(const char *msg, struct mgcp_endpoint *endp)
ret = -1;
}
switch (endp->conn_mode) {
case MGCP_CONN_NONE:
endp->net_end.output_enabled = 0;
endp->bts_end.output_enabled = 0;
break;
case MGCP_CONN_RECV_ONLY:
endp->net_end.output_enabled = 0;
endp->bts_end.output_enabled = 1;
break;
case MGCP_CONN_SEND_ONLY:
endp->net_end.output_enabled = 1;
endp->bts_end.output_enabled = 0;
break;
default:
endp->net_end.output_enabled = 1;
endp->bts_end.output_enabled = 1;
break;
}
endp->net_end.output_enabled =
endp->conn_mode & MGCP_CONN_SEND_ONLY ? 1 : 0;
endp->bts_end.output_enabled =
endp->conn_mode & MGCP_CONN_RECV_ONLY ? 1 : 0;
return ret;
}
@ -877,7 +859,7 @@ mgcp_header_done:
if (p->cfg->change_cb)
p->cfg->change_cb(tcfg, ENDPOINT_NUMBER(endp), MGCP_ENDP_CRCX);
if (endp->bts_end.output_enabled && tcfg->keepalive_interval != 0)
if (endp->conn_mode & MGCP_CONN_RECV_ONLY && tcfg->keepalive_interval != 0)
mgcp_send_dummy(endp);
create_transcoder(endp);
@ -979,7 +961,8 @@ static struct msgb *handle_modify_con(struct mgcp_parse_data *p)
if (p->cfg->change_cb)
p->cfg->change_cb(endp->tcfg, ENDPOINT_NUMBER(endp), MGCP_ENDP_MDCX);
if (endp->bts_end.output_enabled && endp->tcfg->keepalive_interval != 0)
if (endp->conn_mode & MGCP_CONN_RECV_ONLY &&
endp->tcfg->keepalive_interval != 0)
mgcp_send_dummy(endp);
if (silent)

View file

@ -321,6 +321,19 @@ ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
return real_sendto(sockfd, buf, len, flags, dest_addr, addrlen);
}
#define CONN_UNMODIFIED (0x1000)
static void test_values(void)
{
/* Check that NONE disables all output */
OSMO_ASSERT((MGCP_CONN_NONE & MGCP_CONN_RECV_SEND) == 0)
/* Check that LOOPBACK enables all output */
OSMO_ASSERT((MGCP_CONN_LOOPBACK & MGCP_CONN_RECV_SEND) ==
MGCP_CONN_RECV_SEND)
}
static void test_messages(void)
{
struct mgcp_config *cfg;
@ -341,9 +354,9 @@ static void test_messages(void)
endp = &cfg->trunk.endpoints[i];
endp->net_end.payload_type = PTYPE_NONE;
endp->net_end.packet_duration_ms = -1;
endp->bts_end.output_enabled = 0;
endp->net_end.output_enabled = 0;
endp->conn_mode = -1;
OSMO_ASSERT(endp->conn_mode == MGCP_CONN_NONE);
endp->conn_mode |= CONN_UNMODIFIED;
}
for (i = 0; i < ARRAY_SIZE(tests); i++) {
@ -386,7 +399,7 @@ static void test_messages(void)
else
printf("Requested packetization period not set\n");
if (endp->conn_mode != -1)
if ((endp->conn_mode & CONN_UNMODIFIED) == 0)
printf("Connection mode: %d, "
"BTS output %sabled, NET output %sabled\n",
endp->conn_mode,
@ -395,12 +408,17 @@ static void test_messages(void)
else
printf("Connection mode not set\n");
OSMO_ASSERT(endp->net_end.output_enabled ==
(endp->conn_mode & MGCP_CONN_SEND_ONLY ? 1 : 0));
OSMO_ASSERT(endp->bts_end.output_enabled ==
(endp->conn_mode & MGCP_CONN_RECV_ONLY ? 1 : 0));
endp->net_end.packet_duration_ms = -1;
endp->bts_end.output_enabled = 0;
endp->net_end.output_enabled = 0;
endp->local_options.pkt_period_min = 0;
endp->local_options.pkt_period_max = 0;
endp->conn_mode = -1;
endp->conn_mode = MGCP_CONN_NONE | CONN_UNMODIFIED;
endp->net_end.output_enabled = 0;
endp->bts_end.output_enabled = 0;
}
@ -784,6 +802,7 @@ int main(int argc, char **argv)
osmo_init_logging(&log_info);
test_strline();
test_values();
test_messages();
test_retransmission();
test_packet_loss_calc();