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},
--
To view, visit
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/40016?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: merged
Gerrit-Project: erlang/osmo-s1gw
Gerrit-Branch: master
Gerrit-Change-Id: I07c7365181037ee36c1bce73e91f7bafa7f7f0cf
Gerrit-Change-Number: 40016
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: osmith <osmith(a)sysmocom.de>