[M] Change in ...osmo-epdg[master]: s2b: Implement GTPv2C DeleteBearerReq

2023-11-02 Thread pespin
pespin has submitted this change. ( 
https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/34896?usp=email )

Change subject: s2b: Implement GTPv2C DeleteBearerReq
..

s2b: Implement GTPv2C DeleteBearerReq

Sessions are now stored/kept upon CreateSession time until deleted
through DeleteBearerReq.

Related: OS#6046
Change-Id: I1e5af1ead17385d2e494f4c90ffe6455aee850da
---
M src/epdg_gtpc_s2b.erl
1 file changed, 137 insertions(+), 26 deletions(-)

Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved




diff --git a/src/epdg_gtpc_s2b.erl b/src/epdg_gtpc_s2b.erl
index 82985a5..a5658f1 100644
--- a/src/epdg_gtpc_s2b.erl
+++ b/src/epdg_gtpc_s2b.erl
@@ -70,7 +70,9 @@
 rport   :: non_neg_integer(),
 restart_counter :: 0..255,
 seq_no  :: 0..16#,
-sess_list %% TODO: fill it, list of gtp_session
+next_local_control_tei = 1 :: 0..16#,
+next_local_data_tei = 1 :: 0..16#,
+sessions = sets:new()
 }).

 -record(gtp_bearer, {
@@ -134,36 +136,45 @@
 gen_server:call(?SERVER,
   {gtpc_create_session_req, {Imsi}}).

-handle_call({gtpc_create_session_req, {Imsi}}, _From, State) ->
-Sess = new_gtp_session(Imsi, State),
-Req = gen_create_session_request(Sess, State),
+handle_call({gtpc_create_session_req, {Imsi}}, _From, State0) ->
+{Sess0, State1} = find_or_new_gtp_session(Imsi, State0),
+Req = gen_create_session_request(Sess0, State1),
 %TODO: increment State.seq_no.
-tx_gtp(Req, State),
+tx_gtp(Req, State1),
 lager:debug("Waiting for CreateSessionResponse~n", []),
 receive
 {udp, _Socket, IP, InPortNo, RxMsg} ->
 try
 Resp = gtp_packet:decode(RxMsg),
-logger:info("s2b: Rx from IP ~p port ~n ~p~n", [IP, InPortNo, 
Resp]),
-%% TODO: store Sess in State.
-{reply, {ok, Resp}, State}
+lager:info("s2b: Rx from IP ~p port ~p ~p~n", [IP, InPortNo, 
Resp]),
+Sess1 = update_gtp_session_from_create_session_response(Resp, 
Sess0),
+lager:info("s2b: Updated Session after 
create_session_response: ~p~n", [Sess1]),
+State2 = update_gtp_session(Sess0, Sess1, State1),
+{reply, {ok, Resp}, State2}
 catch Any ->
-logger:error("Error sending message to receiver, ERROR: ~p~n", 
[Any]),
-{reply, {error, decode_failure}, State}
+lager:error("Error sending message to receiver, ERROR: ~p~n", 
[Any]),
+{reply, {error, decode_failure}, State1}
 end
 after 5000 ->
-logger:error("Timeout waiting for CreateSessionResponse for ~p~n", 
[Req]),
-{reply, timeout, State}
+lager:error("Timeout waiting for CreateSessionResponse for ~p~n", 
[Req]),
+{reply, timeout, State1}
 end.

 %% @callback gen_server
 handle_cast(stop, State) ->
 {stop, normal, State};
-handle_cast(_Req, State) ->
+handle_cast(Req, State) ->
+lager:info("S2b handle_cast: ~p ~n", [Req]),
 {noreply, State}.

 %% @callback gen_server
-handle_info(_Info, State) ->
+handle_info({udp, _Socket, IP, InPortNo, RxMsg}, State) ->
+lager:info("S2b: Rx from IP ~p port ~p: ~p~n", [IP, InPortNo, RxMsg]),
+Req = gtp_packet:decode(RxMsg),
+lager:info("S2b: Rx from IP ~p port ~p: ~p~n", [IP, InPortNo, Req]),
+rx_gtp(Req, State);
+handle_info(Info, State) ->
+lager:info("S2b handle_info: ~p ~n", [Info]),
 {noreply, State}.

 %% @callback gen_server
@@ -185,6 +196,76 @@
 %% Internal Function Definitions
 %% --

+new_gtp_session(Imsi, State) ->
+% TODO: find non-used local TEI inside State
+Bearer = #gtp_bearer{
+ebi = 5,
+local_data_tei = State#gtp_state.next_local_data_tei
+},
+Sess = #gtp_session{imsi = Imsi,
+apn = ?APN,
+local_control_tei = State#gtp_state.next_local_control_tei,
+bearer = Bearer
+},
+NewSt = State#gtp_state{next_local_control_tei = 
State#gtp_state.next_local_control_tei + 1,
+next_local_data_tei = 
State#gtp_state.next_local_data_tei + 1,
+sessions = sets:add_element(Sess, 
State#gtp_state.sessions)},
+{Sess, NewSt}.
+
+% returns Sess if found, undefined it not
+find_gtp_session_by_imsi(Imsi, State) ->
+sets:fold(
+fun(SessIt = #gtp_session{imsi = Imsi}, _AccIn) -> SessIt;
+   (_, AccIn) -> AccIn
+end,
+undefined,
+State#gtp_state.sessions).
+
+find_or_new_gtp_session(Imsi, State) ->
+Sess = find_gtp_session_by_imsi(Imsi, State),
+case Sess of
+#gtp_session{imsi = Imsi} ->
+{Sess, State};
+undefined ->
+new_gtp_session(Imsi, S

[M] Change in ...osmo-epdg[master]: s2b: Implement GTPv2C DeleteBearerReq

2023-11-01 Thread laforge
Attention is currently required from: fixeria, lynxis lazus, pespin.

laforge has posted comments on this change. ( 
https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/34896?usp=email )

Change subject: s2b: Implement GTPv2C DeleteBearerReq
..


Patch Set 1: Code-Review+2


--
To view, visit https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/34896?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: erlang/osmo-epdg
Gerrit-Branch: master
Gerrit-Change-Id: I1e5af1ead17385d2e494f4c90ffe6455aee850da
Gerrit-Change-Number: 34896
Gerrit-PatchSet: 1
Gerrit-Owner: pespin 
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria 
Gerrit-Reviewer: laforge 
Gerrit-Reviewer: lynxis lazus 
Gerrit-Attention: pespin 
Gerrit-Attention: fixeria 
Gerrit-Attention: lynxis lazus 
Gerrit-Comment-Date: Wed, 01 Nov 2023 13:41:31 +
Gerrit-HasComments: No
Gerrit-Has-Labels: Yes
Gerrit-MessageType: comment


[M] Change in ...osmo-epdg[master]: s2b: Implement GTPv2C DeleteBearerReq

2023-10-31 Thread pespin
Attention is currently required from: fixeria, lynxis lazus.

pespin has posted comments on this change. ( 
https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/34896?usp=email )

Change subject: s2b: Implement GTPv2C DeleteBearerReq
..


Patch Set 1:

(1 comment)

Patchset:

PS1:
I plan to merge this soon if there's no review.



--
To view, visit https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/34896?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: erlang/osmo-epdg
Gerrit-Branch: master
Gerrit-Change-Id: I1e5af1ead17385d2e494f4c90ffe6455aee850da
Gerrit-Change-Number: 34896
Gerrit-PatchSet: 1
Gerrit-Owner: pespin 
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria 
Gerrit-Reviewer: lynxis lazus 
Gerrit-Attention: fixeria 
Gerrit-Attention: lynxis lazus 
Gerrit-Comment-Date: Tue, 31 Oct 2023 15:52:19 +
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
Gerrit-MessageType: comment


[M] Change in ...osmo-epdg[master]: s2b: Implement GTPv2C DeleteBearerReq

2023-10-25 Thread pespin
pespin has uploaded this change for review. ( 
https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/34896?usp=email )


Change subject: s2b: Implement GTPv2C DeleteBearerReq
..

s2b: Implement GTPv2C DeleteBearerReq

Sessions are now stored/kept upon CreateSession time until deleted
through DeleteBearerReq.

Related: OS#6046
Change-Id: I1e5af1ead17385d2e494f4c90ffe6455aee850da
---
M src/epdg_gtpc_s2b.erl
1 file changed, 137 insertions(+), 26 deletions(-)



  git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-epdg 
refs/changes/96/34896/1

diff --git a/src/epdg_gtpc_s2b.erl b/src/epdg_gtpc_s2b.erl
index 82985a5..a5658f1 100644
--- a/src/epdg_gtpc_s2b.erl
+++ b/src/epdg_gtpc_s2b.erl
@@ -70,7 +70,9 @@
 rport   :: non_neg_integer(),
 restart_counter :: 0..255,
 seq_no  :: 0..16#,
-sess_list %% TODO: fill it, list of gtp_session
+next_local_control_tei = 1 :: 0..16#,
+next_local_data_tei = 1 :: 0..16#,
+sessions = sets:new()
 }).

 -record(gtp_bearer, {
@@ -134,36 +136,45 @@
 gen_server:call(?SERVER,
   {gtpc_create_session_req, {Imsi}}).

-handle_call({gtpc_create_session_req, {Imsi}}, _From, State) ->
-Sess = new_gtp_session(Imsi, State),
-Req = gen_create_session_request(Sess, State),
+handle_call({gtpc_create_session_req, {Imsi}}, _From, State0) ->
+{Sess0, State1} = find_or_new_gtp_session(Imsi, State0),
+Req = gen_create_session_request(Sess0, State1),
 %TODO: increment State.seq_no.
-tx_gtp(Req, State),
+tx_gtp(Req, State1),
 lager:debug("Waiting for CreateSessionResponse~n", []),
 receive
 {udp, _Socket, IP, InPortNo, RxMsg} ->
 try
 Resp = gtp_packet:decode(RxMsg),
-logger:info("s2b: Rx from IP ~p port ~n ~p~n", [IP, InPortNo, 
Resp]),
-%% TODO: store Sess in State.
-{reply, {ok, Resp}, State}
+lager:info("s2b: Rx from IP ~p port ~p ~p~n", [IP, InPortNo, 
Resp]),
+Sess1 = update_gtp_session_from_create_session_response(Resp, 
Sess0),
+lager:info("s2b: Updated Session after 
create_session_response: ~p~n", [Sess1]),
+State2 = update_gtp_session(Sess0, Sess1, State1),
+{reply, {ok, Resp}, State2}
 catch Any ->
-logger:error("Error sending message to receiver, ERROR: ~p~n", 
[Any]),
-{reply, {error, decode_failure}, State}
+lager:error("Error sending message to receiver, ERROR: ~p~n", 
[Any]),
+{reply, {error, decode_failure}, State1}
 end
 after 5000 ->
-logger:error("Timeout waiting for CreateSessionResponse for ~p~n", 
[Req]),
-{reply, timeout, State}
+lager:error("Timeout waiting for CreateSessionResponse for ~p~n", 
[Req]),
+{reply, timeout, State1}
 end.

 %% @callback gen_server
 handle_cast(stop, State) ->
 {stop, normal, State};
-handle_cast(_Req, State) ->
+handle_cast(Req, State) ->
+lager:info("S2b handle_cast: ~p ~n", [Req]),
 {noreply, State}.

 %% @callback gen_server
-handle_info(_Info, State) ->
+handle_info({udp, _Socket, IP, InPortNo, RxMsg}, State) ->
+lager:info("S2b: Rx from IP ~p port ~p: ~p~n", [IP, InPortNo, RxMsg]),
+Req = gtp_packet:decode(RxMsg),
+lager:info("S2b: Rx from IP ~p port ~p: ~p~n", [IP, InPortNo, Req]),
+rx_gtp(Req, State);
+handle_info(Info, State) ->
+lager:info("S2b handle_info: ~p ~n", [Info]),
 {noreply, State}.

 %% @callback gen_server
@@ -185,6 +196,76 @@
 %% Internal Function Definitions
 %% --

+new_gtp_session(Imsi, State) ->
+% TODO: find non-used local TEI inside State
+Bearer = #gtp_bearer{
+ebi = 5,
+local_data_tei = State#gtp_state.next_local_data_tei
+},
+Sess = #gtp_session{imsi = Imsi,
+apn = ?APN,
+local_control_tei = State#gtp_state.next_local_control_tei,
+bearer = Bearer
+},
+NewSt = State#gtp_state{next_local_control_tei = 
State#gtp_state.next_local_control_tei + 1,
+next_local_data_tei = 
State#gtp_state.next_local_data_tei + 1,
+sessions = sets:add_element(Sess, 
State#gtp_state.sessions)},
+{Sess, NewSt}.
+
+% returns Sess if found, undefined it not
+find_gtp_session_by_imsi(Imsi, State) ->
+sets:fold(
+fun(SessIt = #gtp_session{imsi = Imsi}, _AccIn) -> SessIt;
+   (_, AccIn) -> AccIn
+end,
+undefined,
+State#gtp_state.sessions).
+
+find_or_new_gtp_session(Imsi, State) ->
+Sess = find_gtp_session_by_imsi(Imsi, State),
+case Sess of
+#gtp_session{imsi = Imsi} ->
+{Sess, State};
+undefined ->
+new_gt