ConnectionControlEnb.h Source File

Simu5G: ConnectionControlEnb.h Source File
Simu5G
ConnectionControlEnb.h
1//
2// Simu5G
3//
4// Authors: Andras Varga (OpenSim Ltd)
5//
6// This file is part of a software released under the license included in file
7// "license.pdf". Please read LICENSE and README files before using it.
8// The above files and the present reference are part of the software itself,
9// and cannot be removed from it.
10//
11
12#ifndef _CONNECTIONCONTROLENB_H_
13#define _CONNECTIONCONTROLENB_H_
14
15#include <map>
16#include <set>
17#include <string>
18#include <utility>
19#include <vector>
20
21#include <inet/common/ModuleRefByPar.h>
22#include <inet/networklayer/common/L3Address.h>
23
24#include "simu5g/common/LteCommon.h"
25#include "simu5g/common/binder/Binder.h"
26#include "simu5g/corenetwork/bearerConfigurator/BearerConfigurator.h"
27#include "simu5g/corenetwork/coreControl/CoreControl.h"
28#include "simu5g/corenetwork/gtp/GtpTunnel.h"
29#include "simu5g/corenetwork/gtp/GtpUser.h"
30#include "simu5g/corenetwork/gtp/GtpUserX2.h"
31#include "simu5g/stack/ip2nic/HandoverPacketHolderEnb.h"
32#include "simu5g/stack/mac/LteMacEnb.h"
33#include "simu5g/stack/rrc/BearerManagement.h"
34#include "simu5g/stack/rrc/ConnectionControlBase.h"
35
36namespace simu5g {
37
38class ConnectionControlUe;
39
46{
47 MacNodeId servingCell = NODEID_NONE;
48 double servingRssi = 0;
49 MacNodeId bestCell = NODEID_NONE;
50 double bestRssi = 0;
51};
52
58{
59 MacNodeId legId = NODEID_NONE;
60 omnetpp::cModule *ueModule = nullptr;
61 ConnectionControlUe *ueRrc = nullptr; // the leg's control-plane entry point
62 std::vector<SessionResource> sessions; // the UE's sessions at the source, with the source's downlink F-TEIDs
63 std::vector<DrbDesc> drbs; // the leg's DRBs as configured at the source, keyed by the leg
64 std::vector<std::pair<const BearerConfigurator::AuthoredBearer *, DrbId>> onDemandIds; // the on-demand definitions materialized for the leg at the source, with their ids
65 UeCapabilities capabilities; // what the leg reported of itself at connection setup
66 SessionType requestedSessionType = IP_V4; // the session type the leg requested at connection setup
67};
68
78{
79 protected:
80 MacNodeId nodeId_ = NODEID_NONE;
81
82 // The node's core network gateway; empty at a node not connected to a core
83 // network (a secondary node), which takes no session
84 std::string gateway_;
85
86 inet::ModuleRefByPar<Binder> binder_;
87 inet::ModuleRefByPar<BearerConfigurator> bearerConfigurator_; // the bearer definitions, read only (its const API)
88 inet::ModuleRefByPar<CoreControl> coreControl_; // the core network's control plane, the far end of S1/N2
89 inet::ModuleRefByPar<BearerManagement> bearerManagement_; // the node's installer
90 inet::ModuleRefByPar<LteMacEnb> mac_; // the node's MAC, for the AMC's user attachment and the per-UE queues
91 inet::ModuleRefByPar<HandoverPacketHolderEnb> handoverPacketHolder_; // the node's downlink holder/forwarder
92 inet::ModuleRefByPar<GtpUser> gtpUser_;
93 inet::ModuleRefByPar<GtpUserX2> gtpUserX2_;
94
95 // What the control plane keeps of a UE leg this base station serves, or is the
96 // handover target of: created by connectionSetupRequest() and handoverRequest(), dropped
97 // by ueContextRelease(), connectionLost() and handoverCancel()
98 struct UeContext {
99 omnetpp::cModule *ueModule = nullptr;
100 ConnectionControlUe *ueRrc = nullptr; // the leg's control-plane entry point
101 enum State { CONNECTED, HO_SOURCE_PREPARING, HO_SOURCE_EXECUTING, HO_TARGET_PREPARED } state = CONNECTED;
102 MacNodeId hoPeer = NODEID_NONE; // the other base station of the leg's handover in progress
103 std::vector<SessionResource> sessions; // target role: the session resources the preparation set up for the leg, reported in the PATH SWITCH REQUEST
104 UeCapabilities capabilities; // what the leg reported of itself at connection setup
105 SessionType requestedSessionType = IP_V4; // the session type the leg requested at connection setup
106 };
107 std::map<MacNodeId, UeContext> ues_; // by the leg's node id
108
109 // The sessions with tunnels at this base station (see setUpSessionTunnels())
110 std::vector<SessionResource> sessions_;
111
112 // The node's TEID space: the TEID allocated last (see allocateTeid())
113 Teid lastTeid_ = TEID_NONE;
114
115 // The transport address of the node's tunnel endpoints, resolved on first use: the
116 // node's addresses are assigned after INITSTAGE_LOCAL (see getAddress())
117 inet::L3Address address_;
118
119 // The DRB ids in use within each node pair this base station is a party to (see
120 // assignDrbId()); a pair between two UEs, or a UE and a multicast group, is the
121 // D2D subclass's (see foreignPairPool())
122 std::map<std::pair<MacNodeId, MacNodeId>, std::set<DrbId>> drbIdsInUse_;
123
124 // The on-demand definitions materialized within each node pair, and the id each
125 // got: like every DRB id, an on-demand bearer's identity is pair-scoped, assigned
126 // at the definition's first match within the pair and returned to the pair's pool
127 // with the bearer (see forgetOnDemandDrbId()), so a UE that moves to another
128 // serving node materializes the definition afresh there
129 std::map<std::pair<const BearerConfigurator::AuthoredBearer *, std::pair<MacNodeId, MacNodeId>>, DrbId> onDemandIds_;
130
131 protected:
132 int numInitStages() const override { return inet::NUM_INIT_STAGES; }
133 void initialize(int stage) override;
134 void handleMessage(omnetpp::cMessage *msg) override { throw omnetpp::cRuntimeError("This module does not process messages"); }
135
136 // Hand out the next TEID of the node's TEID space. TEIDs are allocated in
137 // increasing order and never reused within a run, so a G-PDU still in flight on a
138 // released tunnel cannot be taken for a later session's.
139 virtual Teid allocateTeid();
140
141 // The transport address of the node's tunnel endpoints: that of the network node
142 virtual const inet::L3Address& getAddress();
143
144 // The control-plane entry point of another node, through the Binder's node directory
145 virtual ConnectionControlBase *controlOf(MacNodeId nodeId);
146 virtual ConnectionControlEnb *baseStationControl(MacNodeId bsId);
147 virtual ConnectionControlUe *ueControl(MacNodeId legId);
148
149 // The handover decision: the cell the leg is handed over to on its report, or
150 // NODEID_NONE for none. The default policy takes the reported best cell -- the
151 // decision the UE made itself before, whose hysteresis it still applies before
152 // reporting -- so the instant and the target are unchanged.
153 virtual MacNodeId selectHandoverTarget(MacNodeId legId, const MeasurementReport& report);
154
155 // The other leg of the UE the leg belongs to, or NODEID_NONE
156 virtual MacNodeId otherLegOf(MacNodeId legId);
157
158 // The context of a leg this base station has one of; throws otherwise
159 virtual UeContext& ueContext(MacNodeId legId);
160
161 // What else a leg's arrival, handover and departure involve at this base station,
162 // besides the leg's bearers and tunnels; nothing here (see the D2D subclass):
163 // the source, just before it commands the leg's handover
164 virtual void beforeHandoverCommand(MacNodeId legId, const UeContext& ctx) {}
165 // a leg that arrived here by handover, or attached during the run
166 virtual void legArrived(MacNodeId legId, const UeContext& ctx) {}
167 // a leg this base station released (handed over, lost, or leaving the simulation)
168 virtual void legLeft(MacNodeId legId, const UeContext& ctx) {}
169
170 // This base station's resources of the session, or nullptr
171 virtual SessionResource *findSession(const SessionRef& session);
172
173 // The type of the given session of the UE: as this base station has the session's
174 // resources, or else as a leg of the UE this base station has a context of
175 // requested it at connection setup (a base station not connected to a core
176 // network, which establishes no session, serves the leg's bearers as the
177 // session's anyway); throws if it has neither.
178 virtual SessionType sessionTypeOf(omnetpp::cModule *ueModule, SessionId session);
179
180 // This base station's resources of the sessions of the UE the leg belongs to
181 virtual std::vector<SessionResource> sessionsOf(MacNodeId legId);
182
183 // Release this base station's state for a leg that left it: its MAC queues and RLC
184 // entities here, its PDCP entities here and at this node's master if this node is a
185 // secondary; and, if the UE's other leg is attached nowhere, whatever this node's
186 // secondary holds for that leg, which the master's bearer establishment provisions
187 // there regardless of the leg's attachment and nothing else would release (see
188 // ConnectionControlUe::deleteOwnBuffers()). The AMC detach is the caller's.
189 virtual void releaseLeg(MacNodeId legId);
190
191 // The UE's uplink and downlink at this node's AMC
192 virtual void attachAtAmc(MacNodeId legId);
193 virtual void detachAtAmc(MacNodeId legId);
194
195 // The body of sessionTunnelSetup(), for the calls that come from inside
196 virtual FTeid setUpSessionTunnels(const SessionRef& session, SessionType type, const UplinkTunnels& uplink);
197
198 // Whether the static bearers of the UE are established on this leg: the
199 // technology-neutral LTE leg when the serving nodes form a DC setup (so that the
200 // establishment splits the bearer into legs), else the NR leg when attached, else
201 // the LTE leg -- the stack packet-triggered establishment would pick (see
202 // Ip2Nic::assignBearer)
203 virtual bool carriesStaticDrbs(omnetpp::cModule *ueModule, MacNodeId legId);
204
205 // Install the static bearers of the UE from this leg: each definition's descriptor
206 // delivered to the RRCs involved (pushDrbToRrcs()), then each bearer established
207 // toward the leg's serving node, exactly like packet-triggered establishment, so
208 // traffic finds the configured bearers in place
209 virtual void establishStaticDrbs(omnetpp::cModule *ueModule, MacNodeId legId, SessionId session);
210
211 // ---- DRB identities ----
212
213 // Allocate the lowest free DRB ID within the (unordered) node pair {a, b}, so the
214 // two endpoints of a link can never mint colliding IDs for the same peer.
215 // For multicast flows, pass the multicast group ID as the second node.
216 virtual DrbId assignDrbId(MacNodeId a, MacNodeId b);
217
218 // Return a DRB ID to its pair's pool when the bearer is torn down. DRB identities are
219 // a finite per-UE resource (TS 38.331: DRB-Identity is 1..32) and are reused once
220 // released -- without this, a UE handing over repeatedly would exhaust the space.
221 // Releasing an ID that is not in use is a no-op.
222 virtual void releaseDrbId(MacNodeId a, MacNodeId b, DrbId drbId);
223
224 // The pool of a node pair this base station is no party to: a pair between two
225 // UEs, or a UE and a multicast group (legacy sidelink). None here; the D2D
226 // subclass keeps them network-wide in the D2dBinder.
227 virtual std::set<DrbId>& foreignPairPool(const std::pair<MacNodeId, MacNodeId>& pair);
228
229 // Forget an on-demand definition's materialization in the given node pair when its
230 // bearer is torn down: the id has returned to the pair's pool (releaseDrbId()), and
231 // the next matching flow assigns afresh. Forgetting an id that is not recorded is a
232 // no-op.
233 virtual void forgetOnDemandDrbId(omnetpp::cModule *ueModule, MacNodeId a, MacNodeId b, DrbId drbId);
234
235 // ---- bearer establishment ----
236
237 // Establish the flow on the bearer a definition describes: a static entry's flow
238 // joins the configured bearer under its pinned id; an on-demand entry is assigned
239 // its pair-scoped id, and delivered to the RRCs, when it first matches within the
240 // node pair.
241 virtual DrbId establishFromDefinition(const BearerConfigurator::AuthoredBearer& ab, const FlowId& flow, const FlowBindingKey& key);
242
243 // The DRB id a definition resolves to at the given UE, for the QFI path (see
244 // resolveDrbForQfi()): a static definition's bearer already exists, so its pinned
245 // id is returned as-is; an on-demand definition's bearer is materialized on first
246 // use within the node pair -- the id assigned and the descriptor delivered to the
247 // RRCs -- and that id returned. DRBID_NONE if the UE is not attached, so an
248 // on-demand bearer has nowhere to be established.
249 virtual DrbId drbOfDefinition(const BearerConfigurator::AuthoredBearer& ab, MacNodeId ueNodeId);
250
251 // The definition a flow's bearer was authored from, or nullptr if none covers it
252 virtual const DrbDesc *findBearerDefinition(const FlowId& flow);
253
254 // The body of establishBearer(flow, req), for the calls that come from inside
255 virtual DrbId establishDataConnection(const FlowId& flow, const BearerRequest& req);
256
257 // Deliver the bearer of a definition (drb: the definition's descriptor, or its copy
258 // as materialized) to the RRCs involved, as a bearer of the UE's session: typed by
259 // the session (DrbDesc::sessionType, see sessionTypeOf()), and with header
260 // compression only if the session is an IP one -- the definition's ROHC is dropped
261 // on another session if it comes from the rohcForDrbProfiles policy, and an error
262 // if the definition states it. The RRCs are the UE's (keyed by NODEID_NONE, "my
263 // serving node") and, for each attached stack, the serving node's (keyed by that
264 // stack's UE id); the configured id is reserved per pair.
265 virtual void pushDrbToRrcs(const BearerConfigurator::AuthoredBearer& ab, const DrbDesc& drb);
266
267 // A D2D or multicast flow's bearer: outside the definition system (definitions
268 // describe infrastructure bearers), with a fixed transitional configuration.
269 // None at a base station without D2D; the D2D subclass establishes it.
270 virtual DrbId establishD2dBearer(const FlowId& flow, const FlowBindingKey& key);
271
272 virtual bool isDualConnectivityRequired(const FlowId& flow);
273 virtual void createConnection(const FlowId& flow, const BearerRequest& req, bool withPdcp);
274 // A multicast bearer's connections: TX at the sender, RX at the group members. None
275 // at a base station without D2D; the D2D subclass creates them.
276 virtual void createMulticastConnection(const FlowId& flow, const BearerRequest& req, bool withPdcp);
277 virtual void createIncomingConnectionOnNode(MacNodeId nodeId, const FlowId& flow, const BearerRequest& req, bool withPdcp);
278 virtual void createOutgoingConnectionOnNode(MacNodeId nodeId, const FlowId& flow, const BearerRequest& req, bool withPdcp);
279
280 // Set up the X2-U tunnels of a dual connectivity bearer, one per direction, each at
281 // its receiving end: the secondary for the downlink the master relays, the master
282 // for the uplink the secondary relays back (see GtpUserX2, DcMux)
283 virtual void setUpX2DcTunnels(MacNodeId masterId, MacNodeId secondaryId, MacNodeId ueLteId, MacNodeId ueNrId,
284 MacNodeId ueMcgId, MacNodeId ueScgId, DrbId drbId);
285
286 public:
287 MacNodeId getNodeId() const { return nodeId_; }
288 const std::string& getGateway() const { return gateway_; }
289
290 // ---- attach ----
291
292 // RRCConnectionRequest (LTE) / RRCSetupRequest (NR), and the registration that
293 // follows: a leg of a UE connects at this base station (at initialization, the
294 // leg's configured serving cell), reporting its capabilities and the type of the
295 // session the UE requests (the NAS PDU Session Establishment Request / PDN
296 // Connectivity Request the RRC message carries, as far as the model needs it). The
297 // base station registers the UE with the core network, which sets up the session's
298 // resources here (sessionResourceSetup()).
299 virtual void connectionSetupRequest(omnetpp::cModule *ueModule, MacNodeId legId, ConnectionControlBase *ueRrc, const UeCapabilities& capabilities, SessionType sessionType);
300
301 // E-RAB SETUP / INITIAL CONTEXT SETUP REQUEST (S1AP), PDU SESSION RESOURCE SETUP
302 // REQUEST (NGAP), from the core network, for a leg that registered here: the
303 // tunnels of the session, which is of the given type, at this base station
304 // (sessionTunnelSetup()), the UE's uplink QoS rules (the NAS container), and the
305 // static data radio bearers of the leg that carries them, installed at this node
306 // and at the UE. Returns the downlink tunnel's F-TEID.
307 virtual FTeid sessionResourceSetup(MacNodeId legId, const SessionRef& session, SessionType type, const UplinkTunnels& uplink, QfiRuleSet&& ulQfiRules);
308
309 // RRCRelease's counterpart the UE side sends, a simulation shortcut for the
310 // network's own radio link monitoring: the leg lost the cell, detached, or is
311 // being deleted. This base station releases its state for the leg and tells the
312 // core network (UE CONTEXT RELEASE REQUEST).
313 virtual void connectionLost(MacNodeId legId);
314
315 // The radio link of a leg this base station serves failed, as the UE's RLC
316 // detected it (the RRC re-establishment request, as far as the model needs it):
317 // this base station releases its end of the link
318 virtual void radioLinkFailure(MacNodeId legId);
319
320 // ---- handover ----
321
322 // MeasurementReport, from a leg this base station serves: the base station
323 // decides (selectHandoverTarget()) and, as the source, prepares the leg's handover
324 // with the target over Xn (handoverRequest())
325 virtual void measurementReport(MacNodeId legId, const MeasurementReport& report);
326
327 // HANDOVER REQUEST (Xn), from the source of a leg's handover: this base station,
328 // the target, takes the leg's context, sets the UE's session tunnels up at the
329 // base station the downlink will enter the RAN at (this node's master under dual
330 // connectivity), which also learns the source's downlink TEIDs, installs the leg's
331 // bearer configuration, starts holding the leg's downlink, and acknowledges
332 // (handoverRequestAck())
333 virtual void handoverRequest(const HandoverRequest& request, ConnectionControlEnb *source);
334
335 // HANDOVER REQUEST ACKNOWLEDGE (Xn), from the target, with the session resources
336 // it set up: this base station, the source, commands the leg (the
337 // RRCReconfiguration with sync, ConnectionControlUe::handoverCommand()), then
338 // forwards the leg's downlink to the target's tunnels over X2-U (TS 38.300
339 // 9.2.3.2.1)
340 virtual void handoverRequestAck(MacNodeId legId, const std::vector<SessionResource>& admitted);
341
342 // HANDOVER CANCEL (Xn), from the source of a leg's handover that lost the leg
343 // meanwhile: this base station, the target, drops the leg's context (its
344 // downlink holder keeps whatever it holds for the leg)
345 virtual void handoverCancel(MacNodeId legId);
346
347 // Whether a handover of the leg is being prepared or executed with this base
348 // station as its source or target; asked by the node's own D2D modules
349 virtual bool isHandingOver(MacNodeId legId) const;
350
351 // RRCReconfigurationComplete, from a leg that arrived here by handover: the target
352 // takes the leg on at its AMC, has the core network switch the session's downlink
353 // path here (PATH SWITCH REQUEST, with the tunnels the preparation set up),
354 // releases the leg at the source (UE CONTEXT RELEASE over Xn), and sends down the
355 // downlink held for the leg
356 virtual void reconfigurationComplete(MacNodeId legId);
357
358 // UE CONTEXT RELEASE (Xn), from the target of a leg's handover once the path is
359 // switched: this base station, the source, stops forwarding and releases its
360 // state for the leg
361 virtual void ueContextRelease(MacNodeId legId);
362
363 // PATH SWITCH REQUEST ACKNOWLEDGE, as far as the model needs it: the downlink of
364 // the session of the UE with the given node ids now enters the RAN here, and
365 // entered it at fromBaseStation before (NODEID_NONE: nowhere), where the anchor
366 // ends it with an End Marker if it is another base station. Told to the base
367 // station the downlink enters at, which may be the master of the one that
368 // requested the switch.
369 virtual void downlinkPathSwitched(MacNodeId ueLteId, MacNodeId ueNrId, MacNodeId fromBaseStation);
370
371 // A secondary's leg left it: the master releases the leg's PDCP entities, which
372 // it anchors (SN release, as far as the model needs it)
373 virtual void releasePdcpEntities(MacNodeId legId);
374
375 // ---- the node's tunnels, for the core network's control plane and the other base stations ----
376
377 // A session's tunnels at this base station: its downlink tunnel, under a TEID
378 // allocated here, which also receives the downlink a handover source forwards
379 // over X2-U; and its uplink tunnels into the core network, to send the UE's
380 // uplink on. The tunnel ends keep the session's type. Set up once per session,
381 // whichever side asks first; a later call finds them in place. Returns the
382 // downlink tunnel's F-TEID.
383 virtual FTeid sessionTunnelSetup(const SessionRef& session, SessionType type, const UplinkTunnels& uplink);
384
385 // The TEID of the session's downlink tunnel at another base station, to forward
386 // the session's downlink to it with over X2-U during a handover
387 virtual void setForwardingTeid(const SessionRef& session, MacNodeId bsId, Teid teid);
388
389 // The session is released: its tunnels at this base station are forgotten
390 virtual void sessionRelease(const SessionRef& session);
391
392 // A dual connectivity bearer's X2-U tunnel ending at this node, for the given
393 // direction, under a TEID allocated here; returns the TEID. The bearer is that of
394 // the UE with the given id (this node's key for the bearer) with the given DRB id.
395 virtual Teid addDcTunnel(MacNodeId ueNodeId, DrbId drbId, Direction direction);
396
397 // The TEID of a dual connectivity bearer's X2-U tunnel at the peer node, for the
398 // direction this node sends; the UE is named by both of its node ids
399 virtual void setDcTunnelTeid(MacNodeId ueLteId, MacNodeId ueNrId, DrbId drbId, Direction direction, Teid teid);
400
401 // ---- bearers ----
402
403 // Establish a bearer for a flow the requester identifies but does not describe:
404 // the requester supplies the flow, its classifier key and the triggering packet,
405 // and the bearer's properties come from the "epc" definition whose packet filter
406 // matches (staticDrbs first, then onDemandDrbs, in table order; the default entry
407 // catches what no filter matched). A flow no definition covers throws: the
408 // onDemandDrbs default value carries catch-all definitions, so only a
409 // configuration that replaced them with a non-covering set can get here. D2D and
410 // multicast bearers are outside the definition system (see establishD2dBearer()).
411 // Returns the established bearer's DRB id.
412 DrbId establishBearer(const FlowId& flow, SessionId session, const FlowBindingKey& key, const inet::Packet *pkt) override;
413
414 // Establish a duplex data radio bearer for the flow: entities for BOTH directions
415 // are created at both endpoints at once (DRBs are bidirectional per TS 38.331;
416 // RLC-AM in particular needs the reverse path for its STATUS PDUs). Multicast
417 // flows remain unidirectional (TX at the sender, RX at the group members).
418 //
419 // The bearer's DRB id is the flow's own when it has one, and a freshly assigned
420 // one (see assignDrbId()) when flow.drbId is DRBID_NONE, i.e. when the requester
421 // is establishing a bearer for a flow it has not seen before. Either way the id
422 // of the established bearer is returned.
423 DrbId establishBearer(const FlowId& flow, const BearerRequest& req) override;
424
425 // Resolve the DRB an unmapped QFI of a session should use at the given UE, when
426 // SDAP's QFI-to-DRB table missed. The session's "5gc" definition that maps this QFI
427 // specifically wins; failing that, the session's default bearer catches it (it carries the QFIs no other bearer
428 // maps). One walk in table order, static definitions before on-demand ones, so an
429 // authored default outranks the onDemandDrbs catch-all -- the precedence
430 // establishBearer() gives packet filters. Returns the DRB id (materializing an
431 // on-demand definition's bearer on first use, so it also reaches SDAP's table via
432 // the RRC push), or DRBID_NONE when nothing covers the QFI or the UE is not
433 // attached. Repeated calls return the same bearer. This is SDAP's sole
434 // bearer-selection authority: SDAP holds no default-DRB fallback of its own.
435 DrbId resolveDrbForQfi(MacNodeId ueNodeId, SessionId session, Qfi qfi) override;
436
437 // A bearer of this node was torn down: its DRB id returns to the pair's pool,
438 // unless a static definition owns it for the whole run, and an on-demand
439 // definition's materialization is forgotten
440 void bearerReleased(DrbKey bearer) override;
441
442 // A node has joined a multicast group (its RRC registration tells us through the
443 // node's entry point). Nothing to do at a base station without D2D, where no
444 // sidelink multicast bearer exists; see the D2D subclass.
445 void multicastGroupJoined(MacNodeId nodeId, MacNodeId groupId) override;
446 // This base station's RLC detected the failure of its link to a leg: the leg is
447 // told (ConnectionControlUe::radioLinkFailure())
448 void radioLinkFailure(MacNodeId localId, MacNodeId peerId) override;
449
450 // Mark an externally chosen DRB ID as in use within the pair {a, b}, so
451 // assignDrbId() cannot hand out the same one later (SDAP and the static definitions
452 // name their bearers themselves). The pair's serving base station does it for a
453 // peer that installs a bearer at a UE the peer does not serve.
454 virtual void reserveDrbId(MacNodeId a, MacNodeId b, DrbId drbId);
455
456 // ---- bearer installation at this node, from a peer's control plane ----
457 // The base station's half of a dual connectivity bearer's secondary cell group
458 // (the SN Addition / Modification of TS 36.423 8.7.1, TS 38.423 8.3.1, as the
459 // master runs it), and the RX leg of a multicast bearer at a member's serving
460 // node; each forwards to the node's BearerManagement
461
462 void configureDrb(const DrbDesc& drb) override;
463 void createIncomingConnection(const FlowId& flow, const BearerRequest& req, bool withPdcp) override;
464 void createOutgoingConnection(const FlowId& flow, const BearerRequest& req, bool withPdcp) override;
465 void setUplinkQfiRules(QfiRuleSet&& rules) override;
466};
467
468} //namespace
469
470#endif
Definition ConnectionControlBase.h:42
Definition ConnectionControlEnb.h:78
Definition LteTypes.h:191
An ordered set of QFI-assignment rules, shared by every module that classifies packets to QoS flows.
Definition QfiRuleSet.h:57
Definition AlertReceiver.h:24
constexpr Teid TEID_NONE
GTP-U Tunnel Endpoint Identifier (TS 29.281), chosen by the receiving end of the tunnel.
Definition LteTypes.h:87
constexpr MacNodeId NODEID_NONE
MAC node ID.
Definition LteTypes.h:54
Definition GtpTunnel.h:33
Definition ConnectionControlEnb.h:58
Definition ConnectionControlEnb.h:46
Definition GtpTunnel.h:51
Definition GtpTunnel.h:157
Definition ConnectionControlBase.h:29
Definition GtpTunnel.h:144