diff options
author | Micael Karlberg <bmk@erlang.org> | 2021-07-29 19:27:04 +0200 |
---|---|---|
committer | Micael Karlberg <bmk@erlang.org> | 2021-08-30 16:41:16 +0200 |
commit | 1f3acf0177ad06af242be4431d6154020d6b189a (patch) | |
tree | 606296def389aaab866cd55e12607e63f2813776 | |
parent | 630a99722437e9f1b2e5c1eccb8a2d8f160c6edf (diff) | |
download | erlang-1f3acf0177ad06af242be4431d6154020d6b189a.tar.gz |
[megaco|test] Update load suite to use inet-backend option
OTP-17533
-rw-r--r-- | lib/megaco/test/megaco_load_SUITE.erl | 123 | ||||
-rw-r--r-- | lib/megaco/test/megaco_test_mg.erl | 119 | ||||
-rw-r--r-- | lib/megaco/test/megaco_test_mgc.erl | 107 |
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); |