📄 megaco_config.erl
字号:
ReqsMax, AcksMax), %% Make sure we are notified when/if the transaction %% sender goes down. %% Do we need to store the ref? Will we ever need to %% cancel this (apply_at_exit)? megaco_monitor:apply_at_exit(?MODULE, trans_sender_exit, [CH], Pid), CD#conn_data{trans_req = true, trans_sender = Pid};update_trans_req(CD, Val) -> ?d("update_trans_req -> entry with ~p", [Val]), CD#conn_data{trans_req = Val}.%% update trans_timerupdate_trans_timer(#conn_data{auto_ack = true, trans_ack = true, trans_sender = undefined} = CD, To) when To > 0 -> #conn_data{conn_handle = CH, trans_ack_maxcount = AcksMax, trans_req_maxcount = ReqsMax, trans_req_maxsize = ReqsMaxSz} = CD, {ok, Pid} = megaco_trans_sup:start_trans_sender(CH, To, ReqsMaxSz, ReqsMax, AcksMax), %% Make sure we are notified when/if the transaction %% sender goes down. %% Do we need to store the ref? Will we ever need to %% cancel this (apply_at_exit)? megaco_monitor:apply_at_exit(?MODULE, trans_sender_exit, [CH], Pid), CD#conn_data{trans_timer = To, trans_sender = Pid};update_trans_timer(#conn_data{trans_req = true, trans_sender = undefined} = CD, To) when To > 0 -> #conn_data{conn_handle = CH, trans_ack_maxcount = AcksMax, trans_req_maxcount = ReqsMax, trans_req_maxsize = ReqsMaxSz} = CD, {ok, Pid} = megaco_trans_sup:start_trans_sender(CH, To, ReqsMaxSz, ReqsMax, AcksMax), %% Make sure we are notified when/if the transaction %% sender goes down. %% Do we need to store the ref? Will we ever need to %% cancel this (apply_at_exit)? megaco_monitor:apply_at_exit(?MODULE, trans_sender_exit, [CH], Pid), CD#conn_data{trans_timer = To, trans_sender = Pid};update_trans_timer(#conn_data{trans_sender = Pid} = CD, 0) when is_pid(Pid) -> megaco_trans_sender:stop(Pid), CD#conn_data{trans_timer = 0, trans_sender = undefined};update_trans_timer(#conn_data{trans_sender = Pid} = CD, To) when is_pid(Pid) and (To > 0) -> megaco_trans_sender:timeout(Pid, To), CD#conn_data{trans_timer = To};update_trans_timer(CD, To) when To > 0 -> CD#conn_data{trans_timer = To}.%% update trans_ack_maxcountupdate_trans_ack_maxcount(#conn_data{trans_sender = Pid} = CD, Max) when is_pid(Pid) and (Max > 0) -> megaco_trans_sender:ack_maxcount(Pid, Max), CD#conn_data{trans_ack_maxcount = Max};update_trans_ack_maxcount(CD, Max) when Max > 0 -> ?d("update_trans_ack_maxcount -> entry with ~p", [Max]), CD#conn_data{trans_ack_maxcount = Max}.%% update trans_req_maxcountupdate_trans_req_maxcount(#conn_data{trans_sender = Pid} = CD, Max) when is_pid(Pid) and (Max > 0) -> megaco_trans_sender:req_maxcount(Pid, Max), CD#conn_data{trans_req_maxcount = Max};update_trans_req_maxcount(CD, Max) when Max > 0 -> ?d("update_trans_req_maxcount -> entry with ~p", [Max]), CD#conn_data{trans_req_maxcount = Max}.%% update trans_req_maxsizeupdate_trans_req_maxsize(#conn_data{trans_sender = Pid} = CD, Max) when is_pid(Pid) and (Max > 0) -> megaco_trans_sender:req_maxsize(Pid, Max), CD#conn_data{trans_req_maxsize = Max};update_trans_req_maxsize(CD, Max) when Max > 0 -> ?d("update_trans_req_maxsize -> entry with ~p", [Max]), CD#conn_data{trans_req_maxsize = Max}. handle_connect(RH, RemoteMid, SendHandle, ControlPid) -> LocalMid = RH#megaco_receive_handle.local_mid, ConnHandle = #megaco_conn_handle{local_mid = LocalMid, remote_mid = RemoteMid}, ?d("handle_connect -> entry with" "~n ConnHandle: ~p", [ConnHandle]), case ets:lookup(megaco_local_conn, ConnHandle) of [] -> PrelMid = preliminary_mid, PrelHandle = ConnHandle#megaco_conn_handle{remote_mid = PrelMid}, case ets:lookup(megaco_local_conn, PrelHandle) of [] -> case catch init_conn_data(RH, RemoteMid, SendHandle, ControlPid) of {'EXIT', _Reason} -> ?d("handle_connect -> init conn data failed: " "~n ~p",[_Reason]), {error, {no_such_user, LocalMid}}; ConnData -> ?d("handle_connect -> new connection" "~n ConnData: ~p", [ConnData]), %% Brand new connection, use %% When is the preliminary_mid used? create_snmp_counters(ConnHandle), %% Maybe start transaction sender ConnData2 = trans_sender_start(ConnData), ets:insert(megaco_local_conn, ConnData2), {ok, ConnData2} end; [PrelData] -> ?d("handle_connect -> connection upgrade" "~n PrelData: ~p", [PrelData]), %% OK, we need to fix the snmp counters. Used %% with the temporary (preliminary_mid) conn_handle. create_snmp_counters(ConnHandle), ConnData = PrelData#conn_data{conn_handle = ConnHandle}, trans_sender_upgrade(ConnData), ets:insert(megaco_local_conn, ConnData), ets:delete(megaco_local_conn, PrelHandle), update_snmp_counters(ConnHandle, PrelHandle), TH = ConnHandle#megaco_conn_handle{local_mid = PrelMid, remote_mid = RemoteMid}, TD = ConnData#conn_data{conn_handle = TH}, ?report_debug(TD, "Upgrade preliminary_mid to " "actual remote_mid", [{preliminary_mid, preliminary_mid}, {local_mid, LocalMid}, {remote_mid, RemoteMid}]), {ok, ConnData} end; [_ConnData] -> {error, {already_connected, ConnHandle}} end.%% also trans_req == truetrans_sender_start(#conn_data{conn_handle = CH, auto_ack = true, trans_ack = true, trans_ack_maxcount = AcksMax, trans_req_maxcount = ReqsMax, trans_req_maxsize = ReqsMaxSz, trans_timer = To, trans_sender = undefined} = CD) when To > 0 -> ?d("trans_sender_start(ack) -> entry when" "~n CH: ~p" "~n To: ~p" "~n AcksMax: ~p" "~n ReqsMax: ~p" "~n ReqsMaxSz: ~p", [CH, To, ReqsMaxSz, ReqsMax, AcksMax]), {ok, Pid} = megaco_trans_sup:start_trans_sender(CH, To, ReqsMaxSz, ReqsMax, AcksMax), ?d("trans_sender_start(ack) -> Pid: ~p", [Pid]), %% Make sure we are notified when/if the transaction %% sender goes down. %% Do we need to store the ref? Will we ever need to %% cancel this (apply_at_exit)? megaco_monitor:apply_at_exit(?MODULE, trans_sender_exit, [CH], Pid), CD#conn_data{trans_sender = Pid};trans_sender_start(#conn_data{conn_handle = CH, trans_req = true, trans_ack_maxcount = AcksMax, trans_req_maxcount = ReqsMax, trans_req_maxsize = ReqsMaxSz, trans_timer = To, trans_sender = undefined} = CD) when To > 0 -> ?d("trans_sender_start(req) -> entry when" "~n CH: ~p" "~n To: ~p" "~n AcksMax: ~p" "~n ReqsMax: ~p" "~n ReqsMaxSz: ~p", [CH, To, ReqsMaxSz, ReqsMax, AcksMax]), {ok, Pid} = megaco_trans_sup:start_trans_sender(CH, To, ReqsMaxSz, ReqsMax, AcksMax), ?d("trans_sender_start(req) -> Pid: ~p", [Pid]), %% Make sure we are notified when/if the transaction %% sender goes down. %% Do we need to store the ref? Will we ever need to %% cancel this (apply_at_exit)? megaco_monitor:apply_at_exit(?MODULE, trans_sender_exit, [CH], Pid), CD#conn_data{trans_sender = Pid};trans_sender_start(CD) -> ?d("trans_sender_start -> undefined", []), CD#conn_data{trans_sender = undefined}.trans_sender_upgrade(#conn_data{conn_handle = CH, trans_sender = Pid}) when is_pid(Pid) -> ?d("trans_sende_upgrade -> entry when" "~n CH: ~p" "~n Pid: ~p", [CH, Pid]), megaco_trans_sender:upgrade(Pid, CH);trans_sender_upgrade(_CD) -> ok.handle_connect_remote(ConnHandle, UserNode, Ref) -> Pat = #remote_conn_data{conn_handle = ConnHandle, user_node = UserNode, monitor_ref = '_'}, case ets:match_object(megaco_remote_conn, Pat) of [] -> RCD = #remote_conn_data{conn_handle = ConnHandle, user_node = UserNode, monitor_ref = Ref}, ets:insert(megaco_remote_conn, RCD), ok; _ -> {error, {already_connected, ConnHandle, UserNode}} end.init_conn_data(RH, RemoteMid, SendHandle, ControlPid) -> Mid = RH#megaco_receive_handle.local_mid, ConnHandle = #megaco_conn_handle{local_mid = Mid, remote_mid = RemoteMid}, EncodingMod = RH#megaco_receive_handle.encoding_mod, EncodingConfig = RH#megaco_receive_handle.encoding_config, SendMod = RH#megaco_receive_handle.send_mod, #conn_data{conn_handle = ConnHandle, serial = undefined_serial, max_serial = user_info(Mid, max_trans_id), request_timer = user_info(Mid, request_timer), long_request_timer = user_info(Mid, long_request_timer), auto_ack = user_info(Mid, auto_ack), trans_ack = user_info(Mid, trans_req), trans_req = user_info(Mid, trans_req), trans_timer = user_info(Mid, trans_timer), trans_req_maxsize = user_info(Mid, trans_req_maxsize), trans_req_maxcount = user_info(Mid, trans_req_maxcount), trans_ack_maxcount = user_info(Mid, trans_ack_maxcount), pending_timer = user_info(Mid, pending_timer), sent_pending_limit = user_info(Mid, sent_pending_limit), recv_pending_limit = user_info(Mid, recv_pending_limit), reply_timer = user_info(Mid, reply_timer), control_pid = ControlPid, monitor_ref = undefined_monitor_ref, send_mod = SendMod, send_handle = SendHandle, encoding_mod = EncodingMod, encoding_config = EncodingConfig, protocol_version = user_info(Mid, protocol_version), auth_data = user_info(Mid, auth_data), user_mod = user_info(Mid, user_mod), user_args = user_info(Mid, user_args), reply_action = undefined, reply_data = user_info(Mid, reply_data), threaded = user_info(Mid, threaded), strict_version = user_info(Mid, strict_version), long_request_resend = user_info(Mid, long_request_resend), cancel = false, resend_indication = user_info(Mid, resend_indication)}.handle_disconnect(ConnHandle) when is_record(ConnHandle, megaco_conn_handle) -> case ets:lookup(megaco_local_conn, ConnHandle) of [ConnData] -> ets:delete(megaco_local_conn, ConnHandle), RemoteConnData = handle_disconnect_remote(ConnHandle, '_'), {ok, ConnData, RemoteConnData}; [] -> {error, {already_disconnected, ConnHandle}} end.handle_disconnect_remote(ConnHandle, UserNode) -> Pat = #remote_conn_data{conn_handle = ConnHandle, user_node = UserNode, monitor_ref = '_'}, RemoteConnData = ets:match_object(megaco_remote_conn, Pat), ets:match_delete(megaco_remote_conn, Pat), RemoteConnData.make_receive_handle(UserMid) -> #megaco_receive_handle{local_mid = UserMid, encoding_mod = user_info(UserMid, encoding_mod), encoding_config = user_info(UserMid, encoding_config), send_mod = user_info(UserMid, send_mod)}.%%-----------------------------------------------------------------%% Func: create_snmp_counters/1, update_snmp_counters/2%% Description: create/update all the SNMP statistic counters%%-----------------------------------------------------------------create_snmp_counters(CH) -> create_snmp_counters(CH, snmp_counters()).% create_snmp_counters(CH, []) ->% ok;% create_snmp_counters(CH, [Counter|Counters]) ->% Key = {CH, Counter},% ets:insert(megaco_stats, {Key, 0}),% create_snmp_counters(CH, Counters).create_snmp_counters(CH, Counters) -> F = fun(Counter) -> Key = {CH, Counter}, ets:insert(megaco_stats, {Key, 0}) end, lists:foreach(F, Counters).update_snmp_counters(CH, PrelCH) -> update_snmp_counters(CH, PrelCH, snmp_counters()).update_snmp_counters(_CH, _PrelCH, []) -> ok;update_snmp_counters(CH, PrelCH, [Counter|Counters]) -> PrelKey = {PrelCH, Counter}, Key = {CH, Counter}, [{PrelKey,PrelVal}] = ets:lookup(megaco_stats, PrelKey), ets:update_counter(megaco_stats, Key, PrelVal), ets:delete(megaco_stats, PrelKey), update_snmp_counters(CH, PrelCH, Counters).global_snmp_counters() -> [medGwyGatewayNumErrors].snmp_counters() -> [medGwyGatewayNumTimerRecovery, medGwyGatewayNumErrors].%%-----------------------------------------------------------------warning_msg(F, A) -> ?megaco_warning("Config server: " ++ F, A).error_msg(F, A) -> ?megaco_error("Config server: " ++ F, A).
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -