Packages
smppex
2.2.6
3.3.0
3.2.4
3.2.3
3.2.2
3.2.1
3.2.0
retired
3.1.0
retired
3.0.6
3.0.5
3.0.4
3.0.3
3.0.2
3.0.1
3.0.0
2.4.0
2.3.3
2.3.2
2.3.1
2.3.0
2.2.9
2.2.8
2.2.7
2.2.6
2.2.5
2.2.4
2.2.3
2.2.2
2.2.1
2.2.0
2.1.0
2.0.1
2.0.0
1.0.1
0.3.2
0.3.1
0.3.0
0.2.1
0.2.0
0.1.12
0.1.11
0.1.10
0.1.9
0.1.8
0.1.7
0.1.6
0.1.5
0.1.4
0.1.3
0.1.2
0.1.1
0.1.0
0.0.5
0.0.4
0.0.3
0.0.2
0.0.1
SMPP 3.4 protocol and framework implemented in Elixir
Current section
Files
Jump to
Current section
Files
lib/smppex/smpp_timers.ex
defmodule SMPPEX.SMPPTimers do
@moduledoc false
alias SMPPEX.SMPPTimers
# :established -> :bound
# :active <-> :waiting_resp
defstruct connection_time: 0,
session_init_state: :established,
session_init_limit: 0,
last_peer_action_time: 0,
enquire_link_state: :active,
enquire_link_limit: 0,
enquire_link_resp_limit: 0,
last_transaction_time: 0,
inactivity_limit: 0
@type t :: %SMPPTimers{}
@spec new(non_neg_integer, timeout, timeout, timeout, timeout) :: t
def new(time, session_init_limit, enquire_link_limit, enquire_link_resp_limit, inactivity_limit) do
%SMPPTimers{
connection_time: time,
session_init_limit: session_init_limit,
enquire_link_limit: enquire_link_limit,
enquire_link_resp_limit: enquire_link_resp_limit,
inactivity_limit: inactivity_limit
}
end
@spec handle_bind(t, non_neg_integer) :: t
def handle_bind(timers, time) do
handle_peer_transaction(%SMPPTimers{timers | session_init_state: :bound}, time)
end
@spec handle_peer_transaction(t, non_neg_integer) :: t
def handle_peer_transaction(timers, time) do
handle_peer_action(%SMPPTimers{timers | last_transaction_time: time}, time)
end
@spec handle_peer_action(t, non_neg_integer) :: t
def handle_peer_action(timers, time) do
%SMPPTimers{timers | last_peer_action_time: time, enquire_link_state: :active}
end
@type tick_result :: {:ok, t} | {:stop, reason :: term} | {:enquire_link, t}
@spec handle_tick(t, non_neg_integer) :: tick_result
def handle_tick(timers, time) do
case timers.session_init_state do
:established -> handle_unbound_tick(timers, time)
:bound -> handle_bound_tick(timers, time)
end
end
defp handle_unbound_tick(timers, time) do
case time - timers.connection_time > timers.session_init_limit do
true -> {:stop, :session_init_timer}
false -> {:ok, timers}
end
end
defp handle_bound_tick(timers, time) do
case time - timers.last_transaction_time > timers.inactivity_limit do
true -> {:stop, :inactivity_timer}
false -> check_enquire_link(timers, time)
end
end
defp check_enquire_link(timers, time) do
case timers.enquire_link_state do
:active -> check_active_enquire_link(timers, time)
:waiting_resp -> check_waiting_enquire_link(timers, time)
end
end
defp check_active_enquire_link(timers, time) do
case time - timers.last_peer_action_time > timers.enquire_link_limit do
true -> {:enquire_link, %SMPPTimers{timers | enquire_link_state: :waiting_resp}}
false -> {:ok, timers}
end
end
defp check_waiting_enquire_link(timers, time) do
case time - timers.last_peer_action_time >
timers.enquire_link_limit + timers.enquire_link_resp_limit do
true -> {:stop, :enquire_link_timer}
false -> {:ok, timers}
end
end
end