fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/41613?usp=email )
Change subject: sctp_proxy: add _from_{enb,mme} variants of sctp_send/2 ......................................................................
sctp_proxy: add _from_{enb,mme} variants of sctp_send/2
The existing sctp_send/2 is sending data from an eNB towards the MME. Sending data in the opposite direction is done in-place.
For the sake of readability, let's add the counterpart of sctp_send/2 and clarify the direction by adding _from_{enb,mme} to function names.
Change-Id: I388137e27ea5000f22e7a5b58d1ffcfd9caa1475 --- M src/sctp_proxy.erl 1 file changed, 35 insertions(+), 23 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-s1gw refs/changes/13/41613/1
diff --git a/src/sctp_proxy.erl b/src/sctp_proxy.erl index 3aa67d8..ad58d4b 100644 --- a/src/sctp_proxy.erl +++ b/src/sctp_proxy.erl @@ -165,7 +165,7 @@
%% Handle an eNB -> MME data forwarding request (forward) connected(cast, {send_data, Data}, S0) -> - sctp_send(Data, S0), + sctp_send_from_enb(Data, S0), {keep_state, S0};
%% Handle an #sctp_assoc_change event (MME connection state) @@ -184,26 +184,16 @@
%% Handle an #sctp_sndrcvinfo event (MME -> eNB data) connected(info, {sctp, _Socket, MmeAddr, MmePort, - {[#sctp_sndrcvinfo{assoc_id = Aid, + {[#sctp_sndrcvinfo{assoc_id = MmeAid, stream = SID, ssn = SSN, tsn = TSN}], Data}}, - #{sock := Sock, - enb_aid := EnbAid, - mme_aid := Aid, - handler := Pid} = S) -> + #{mme_aid := MmeAid} = S) -> ?LOG_DEBUG("MME connection (id=~p, ~p:~p) -> eNB: ~p", - [Aid, MmeAddr, MmePort, + [MmeAid, MmeAddr, MmePort, #{tsn => TSN, sid => SID, ssn => SSN, len => byte_size(Data), data => Data}]), - case s1ap_proxy:process_pdu(Pid, Data) of - {forward, FwdData} -> - sctp_server:send_data(EnbAid, FwdData); - {reply, ReData} -> - ok = sctp_common:send_data({Sock, Aid}, ReData); - {drop, Data} -> - ok %% no-op - end, + sctp_send_from_mme(Data, S), {keep_state, S};
connected(Event, EventData, S) -> @@ -261,15 +251,20 @@ %% private API %% ------------------------------------------------------------------
-%% Send a single message to the MME -sctp_send(Data, - #{sock := Sock, - enb_aid := EnbAid, - mme_aid := Aid, - handler := Pid}) -> +%% XXX: proper type +-type state() :: map(). + + +%% Send a single message: eNB -> MME +-spec sctp_send_from_enb(binary(), state()) -> ok | {error, term()}. +sctp_send_from_enb(Data, + #{sock := Sock, + enb_aid := EnbAid, + mme_aid := MmeAid, + handler := Pid}) -> case s1ap_proxy:process_pdu(Pid, Data) of {forward, FwdData} -> - ok = sctp_common:send_data({Sock, Aid}, FwdData); + sctp_common:send_data({Sock, MmeAid}, FwdData); {reply, ReData} -> sctp_server:send_data(EnbAid, ReData); {drop, Data} -> @@ -277,12 +272,29 @@ end.
+%% Send a single message: eNB <- MME +-spec sctp_send_from_mme(binary(), state()) -> ok | {error, term()}. +sctp_send_from_mme(Data, + #{sock := Sock, + enb_aid := EnbAid, + mme_aid := MmeAid, + handler := Pid}) -> + case s1ap_proxy:process_pdu(Pid, Data) of + {forward, FwdData} -> + sctp_server:send_data(EnbAid, FwdData); + {reply, ReData} -> + sctp_common:send_data({Sock, MmeAid}, ReData); + {drop, Data} -> + ok %% no-op + end. + + %% Send pending messages to the MME sctp_send_pending(#{tx_queue := Pending} = S) -> sctp_send_pending(lists:reverse(Pending), S).
sctp_send_pending([Data | Pending], S) -> - sctp_send(Data, S), + sctp_send_from_enb(Data, S), s1gw_metrics:gauge_dec(?S1GW_GAUGE_S1AP_PROXY_UPLINK_PACKETS_QUEUED), sctp_send_pending(Pending, S);