NrSdap.ned

NED File src/simu5g/stack/sdap/NrSdap.ned

Name Type Description
NrSdap simple module

Implements the SDAP Protocol.

Source code

//
//                  Simu5G
//
// Authors: Mohamed Seliem (University College Cork)
//
// 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.sdap;

//
// Implements the SDAP Protocol.
//
// For PDUs received from the PDCP layer, extracts SDAP headers (if present),
// restores the associated QoS Flow based on QFI, and forwards the resulting SDUs
// to the upper layer (IP, Ethernet, or application for unstructured sessions).
//
// For SDUs received from the upper layer, performs QFI-to-DRB mapping,
// encapsulates the data with SDAP headers if needed, and forwards the packets
// to the PDCP layer. On the gNB DL path, the QFI is always taken from the
// QfiReq tag (set by GtpUser). On the UE UL path two sources may answer: the
// classified QFI (the QfiReq tag, stamped by ~QosFlowClassifier's rules or set
// by the application directly) and a reflective QoS match, the rule derived
// from observed downlink traffic. When both answer, reflectiveQosOverridesQfi
// says which wins; one alone is used as-is; a packet with neither joins the
// default QoS flow (QFI 0, the default DRB).
//
// Whether a bearer's packets carry an SDAP header is the control plane's
// decision, delivered per bearer in the pushed configuration (computed by
// ~BearerConfigurator: a header is needed exactly when the QFI could not be
// recovered from the DRB alone on the RX side, unless the configuration
// suppresses it -- see the suppressSdapHeader entry field there). On a
// headerless bearer both ends agree on the one QFI it carries -- its sole
// mapped QFI, or QFI 0 when none is mapped: RX assigns that value to every
// packet, and TX verifies each packet against it, stopping with an error when
// another QoS flow shows up.
//
// Flows of the D2D machinery are outside SDAP and pass through this module
// untouched in both directions: their bearers are peer-keyed, carry no QoS
// flows, and ~Ip2Nic assigns them (3GPP sidelink has its own SL-SDAP over
// PC5, which is not modeled). This holds in either mode -- a D2D-capable
// pair's flow keeps its ownership while in infrastructure mode, since the
// mode switch tears down and re-establishes within that machinery.
//
// Supports all 3GPP PDU session types (IPv4, IPv6, Ethernet, Unstructured)
// via the pduSessionType field of the bearer configuration.
//
// SDAP does not author its own configuration: the QFI-to-DRB mapping and the
// per-bearer SDAP settings are authored network-wide (see the staticDrbs
// parameter of ~BearerConfigurator), delivered to RRC, and pushed into this module from
// there at initialization.
//
// Gates:
//  - upperLayerIn/upperLayerOut: connects to the upper layer (Ip2Nic or app).
//  - pdcpIn/pdcpOut: connects to the PDCP layer.
//
simple NrSdap like INrSdap
{
    parameters:
        string nodeRole @enum("UE", "gNB");  // Node role: "UE" or "gNB" - determines reflective QoS behavior
        string bearerConfiguratorModule = default("bearerConfigurator");
        bool establishBearersOnDemand = default(true);  // When false, a packet that finds no established bearer raises an error instead of establishing one (static bearers are established up front; see the staticDrbs parameter of ~BearerConfigurator)
        string reflectiveQosTableModule = default("");  // UE only: path to ReflectiveQosTable module (empty = disabled)
        bool useReflectiveQos = default(false); // UE only
        bool reflectiveQosOverridesQfi = default(false);  // UE only: when a packet has both a classified QFI (QfiReq tag) and a reflective QoS match, true = the reflective QFI wins, false = the classified one; a packet with only one of the two always uses it
        @display("i=block/layer");
    gates:
        input upperLayerIn;     // From upper layer (Ip2Nic or app)
        output upperLayerOut;   // To upper layer (Ip2Nic or app)
        input pdcpIn;           // From PDCP layer
        output pdcpOut;         // To PDCP layer
}