📄 megaco_config.erl
字号:
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 + -