12#ifndef LIBE3_SUBSCRIPTION_MANAGER_HPP
13#define LIBE3_SUBSCRIPTION_MANAGER_HPP
17#include <shared_mutex>
20#include <unordered_map>
21#include <unordered_set>
140 uint32_t ran_function_id,
141 const std::vector<uint32_t>& telemetry_ids = {},
142 const std::vector<uint32_t>& control_ids = {},
143 uint32_t periodicity_us = 0);
168 bool is_subscribed(uint32_t dapp_id, uint32_t ran_function_id)
const;
227 mutable std::shared_mutex mutex_;
230 std::unordered_map<uint32_t, DAppEntry> registered_dapps_;
233 std::unordered_map<uint32_t, std::unordered_set<uint32_t>> dapp_subscriptions_;
236 std::unordered_map<uint32_t, std::unordered_set<uint32_t>> ran_function_subscribers_;
239 std::unordered_map<uint32_t, std::pair<uint32_t, uint32_t>> subscription_ids_;
242 std::unordered_map<uint64_t, uint32_t> subscription_id_reverse_;
245 std::unordered_map<uint64_t, SubscriptionDetails> subscription_details_;
251 static uint64_t make_sub_key(uint32_t dapp_id, uint32_t ran_func_id) {
252 return (
static_cast<uint64_t
>(dapp_id) << 32) | ran_func_id;
264 void check_sm_lifecycle(uint32_t ran_function_id,
bool had_subscribers);
std::vector< uint32_t > get_active_ran_functions() const
Get all RAN functions that have at least one subscriber.
std::vector< uint32_t > get_registered_dapps() const
Get list of registered dApp IDs.
ErrorCode remove_subscription(uint32_t dapp_id, uint32_t ran_function_id)
Remove a subscription between dApp and RAN function.
bool is_subscribed(uint32_t dapp_id, uint32_t ran_function_id) const
Check if dApp is subscribed to a RAN function.
void set_sm_lifecycle_callback(SmLifecycleCallback callback)
Set callback for SM lifecycle events.
ErrorCode unregister_dapp(uint32_t dapp_id)
Unregister a dApp and clean up all its subscriptions.
SubscriptionManager(const SubscriptionManager &)=delete
SubscriptionManager & operator=(SubscriptionManager &&)=delete
std::pair< ErrorCode, uint32_t > register_dapp()
Register a dApp from E3 Setup Request.
SubscriptionManager & operator=(const SubscriptionManager &)=delete
size_t get_subscriber_count(uint32_t ran_function_id) const
Get count of subscribers for a RAN function.
const SubscriptionDetails * get_subscription_details(uint32_t dapp_id, uint32_t ran_function_id) const
Get subscription details for a specific dApp + RAN function pair.
bool has_subscribers(uint32_t ran_function_id) const
Check if any dApp is subscribed to a RAN function.
~SubscriptionManager()
Destructor.
void clear()
Clear all registrations and subscriptions.
std::vector< uint32_t > get_dapp_subscriptions(uint32_t dapp_id) const
Get all RAN functions a dApp is subscribed to.
SubscriptionManager(SubscriptionManager &&)=delete
bool is_dapp_registered(uint32_t dapp_id) const
Check if a dApp is registered.
SubscriptionManager()
Construct a new Subscription Manager.
std::vector< uint32_t > get_subscribed_dapps(uint32_t ran_function_id) const
Get all dApps subscribed to a RAN function.
size_t subscription_count() const
Get total number of active subscriptions.
ErrorCode remove_subscription_by_id(uint32_t dapp_id, uint32_t subscription_id)
Remove a subscription by its ID.
std::pair< ErrorCode, uint32_t > add_subscription(uint32_t dapp_id, uint32_t ran_function_id, const std::vector< uint32_t > &telemetry_ids={}, const std::vector< uint32_t > &control_ids={}, uint32_t periodicity_us=0)
Add a subscription between dApp and RAN function.
size_t dapp_count() const
Get total number of registered dApps.
ErrorCode
Error codes returned by libe3 operations Use shared error-code list (see libe3/error_codes....
std::function< void(uint32_t ran_function_id, bool should_start)> SmLifecycleCallback
Callback type for SM lifecycle events.
Per-subscription metadata stored by the SubscriptionManager.
uint32_t periodicity_us
0 = use SM default
std::vector< uint32_t > control_ids
std::vector< uint32_t > telemetry_ids
E3AP Protocol Types - Vendor-neutral type definitions.