⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 megaco_config.erl

📁 OTP是开放电信平台的简称
💻 ERL
📖 第 1 页 / 共 5 页
字号:
						    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 + -