summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMicael Karlberg <bmk@erlang.org>2021-07-29 19:27:04 +0200
committerMicael Karlberg <bmk@erlang.org>2021-08-30 16:41:16 +0200
commit1f3acf0177ad06af242be4431d6154020d6b189a (patch)
tree606296def389aaab866cd55e12607e63f2813776
parent630a99722437e9f1b2e5c1eccb8a2d8f160c6edf (diff)
downloaderlang-1f3acf0177ad06af242be4431d6154020d6b189a.tar.gz
[megaco|test] Update load suite to use inet-backend option
OTP-17533
-rw-r--r--lib/megaco/test/megaco_load_SUITE.erl123
-rw-r--r--lib/megaco/test/megaco_test_mg.erl119
-rw-r--r--lib/megaco/test/megaco_test_mgc.erl107
3 files changed, 231 insertions, 118 deletions
diff --git a/lib/megaco/test/megaco_load_SUITE.erl b/lib/megaco/test/megaco_load_SUITE.erl
index d033e137ec..4032d86186 100644
--- a/lib/megaco/test/megaco_load_SUITE.erl
+++ b/lib/megaco/test/megaco_load_SUITE.erl
@@ -62,7 +62,7 @@
-define(MGC_START(Node, Mid, ET, Conf, Verb),
megaco_test_mgc:start(Node, Mid, ET,
- [{megaco_trace, false}] ++ Conf, Verb)).
+ Conf ++ [{megaco_trace, false}], Verb)).
-define(MGC_STOP(Pid), megaco_test_mgc:stop(Pid)).
-define(MGC_USER_INFO(Pid,Tag), megaco_test_mgc:user_info(Pid,Tag)).
-define(MGC_CONN_INFO(Pid,Tag), megaco_test_mgc:conn_info(Pid,Tag)).
@@ -70,8 +70,8 @@
-define(MG_START(Pid, Mid, Enc, Transp, Conf, Verb),
megaco_test_mg:start(Pid, Mid, Enc, Transp,
- [{megaco_trace, false},
- {transport_opts, [{serialize, true}]}] ++ Conf,
+ Conf ++ [{megaco_trace, false},
+ {transport_opts, [{serialize, true}]}],
Verb)).
-define(MG_STOP(Pid), megaco_test_mg:stop(Pid)).
-define(MG_USER_INFO(Pid,Tag), megaco_test_mg:user_info(Pid,Tag)).
@@ -92,15 +92,47 @@ suite() ->
[{ct_hooks, [ts_install_cth]}].
all() ->
+ %% This is a temporary messure to ensure that we can
+ %% test the socket backend without effecting *all*
+ %% applications on *all* machines.
+ %% This flag is set only for *one* host.
+ case ?TEST_INET_BACKENDS() of
+ true ->
+ [
+ {group, inet_backend_default},
+ {group, inet_backend_inet},
+ {group, inet_backend_socket}
+ ];
+ _ ->
+ [
+ {group, inet_backend_default}
+ ]
+ end.
+
+groups() ->
[
- {group, single},
- {group, multi}
+ {inet_backend_default, [], inet_backend_default_cases()},
+ {inet_backend_inet, [], inet_backend_inet_cases()},
+ {inet_backend_socket, [], inet_backend_socket_cases()},
+
+ {all, [], all_cases()},
+ {single, [], single_cases()},
+ {multi, [], multi_cases()}
].
-groups() ->
+inet_backend_default_cases() ->
+ [{all, [], all_cases()}].
+
+inet_backend_inet_cases() ->
+ [{all, [], all_cases()}].
+
+inet_backend_socket_cases() ->
+ [{all, [], all_cases()}].
+
+all_cases() ->
[
- {single, [], single_cases()},
- {multi, [], multi_cases()}
+ {group, single},
+ {group, multi}
].
single_cases() ->
@@ -174,10 +206,39 @@ end_per_suite(Config0) when is_list(Config0) ->
%% -----
%%
-init_per_group(_GroupName, Config) ->
+init_per_group(inet_backend_default = Group, Config) ->
+ ?ANNOUNCE_GROUP_INIT(Group),
+ [{socket_create_opts, []} | Config];
+init_per_group(inet_backend_inet = Group, Config) ->
+ ?ANNOUNCE_GROUP_INIT(Group),
+ case ?EXPLICIT_INET_BACKEND() of
+ true ->
+ %% The environment trumps us,
+ %% so only the default group should be run!
+ {skip, "explicit inet backend"};
+ false ->
+ [{socket_create_opts, [{inet_backend, inet}]} | Config]
+ end;
+init_per_group(inet_backend_socket = Group, Config) ->
+ ?ANNOUNCE_GROUP_INIT(Group),
+ case ?EXPLICIT_INET_BACKEND() of
+ true ->
+ %% The environment trumps us,
+ %% so only the default group should be run!
+ {skip, "explicit inet backend"};
+ false ->
+ [{socket_create_opts, [{inet_backend, socket}]} | Config]
+ end;
+init_per_group(Group, Config) ->
+ ?ANNOUNCE_GROUP_INIT(Group),
Config.
-end_per_group(_GroupName, Config) ->
+end_per_group(Group, Config) when (inet_backend_default =:= Group) orelse
+ (inet_backend_init =:= Group) orelse
+ (inet_backend_socket =:= Group) ->
+ ?SLEEP(?SECS(5)),
+ Config;
+end_per_group(_Group, Config) ->
Config.
@@ -397,25 +458,28 @@ try_single_user_load(Name, Config, NumLoaders0) ->
single_user_load(State, Config, NumLoaders) ->
i("starting with ~w loader(s)", [NumLoaders]),
+ SCO = ?config(socket_create_opts, Config),
Res = load_controller(Config,
fun(Env) ->
populate(Env),
- exit( single_user_load(State, NumLoaders) )
+ exit( do_single_user_load(SCO,
+ State, NumLoaders) )
end),
i("done"),
Res.
-single_user_load([MgcNode, MgNode], NumLoaders) ->
+do_single_user_load(SCO,
+ [MgcNode, MgNode], NumLoaders) ->
%% Start the MGC and MGs
i("[MGC] start"),
MgcMid = {deviceName, "ctrl"},
ET = [{text, tcp, [{serialize, true}]}],
DSI = maybe_display_system_info(NumLoaders),
- {ok, Mgc} = ?MGC_START(MgcNode, MgcMid, ET, DSI, ?MGC_VERBOSITY),
+ {ok, Mgc} = ?MGC_START(MgcNode, MgcMid, ET, SCO ++ DSI, ?MGC_VERBOSITY),
i("[MG] start"),
MgMid = {deviceName, "mg"},
- {ok, Mg} = ?MG_START(MgNode, MgMid, text, tcp, DSI, ?MG_VERBOSITY),
+ {ok, Mg} = ?MG_START(MgNode, MgMid, text, tcp, SCO ++ DSI, ?MG_VERBOSITY),
d("MG user info: ~p", [?MG_USER_INFO(Mg, all)]),
@@ -501,17 +565,18 @@ try_multi_user_load(Name, Config, NumUsers, NumLoaders0) ->
multi_user_load(State, Config, NumUsers, NumLoaders) ->
i("starting with ~w loader(s)", [NumLoaders]),
+ SCO = ?config(socket_create_opts, Config),
Res = load_controller(
Config,
fun(Env) ->
populate(Env),
- exit( multi_user_load(State, NumUsers, NumLoaders) )
+ exit( do_multi_user_load(SCO, State, NumUsers, NumLoaders) )
end),
i("done"),
Res.
-multi_user_load([MgcNode | MgNodes], NumUsers, NumLoaders)
+do_multi_user_load(SCO, [MgcNode | MgNodes], NumUsers, NumLoaders)
when (is_integer(NumUsers) andalso (NumUsers > 1) andalso
is_integer(NumLoaders) andalso (NumLoaders >= 1)) ->
%% Start the MGC and MGs
@@ -519,7 +584,7 @@ multi_user_load([MgcNode | MgNodes], NumUsers, NumLoaders)
MgcMid = {deviceName, "ctrl"},
ET = [{text, tcp, [{serialize, false}]}],
DSI = maybe_display_system_info(2 * NumUsers * NumLoaders),
- {ok, Mgc} = ?MGC_START(MgcNode, MgcMid, ET, DSI, ?MGC_VERBOSITY),
+ {ok, Mgc} = ?MGC_START(MgcNode, MgcMid, ET, SCO ++ DSI, ?MGC_VERBOSITY),
megaco_test_mgc:update_user_info(Mgc,reply_timer,1000),
d("MGC user info: ~p", [?MGC_USER_INFO(Mgc, all)]),
@@ -527,7 +592,7 @@ multi_user_load([MgcNode | MgNodes], NumUsers, NumLoaders)
MgUsers = make_mids(MgNodes),
d("start MGs, apply the load and stop MGs"),
- ok = multi_load(MgUsers, DSI, NumLoaders, ?MULTI_USER_LOAD_NUM_REQUESTS),
+ ok = multi_load(MgUsers, SCO ++ DSI, NumLoaders, ?MULTI_USER_LOAD_NUM_REQUESTS),
i("flush the message queue: ~p", [megaco_test_lib:flush()]),
@@ -542,14 +607,14 @@ multi_user_load([MgcNode | MgNodes], NumUsers, NumLoaders)
ok.
-multi_load(MGs, DSI, NumLoaders, NumReqs) ->
+multi_load(MGs, Conf, NumLoaders, NumReqs) ->
d("multi_load -> entry with"
"~n MGs: ~p"
- "~n DSI: ~p"
+ "~n Conf: ~p"
"~n NumLoaders: ~p"
- "~n NumReqs: ~p", [MGs, DSI, NumLoaders, NumReqs]),
+ "~n NumReqs: ~p", [MGs, Conf, NumLoaders, NumReqs]),
- Pids = multi_load_collector_start(MGs, DSI, NumLoaders, NumReqs, []),
+ Pids = multi_load_collector_start(MGs, Conf, NumLoaders, NumReqs, []),
case timer:tc(?MODULE, do_multi_load, [Pids, NumLoaders, NumReqs]) of
{Time, {ok, OKs, []}} ->
Sec = Time / 1000000,
@@ -569,13 +634,13 @@ do_multi_load(Pids, _NumLoaders, _NumReqs) ->
lists:foreach(Fun, Pids),
await_multi_load_collectors(Pids, [], []).
-multi_load_collector_start([], _DSI, _NumLoaders, _NumReqs, Pids) ->
+multi_load_collector_start([], _Conf, _NumLoaders, _NumReqs, Pids) ->
Pids;
-multi_load_collector_start([{Mid, Node}|MGs], DSI, NumLoaders, NumReqs, Pids) ->
+multi_load_collector_start([{Mid, Node}|MGs], Conf, NumLoaders, NumReqs, Pids) ->
Env = get(),
Pid = spawn_link(?MODULE, multi_load_collector,
- [self(), Node, Mid, DSI, NumLoaders, NumReqs, Env]),
- multi_load_collector_start(MGs, DSI, NumLoaders, NumReqs, [{Pid,Mid}|Pids]).
+ [self(), Node, Mid, Conf, NumLoaders, NumReqs, Env]),
+ multi_load_collector_start(MGs, Conf, NumLoaders, NumReqs, [{Pid,Mid}|Pids]).
get_env(Key, Env) ->
case lists:keysearch(Key, 1, Env) of
@@ -585,13 +650,13 @@ get_env(Key, Env) ->
undefined
end.
-multi_load_collector(Parent, Node, Mid, DSI, NumLoaders, NumReqs, Env) ->
+multi_load_collector(Parent, Node, Mid, Conf, NumLoaders, NumReqs, Env) ->
put(verbosity, get_env(verbosity, Env)),
put(tc, get_env(tc, Env)),
put(sname, get_env(sname, Env) ++ "-loader"),
- case ?MG_START(Node, Mid, text, tcp, DSI, ?MG_VERBOSITY) of
+ case ?MG_START(Node, Mid, text, tcp, Conf, ?MG_VERBOSITY) of
{ok, Pid} ->
- d("MG ~p user info: ~n~p", [Mid, ?MG_USER_INFO(Pid,all)]),
+ d("MG ~p user info: ~n~p", [Mid, ?MG_USER_INFO(Pid, all)]),
ServChRes = ?MG_SERV_CHANGE(Pid),
d("service change result: ~p", [ServChRes]),
megaco_test_mg:update_conn_info(Pid,reply_timer,1000),
diff --git a/lib/megaco/test/megaco_test_mg.erl b/lib/megaco/test/megaco_test_mg.erl
index e84adc7de6..9d096430db 100644
--- a/lib/megaco/test/megaco_test_mg.erl
+++ b/lib/megaco/test/megaco_test_mg.erl
@@ -67,7 +67,9 @@
-define(A5555, tid(255*256*256 + 255*256) ).
-define(A5556, tid(255*256*256 + 255*256 + 255) ).
--record(mg, {mid = undefined,
+-record(mg, {parent = undefined,
+ inet_backend = default,
+ mid = undefined,
state = initiated,
req_handler = undefined,
call_mode = async,
@@ -78,7 +80,6 @@
load_counter = 0,
reply_counter = 0,
mload_info = undefined,
- parent = undefined,
dsi_timer,
evs = []}).
@@ -354,11 +355,16 @@ mg(Parent, Verbosity, Config) ->
case (catch init(Config)) of
{error, _} = Error ->
exit(Error);
+
{'EXIT', Reason} ->
exit({init_failed, Reason});
- {ok, Mid, DSITimer} ->
+
+ {ok, IB, Mid, DSITimer} ->
notify_started(Parent),
- MG = #mg{parent = Parent, mid = Mid, dsi_timer = DSITimer},
+ MG = #mg{parent = Parent,
+ inet_backend = IB,
+ mid = Mid,
+ dsi_timer = DSITimer},
i("mg -> started"),
put(verbosity, Verbosity),
case (catch loop(evs(MG, started))) of
@@ -380,12 +386,16 @@ init(Config) ->
"~n Config: ~p", [Config]),
random_init(),
d("init -> random initiated"),
- Mid = get_conf(local_mid, Config),
- d("init -> Mid: ~p", [Mid]),
+
+ IB = get_conf(inet_backend, Config, default),
+ Mid = get_conf(local_mid, Config),
RI = get_conf(receive_info, Config),
- d("init -> RI: ~p", [RI]),
- d("init -> maybe start the display system info timer"),
+ d("init -> "
+ "~n Inet Backend: ~p"
+ "~n Mid: ~p"
+ "~n RI: ~p", [IB, Mid, RI]),
+
DSITimer =
case get_conf(display_system_info, Config, undefined) of
Time when is_integer(Time) ->
@@ -395,6 +405,7 @@ init(Config) ->
undefined
end,
Conf0 = lists:keydelete(display_system_info, 1, Config),
+ Conf1 = lists:keydelete(inet_backend, 1, Conf0),
d("init -> start megaco"),
application:start(megaco),
@@ -411,12 +422,12 @@ init(Config) ->
_ ->
ok
end,
- Conf1 = lists:keydelete(megaco_trace, 1, Conf0),
+ Conf2 = lists:keydelete(megaco_trace, 1, Conf1),
d("init -> start megaco user"),
- Conf2 = lists:keydelete(local_mid, 1, Conf1),
- Conf3 = lists:keydelete(receive_info, 1, Conf2),
- ok = megaco:start_user(Mid, Conf3),
+ Conf3 = lists:keydelete(local_mid, 1, Conf2),
+ Conf4 = lists:keydelete(receive_info, 1, Conf3),
+ ok = megaco:start_user(Mid, Conf4),
d("init -> update user info (user_mod)"),
ok = megaco:update_user_info(Mid, user_mod, ?MODULE),
d("init -> update user info (user_args)"),
@@ -427,8 +438,8 @@ init(Config) ->
d("init -> parse receive info"),
{MgcPort, MgcHost, RH1, TO} = parse_receive_info(RI, RH),
d("init -> start transport (with ~p)", [TO]),
- {ok, _CH} = start_transport(MgcPort, MgcHost, RH1, TO),
- {ok, Mid, DSITimer}.
+ {ok, _CH} = start_transport(IB, MgcPort, MgcHost, RH1, TO),
+ {ok, IB, Mid, DSITimer}.
loop(#mg{parent = Parent, mid = Mid} = S) ->
@@ -936,39 +947,43 @@ parse_receive_info(RI, RH) ->
{TP, TH, RH1, TO}.
-start_transport(MgcPort, MgcHost,
- #megaco_receive_handle{send_mod = megaco_tcp} = RH, TO) ->
- start_tcp(MgcPort, MgcHost, RH, TO);
-start_transport(MgcPort, MgcHost,
- #megaco_receive_handle{send_mod = megaco_udp} = RH, TO) ->
- start_udp(MgcPort, MgcHost, RH, TO);
-start_transport(_, _, #megaco_receive_handle{send_mod = Mod}, _TO) ->
+start_transport(IB,
+ MgcPort, MgcHost,
+ #megaco_receive_handle{send_mod = megaco_tcp} = RH, TO) ->
+ start_tcp(IB, RH, TO, MgcPort, MgcHost);
+start_transport(IB,
+ MgcPort, MgcHost,
+ #megaco_receive_handle{send_mod = megaco_udp} = RH, TO) ->
+ start_udp(IB, RH, TO, MgcPort, MgcHost);
+start_transport(_, _, _, #megaco_receive_handle{send_mod = Mod}, _TO) ->
throw({error, {bad_send_mod, Mod}}).
-start_tcp(MgcPort, MgcHost, RH, TO) ->
+start_tcp(IB, RH, TO, MgcPort, MgcHost) ->
d("start tcp transport: "
+ "~n Inet Backend: ~p"
"~n MGC Port: ~p"
"~n MGC Host: ~p"
"~n Receive handle: ~p"
- "~n Transport options: ~p", [MgcPort, MgcHost, RH, TO]),
+ "~n Transport options: ~p", [IB, MgcPort, MgcHost, RH, TO]),
case megaco_tcp:start_transport() of
{ok, Sup} ->
d("tcp transport started: ~p", [Sup]),
- start_tcp_connect(TO, RH, MgcPort, MgcHost, Sup);
+ start_tcp_connect(IB, TO, RH, MgcPort, MgcHost, Sup);
{error, Reason} ->
throw({error, {megaco_tcp_start_transport, Reason}})
end.
-start_tcp_connect(TO, RH, Port, Host, Sup) ->
+start_tcp_connect(IB, TO, RH, Port, Host, Sup) ->
d("try tcp connecting to: ~p:~p", [Host, Port]),
- Opts = [{host, Host},
+ Opts = [{inet_backend, IB},
+ {host, Host},
{port, Port},
{receive_handle, RH},
{tcp_options, [{nodelay, true}]}] ++ TO,
- try_start_tcp_connect(RH, Sup, Opts, 250, noError).
+ try_start_tcp_connect(RH, Opts, Sup, 250, noError).
-try_start_tcp_connect(RH, Sup, Opts, Timeout, Error0) when (Timeout < 5000) ->
+try_start_tcp_connect(RH, Opts, Sup, Timeout, Error0) when (Timeout < 5000) ->
Sleep = random(Timeout) + 100,
d("try tcp connect (~p,~p)", [Timeout, Sleep]),
case megaco_tcp:connect(Sup, Opts) of
@@ -978,13 +993,13 @@ try_start_tcp_connect(RH, Sup, Opts, Timeout, Error0) when (Timeout < 5000) ->
Error1 when Error0 =:= noError -> % Keep the first error
d("failed connecting [1]: ~p", [Error1]),
sleep(Sleep),
- try_start_tcp_connect(RH, Sup, Opts, Timeout*2, Error1);
+ try_start_tcp_connect(RH, Opts, Sup, Timeout*2, Error1);
Error2 ->
d("failed connecting [2]: ~p", [Error2]),
sleep(Sleep),
- try_start_tcp_connect(RH, Sup, Opts, Timeout*2, Error0)
+ try_start_tcp_connect(RH, Opts, Sup, Timeout*2, Error0)
end;
-try_start_tcp_connect(_RH, Sup, _Opts, _Timeout, Error) ->
+try_start_tcp_connect(_RH, _Opts, Sup, _Timeout, Error) ->
megaco_tcp:stop_transport(Sup),
throw({error, {megaco_tcp_connect, Error}}).
@@ -995,25 +1010,45 @@ megaco_tcp_connect(RH, SendHandle, ControlPid) ->
d("megaco connected: ~p", [CH]),
{ok, CH}.
-start_udp(MgcPort, MgcHost, RH, TO) ->
+start_udp(IB, RH, TO, MgcPort, MgcHost) ->
d("start udp transport (~p)", [MgcPort]),
case megaco_udp:start_transport() of
{ok, Sup} ->
d("udp transport started: ~p", [Sup]),
- Opts = [{port, 0}, {receive_handle, RH}] ++ TO,
- d("udp open", []),
- case megaco_udp:open(Sup, Opts) of
- {ok, Handle, ControlPid} ->
- d("udp opened: ~p, ~p", [Handle, ControlPid]),
- megaco_udp_connect(MgcPort, MgcHost,
- RH, Handle, ControlPid);
- {error, Reason} ->
- throw({error, {megaco_udp_open, Reason}})
- end;
+ start_udp_open(IB, RH, TO, MgcPort, MgcHost, Sup);
+ %% Opts = [{inet_backend, IB}, {port, 0}, {receive_handle, RH}] ++ TO,
+ %% d("udp open", []),
+ %% case megaco_udp:open(Sup, Opts) of
+ %% {ok, Handle, ControlPid} ->
+ %% d("udp opened: ~p, ~p", [Handle, ControlPid]),
+ %% megaco_udp_connect(IB,
+ %% MgcPort, MgcHost,
+ %% RH, Handle, ControlPid);
+ %% {error, Reason} ->
+ %% throw({error, {megaco_udp_open, Reason}})
+ %% end;
{error, Reason} ->
throw({error, {megaco_udp_start_transport, Reason}})
end.
+start_udp_open(IB, RH, TO, MgcPort, MgcHost, Sup) ->
+ Opts = [{inet_backend, IB}, {port, 0}, {receive_handle, RH}] ++ TO,
+ try_start_udp_open(RH, Opts, MgcPort, MgcHost, Sup).
+
+try_start_udp_open(RH, Opts, MgcPort, MgcHost, Sup) ->
+ d("udp open", []),
+ case megaco_udp:open(Sup, Opts) of
+ {ok, Handle, ControlPid} ->
+ d("udp opened: ~p, ~p", [Handle, ControlPid]),
+ megaco_udp_connect(MgcPort, MgcHost,
+ RH, Handle, ControlPid);
+ {error, Reason} ->
+ megaco_udp:stop_transport(Sup),
+ throw({error, {megaco_udp_open, Reason}})
+ end.
+
+
+
megaco_udp_connect(MgcPort, MgcHost, RH, Handle, ControlPid) ->
MgcMid = preliminary_mid,
SendHandle = megaco_udp:create_send_handle(Handle, MgcHost, MgcPort),
diff --git a/lib/megaco/test/megaco_test_mgc.erl b/lib/megaco/test/megaco_test_mgc.erl
index a7d0731b0f..74fd9fc7fc 100644
--- a/lib/megaco/test/megaco_test_mgc.erl
+++ b/lib/megaco/test/megaco_test_mgc.erl
@@ -57,6 +57,8 @@
-include_lib("megaco/include/megaco.hrl").
-include_lib("megaco/include/megaco_message_v1.hrl").
+-define(NO_ERROR, 'no error').
+
-define(A4444, ["11111111", "00000000", "00000000"]).
-define(A4445, ["11111111", "00000000", "11111111"]).
-define(A5555, ["11111111", "11111111", "00000000"]).
@@ -65,18 +67,19 @@
-define(valid_actions,
[ignore, pending, pending_ignore, discard_ack, handle_ack, handle_pending_ack, handle_sloppy_ack]).
--record(mgc, {parent = undefined,
- tcp_sup = undefined,
- udp_sup = undefined,
- req_action = discard_ack,
- req_timeout = 0,
- mid = undefined,
- ack_info = undefined,
- abort_info = undefined,
- req_info = undefined,
- mg = [],
+-record(mgc, {parent = undefined,
+ inet_backend = default,
+ tcp_sup = undefined,
+ udp_sup = undefined,
+ req_action = discard_ack,
+ req_timeout = 0,
+ mid = undefined,
+ ack_info = undefined,
+ abort_info = undefined,
+ req_info = undefined,
+ mg = [],
dsi_timer,
- evs = []}).
+ evs = []}).
-define(EVS_MAX, 10).
@@ -330,13 +333,14 @@ mgc(Parent, Verbosity, Config) ->
case (catch init(Config)) of
{error, Reason} ->
exit(Reason);
- {Mid, TcpSup, UdpSup, DSITimer} ->
+ {IB, Mid, TcpSup, UdpSup, DSITimer} ->
notify_started(Parent),
- S = #mgc{parent = Parent,
- tcp_sup = TcpSup,
- udp_sup = UdpSup,
- mid = Mid,
- dsi_timer = DSITimer},
+ S = #mgc{parent = Parent,
+ tcp_sup = TcpSup,
+ udp_sup = UdpSup,
+ mid = Mid,
+ dsi_timer = DSITimer,
+ inet_backend = IB},
i("mgc -> started"),
display_system_info("at start "),
loop(evs(S, started))
@@ -345,10 +349,15 @@ mgc(Parent, Verbosity, Config) ->
init(Config) ->
d("init -> entry"),
random_init(),
- Mid = get_conf(local_mid, Config),
+
+ IB = get_conf(inet_backend, Config, default),
+ Mid = get_conf(local_mid, Config),
RI = get_conf(receive_info, Config),
- d("init -> maybe start the display system info timer"),
+ d("init -> "
+ "~n Inet Backend: ~p"
+ "~n Mid: ~p"
+ "~n RI: ~p", [IB, Mid, RI]),
DSITimer =
case get_conf(display_system_info, Config, undefined) of
Time when is_integer(Time) ->
@@ -358,6 +367,7 @@ init(Config) ->
undefined
end,
Conf0 = lists:keydelete(display_system_info, 1, Config),
+ Conf1 = lists:keydelete(inet_backend, 1, Conf0),
d("init -> start megaco"),
application:start(megaco),
@@ -373,12 +383,12 @@ init(Config) ->
_ ->
ok
end,
- Conf1 = lists:keydelete(megaco_trace, 1, Conf0),
+ Conf2 = lists:keydelete(megaco_trace, 1, Conf1),
d("init -> start megaco user"),
- Conf2 = lists:keydelete(local_mid, 1, Conf1),
- Conf3 = lists:keydelete(receive_info, 1, Conf2),
- ok = megaco:start_user(Mid, Conf3),
+ Conf3 = lists:keydelete(local_mid, 1, Conf2),
+ Conf4 = lists:keydelete(receive_info, 1, Conf3),
+ ok = megaco:start_user(Mid, Conf4),
d("init -> update user info (user_mod)"),
ok = megaco:update_user_info(Mid, user_mod, ?MODULE),
@@ -392,8 +402,8 @@ init(Config) ->
Transports = parse_receive_info(RI, RH),
d("init -> start transports"),
- {Tcp, Udp} = start_transports(Transports),
- {Mid, Tcp, Udp, DSITimer}.
+ {Tcp, Udp} = start_transports(IB, Transports),
+ {IB, Mid, Tcp, Udp, DSITimer}.
loop(S) ->
d("loop -> await request"),
@@ -722,11 +732,11 @@ parse_receive_info1(RI, RH) ->
%% send/receive port (udp).
%% The second step *may* need to be repeated!
%% --------------------------------------------------------
-start_transports([]) ->
+start_transports(_, []) ->
throw({error, no_transport});
-start_transports(Transports) when is_list(Transports) ->
+start_transports(IB, Transports) when is_list(Transports) ->
{Tcp, Udp} = start_transports1(Transports, undefined, undefined),
- ok = start_transports2(Transports, Tcp, Udp),
+ ok = start_transports2(IB, Transports, Tcp, Udp),
{Tcp, Udp}.
start_transports1([], Tcp, Udp) ->
@@ -760,28 +770,29 @@ start_transports1([{_TO, _Port, RH}|Transports], Tcp, Udp)
start_transports1([_|Transports], Tcp, Udp) ->
start_transports1(Transports, Tcp, Udp).
-start_transports2([], _, _) ->
+start_transports2(_, [], _, _) ->
ok;
-start_transports2([{TO, Port, RH}|Transports], Tcp, Udp)
+start_transports2(IB, [{TO, Port, RH}|Transports], Tcp, Udp)
when RH#megaco_receive_handle.send_mod =:= megaco_tcp ->
- start_tcp(TO, RH, Port, Tcp),
- start_transports2(Transports, Tcp, Udp);
-start_transports2([{TO, Port, RH}|Transports], Tcp, Udp)
+ start_tcp(IB, TO, RH, Port, Tcp),
+ start_transports2(IB, Transports, Tcp, Udp);
+start_transports2(IB, [{TO, Port, RH}|Transports], Tcp, Udp)
when RH#megaco_receive_handle.send_mod =:= megaco_udp ->
- start_udp(TO, RH, Port, Udp),
- start_transports2(Transports, Tcp, Udp).
+ start_udp(IB, TO, RH, Port, Udp),
+ start_transports2(IB, Transports, Tcp, Udp).
-start_tcp(TO, RH, Port, Sup) ->
+start_tcp(IB, TO, RH, Port, Sup) ->
d("start tcp transport"),
- start_tcp(TO, RH, Port, Sup, 250).
+ start_tcp(IB, TO, RH, Port, Sup, 250).
-start_tcp(TO, RH, Port, Sup, Timeout)
+start_tcp(IB, TO, RH, Port, Sup, Timeout)
when is_pid(Sup) andalso is_integer(Timeout) andalso (Timeout > 0) ->
d("tcp listen on ~p", [Port]),
- Opts = [{port, Port},
+ Opts = [{inet_backend, IB},
+ {port, Port},
{receive_handle, RH},
{tcp_options, [{nodelay, true}]}] ++ TO,
- try_start_tcp(Sup, Opts, Timeout, noError).
+ try_start_tcp(Sup, Opts, Timeout, ?NO_ERROR).
try_start_tcp(Sup, Opts, Timeout, Error0) when (Timeout < 5000) ->
Sleep = random(Timeout) + 100,
@@ -790,7 +801,7 @@ try_start_tcp(Sup, Opts, Timeout, Error0) when (Timeout < 5000) ->
ok ->
d("listen socket created", []),
Sup;
- Error1 when Error0 =:= noError -> % Keep the first error
+ Error1 when Error0 =:= ?NO_ERROR -> % Keep the first error
d("failed creating listen socket [1]: ~p", [Error1]),
sleep(Sleep),
try_start_tcp(Sup, Opts, Timeout*2, Error1);
@@ -809,14 +820,16 @@ try_start_tcp(Sup, _Opts, _Timeout, Error) ->
end.
-start_udp(TO, RH, Port, Sup) ->
+start_udp(IB, TO, RH, Port, Sup) ->
d("start udp transport"),
- start_udp(TO, RH, Port, Sup, 250).
+ start_udp(IB, TO, RH, Port, Sup, 250).
-start_udp(TO, RH, Port, Sup, Timeout) ->
+start_udp(IB, TO, RH, Port, Sup, Timeout) ->
d("udp open ~p", [Port]),
- Opts = [{port, Port}, {receive_handle, RH}] ++ TO,
- try_start_udp(Sup, Opts, Timeout, noError).
+ Opts = [{inet_backend, IB},
+ {port, Port},
+ {receive_handle, RH}] ++ TO,
+ try_start_udp(Sup, Opts, Timeout, ?NO_ERROR).
try_start_udp(Sup, Opts, Timeout, Error0) when (Timeout < 5000) ->
d("try open udp socket (~p)", [Timeout]),
@@ -824,7 +837,7 @@ try_start_udp(Sup, Opts, Timeout, Error0) when (Timeout < 5000) ->
{ok, _SendHandle, _ControlPid} ->
d("port opened", []),
Sup;
- Error1 when Error0 =:= noError -> % Keep the first error
+ Error1 when Error0 =:= ?NO_ERROR -> % Keep the first error
d("failed open port [1]: ~p", [Error1]),
sleep(Timeout),
try_start_udp(Sup, Opts, Timeout*2, Error1);