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

📄 megaco_config.erl

📁 OTP是开放电信平台的简称
💻 ERL
📖 第 1 页 / 共 5 页
字号:
     TransTmr, TransSndr,      PendingTmr,      SentPendingLimit,      RecvPendingLimit,      ReplyTmr, CtrPid, MonRef,      Sendmod, SendHandle,      EncodeMod, EncodeConf,      ProtV, AuthData,      UserMod, UserArgs, ReplyAction, ReplyData,     Threaded,     StrictVersion,     LongReqResend};%% To pre-3.6old_conn_data(#conn_data{conn_handle          = CH, 			 serial               = Serial,			 max_serial           = MaxSerial,			 request_timer        = ReqTmr,			 long_request_timer   = LongReqTmr,			 auto_ack             = AutoAck,			 trans_ack            = TransAck,			 trans_ack_maxcount   = TransAckMaxCnt,			 trans_req            = TransReq,			 trans_req_maxcount   = TransReqMaxCnt,			 trans_req_maxsize    = TransReqMaxSz,			 trans_timer          = TransTmr,			 trans_sender         = TransSndr,			 pending_timer        = PendingTmr,			 sent_pending_limit   = SentPendingLimit,			 recv_pending_limit   = RecvPendingLimit, 			 reply_timer          = ReplyTmr,			 control_pid          = CtrPid,			 monitor_ref          = MonRef,			 send_mod             = Sendmod,			 send_handle          = SendHandle,			 encoding_mod         = EncodeMod,			 encoding_config      = EncodeConf,			 protocol_version     = ProtV,			 auth_data            = AuthData,			 user_mod             = UserMod,			 user_args            = UserArgs,			 reply_action         = ReplyAction,			 reply_data           = ReplyData,			 threaded             = Threaded,			 strict_version       = StrictVersion,			 long_request_resend  = LongReqResend,			 cancel               = Cancel			 %% resend_indication    = ResendIndication			},	      [resend_indication]) ->    {conn_data, CH, Serial, MaxSerial, ReqTmr, LongReqTmr,      AutoAck,      TransAck, TransAckMaxCnt,      TransReq, TransReqMaxCnt, TransReqMaxSz,      TransTmr, TransSndr,      PendingTmr,      SentPendingLimit,      RecvPendingLimit,      ReplyTmr, CtrPid, MonRef,      Sendmod, SendHandle,      EncodeMod, EncodeConf,      ProtV, AuthData,      UserMod, UserArgs, ReplyAction, ReplyData,     Threaded,     StrictVersion,     LongReqResend,     Cancel}.		%%%----------------------------------------------------------------------%%% Internal functions%%%----------------------------------------------------------------------handle_start_user(default, _Config) ->    {error, bad_user_mid};handle_start_user(Mid, Config) ->    case catch user_info(Mid, mid) of        {'EXIT', _} ->	    DefaultConfig = user_info(default, all),            do_handle_start_user(Mid, DefaultConfig),            do_handle_start_user(Mid, Config);        _LocalMid ->            {error, {user_already_exists, Mid}}    end.do_handle_start_user(UserMid, [{Item, Val} | Rest]) ->    case do_update_user(UserMid, Item, Val) of        ok ->            do_handle_start_user(UserMid, Rest);        {error, Reason} ->            ets:match_delete(megaco_config, {{UserMid, '_'}, '_'}),            {error, Reason}    end;do_handle_start_user(UserMid, []) ->    do_update_user(UserMid, mid, UserMid),    ok;do_handle_start_user(UserMid, BadConfig) ->    ets:match_delete(megaco_config, {{UserMid, '_'}, '_'}),    {error, {bad_user_config, UserMid, BadConfig}}.do_update_user(UserMid, Item, Val) ->    case verify_val(Item, Val) of        true  ->            ets:insert(megaco_config, {{UserMid, Item}, Val}),            ok;        false ->            {error, {bad_user_val, UserMid, Item, Val}}    end.verify_val(Item, Val) ->    case Item of        mid                    -> true;        local_mid              -> true;        remote_mid             -> true;        min_trans_id           -> verify_strict_uint(Val, 4294967295); % uint32        max_trans_id           -> verify_uint(Val, 4294967295);        % uint32        request_timer          -> verify_timer(Val);        long_request_timer     -> verify_timer(Val);        auto_ack               -> verify_bool(Val);	trans_ack              -> verify_bool(Val);        trans_ack_maxcount     -> verify_uint(Val);	trans_req              -> verify_bool(Val);        trans_req_maxcount     -> verify_uint(Val);        trans_req_maxsize      -> verify_uint(Val);        trans_timer            -> verify_timer(Val) and (Val >= 0);	trans_sender when Val == undefined -> true;        pending_timer                      -> verify_timer(Val);        sent_pending_limit                 -> verify_uint(Val) and (Val > 0);        recv_pending_limit                 -> verify_uint(Val) and (Val > 0);        reply_timer                        -> verify_timer(Val);        control_pid      when is_pid(Val)  -> true;        monitor_ref                        -> true; % Internal usage only        send_mod         when is_atom(Val) -> true;        send_handle                        -> true;        encoding_mod     when is_atom(Val) -> true;        encoding_config  when is_list(Val) -> true;        protocol_version                   -> verify_strict_uint(Val);        auth_data                          -> true;        user_mod         when is_atom(Val) -> true;        user_args        when is_list(Val) -> true;        reply_data                         -> true;        threaded                           -> verify_bool(Val);        strict_version                     -> verify_bool(Val);	long_request_resend                -> verify_bool(Val);	cancel                             -> verify_bool(Val);	resend_indication                  -> verify_bool(Val);        _                                  -> false    end.verify_bool(true)  -> true;verify_bool(false) -> true;verify_bool(_)     -> false.verify_strict_int(Int) when is_integer(Int) -> true;verify_strict_int(_)                        -> false.verify_strict_uint(Int) when is_integer(Int) and (Int >= 0) -> true;verify_strict_uint(_)                                       -> false.verify_strict_uint(Int, infinity) ->    verify_strict_uint(Int);verify_strict_uint(Int, Max) ->    verify_strict_int(Int, 0, Max).verify_uint(infinity) -> true;verify_uint(Val)      -> verify_strict_uint(Val).verify_int(infinity) -> true;verify_int(Val)      -> verify_strict_int(Val).verify_uint(Int, infinity) ->    verify_uint(Int);verify_uint(infinity, _Max) ->    true;verify_uint(Int, Max) ->    verify_strict_int(Int, 0, Max).verify_strict_int(Val, Min, Max)   when (is_integer(Val) and 	is_integer(Min) and 	is_integer(Max) and 	(Val >= Min)    and 	(Val =< Max)) ->    true;verify_strict_int(_, _, _) ->    false.        verify_timer(Timer) ->    megaco_timer:verify(Timer).handle_stop_user(UserMid) ->    case catch user_info(UserMid, mid) of        {'EXIT', _} ->	    {error, {no_such_user, UserMid}};	_ ->	    case catch user_info(UserMid, connections) of		[] ->		    ets:match_delete(megaco_config, {{UserMid, '_'}, '_'}),		    ok;		{'EXIT', _} ->		    {error, {no_such_user, UserMid}};		_Else ->		    {error, {active_connections, UserMid}}	    end    end.handle_update_conn_data(CD, Item = receive_handle, RH) ->    UserMid = (CD#conn_data.conn_handle)#megaco_conn_handle.local_mid,    if        is_record(RH, megaco_receive_handle) and         is_atom(RH#megaco_receive_handle.encoding_mod) and        is_list(RH#megaco_receive_handle.encoding_config) and        is_atom(RH#megaco_receive_handle.send_mod) and        (RH#megaco_receive_handle.local_mid /= UserMid) ->            CD2 = CD#conn_data{encoding_mod    = RH#megaco_receive_handle.encoding_mod,                               encoding_config = RH#megaco_receive_handle.encoding_config,                               send_mod        = RH#megaco_receive_handle.send_mod},            ets:insert(megaco_local_conn, CD2),            ok;        true ->            {error, {bad_user_val, UserMid, Item, RH}}    end;handle_update_conn_data(CD, Item, Val) ->    case verify_val(Item, Val) of        true ->            CD2 = replace_conn_data(CD, Item, Val),            ets:insert(megaco_local_conn, CD2),            ok;        false ->            UserMid = (CD#conn_data.conn_handle)#megaco_conn_handle.local_mid,            {error, {bad_user_val, UserMid, Item, Val}}    end.replace_conn_data(CD, Item, Val) ->    case Item of        trans_id             -> CD#conn_data{serial             = Val};        max_trans_id         -> CD#conn_data{max_serial         = Val};        request_timer        -> CD#conn_data{request_timer      = Val};        long_request_timer   -> CD#conn_data{long_request_timer = Val};	auto_ack             -> update_auto_ack(CD, Val);	%% Accumulate trans ack before sending	trans_ack            -> update_trans_ack(CD, Val); 	trans_ack_maxcount   -> update_trans_ack_maxcount(CD, Val);	%% Accumulate trans req before sending	trans_req            -> update_trans_req(CD, Val); 	trans_req_maxcount   -> update_trans_req_maxcount(CD, Val);	trans_req_maxsize    -> update_trans_req_maxsize(CD, Val);	trans_timer          -> update_trans_timer(CD, Val); 	%% trans_sender      - Automagically updated by 	%%                     update_auto_ack & update_trans_timer & 	%%                     update_trans_ack & update_trans_req        pending_timer        -> CD#conn_data{pending_timer        = Val};        sent_pending_limit   -> CD#conn_data{sent_pending_limit   = Val};        recv_pending_limit   -> CD#conn_data{recv_pending_limit   = Val};        reply_timer          -> CD#conn_data{reply_timer          = Val};        control_pid          -> CD#conn_data{control_pid          = Val};        monitor_ref          -> CD#conn_data{monitor_ref          = Val};        send_mod             -> CD#conn_data{send_mod             = Val};        send_handle          -> CD#conn_data{send_handle          = Val};        encoding_mod         -> CD#conn_data{encoding_mod         = Val};        encoding_config      -> CD#conn_data{encoding_config      = Val};        protocol_version     -> CD#conn_data{protocol_version     = Val};        auth_data            -> CD#conn_data{auth_data            = Val};        user_mod             -> CD#conn_data{user_mod             = Val};        user_args            -> CD#conn_data{user_args            = Val};        reply_action         -> CD#conn_data{reply_action         = Val};        reply_data           -> CD#conn_data{reply_data           = Val};        threaded             -> CD#conn_data{threaded             = Val};        strict_version       -> CD#conn_data{strict_version       = Val};	long_request_resend  -> CD#conn_data{long_request_resend  = Val};	cancel               -> CD#conn_data{cancel               = Val};	resend_indication    -> CD#conn_data{resend_indication    = Val}    end.%% update auto_ackupdate_auto_ack(#conn_data{trans_sender = Pid,			   trans_req    = false} = CD, 		false) when is_pid(Pid) ->    megaco_trans_sender:stop(Pid),    CD#conn_data{auto_ack = false, trans_sender = undefined};update_auto_ack(#conn_data{trans_timer  = To, 			   trans_ack    = true,			   trans_sender = undefined} = CD, 		true) 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{auto_ack = true, trans_sender = Pid};update_auto_ack(CD, Val) ->    ?d("update_auto_ack -> entry with ~p", [Val]),    CD#conn_data{auto_ack = Val}.%% update trans_ackupdate_trans_ack(#conn_data{auto_ack     = true,			    trans_req    = false,			    trans_sender = Pid} = CD, 		      false) when is_pid(Pid) ->    megaco_trans_sender:stop(Pid),    CD#conn_data{trans_ack = false, trans_sender = undefined};update_trans_ack(#conn_data{trans_timer  = To,			    auto_ack     = true, 			    trans_sender = undefined} = CD, 		      true) 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_ack = true, trans_sender = Pid};update_trans_ack(CD, Val) ->    ?d("update_trans_ack -> entry with ~p", [Val]),    CD#conn_data{trans_ack = Val}.%% update trans_requpdate_trans_req(#conn_data{trans_ack    = false,			    trans_sender = Pid} = CD, 		      false) when is_pid(Pid) ->    megaco_trans_sender:stop(Pid),    CD#conn_data{trans_req = false, trans_sender = undefined};update_trans_req(#conn_data{trans_timer  = To, 			    trans_sender = undefined} = CD, 		      true) 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, 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -