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


Change subject: s2b: Answer CreateBearerReq with CreateBearerResp
......................................................................

s2b: Answer CreateBearerReq with CreateBearerResp

Change-Id: I230e71661b289735c11bc7c576f7ff87bc41620d
---
M src/epdg_gtpc_s2b.erl
1 file changed, 79 insertions(+), 2 deletions(-)



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

diff --git a/src/epdg_gtpc_s2b.erl b/src/epdg_gtpc_s2b.erl
index 3762ec3..712e484 100644
--- a/src/epdg_gtpc_s2b.erl
+++ b/src/epdg_gtpc_s2b.erl
@@ -253,6 +253,18 @@
                     Sess#gtp_session.bearers),
     Res.

+gtp_session_add_bearer(Sess, Bearer) ->
+    lager:debug("Add bearer ~p to session ~p~n", [Bearer, Sess]),
+    Sess#gtp_session{bearers = sets:add_element(Bearer, 
Sess#gtp_session.bearers)}.
+
+gtp_session_del_bearer(Sess, Bearer) ->
+    lager:debug("Remove bearer ~p from session ~p~n", [Bearer, Sess]),
+    Sess1 = Sess#gtp_session{bearers = sets:del_element(Bearer, 
Sess#gtp_session.bearers)},
+    case Sess1#gtp_session.default_bearer_id of
+    Ebi when Ebi == Bearer#gtp_bearer.ebi -> 
Sess1#gtp_session{default_bearer_id = undefined};
+    _ -> Sess1
+    end.
+
 gtp_session_default_bearer(Sess) ->
     gtp_session_find_bearer_by_ebi(Sess, Sess#gtp_session.default_bearer_id).

@@ -318,17 +330,43 @@
             {noreply, State1}
         end;

-rx_gtp(Req = #gtp{version = v2, type = delete_bearer_request}, State) ->
+rx_gtp(Req = #gtp{version = v2, type = create_bearer_request, ie = IEs}, 
State) ->
+    Sess = find_gtp_session_by_local_teic(Req#gtp.tei, State),
+    case Sess of
+    undefined ->
+        lager:error("Rx unknown TEI ~p: ~p~n", [Req#gtp.tei, Req]),
+        {noreply, State};
+    Sess ->
+        #{{v2_bearer_context,0} := #v2_bearer_context{instance = 0, group = 
BearerIE}} = IEs,
+        #{{v2_eps_bearer_id,0} := #v2_eps_bearer_id{instance = 0, 
eps_bearer_id = Ebi}} = BearerIE,
+        #{{v2_fully_qualified_tunnel_endpoint_identifier,Ebi} :=
+            #v2_fully_qualified_tunnel_endpoint_identifier{
+                instance = Ebi,
+                interface_type = _Interface,
+                key = RemoteDataTei, ipv4 = _IP4, ipv6 = _IP6}} = BearerIE,
+        Sess1 = gtp_session_add_bearer(Sess, #gtp_bearer{ebi = Ebi, 
remote_data_tei = RemoteDataTei}), % TODO: teid
+        State1 = update_gtp_session(Sess, Sess1, State),
+        Resp = gen_create_bearer_response(Req, Sess1, request_accepted, 
State1),
+        tx_gtp(Resp, State1),
+        {noreply, State}
+    end;
+
+rx_gtp(Req = #gtp{version = v2, type = delete_bearer_request, ie = IEs}, 
State) ->
     Sess = find_gtp_session_by_local_teic(Req#gtp.tei, State),
     case Sess of
         undefined ->
             lager:error("Rx unknown TEI ~p: ~p~n", [Req#gtp.tei, Req]),
             {noreply, State};
         Sess ->
+            #{{v2_cause,0} := _CauseIE,
+              {v2_eps_bearer_id,0} := #v2_eps_bearer_id{instance = 0, 
eps_bearer_id = Ebi}} = IEs,
+            % GtpCause = gtp_utils:enum_v2_cause(CauseIE#v2_cause.v2_cause)
+            Bearer = gtp_session_find_bearer_by_ebi(Sess, Ebi),
             Resp = gen_delete_bearer_response(Req, Sess, request_accepted, 
State),
             tx_gtp(Resp, State),
             
epdg_ue_fsm:received_gtpc_delete_bearer_request(Sess#gtp_session.pid),
-            State1 = delete_gtp_session(Sess, State),
+            Sess1 = gtp_session_del_bearer(Sess, Bearer),
+            State1 = update_gtp_session(Sess, Sess1, State),
             {noreply, State1}
         end;

@@ -398,6 +436,36 @@
     ],
     #gtp{version = v2, type = delete_session_request, tei = RemoteCtlTEI, 
seq_no = SeqNo, ie = IEs}.

+gen_create_bearer_response(Req = #gtp{version = v2, type = 
create_bearer_request},
+                           Sess = #gtp_session{remote_control_tei = 
RemoteCtlTEI},
+                           GtpCause,
+                           #gtp_state{laddr = LocalAddr,
+                                      restart_counter = RCnt}) ->
+    Bearer = gtp_session_default_bearer(Sess),
+    BearersIE = [#v2_bearer_level_quality_of_service{
+        pci = 1, pl = 10, pvi = 0, label = 8,
+        maximum_bit_rate_for_uplink      = 0,
+        maximum_bit_rate_for_downlink    = 0,
+        guaranteed_bit_rate_for_uplink   = 0,
+        guaranteed_bit_rate_for_downlink = 0
+        },
+        #v2_eps_bearer_id{eps_bearer_id = Bearer#gtp_bearer.ebi},
+        #v2_fully_qualified_tunnel_endpoint_identifier{
+        instance = 0,
+        interface_type = 31, %% "S2b-U ePDG GTP-U"
+        key = Bearer#gtp_bearer.local_data_tei,
+        ipv4 = gtp_utils:ip_to_bin(LocalAddr)
+        }
+    ],
+    IEs = [#v2_cause{v2_cause = GtpCause},
+           #v2_bearer_context{group = BearersIE},
+           #v2_recovery{restart_counter = RCnt}
+    ],
+    #gtp{version = v2,
+         type = create_bearer_response,
+         tei = RemoteCtlTEI,
+         seq_no = Req#gtp.seq_no,
+         ie = IEs}.

 gen_delete_bearer_response(Req = #gtp{version = v2, type = 
delete_bearer_request},
                            Sess = #gtp_session{remote_control_tei = 
RemoteCtlTEI},

--
To view, visit https://gerrit.osmocom.org/c/erlang/osmo-epdg/+/35886?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: I230e71661b289735c11bc7c576f7ff87bc41620d
Gerrit-Change-Number: 35886
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <[email protected]>
Gerrit-MessageType: newchange

Reply via email to