fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/40015?usp=email )
Change subject: sctp_{client,server}: add and use sctp_common:parse_addr/1 ......................................................................
sctp_{client,server}: add and use sctp_common:parse_addr/1
Change-Id: Ibc7b3e519e4b94499bf8a2c45b64fa62b2d08d1e --- M src/sctp_client.erl M src/sctp_common.erl M src/sctp_server.erl 3 files changed, 27 insertions(+), 22 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-s1gw refs/changes/15/40015/1
diff --git a/src/sctp_client.erl b/src/sctp_client.erl index de3fefb..731174f 100644 --- a/src/sctp_client.erl +++ b/src/sctp_client.erl @@ -86,24 +86,16 @@ connect({any, localhost}).
-spec connect(loc_rem_addr()) -> connect_result(). -connect(LocRemAddr) -> - connect(LocRemAddr, ?S1AP_PORT). +connect({LAddr, RAddr}) -> + connect({LAddr, RAddr}, ?S1AP_PORT).
-spec connect(loc_rem_addr(), inet:port_number()) -> connect_result(). -connect({LocAddrStr, RemAddr}, Port) when is_list(LocAddrStr) -> - {ok, LocAddr} = inet:parse_address(LocAddrStr), - connect({LocAddr, RemAddr}, Port); - -connect({LocAddr, RemAddrStr}, Port) when is_list(RemAddrStr) -> - {ok, RemAddr} = inet:parse_address(RemAddrStr), - connect({LocAddr, RemAddr}, Port); - -connect({LocAddr, RemAddr}, Port) -> - {ok, Sock} = gen_sctp:open([{ip, LocAddr}, +connect({LAddr, RAddr}, RPort) -> + {ok, Sock} = gen_sctp:open([{ip, sctp_common:parse_addr(LAddr)}, {type, seqpacket}, {sctp_nodelay, true}, {active, true}]), - gen_sctp:connect_init(Sock, RemAddr, Port, []), + gen_sctp:connect_init(Sock, sctp_common:parse_addr(RAddr), RPort, []), {ok, Sock}.
diff --git a/src/sctp_common.erl b/src/sctp_common.erl index 0d28f81..296dbff 100644 --- a/src/sctp_common.erl +++ b/src/sctp_common.erl @@ -34,7 +34,8 @@
-module(sctp_common).
--export([send_data/2, +-export([parse_addr/1, + send_data/2, shutdown/1]).
-include_lib("kernel/include/logger.hrl"). @@ -51,6 +52,22 @@ %% public API %% ------------------------------------------------------------------
+-spec parse_addr(AddrStr :: string()) -> Addr :: inet:ip_address(); + (Addr) -> Addr when Addr :: any | localhost | inet:ip_address(). +parse_addr(AddrStr) when is_list(AddrStr) -> + {ok, Addr} = inet:parse_address(AddrStr), + Addr; + +parse_addr(Addr) -> + case Addr of + any -> any; + localhost -> localhost; + _ -> + true = inet:is_ip_address(Addr), + Addr + end. + + -spec send_data(sock_aid(), binary()) -> ok | {error, term()}. send_data({Sock, Aid}, Data) -> gen_sctp:send(Sock, #sctp_sndrcvinfo{stream = ?S1AP_SCTP_STREAM, diff --git a/src/sctp_server.erl b/src/sctp_server.erl index e9066ac..898882d 100644 --- a/src/sctp_server.erl +++ b/src/sctp_server.erl @@ -101,19 +101,15 @@ %% gen_server API %% ------------------------------------------------------------------
-init([BindAddrStr, BindPort, Handler, Priv]) when is_list(BindAddrStr) -> - {ok, BindAddr} = inet:parse_address(BindAddrStr), - init([BindAddr, BindPort, Handler, Priv]); - -init([BindAddr, BindPort, Handler, Priv]) -> +init([LAddr, LPort, Handler, Priv]) -> process_flag(trap_exit, true), - {ok, Sock} = gen_sctp:open([{ip, BindAddr}, - {port, BindPort}, + {ok, Sock} = gen_sctp:open([{ip, sctp_common:parse_addr(LAddr)}, + {port, LPort}, {type, seqpacket}, {reuseaddr, true}, {sctp_nodelay, true}, {active, true}]), - ?LOG_INFO("SCTP server listening on ~w:~w", [BindAddr, BindPort]), + ?LOG_INFO("SCTP server listening on ~p:~p", [LAddr, LPort]), ok = gen_sctp:listen(Sock, true), {ok, #server_state{sock = Sock, clients = dict:new(),