fixeria has submitted this change. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/40016?usp=email )
Change subject: sctp_{client,server}: accept arguments in form of a map ......................................................................
sctp_{client,server}: accept arguments in form of a map
This prepares for a follow-up patch adding even more arguments. Maps are more convenient/readable to organize multiple arguments.
Change-Id: I07c7365181037ee36c1bce73e91f7bafa7f7f0cf Related: SYS#7288 --- M src/osmo_s1gw_sup.erl M src/sctp_client.erl M src/sctp_proxy.erl M src/sctp_server.erl 4 files changed, 59 insertions(+), 60 deletions(-)
Approvals: Jenkins Builder: Verified fixeria: Looks good to me, approved osmith: Looks good to me, but someone else must approve laforge: Looks good to me, but someone else must approve
diff --git a/src/osmo_s1gw_sup.erl b/src/osmo_s1gw_sup.erl index 5f332ed..22a0298 100644 --- a/src/osmo_s1gw_sup.erl +++ b/src/osmo_s1gw_sup.erl @@ -59,17 +59,10 @@
init([]) -> - S1GWBindAddr = get_env(s1gw_bind_addr, ?ENV_DEFAULT_S1GW_BIND_ADDR), - S1GWBindPort = get_env(s1gw_bind_port, ?ENV_DEFAULT_S1GW_BIND_PORT), - MmeLocAddr = get_env(mme_loc_addr, ?ENV_DEFAULT_MME_LOC_ADDR), - MmeRemAddr = get_env(mme_rem_addr, ?ENV_DEFAULT_MME_REM_ADDR), - MmeRemPort = get_env(mme_rem_port, ?ENV_DEFAULT_MME_REM_PORT), PfcpLocAddr = get_env(pfcp_loc_addr, ?ENV_DEFAULT_PFCP_LOC_ADDR), PfcpRemAddr = get_env(pfcp_rem_addr, ?ENV_DEFAULT_PFCP_REM_ADDR),
- SctpServer = {sctp_server, {sctp_server, start_link, - [S1GWBindAddr, S1GWBindPort, sctp_proxy, - {{MmeLocAddr, MmeRemAddr}, MmeRemPort}]}, + SctpServer = {sctp_server, {sctp_server, start_link, [server_cfg()]}, permanent, 5000, worker, @@ -92,4 +85,19 @@ get_env(Param, Default) -> application:get_env(?ENV_APP_NAME, Param, Default).
+ +-spec client_cfg() -> sctp_client:cfg(). +client_cfg() -> + #{laddr => get_env(mme_loc_addr, ?ENV_DEFAULT_MME_LOC_ADDR), + raddr => get_env(mme_rem_addr, ?ENV_DEFAULT_MME_REM_ADDR), + rport => get_env(mme_rem_port, ?ENV_DEFAULT_MME_REM_PORT)}. + + +-spec server_cfg() -> sctp_server:cfg(). +server_cfg() -> + #{laddr => get_env(s1gw_bind_addr, ?ENV_DEFAULT_S1GW_BIND_ADDR), + lport => get_env(s1gw_bind_port, ?ENV_DEFAULT_S1GW_BIND_PORT), + handler => sctp_proxy, + priv => client_cfg()}. + %% vim:set ts=4 sw=4 et: diff --git a/src/sctp_client.erl b/src/sctp_client.erl index 731174f..7860446 100644 --- a/src/sctp_client.erl +++ b/src/sctp_client.erl @@ -34,25 +34,21 @@
-module(sctp_client).
--export([connect/0, - connect/1, - connect/2]). +-export([connect/1]).
-include_lib("kernel/include/logger.hrl"). -include_lib("kernel/include/inet.hrl"). -include_lib("kernel/include/inet_sctp.hrl").
--include("s1ap.hrl").
+-type cfg() :: #{laddr => any | string() | inet:ip_address(), + raddr => loopback | string() | inet:ip_address(), + rport => inet:port_number() + }.
--type loc_addr() :: any | list() | inet:ip_address(). --type rem_addr() :: localhost | list() | inet:ip_address(). --type loc_rem_addr() :: {loc_addr(), rem_addr()}. -type connect_result() :: {ok, gen_sctp:sctp_socket()}.
--export_type([loc_addr/0, - rem_addr/0, - loc_rem_addr/0, +-export_type([cfg/0, connect_result/0]).
@@ -60,8 +56,8 @@ %% behavior callbacks %% ------------------------------------------------------------------
--callback start_link(AID, Priv) -> Result - when AID :: gen_sctp:assoc_id(), +-callback start_link(Aid, Priv) -> Result + when Aid :: gen_sctp:assoc_id(), Priv :: term(), Result :: {ok, pid()} | term().
@@ -81,22 +77,16 @@ %% public API %% ------------------------------------------------------------------
--spec connect() -> connect_result(). -connect() -> - connect({any, localhost}). - --spec connect(loc_rem_addr()) -> connect_result(). -connect({LAddr, RAddr}) -> - connect({LAddr, RAddr}, ?S1AP_PORT). - --spec connect(loc_rem_addr(), inet:port_number()) -> connect_result(). -connect({LAddr, RAddr}, RPort) -> - {ok, Sock} = gen_sctp:open([{ip, sctp_common:parse_addr(LAddr)}, +-spec connect(cfg()) -> connect_result(). +connect(Cfg) -> + LAddr = sctp_common:parse_addr(maps:get(laddr, Cfg, any)), + RAddr = sctp_common:parse_addr(maps:get(raddr, Cfg, localhost)), + RPort = maps:get(rport, Cfg), + {ok, Sock} = gen_sctp:open([{ip, LAddr}, {type, seqpacket}, {sctp_nodelay, true}, {active, true}]), - gen_sctp:connect_init(Sock, sctp_common:parse_addr(RAddr), RPort, []), + gen_sctp:connect_init(Sock, RAddr, RPort, []), {ok, Sock}.
- %% vim:set ts=4 sw=4 et: diff --git a/src/sctp_proxy.erl b/src/sctp_proxy.erl index 94ff36a..e208d95 100644 --- a/src/sctp_proxy.erl +++ b/src/sctp_proxy.erl @@ -43,7 +43,6 @@ code_change/4, terminate/3]). -export([start_link/2, - start_link/3, send_data/2, fetch_info/1, shutdown/1]). @@ -58,21 +57,12 @@ %% public API %% ------------------------------------------------------------------
--spec start_link(Aid, {MmeAddr, MmePort}) -> Result +-spec start_link(Aid, ConnCfg) -> Result when Aid :: gen_sctp:assoc_id(), - MmeAddr :: sctp_client:loc_rem_addr(), - MmePort :: inet:port_number(), + ConnCfg :: sctp_client:cfg(), Result :: gen_statem:start_ret(). -start_link(Aid, {MmeAddr, MmePort}) -> - start_link(Aid, MmeAddr, MmePort). - --spec start_link(Aid, MmeAddr, MmePort) -> Result - when Aid :: gen_sctp:assoc_id(), - MmeAddr :: sctp_client:loc_rem_addr(), - MmePort :: inet:port_number(), - Result :: gen_statem:start_ret(). -start_link(Aid, MmeAddr, MmePort) -> - gen_statem:start_link(?MODULE, [Aid, MmeAddr, MmePort], []). +start_link(Aid, ConnCfg) -> + gen_statem:start_link(?MODULE, [Aid, ConnCfg], []).
-spec send_data(pid(), binary()) -> ok. @@ -94,12 +84,11 @@ %% gen_statem API %% ------------------------------------------------------------------
-init([Aid, MmeAddr, MmePort]) -> +init([Aid, ConnCfg]) -> {ok, Pid} = s1ap_proxy:start_link(), {ok, connecting, #{enb_aid => Aid, - mme_addr => MmeAddr, - mme_port => MmePort, + conn_cfg => ConnCfg, tx_queue => [], handler => Pid}}.
@@ -110,10 +99,10 @@
%% CONNECTING state connecting(enter, OldState, - #{mme_addr := MmeAddr, mme_port := MmePort} = S) -> + #{conn_cfg := ConnCfg} = S) -> ?LOG_INFO("State change: ~p -> ~p", [OldState, ?FUNCTION_NAME]), %% Initiate connection establishment with the MME - {ok, Sock} = sctp_client:connect(MmeAddr, MmePort), + {ok, Sock} = sctp_client:connect(ConnCfg), {next_state, connecting, S#{sock => Sock}, [{state_timeout, 2_000, conn_est_timeout}]};
diff --git a/src/sctp_server.erl b/src/sctp_server.erl index 898882d..06a9888 100644 --- a/src/sctp_server.erl +++ b/src/sctp_server.erl @@ -40,7 +40,7 @@ handle_call/3, handle_cast/2, terminate/2]). --export([start_link/4, +-export([start_link/1, send_data/2, fetch_conn_list/0, shutdown/0]). @@ -61,6 +61,14 @@ port => inet:port_number() }.
+-type cfg() :: #{laddr => any | string() | inet:ip_address(), + lport => inet:port_number(), + handler => module(), + priv => term() + }. + +-export_type([cfg/0]). +
-record(server_state, {sock :: gen_sctp:sctp_socket(), clients :: dict:dict(), @@ -77,13 +85,14 @@ %% public API %% ------------------------------------------------------------------
-start_link(BindAddr, BindPort, Handler, Priv) -> - gen_server:start_link({local, ?MODULE}, ?MODULE, - [BindAddr, BindPort, - Handler, Priv], - []). +-spec start_link(cfg()) -> {ok, pid()} | term(). +start_link(Cfg) -> + gen_server:start_link({local, ?MODULE}, ?MODULE, [Cfg], []).
+-spec send_data(Aid, Data) -> ok + when Aid :: gen_sctp:assoc_id(), + Data :: binary(). send_data(Aid, Data) -> gen_server:cast(?MODULE, {?FUNCTION_NAME, Aid, Data}).
@@ -101,9 +110,12 @@ %% gen_server API %% ------------------------------------------------------------------
-init([LAddr, LPort, Handler, Priv]) -> +init([#{lport := LPort, + handler := Handler, + priv := Priv} = Cfg]) -> process_flag(trap_exit, true), - {ok, Sock} = gen_sctp:open([{ip, sctp_common:parse_addr(LAddr)}, + LAddr = sctp_common:parse_addr(maps:get(laddr, Cfg, any)), + {ok, Sock} = gen_sctp:open([{ip, LAddr}, {port, LPort}, {type, seqpacket}, {reuseaddr, true},