DcPdcpLegSplitter.ned

NED File src/simu5g/stack/pdcp/DcPdcpLegSplitter.ned

Name Type Description
DcPdcpLegSplitter simple module

TX-side leg dispatcher of a dual-connectivity split bearer (two legs), steering each PDCP PDU to a leg from the split policy RRC pushes off the bearer's definition (TS 38.331 PDCP-Config, TS 38.323 5.2.1). A splitter serves exactly one direction: a UE's TX side is uplink, a base station's is downlink.

Source code

//
//                  Simu5G
//
// Authors: Andras Varga (OpenSim Ltd)
//
// This file is part of a software released under the license included in file
// "license.pdf". Please read LICENSE and README files before using it.
// The above files and the present reference are part of the software itself,
// and cannot be removed from it.
//

package simu5g.stack.pdcp;

//
// TX-side leg dispatcher of a dual-connectivity split bearer (two legs), steering
// each PDCP PDU to a leg from the split policy RRC pushes off the bearer's definition
// (TS 38.331 PDCP-Config, TS 38.323 5.2.1). A splitter serves exactly one direction:
// a UE's TX side is uplink, a base station's is downlink.
//
// Uplink (at the UE, which has both legs' RLC queues locally): below the
// ul-DataSplitThreshold the bearer stays on its primary path; at or above it, either
// leg may be used, and the spec leaves that choice to the implementation. The splitter
// fills it with ulLegSelection if the definition carries one, else by offloading to
// the least-occupied leg.
//
// Downlink (at the DC master): the secondary leg's RLC queue is at another node,
// across X2, and cannot be weighed here, so there is no threshold or load-balancing --
// dlLegSelection decides each PDU's leg, or the bearer stays on its primary leg. (Real
// downlink split flow control is X2-feedback-driven and is not modeled.)
//
// The leg-selection expression (RRC passes the direction's -- ulLegSelection or
// dlLegSelection) is over the per-bearer PDU counter "packetOrdinal" and returns the
// leg index directly, e.g. packetOrdinal % 2 for round robin. A single-leg (MCG or
// SCG) bearer has nothing to steer, and the module serves its second role alone.
//
// Legs whose peer is not attached are not offered to either policy: with one leg
// live the choice is made already. That leg's DC-specific id mapping on the way out
// is selected by its cell group (the legs parameter):
//  - an MCG leg (the anchor stack): ids already correct; emits pdcpSduSent.
//  - an SCG leg on a UE (the local secondary stack): rewrites the flow's
//    source/destination to that stack's node ids (serving node looked up per
//    packet, so handover is honored); emits pdcpSduSentNr.
//  - an SCG leg on a DC master (remote leg): rewrites the ids to (secondary
//    node, the UE's secondary-stack id) and adds the X2 addressing tag; the
//    PDU leaves via the DcMux.
//
// If no leg is live at all, the PDU falls back to leg 0 with a warning.
//
simple DcPdcpLegSplitter like IPdcpLegSplitter
{
    parameters:
        int numLegs;                        // Number of legs (set by the enclosing PdcpEntityBase)
        string legs;                        // Cell group of each leg, space-separated "MCG"/"SCG" (set by the enclosing PdcpEntityBase)
        string binderModule = default("binder");
        // The split policy (primary path, split threshold) and any legSelection override
        // are pushed by RRC from the bearer's definition; see banner comment.
        @display("i=block/dispatch");
        @signal[sentPacketToLowerLayer];
        @signal[pdcpSduSent];
        @signal[pdcpSduSentNr];
    gates:
        input in;               // PDUs from the TX entity
        output out[];           // To leg k (sized by the enclosing PdcpEntityBase's connections)
}