[M] Change in ...osmo-epdg[master]: s2b: Implement GTPv2C DeleteBearerReq
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
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
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
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