diff --git a/conf_schema.h b/conf_schema.h index fb553bd7..796092b2 100644 --- a/conf_schema.h +++ b/conf_schema.h @@ -346,6 +346,12 @@ SUB_STRUCT(mdp_iftypelist, iftype,) ATOM(bool_t, enable_inet, 0, boolean,, "If true, allow mdp clients to connect over loopback UDP") END_STRUCT +STRUCT(vomp) +ATOM(int32_t, dial_timeout_ms, 15000, int32_nonneg,, "Timeout to establish a call when dialling") +ATOM(int32_t, ring_timeout_ms, 30000, int32_nonneg,, "Timeout for the other user to answer") +ATOM(int32_t, network_timeout_ms, 30000, int32_nonneg,, "Timeout for network activity until a call will end") +END_STRUCT + STRUCT(olsr) ATOM(bool_t, enable, 0, boolean,, "If true, OLSR is used for mesh routing") ATOM(uint16_t, remote_port, 4130, uint16_nonzero,, "Remote port number") @@ -494,6 +500,7 @@ SUB_STRUCT(server, server,) SUB_STRUCT(monitor, monitor,) SUB_STRUCT(mdp, mdp,) SUB_STRUCT(dna, dna,) +SUB_STRUCT(vomp, vomp,) SUB_STRUCT(debug, debug,) SUB_STRUCT(rhizome, rhizome,) SUB_STRUCT(directory, directory,) diff --git a/constants.h b/constants.h index b4e5f690..b838b54d 100644 --- a/constants.h +++ b/constants.h @@ -176,13 +176,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. #define CODEC_FLAGS_LENGTH 32 -/* in milliseconds of inactivity */ -// 20 seconds to start ringing -#define VOMP_CALL_DIAL_TIMEOUT 15000 -// 60 seconds to answer -#define VOMP_CALL_RING_TIMEOUT 60000 -// 2 minutes of zero network traffic -#define VOMP_CALL_NETWORK_TIMEOUT 120000 // force state packet interval #define VOMP_CALL_STATUS_INTERVAL 1000 diff --git a/tests/vomp b/tests/vomp index a15d66cc..0b6cf4fb 100755 --- a/tests/vomp +++ b/tests/vomp @@ -21,6 +21,11 @@ source "${0%/*}/../testframework.sh" source "${0%/*}/../testdefs.sh" +setup() { + setup_servald + assert_no_servald_processes + start_servald_instances +A +B +} teardown() { stop_all_servald_servers kill_all_servald_processes @@ -35,42 +40,108 @@ configure_servald_server() { set debug.mdprequests on \ set debug.monitor on \ set debug.vomp on \ + set vomp.dial_timeout_ms 1000 \ + set vomp.ring_timeout_ms 5000 \ + set vomp.network_timeout_ms 5000 \ set log.console.level DEBUG \ set log.console.show_time on } -vomp_connect() { - executeOk_servald console < <(sleep 1 && echo "call $1 $2 $3" && sleep 3 && echo "say hello" && sleep 3 && echo "hangup") - tfw_cat --stdout --stderr - assertStdoutGrep --stdout --matches=1 "^Dialling$" - assertStdoutGrep --stdout --matches=1 "^Codec list" - assertStdoutGrep --stdout --matches=1 "^Ringing$" - assertStdoutGrep --stdout --matches=1 "^Picked up$" - assertStdoutGrep --stdout --matches=1 "^hi there$" - assertStdoutGrep --stdout --matches=1 "^Call ended$" +vomp_console() { +# Note, this might block and stall the test, but I need to predict where stdout is going to be +# perhaps add an argument to execute? + $servald console <&8 >"$1" } -vomp_answer() { - executeOk_servald console < <(sleep 2 && echo "answer" && sleep 2 && echo "say hi there" && sleep 3 && echo "hangup") - tfw_cat --stdout --stderr - assertStdoutGrep --stdout --matches=1 "^Incoming call" - assertStdoutGrep --stdout --matches=1 "^Codec list" - assertStdoutGrep --stdout --matches=1 "^hello$" - assertStdoutGrep --stdout --matches=1 "^Call ended$" +send_cmd() { + tfw_log "sending $1 to $2" +# Note, this might block and stall the test... + echo "$1" >> "$2" +} + +init_console() { + eval ${instance_name}_IN="$PWD/${instance_name}_IN" + eval ${instance_name}_OUT="$PWD/${instance_name}_OUT" + mkfifo "$PWD/${instance_name}_IN" + exec 8<>"$PWD/${instance_name}_IN" + fork vomp_console "$PWD/${instance_name}_OUT" + exec 8>&- +} + +doc_nophone="Attempt to dial a node with no phone" +test_nophone() { + set_instance +A + init_console + send_cmd "call $SIDB $DIDA $DIDB" "$A_IN" + wait_until grep "^Call ended$" "$A_OUT" + send_cmd "quit" "$A_IN" + fork_wait_all + tfw_cat "$A_OUT" +} + +doc_hangup="Hangup instead of answering" +test_hangup() { + foreach_instance +A +B init_console + send_cmd "call $SIDA $DIDB $DIDA" "$B_IN" + wait_until grep "^Dialling$" "$B_OUT" + wait_until grep "^Incoming call" "$A_OUT" + wait_until grep "^Codec list" "$A_OUT" + wait_until grep "^Codec list" "$B_OUT" + wait_until grep "^Ringing$" "$B_OUT" + send_cmd "hangup" "$A_IN" + wait_until grep "^Call ended$" "$A_OUT" + wait_until grep "^Call ended$" "$B_OUT" + send_cmd "quit" "$A_IN" + send_cmd "quit" "$B_IN" + fork_wait_all + tfw_cat "$A_OUT" "$B_OUT" +} + +doc_timeout="Call timeout" +test_timeout() { + foreach_instance +A +B init_console + send_cmd "call $SIDA $DIDB $DIDA" "$B_IN" + wait_until grep "^Dialling$" "$B_OUT" + wait_until grep "^Incoming call" "$A_OUT" + wait_until grep "^Codec list" "$A_OUT" + wait_until grep "^Codec list" "$B_OUT" + wait_until grep "^Ringing$" "$B_OUT" + send_cmd "answer" "$A_IN" + wait_until grep "^Picked up$" "$B_OUT" + send_cmd "say hello" "$A_IN" + send_cmd "say hi there" "$B_IN" + wait_until grep "^hello$" "$B_OUT" + wait_until grep "^hi there$" "$A_OUT" + stop_servald_server +B +# B's console should just quit + wait_until --timeout=20 grep "^Call ended$" "$A_OUT" + send_cmd "quit" "$A_IN" + fork_wait_all + tfw_cat "$A_OUT" "$B_OUT" } doc_call_lifecycle="Successful call lifecycle" -setup_call_lifecycle() { - setup_servald - assert_no_servald_processes - start_servald_instances +A +B -} test_call_lifecycle() { - set_instance +A - fork vomp_answer - set_instance +B - fork vomp_connect $SIDA $DIDB $DIDA + foreach_instance +A +B init_console + send_cmd "call $SIDA $DIDB $DIDA" "$B_IN" + wait_until grep "^Dialling$" "$B_OUT" + wait_until grep "^Incoming call" "$A_OUT" + wait_until grep "^Codec list" "$A_OUT" + wait_until grep "^Codec list" "$B_OUT" + wait_until grep "^Ringing$" "$B_OUT" + send_cmd "answer" "$A_IN" + wait_until grep "^Picked up$" "$B_OUT" + send_cmd "say hello" "$A_IN" + send_cmd "say hi there" "$B_IN" + wait_until grep "^hello$" "$B_OUT" + wait_until grep "^hi there$" "$A_OUT" + send_cmd "hangup" "$B_IN" + wait_until grep "^Call ended$" "$A_OUT" + wait_until grep "^Call ended$" "$B_OUT" + send_cmd "quit" "$A_IN" + send_cmd "quit" "$B_IN" fork_wait_all + tfw_cat "$A_OUT" "$B_OUT" } runTests "$@" diff --git a/vomp.c b/vomp.c index 7c03f669..653ea83f 100644 --- a/vomp.c +++ b/vomp.c @@ -1096,14 +1096,14 @@ static void vomp_process_tick(struct sched_ent *alarm) struct vomp_call_state *call = (struct vomp_call_state *)alarm; /* See if any calls need to be expired. - Allow VOMP_CALL_DIAL_TIMEOUT ms for the other party to ring / request ringing - Allow VOMP_CALL_RING_TIMEOUT ms for the ringing party to answer - Allow VOMP_CALL_NETWORK_TIMEOUT ms between received packets + Allow vomp.dial_timeout_ms for the other party to ring / request ringing + Allow vomp.ring_timeout_ms for the ringing party to answer + Allow vomp.network_timeout_ms between received packets */ - if ((call->remote.state < VOMP_STATE_RINGINGOUT && call->create_time + VOMP_CALL_DIAL_TIMEOUT < now) || - (call->local.state < VOMP_STATE_INCALL && call->create_time + VOMP_CALL_RING_TIMEOUT < now) || - (call->last_activity+VOMP_CALL_NETWORK_TIMEOUTremote.state < VOMP_STATE_RINGINGOUT && call->create_time + config.vomp.dial_timeout_ms < now) || + (call->local.state < VOMP_STATE_INCALL && call->create_time + config.vomp.ring_timeout_ms < now) || + (call->last_activity+config.vomp.network_timeout_msrejection_reason=VOMP_REJECT_TIMEOUT; diff --git a/vomp_console.c b/vomp_console.c index 451f3b96..b43ddb40 100644 --- a/vomp_console.c +++ b/vomp_console.c @@ -70,6 +70,7 @@ static int console_answer(const struct cli_parsed *parsed, struct cli_context *c static int console_hangup(const struct cli_parsed *parsed, struct cli_context *context); static int console_audio(const struct cli_parsed *parsed, struct cli_context *context); static int console_usage(const struct cli_parsed *parsed, struct cli_context *context); +static int console_quit(const struct cli_parsed *parsed, struct cli_context *context); static void console_command(char *line); static void monitor_read(struct sched_ent *alarm); @@ -79,6 +80,7 @@ struct cli_schema console_commands[]={ {console_hangup,{"hangup",NULL},0,"Hangup the phone line"}, {console_usage,{"help",NULL},0,"This usage message"}, {console_audio,{"say","...",NULL},0,"Send a text string to the other party"}, + {console_quit,{"quit",NULL},0,"Exit process"}, {NULL, {NULL, NULL, NULL}, 0, NULL}, }; @@ -272,6 +274,7 @@ static int console_dial(const struct cli_parsed *parsed, struct cli_context *UNU { if (call_token!=-1){ printf("Already in a call\n"); + fflush(stdout); return 0; } const char *sid = parsed->args[1]; @@ -301,6 +304,18 @@ static int console_hangup(const struct cli_parsed *UNUSED(parsed), struct cli_co return 0; } +static int console_quit(const struct cli_parsed *UNUSED(parsed), struct cli_context *UNUSED(context)) +{ + if (monitor_alarm.poll.fd!=-1){ + printf("Shutting down\n"); + fflush(stdout); + unwatch(&monitor_alarm); + monitor_client_close(monitor_alarm.poll.fd, monitor_state); + monitor_alarm.poll.fd=-1; + } + return 0; +} + static int console_audio(const struct cli_parsed *parsed, struct cli_context *UNUSED(context)) { if (call_token==-1){