NS-3源码学习(七)含有MLD设备的WiFi系统

发布时间 2023-12-13 17:23:46作者: PolarisZg

MLD介绍

除去4kQAM,6GHz载频这样的物理层的改进,WiFi 7最大的亮点就是设计了MLD设备,允许同一个设备在物理层上使用两个乃至多个信道传输数据。实际上这个技术在WiFi 6时期已经被实现,例如各大手机厂商推出的双WiFi加速技术,便是利用两个不同的链路来传输数据。不过那些属于网络层的技术,需要网络层乃至应用层去适配和管理,这就导致粒度过大而无法发挥出全部的性能。WiFi 7引入的multi-Link技术在链路层实现,链路层对上层仅提供一个接口。

华为公司的双WiFi加速功能

MLD技术示意图

NS-3中对MLD仿真环境的搭建

搭建一个所有设备连接到所有信道上的环境不难,仅需要多添加一些sta结点即可。但是搭建既有MLD,又有仅连接到单一channel的device,这样的环境确实卡了我很长时间。

主要的困难如下:在NS-3中使用了很多Helper函数将一些模块打包供用户使用,当创建WiFi系统时,一般的做法是配置phy和mac的helper函数,然后通过wifihelper函数调用上述两个helper后将phy层和mac层安装到device中,这之后网络层乃至更高层去使用device,

channel则在配置phy层的helper函数时被安装到phy层。

这里就出现了一个困难,配置phy时,需要将结点需要的channel安装到phy中,配置wifihelpr时,需要设置监视的channel的数量,以便其配置stationManagers管理WiFi结点访问channel的权限和机会(txop),在wifihelper的install函数中出现了这样的代码:

NS_ABORT_MSG_IF(stationManagers.size() != phys.size(),
                        "Number of station manager models ("
                            << stationManagers.size() << ") does not match the number of links ("
                            << phys.size() << ")");

也就是说,phy层连接的channel和stationManager管理的channel必须要一致才行。

这里有一个很自然的想法,就是我再新建一个wifihelper不就好了吗,但是又有一个矛盾,新建的helper,乃至于新建的channel,和连接到AP的channel在仿真时是同一个吗?如果不使用同一个实例化的wifihelper甚至于不是同一个被实例化的channel,仅仅是在配置的时候写入了同样的参数,那他们在底层会被认为是一个吗?

经过不断的修改代码,可以得到这样的结论:

  • wifihelper可以不使用同一个被实例化的对象,它仅仅是一个辅助类;
  • phyhelper也可以不使用同一个;
  • machelper也可以不是同一个;
  • MultiModelSpectrumChannel必须是同一个,指向这个实例化对象的指针是使用工厂类创建的,并添加了损失模型:
Ptr<MultiModelSpectrumChannel> spectrumChannelLink0 = CreateObject<MultiModelSpectrumChannel>();
Ptr<LogDistancePropagationLossModel> lossModel =
        CreateObject<LogDistancePropagationLossModel>();
spectrumChannelLink0->AddPropagationLossModel(lossModel);

整体的流程图如下所示:

img