LTE用户文档



(如有不当的地方,欢迎指正!)



14 Evolved Packet Core (EPC)



 



我们现在讲解如何编写一个仿真程序——除了 LTE 无线接入网外,还允许仿真 EPC。 EPC 允许使用 IPv4 网络与 LTE 设备连接。换句话说,可以在 LTE 上使用常规的 ns-3 应用和 IPv4  sockets ,并且能够把 LTE 网络与仿真中的任何 IPv4 网络相连接。



 



首先,除了我们已经在 Basic simulation program



 



Ptr<LteHelper> lteHelper = CreateObject<LteHelper> ();
Ptr<PointToPointEpcHelper> epcHelper = CreateObject<PointToPointEpcHelper> ();


 



然后,你需要告诉 LTE helper 接下来要使用 EPC:



 


lteHelper->SetEpcHelper (epcHelper);

 



上面一步是很有必要的, LTE helper 将触发合适的 EPC 配置与一些相关的重要配置,例如当一个基站或用户添加到仿真中时或者创建一个EPS 承载时。另外,所有这些实现都不受用户的干预。



 



调用 lteHelper->SetEpcHelper (epcHelper) 会使能 EPC 起作用,同时具有副作用——创建的任何新的 LteEnbRrc 所拥有的 EpsBearerToRlcMapping 属性设置为 RLC_UM_ALWAYS 而不是 RLC_TM_ALWAYS(原文档中写的是RLC_SM_ALWAYS,有误!) ,如果后者是默认的话;否则,属性不会改变(例如,如果你修改默认属性为 RLC_AM_ALWAYS, 它将不会变动)。



 



注意, EpcHelper 也会自动地创建 PGW 节点并配置它,以便它可以合适地处理来自/去往 LTE 无线接入网的业务。不过,你需要添加一些明确的代码来连接 PGW 到其他的 IPv4 网络(例如因特网)。这里有一个非常简单的例子——如何通过点对点链路连接单个远程主机到 PGW :



Ptr<Node> pgw = epcHelper->GetPgwNode (); 
// 创建一个远程主机
NodeContainer remoteHostContainer;
remoteHostContainer.Create (1); 
Ptr<Node> remoteHost = remoteHostContainer.Get (0);
InternetStackHelper internet;
internet.Install (remoteHostContainer);
 
// 创建 internet
PointToPointHelper p2ph;
p2ph.SetDeviceAttribute ("DataRate", DataRateValue (DataRate ("100Gb/s"))); 
p2ph.SetDeviceAttribute ("Mtu", UintegerValue (1500)); 
p2ph.SetChannelAttribute ("Delay", TimeValue (Seconds (0.010))); 
NetDeviceContainer internetDevices = p2ph.Install (pgw, remoteHost); 
Ipv4AddressHelper ipv4h;
ipv4h.SetBase ("1.0.0.0", "255.0.0.0");
Ipv4InterfaceContainer internetIpIfaces = ipv4h.Assign (internetDevices);
// 接口 0 为本地主机,1 为 p2p 设备
Ipv4Address remoteHostAddr = internetIpIfaces.GetAddress (1);



 



指定路由很重要,以便远程主机可以到达 LTE 用户。实现这的一个方式是利用这样一个事实——PointToPointEpcHelper 默认会分配 LTE 用户一个7.0.0.0 网络的 IP 地址。只要考虑到这一点就足够了:



 



Ipv4StaticRoutingHelper ipv4RoutingHelper;
Ptr<Ipv4StaticRouting> remoteHostStaticRouting = ipv4RoutingHelper.GetStaticRouting (remoteHost->GetObject<Ipv4> ()); 
remoteHostStaticRouting->AddNetworkRouteTo (Ipv4Address ("7.0.0.0"), Ipv4Mask ("255.0.0.0"), 1);



 



现在,你应该继续并创建 LTE 基站和用户(参考前面章节)。 当然,你可以配置 LTE 的其他方面,例如路径损耗和衰落模型。 一旦你创建完用户,你应该也给它们配置 IP 网络。按照下面的方式实现。我们假定你有一个装用户和基站节点的容器,类似于:



 

NodeContainer ueNodes;
NodeContainer enbNodes;



 



配置一个只有 LTE 的仿真,你通常会这样做:



 



NetDeviceContainer ueLteDevs = lteHelper->InstallUeDevice (ueNodes);
lteHelper->Attach (ueLteDevs, enbLteDevs.Get (0));



 



为了给用户配置 IP 网络,你只需要额外添加这些:



 

// 在用户上安装 IP 协议栈
InternetStackHelper internet;
internet.Install (ueNodes);

// 给用户分配 IP 地址
for (uint32_t u = 0; u < ueNodes.GetN (); ++u)
  {
    Ptr<Node> ue = ueNodes.Get (u);
    Ptr<NetDevice> ueLteDevice = ueLteDevs.Get (u);
    Ipv4InterfaceContainer ueIpIface = epcHelper->AssignUeIpv4Address (NetDeviceContainer (ueLteDevice));
    // 为用户设置默认网关
    Ptr<Ipv4StaticRouting> ueStaticRouting = ipv4RoutingHelper.GetStaticRouting (ue->GetObject<Ipv4> ());
    ueStaticRouting->SetDefaultRoute (epcHelper->GetUeDefaultGatewayAddress (), 1);
  }



 



 EPC 的承载激活与 LTE-only 仿真稍微不同。首先,当使用 EPC 时,不再使用 ActivateDataRadioBearer 方法。其次,使用 EPC ,当你调用 LteHelper::Attach () 时,默认的 EPS 承载将自动激活。第三,如果你想设置专用的 EPS 承载,你可以使用方法  LteHelper::ActivateDedicatedEpsBearer () 来实现。 该方法被看作一个参数 Traffic Flow Template (TFT,业务流模板)——一个定义业务(会被映射到专用的 EPS 承载上)类型的结构体。下面一个例子讲的是,当用户在端口 1234 通信时,如何为应用设置专用的无线承载:



 



Ptr<EpcTft> tft = Create<EpcTft> ();
EpcTft::PacketFilter pf;
pf.localPortStart = 1234;
pf.localPortEnd = 1234;
tft->Add (pf);
lteHelper->ActivateDedicatedEpsBearer (ueLteDevs, EpsBearer (EpsBearer::NGBR_VIDEO_TCP_DEFAULT), tft);



 



你当然也可以使用自定义的 EpsBearer 和 EpcTft 配置,请参考 doxygen 文档来学习如何实现它。



 



最后,你可以在 LTE 用户节点上安装应用,通过因特网与远程应用进行通信。这可以通过一般的ns3 过程实现。 接下来是一个简单的例子,一个远程主机,如何设置下行通信,远程主机上有一个 UdpClient 应用,LTE 用户(与前面的代码片段使用相同的变量名)上有一个 PacketSink。



 



uint16_t dlPort = 1234;
PacketSinkHelper packetSinkHelper ("ns3::UdpSocketFactory",
                                  InetSocketAddress (Ipv4Address::GetAny (), dlPort));
ApplicationContainer serverApps = packetSinkHelper.Install (ue);
serverApps.Start (Seconds (0.01));
UdpClientHelper client (ueIpIface.GetAddress (0), dlPort);
ApplicationContainer clientApps = client.Install (remoteHost);
clientApps.Start (Seconds (0.01));



 



好了,现在你可以像往常一样开始你的仿真:



 



Simulator::Stop (Seconds (10.0));
Simulator::Run ();



 

 

参考文献

https://www.nsnam.org/docs/models/html/lte-user.html