fixeria has uploaded this change for review. (
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/39117?usp=email )
Change subject: s1ap_proxy: handle E-RAB MODIFY REQ/RSP
......................................................................
s1ap_proxy: handle E-RAB MODIFY REQ/RSP
Change-Id: I057a1c58d0c6ad04c00ad3ea4c68230d8632a07e
---
M include/s1gw_metrics.hrl
M src/s1ap_proxy.erl
M src/s1gw_metrics.erl
3 files changed, 118 insertions(+), 1 deletion(-)
git pull ssh://gerrit.osmocom.org:29418/erlang/osmo-s1gw refs/changes/17/39117/1
diff --git a/include/s1gw_metrics.hrl b/include/s1gw_metrics.hrl
index 77d6a8e..1b402d4 100644
--- a/include/s1gw_metrics.hrl
+++ b/include/s1gw_metrics.hrl
@@ -18,6 +18,8 @@
-define(S1GW_CTR_S1AP_PROXY_IN_PKT_PROC_ERROR, [ctr, s1ap, proxy, in_pkt, proc_error]).
-define(S1GW_CTR_S1AP_PROXY_IN_PKT_ERAB_SETUP_REQ, [ctr, s1ap, proxy, in_pkt,
erab_setup_req]).
-define(S1GW_CTR_S1AP_PROXY_IN_PKT_ERAB_SETUP_RSP, [ctr, s1ap, proxy, in_pkt,
erab_setup_rsp]).
+-define(S1GW_CTR_S1AP_PROXY_IN_PKT_ERAB_MODIFY_REQ, [ctr, s1ap, proxy, in_pkt,
erab_modify_req]).
+-define(S1GW_CTR_S1AP_PROXY_IN_PKT_ERAB_MODIFY_RSP, [ctr, s1ap, proxy, in_pkt,
erab_modify_rsp]).
-define(S1GW_CTR_S1AP_PROXY_IN_PKT_ERAB_RELEASE_CMD, [ctr, s1ap, proxy, in_pkt,
erab_release_cmd]).
-define(S1GW_CTR_S1AP_PROXY_IN_PKT_ERAB_RELEASE_RSP, [ctr, s1ap, proxy, in_pkt,
erab_release_rsp]).
-define(S1GW_CTR_S1AP_PROXY_IN_PKT_ERAB_RELEASE_IND, [ctr, s1ap, proxy, in_pkt,
erab_release_ind]).
diff --git a/src/s1ap_proxy.erl b/src/s1ap_proxy.erl
index f4cc9a5..83225b1 100644
--- a/src/s1ap_proxy.erl
+++ b/src/s1ap_proxy.erl
@@ -71,6 +71,7 @@
-record(proxy_state, {erabs :: dict:dict(),
mme_ue_id :: undefined | mme_ue_id(),
enb_ue_id :: undefined | enb_ue_id(),
+ erab_id :: undefined | erab_id(),
path :: [s1ap_ie_id()]
}).
@@ -267,7 +268,37 @@
{forward, S1} %% XXX: forward as-is or drop?
end;
-%% TODO: 9.1.3.3 E-RAB MODIFY REQUEST / (Optional) Transport Information
+%% 9.1.3.3 E-RAB MODIFY REQUEST
+handle_pdu({Outcome = initiatingMessage,
+ #'InitiatingMessage'{procedureCode = ?'id-E-RABModify',
+ value = C0} = Msg}, S0) ->
+ ?LOG_DEBUG("Processing E-RAB MODIFY REQUEST"),
+ s1gw_metrics:ctr_inc(?S1GW_CTR_S1AP_PROXY_IN_PKT_ERAB_MODIFY_REQ),
+ case handle_ies(?'id-E-RABToBeModifiedListBearerModReq',
+ C0#'E-RABModifyRequest'.protocolIEs, S0) of
+ {{ok, IEs}, S1} ->
+ C1 = C0#'E-RABModifyRequest'{protocolIEs = IEs},
+ PDU = {Outcome, Msg#'InitiatingMessage'{value = C1}},
+ {{forward, PDU}, S1}; %% forward patched PDU
+ {{error, Reason}, S1} ->
+ ?LOG_NOTICE("Failed to process E-RAB MODIFY REQUEST: ~p",
[Reason]),
+ s1gw_metrics:ctr_inc(?S1GW_CTR_S1AP_PROXY_IN_PKT_PROC_ERROR),
+ {forward, S1} %% XXX: forward as-is or drop?
+ end;
+
+%% 9.1.3.4 E-RAB MODIFY RESPONSE
+handle_pdu({successfulOutcome,
+ #'SuccessfulOutcome'{procedureCode = ?'id-E-RABModify',
+ value = C0}}, S0) ->
+ ?LOG_DEBUG("Processing E-RAB MODIFY RESPONSE"),
+ s1gw_metrics:ctr_inc(?S1GW_CTR_S1AP_PROXY_IN_PKT_ERAB_MODIFY_RSP),
+ %% there's nothing to patch in this PDU, so we forward it as-is
+ %% TODO: check result of handle_ies(), inc. ?S1GW_CTR_S1AP_PROXY_IN_PKT_PROC_ERROR
+ {_, S1} = handle_ies(?'id-E-RABModifyListBearerModRes',
+ C0#'E-RABModifyResponse'.protocolIEs, S0),
+ {_, S2} = handle_ies(?'id-E-RABFailedToModifyList',
+ C0#'E-RABModifyResponse'.protocolIEs, S1),
+ {forward, S2};
%% 9.1.3.5 E-RAB RELEASE COMMAND
handle_pdu({Outcome = initiatingMessage,
@@ -445,6 +476,88 @@
{{error, erab_not_registered}, S}
end;
+%% 9.1.3.3 E-RAB MODIFY REQUEST related IEs
+handle_ie([?'id-E-RABToBeModifiedListBearerModReq'], C, S) ->
+ %% This IE contains a list of BearerModReq, so patch inner IEs
+ handle_ies(?'id-E-RABToBeModifiedItemBearerModReq', C, S);
+
+handle_ie([?'id-E-RABToBeModifiedItemBearerModReq',
+ ?'id-E-RABToBeModifiedListBearerModReq'],
+ #'E-RABToBeModifiedItemBearerModReq'{'e-RAB-ID' = ERABId,
+ 'iE-Extensions' = E0} = C0, S0)
->
+ %% The IE-Extensions may optionally contain F-TEID, so patch inner IEs
+ case E0 of
+ %% no extensions means no F-TEID, so nothing to patch
+ asn1_NOVALUE ->
+ {{ok, C0}, S0};
+ _ ->
+ case handle_ies(?'id-TransportInformation',
+ E0, S0#proxy_state{erab_id = ERABId}) of
+ {{ok, E1}, S1} ->
+ C1 =
C0#'E-RABToBeModifiedItemBearerModReq'{'iE-Extensions' = E1},
+ {{ok, C1}, S1};
+ Error ->
+ Error
+ end
+ end;
+
+handle_ie([?'id-TransportInformation',
+ ?'id-E-RABToBeModifiedItemBearerModReq',
+ ?'id-E-RABToBeModifiedListBearerModReq'],
+ #'TransportInformation'{'transportLayerAddress' = TLA_In,
+ 'uL-GTP-TEID' = << TEID_In:32/big
>>} = C0, S) ->
+ %% poke E-RAB FSM
+ case erab_fsm_find(S#proxy_state.erab_id, S) of
+ {ok, Pid} ->
+ case erab_fsm:erab_modify_req(Pid, {TEID_In, TLA_In}) of
+ {ok, {TEID_Out, TLA_Out}} ->
+ C1 =
C0#'TransportInformation'{'transportLayerAddress' = TLA_Out,
+ 'uL-GTP-TEID' = <<
TEID_Out:32/big >>},
+ {{ok, C1}, S};
+ {error, Reason} ->
+ {{error, Reason}, S}
+ end;
+ error ->
+ ?LOG_ERROR("E-RAB-ID ~p is not registered",
+ [erab_uid(S#proxy_state.erab_id, S)]),
+ {{error, erab_not_registered}, S}
+ end;
+
+%% 9.1.3.4 E-RAB MODIFY RESPONSE related IEs
+handle_ie([?'id-E-RABModifyListBearerModRes'], C, S) ->
+ %% This IE contains a list of BearerModRes, so patch inner IEs
+ handle_ies(?'id-E-RABModifyItemBearerModRes', C, S);
+
+handle_ie([?'id-E-RABModifyItemBearerModRes',
+ ?'id-E-RABModifyListBearerModRes'],
+ #'E-RABModifyItemBearerModRes'{'e-RAB-ID' = ERABId} = C, S)
->
+ %% poke E-RAB FSM
+ case erab_fsm_find(ERABId, S) of
+ {ok, Pid} ->
+ erab_fsm:erab_modify_rsp(Pid, ack),
+ {{ok, C}, S};
+ error ->
+ ?LOG_ERROR("E-RAB-ID ~p is not registered", [erab_uid(ERABId,
S)]),
+ {{error, erab_not_registered}, S}
+ end;
+
+handle_ie([?'id-E-RABFailedToModifyList'], C, S) ->
+ %% This IE contains a list of E-RABItem, so patch inner IEs
+ handle_ies(?'id-E-RABItem', C, S);
+
+handle_ie([?'id-E-RABItem',
+ ?'id-E-RABFailedToModifyList'],
+ #'E-RABItem'{'e-RAB-ID' = ERABId} = C, S) ->
+ %% poke E-RAB FSM
+ case erab_fsm_find(ERABId, S) of
+ {ok, Pid} ->
+ erab_fsm:erab_modify_rsp(Pid, nack),
+ {{ok, C}, S};
+ error ->
+ ?LOG_ERROR("E-RAB-ID ~p is not registered", [erab_uid(ERABId,
S)]),
+ {{error, erab_not_registered}, S}
+ end;
+
%% 9.1.3.5 E-RAB RELEASE COMMAND related IEs
handle_ie([?'id-E-RABToBeReleasedList'], C, S) ->
%% This IE contains a list of E-RABItem
diff --git a/src/s1gw_metrics.erl b/src/s1gw_metrics.erl
index 55421e7..79b1ffd 100644
--- a/src/s1gw_metrics.erl
+++ b/src/s1gw_metrics.erl
@@ -69,6 +69,8 @@
?S1GW_CTR_S1AP_PROXY_IN_PKT_PROC_ERROR, %% failed to process
?S1GW_CTR_S1AP_PROXY_IN_PKT_ERAB_SETUP_REQ, %% E-RAB SETUP.req PDUs
?S1GW_CTR_S1AP_PROXY_IN_PKT_ERAB_SETUP_RSP, %% E-RAB SETUP.rsp PDUs
+ ?S1GW_CTR_S1AP_PROXY_IN_PKT_ERAB_MODIFY_REQ, %% E-RAB MODIFY.req PDUs
+ ?S1GW_CTR_S1AP_PROXY_IN_PKT_ERAB_MODIFY_RSP, %% E-RAB MODIFY.rsp PDUs
?S1GW_CTR_S1AP_PROXY_IN_PKT_ERAB_RELEASE_CMD, %% E-RAB RELEASE.cmd PDUs
?S1GW_CTR_S1AP_PROXY_IN_PKT_ERAB_RELEASE_RSP, %% E-RAB RELEASE.rsp PDUs
?S1GW_CTR_S1AP_PROXY_IN_PKT_ERAB_RELEASE_IND, %% E-RAB RELEASE.ind PDUs
--
To view, visit
https://gerrit.osmocom.org/c/erlang/osmo-s1gw/+/39117?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: newchange
Gerrit-Project: erlang/osmo-s1gw
Gerrit-Branch: master
Gerrit-Change-Id: I057a1c58d0c6ad04c00ad3ea4c68230d8632a07e
Gerrit-Change-Number: 39117
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>