Skip to content

Commit d810b63

Browse files
committed
e2ap: adding support for RIC subscription delete
1 parent 2d4c1cb commit d810b63

14 files changed

+248
-9
lines changed

include/srsran/e2/e2_event_manager.h

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "srsran/asn1/e2ap/e2ap.h"
1515
#include "srsran/support/async/event_signal.h"
1616
#include "srsran/support/async/protocol_transaction_manager.h"
17+
#include <map>
1718

1819
namespace srsran {
1920

@@ -26,11 +27,16 @@ class e2_event_manager
2627
constexpr static size_t MAX_NOF_TRANSACTIONS = 256;
2728
protocol_transaction_manager<e2ap_outcome, MAX_NOF_TRANSACTIONS> transactions;
2829

29-
protocol_transaction_event_source<asn1::e2ap::ricsubscription_delete_request_s> sub_del_request;
30-
// CU initiated E2 Setup Procedure
30+
std::map<int, std::unique_ptr<protocol_transaction_event_source<asn1::e2ap::ricsubscription_delete_request_s>>>
31+
sub_del_reqs;
3132

33+
void add_sub_del_req(int ric_instance_id, timer_factory timer)
34+
{
35+
sub_del_reqs[ric_instance_id] =
36+
std::make_unique<protocol_transaction_event_source<asn1::e2ap::ricsubscription_delete_request_s>>(timer);
37+
}
3238
explicit e2_event_manager(timer_factory timers) :
33-
transactions(timers, e2ap_outcome{asn1::e2ap::unsuccessful_outcome_s{}}), sub_del_request(timers)
39+
transactions(timers, e2ap_outcome{asn1::e2ap::unsuccessful_outcome_s{}})
3440
{
3541
}
3642
};

include/srsran/e2/e2_messages.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,18 @@ struct e2_subscribe_reponse_message {
4545
bool success;
4646
};
4747

48+
struct e2_subscribe_delete_request_message {
49+
asn1::e2ap::ri_crequest_id_s request_id;
50+
asn1::e2ap::ricsubscription_delete_request_s subscription;
51+
};
52+
53+
struct e2_subscribe_delete_response_message {
54+
asn1::e2ap::ri_crequest_id_s request_id;
55+
asn1::e2ap::ricsubscription_delete_resp_s response;
56+
asn1::e2ap::ricsubscription_delete_fail_s failure;
57+
bool success;
58+
};
59+
4860
struct e2_indication_message {
4961
asn1::e2ap::ri_crequest_id_s request_id;
5062
asn1::e2ap::ri_cind_s indication;

include/srsran/e2/subscription/e2_subscription.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,15 @@ class e2_subscription_proc
4444
virtual ~e2_subscription_proc() = default;
4545
/// \brief Handle the incoming subscription message.
4646
virtual e2_subscribe_reponse_message handle_subscription_setup(const asn1::e2ap::ricsubscription_request_s& msg) = 0;
47+
/// \brief Handle the incoming subscription delete message.
48+
virtual e2_subscribe_delete_response_message
49+
handle_subscription_delete(const asn1::e2ap::ricsubscription_delete_request_s& msg) = 0;
4750
/// \brief start the subscription request
4851
virtual void start_subscription(int ric_instance_id, e2_event_manager& ev_mng, uint16_t ran_func_id) = 0;
52+
/// \brief void stop the subscription request
53+
virtual void stop_subscription(int ric_instance_id,
54+
e2_event_manager& ev_mng,
55+
const asn1::e2ap::ricsubscription_delete_request_s& msg) = 0;
4956
};
5057

5158
class e2_subscriber_mgmt

lib/e2/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
set(SOURCES
1010
procedures/e2_setup_procedure.cpp
1111
procedures/e2_subscription_setup_procedure.cpp
12+
procedures/e2_subscription_delete_procedure.cpp
1213
procedures/e2_indication_procedure.cpp
1314
common/e2ap_asn1_packer.cpp
1415
common/e2_factory.cpp

lib/e2/common/e2_impl.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ e2_impl::e2_impl(e2ap_configuration& cfg_,
2929
pdu_notifier(e2_pdu_notifier_),
3030
subscription_mngr(subscription_mngr_),
3131
subscribe_proc(e2_pdu_notifier_, subscription_mngr_, timers, logger),
32+
subscribe_delete_proc(e2_pdu_notifier_, subscription_mngr_, timers, logger),
3233
events(std::make_unique<e2_event_manager>(timers))
3334
{
3435
}
@@ -120,6 +121,12 @@ void e2_impl::handle_ric_subscription_request(const asn1::e2ap::ricsubscription_
120121
subscribe_proc.run_subscription_procedure(msg, *events);
121122
}
122123

124+
void e2_impl::handle_ric_subscription_delete_request(const asn1::e2ap::ricsubscription_delete_request_s& msg)
125+
{
126+
logger.info("Received RIC Subscription Delete Request");
127+
subscribe_delete_proc.run_subscription_delete_procedure(msg, *events);
128+
}
129+
123130
void e2_impl::handle_message(const e2_message& msg)
124131
{
125132
logger.info("Handling E2 PDU of type {}", msg.pdu.type().to_string());
@@ -158,9 +165,7 @@ void e2_impl::handle_initiating_message(const asn1::e2ap::init_msg_s& msg)
158165
handle_ric_subscription_request(msg.value.ricsubscription_request());
159166
break;
160167
case asn1::e2ap::e2_ap_elem_procs_o::init_msg_c::types_opts::options::ricsubscription_delete_request:
161-
logger.info("Received RIC Subscription Delete Request");
162-
events->sub_del_request.set(msg.value.ricsubscription_delete_request());
163-
// TODO - add subscription delete procedure
168+
handle_ric_subscription_delete_request(msg.value.ricsubscription_delete_request());
164169
break;
165170
default:
166171
logger.error("Invalid E2AP initiating message type");

lib/e2/common/e2_impl.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
#pragma once
1212

1313
#include "procedures/e2_setup_procedure.h"
14+
#include "procedures/e2_subscription_delete_procedure.h"
1415
#include "procedures/e2_subscription_setup_procedure.h"
1516
#include "srsran/asn1/e2ap/e2ap.h"
1617
#include "srsran/e2/e2.h"
@@ -65,6 +66,10 @@ class e2_impl final : public e2_interface
6566
/// \param[in] msg The received ric subscription request message.
6667
void handle_ric_subscription_request(const asn1::e2ap::ricsubscription_request_s& msg);
6768

69+
/// \brief Notify about the reception of an ric subscription delete request message.
70+
/// \param[in] msg The received ric subscription delete request message.
71+
void handle_ric_subscription_delete_request(const asn1::e2ap::ricsubscription_delete_request_s& msg);
72+
6873
/// \brief handle e2 setup response message from the ric interface.
6974
/// @param[in] msg The received e2 setup response message.
7075
void handle_e2_setup_response(const e2_setup_response_message& msg);
@@ -86,6 +91,7 @@ class e2_impl final : public e2_interface
8691
std::map<std::string, std::unique_ptr<e2sm_handler>> e2sm_handlers;
8792
e2_subscriber_mgmt& subscription_mngr;
8893
e2_subscription_setup_procedure subscribe_proc;
94+
e2_subscription_delete_procedure subscribe_delete_proc;
8995
std::unique_ptr<e2_event_manager> events;
9096

9197
unsigned current_transaction_id = 0; // store current E2AP transaction id

lib/e2/common/e2_subscription_manager_impl.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ e2_subscription_manager_impl::handle_subscription_setup(const asn1::e2ap::ricsub
2929
e2_subscribe_reponse_message outcome;
3030
subscription.subscription_info.request_id.ric_requestor_id = msg->ri_crequest_id.value.ric_requestor_id;
3131
subscription.subscription_info.ran_function_id = msg->ra_nfunction_id->value;
32+
subscription.subscription_info.request_id.ric_instance_id = msg->ri_crequest_id.value.ric_instance_id;
3233
e2_sm_kpm_event_trigger_definition_s event_trigger_def;
3334

3435
if (supported_ran_functions.count(msg->ra_nfunction_id.value)) {
@@ -61,6 +62,24 @@ e2_subscription_manager_impl::handle_subscription_setup(const asn1::e2ap::ricsub
6162
return outcome;
6263
}
6364

65+
e2_subscribe_delete_response_message
66+
e2_subscription_manager_impl::handle_subscription_delete(const asn1::e2ap::ricsubscription_delete_request_s& msg)
67+
{
68+
e2_subscribe_delete_response_message outcome;
69+
outcome.request_id.ric_requestor_id = msg->ri_crequest_id.value.ric_requestor_id;
70+
outcome.request_id.ric_instance_id = msg->ri_crequest_id.value.ric_instance_id;
71+
outcome.response->ra_nfunction_id.value = msg->ra_nfunction_id.value;
72+
outcome.response->ri_crequest_id.value = msg->ri_crequest_id.value;
73+
outcome.success = false;
74+
if (subscriptions.count(outcome.request_id.ric_instance_id)) {
75+
outcome.success = true;
76+
} else {
77+
outcome.failure->cause->set_misc();
78+
logger.error("RIC instance ID not found");
79+
}
80+
return outcome;
81+
}
82+
6483
void e2_subscription_manager_impl::start_subscription(int ric_instance_id,
6584
e2_event_manager& ev_mng,
6685
uint16_t ran_func_id)
@@ -73,6 +92,18 @@ void e2_subscription_manager_impl::start_subscription(int ric_inst
7392
logger);
7493
}
7594

95+
void e2_subscription_manager_impl::stop_subscription(int ric_instance_id,
96+
e2_event_manager& ev_mng,
97+
const asn1::e2ap::ricsubscription_delete_request_s& msg)
98+
{
99+
if (subscriptions.count(ric_instance_id)) {
100+
ev_mng.sub_del_reqs[ric_instance_id]->set(msg);
101+
subscriptions[ric_instance_id].indication_task.await_ready();
102+
subscriptions.erase(ric_instance_id);
103+
} else {
104+
logger.error("RIC instance ID not found");
105+
}
106+
}
76107
bool e2_subscription_manager_impl::action_supported(const ri_caction_to_be_setup_item_s& action,
77108
uint16_t ran_func_id,
78109
uint32_t ric_instance_id)

lib/e2/common/e2_subscription_manager_impl.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,23 @@ class e2_subscription_manager_impl : public e2_subscription_manager
2929
/// \return The subscription response message.
3030
e2_subscribe_reponse_message handle_subscription_setup(const asn1::e2ap::ricsubscription_request_s& msg) override;
3131

32+
/// \brief Handles the subscription delete request message.
33+
/// \param[in] msg The subscription delete request message.
34+
/// \return The subscription delete response message.
35+
e2_subscribe_delete_response_message
36+
handle_subscription_delete(const asn1::e2ap::ricsubscription_delete_request_s& msg) override;
37+
3238
/// \brief Starts the subscription procedure associated with the given ric instance id.
3339
/// \param[in] ric_instance_id The ric instance id.
3440
/// \param[in] ev_mng The event manager that will be used to end the subscription procedure.
3541
void start_subscription(int ric_instance_id, e2_event_manager& ev_mng, uint16_t ran_func_id) override;
3642

43+
/// @brief Stops the subscription procedure associated with the given ric instance id.
44+
/// @param[in] ric_instance_id The ric instance id.
45+
void stop_subscription(int ric_instance_id,
46+
e2_event_manager& ev_mng,
47+
const asn1::e2ap::ricsubscription_delete_request_s& msg) override;
48+
3749
/// \brief checks whether the given action is supported.
3850
/// \param[in] action The action to check.
3951
/// \param[in] ran_func_id The ran function id.

lib/e2/procedures/e2_indication_procedure.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,13 @@ void e2_indication_procedure::operator()(coro_context<eager_async_task<void>>& c
2929
{
3030
CORO_BEGIN(ctx);
3131
while (running) {
32-
// request metrics from DU
33-
transaction_sink.subscribe_to(ev_mng.sub_del_request, (std::chrono::milliseconds)1000);
32+
if (!ev_mng.sub_del_reqs.count(subscription.request_id.ric_instance_id)) {
33+
logger.error("No subscription delete request found for RIC instance ID {}",
34+
subscription.request_id.ric_instance_id);
35+
break;
36+
}
37+
transaction_sink.subscribe_to(*ev_mng.sub_del_reqs[subscription.request_id.ric_instance_id].get(),
38+
(std::chrono::milliseconds)1000);
3439
CORO_AWAIT(transaction_sink);
3540
if (!transaction_sink.timeout_expired()) {
3641
logger.info("Subscription deleted");
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
*
3+
* Copyright 2021-2023 Software Radio Systems Limited
4+
*
5+
* By using this file, you agree to the terms and conditions set
6+
* forth in the LICENSE file which can be found at the top level of
7+
* the distribution.
8+
*
9+
*/
10+
11+
#include "e2_subscription_delete_procedure.h"
12+
using namespace srsran;
13+
using namespace asn1::e2ap;
14+
15+
e2_subscription_delete_procedure::e2_subscription_delete_procedure(e2_message_notifier& ric_notif_,
16+
e2_subscription_proc& subscription_mngr_,
17+
timer_factory timers_,
18+
srslog::basic_logger& logger_) :
19+
logger(logger_), ric_notif(ric_notif_), subscription_mngr(subscription_mngr_), timers(timers_)
20+
{
21+
}
22+
23+
void e2_subscription_delete_procedure::run_subscription_delete_procedure(
24+
const asn1::e2ap::ricsubscription_delete_request_s request_,
25+
e2_event_manager& event_manager)
26+
{
27+
logger.info("E2AP: Received subscription delete request");
28+
e2_subscribe_delete_response_message response;
29+
response = subscription_mngr.handle_subscription_delete(request_);
30+
if (response.success) {
31+
subscription_mngr.stop_subscription(request_->ri_crequest_id.value.ric_instance_id, event_manager, request_);
32+
send_e2_subscription_delete_response(response);
33+
} else {
34+
send_e2_subscription_delete_failure(response);
35+
}
36+
}
37+
38+
void e2_subscription_delete_procedure::send_e2_subscription_delete_response(
39+
const e2_subscribe_delete_response_message& response)
40+
{
41+
e2_message msg;
42+
logger.info("E2AP: Sending subscription delete response");
43+
msg.pdu.set_successful_outcome().load_info_obj(ASN1_E2AP_ID_RICSUBSCRIPTION_DELETE);
44+
msg.pdu.successful_outcome().value.ricsubscription_delete_resp() = response.response;
45+
ric_notif.on_new_message(msg);
46+
}
47+
48+
void e2_subscription_delete_procedure::send_e2_subscription_delete_failure(
49+
const e2_subscribe_delete_response_message& failure)
50+
{
51+
e2_message msg;
52+
msg.pdu.set_unsuccessful_outcome().load_info_obj(ASN1_E2AP_ID_RICSUBSCRIPTION_DELETE);
53+
msg.pdu.unsuccessful_outcome().value.ricsubscription_delete_fail() = failure.failure;
54+
ric_notif.on_new_message(msg);
55+
logger.info("E2AP: Sending subscription delete failure");
56+
}

0 commit comments

Comments
 (0)