MultiOperator.ned

NED File simulations/nr/mec/multiOperator/MultiOperator.ned

Name Type Description
MultiOperator network

Two operator networks side by side. Each has three gNodeB cells chained by X2, an intermediate Upf that feeds them and carries the operator's MecHost, an anchor Upf, and a Ualcmp with its MecOrchestrator. The two anchor Upf nodes meet at a shared router, the only node the operators have in common. numUe_A and numUe_B NrUe terminals attach to operator A and B respectively, and numBgCells BackgroundCell cells can be added as interferers.

Source code

//
//                  Simu5G
//
// Copyright (C) 2019-2021 Giovanni Nardini, Giovanni Stea, Antonio Virdis et al. (University of Pisa)
// Copyright (C) 2022-2026 Giovanni Nardini, Giovanni Stea et al. (University of Pisa)
//
// 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.simulations.nr.mec.multiOperator;

import inet.networklayer.configurator.ipv4.Ipv4NetworkConfigurator;
import inet.networklayer.ipv4.RoutingTableRecorder;
import inet.node.ethernet.Eth10G;
import inet.node.inet.Router;
import simu5g.common.binder.Binder;
import simu5g.common.carrierAggregation.CarrierAggregation;
import simu5g.corenetwork.bearerConfigurator.BearerConfigurator;
import simu5g.nodes.NrUe;
import simu5g.nodes.gNodeB;
import simu5g.nodes.Upf;
import simu5g.nodes.BackgroundCell;
import simu5g.nodes.MecHost;
import simu5g.mec.orchestrator.MecOrchestrator;
import simu5g.mec.ualcmp.Ualcmp;
import simu5g.world.radio.LteChannelControl;


//
// Two operator networks side by side. Each has three ~gNodeB cells chained by X2,
// an intermediate ~Upf that feeds them and carries the operator's ~MecHost, an
// anchor ~Upf, and a ~Ualcmp with its ~MecOrchestrator. The two anchor ~Upf nodes
// meet at a shared router, the only node the operators have in common. numUe_A
// and numUe_B ~NrUe terminals attach to operator A and B respectively, and
// numBgCells ~BackgroundCell cells can be added as interferers.
//
// Operator B's MEC system -- its ~MecHost, ~MecOrchestrator and ~Ualcmp -- is
// conditional on the enableMecOperatorB parameter. The addresses of the network
// interfaces are assigned in demo.xml.
//
network MultiOperator
{
    parameters:
        // The gNBs connect to a 5GC (Upf), so every cellular stack has SDAP:
        // TS 37.324 ties SDAP to the 5GC connection, not to the radio
        **.cellularNic.hasSdap = default(true);
        int numUe_A = default(1);
        int numUe_B = default(1);
        int numBgCells = default(0);
        bool enableMecOperatorB = default(true);
        @display("i=block/network2;bgb=1627,801;bgi=background/pisa");
    submodules:
        channelControl: LteChannelControl {
            @display("p=50,25;is=s");
        }
        routingRecorder: RoutingTableRecorder {
            @display("p=50,75;is=s");
        }
        configurator: Ipv4NetworkConfigurator {
            @display("p=50,125;is=s");
        }
        binder: Binder {
            @display("p=50,175;is=s");
        }
        bearerConfigurator: BearerConfigurator {
            @display("p=50,225;is=s");
        }
        carrierAggregation: CarrierAggregation {
            @display("p=50,275;is=s");
        }
        router: Router {
            @display("p=750,73");
        }
        upf_A: Upf {
            @display("p=625,173");
        }
        upf_B: Upf {
            @display("p=875,173");
        }
        iUpf_A: Upf {
            @display("p=623,281");
        }
        iUpf_B: Upf {
            @display("p=874,281");
        }
        gnb_A1: gNodeB {
            @display("p=274,454;is=vl");
        }
        gnb_A2: gNodeB {
            @display("p=800,452;is=vl");
        }
        gnb_A3: gNodeB {
            @display("p=1245,452;is=vl");
        }
        gnb_B1: gNodeB {
            @display("p=330,514;is=vl");
        }
        gnb_B2: gNodeB {
            @display("p=848,513;is=vl");
        }
        gnb_B3: gNodeB {
            @display("p=1304,513;is=vl");
        }
        bgCell[numBgCells]: BackgroundCell {
            @display("p=138,630;is=vl");
        }
        ue_A[numUe_A]: NrUe {
            @display("p=717,691");
        }
        ue_B[numUe_B]: NrUe {
            @display("p=937,691");
        }

        //# MEC modules
        mecHost_A: MecHost {
            @display("p=273,281");
        }
        mecHost_B: MecHost if enableMecOperatorB {
            @display("p=1245,281");
        }
        mecOrchestrator_A: MecOrchestrator {
            @display("p=273,73");
        }
        mecOrchestrator_B: MecOrchestrator if enableMecOperatorB {
            @display("p=1245,73");
        }
        ualcmp_A: Ualcmp {
            @display("p=490,73");
        }
        ualcmp_B: Ualcmp if enableMecOperatorB {
            @display("p=1027,73");
        }

    connections:

        //# 5G Core Network connections
        upf_A.pppg++ <--> Eth10G <--> iUpf_A.pppg++;
        iUpf_A.pppg++ <--> Eth10G <--> mecHost_A.ppp++;
        iUpf_A.pppg++ <--> Eth10G <--> gnb_A1.ppp;
        iUpf_A.pppg++ <--> Eth10G <--> gnb_A2.ppp;
        iUpf_A.pppg++ <--> Eth10G <--> gnb_A3.ppp;

        upf_B.pppg++ <--> Eth10G <--> iUpf_B.pppg++;
        iUpf_B.pppg++ <--> Eth10G <--> mecHost_B.ppp++ if enableMecOperatorB;
        iUpf_B.pppg++ <--> Eth10G <--> gnb_B1.ppp;
        iUpf_B.pppg++ <--> Eth10G <--> gnb_B2.ppp;
        iUpf_B.pppg++ <--> Eth10G <--> gnb_B3.ppp;

        //# MEC-related connections
        router.pppg++ <--> Eth10G <--> upf_A.dnPppg;
        ualcmp_A.ppp++ <--> Eth10G <--> router.pppg++;
        ualcmp_A.toMecOrchestrator --> mecOrchestrator_A.fromUALCMP;
        ualcmp_A.fromMecOrchestrator <-- mecOrchestrator_A.toUALCMP;

        router.pppg++ <--> Eth10G <--> upf_B.dnPppg;
        ualcmp_B.ppp++ <--> Eth10G <--> router.pppg++ if enableMecOperatorB;
        ualcmp_B.toMecOrchestrator --> mecOrchestrator_B.fromUALCMP if enableMecOperatorB;
        ualcmp_B.fromMecOrchestrator <-- mecOrchestrator_B.toUALCMP if enableMecOperatorB;

        //# X2 connections
        gnb_A1.x2++ <--> Eth10G <--> gnb_A2.x2++;
        gnb_A2.x2++ <--> Eth10G <--> gnb_A3.x2++;
        gnb_B1.x2++ <--> Eth10G <--> gnb_B2.x2++;
        gnb_B2.x2++ <--> Eth10G <--> gnb_B3.x2++;
}