NFD无线传输修改
修改NFD支持无线传输
想要将NFD改成无线模式有两种方式,一种是为无线网卡配置adhoc模式,通过网卡实现的802.11链路层的协议,以及相关的帧交换,用户端在使用时只需要构造出想要发送的数据并发送到网卡即可。另外一种是将网卡配置为monitor模式,这样就需要自己为发送的数据包添加字段,构造为符合802.11协议的数据包。
方法一:配置adhoc模式
将无线网卡配置adhoc模式,这种方式改动量很小,只需要将网卡配置为adhoc模式,网卡全权负责数据包帧格式的转换。配置adhoc模式的方法为:
1 | nic_name=$1 |
执行脚本时需要输入网卡名和信道号,测试时采取的是13信道(2.472GHz),干扰相对较小。如果两个网卡在配置完adhoc模式后分到了一个cell里,则配置成功。
由于网卡负责后序对包的帧结构进行处理,配置成功后不需要修改NFD和ndn-cxx的源码,直接可以发送成功。发送的包在wireshark中的显示和实际发送的数据内容相同。
但是如果是在监听模式下,收到的包会增加其他的字段。
此外,其他网卡启动monitor模式监测信道中的包时,会发现每节点每秒中会有大约10个广播包(wireshark抓包结果,不排除同一个包显示了多次的可能性),猜测广播包的作用是进行链路层的探测。探测包的结构如下:
测试了一下将目标MAC地址和NLSR配置变成全F,wireshark能抓到包,但是无法正常解析。正确的做法应该是NLSR配置实际的网卡MAC地址,配置face时设置为全F。但是此时NLSR里配置的邻居的MAC地址和全F不符,需要修改NLSR代码。
修改目标地址为广播需要将NFD的ethernet-factory.cpp
的187-190行对多播的判断注释掉。
1 | if (remoteEndpoint.isMulticast()) { |
方法二:配置monitor模式
将无线网卡都配置成monitor模式,在这种模式下,需要自己对数据包的帧结构进行调整,网卡只负责收发数据,不修改帧结构。因此此模式下需要修改NFD收发包过程。
配置monitor模式:
1 | sudo ifconfig wlp0s20f3 down |
修改NFD代码:
1. 修改对接口状态的判断
首先,网卡为monitor模式时,会将网卡的状态设置为NO_CARRIER,在ndn-cxx的network-monitor-impl-netlink.cpp中,强制将其跳过,另外忽略OPER_STATE_DORMANT。还需要将解析链路状态的unknown忽略
1 | static void |
2. 修改创建信道时的判断
注释掉EthernetFactory::applyUnicastConfigToNetif
和EthernetFactory::applyMcastConfigToNetif
函数对以太网face的判断
1 | shared_ptr<EthernetChannel> |
3.修改对网卡数据链路层的判断
原来的NFD限制了链路层必须为DLT_EN10MB
类型,现在改为了获取网卡的链路层类型,再执行原来的处理。PcapHelper::newactivate()
在activate函数的基础上加了获取网卡的链路层类型的功能。
1 | try { |
4. 修改发包流程
本质上就是构造出完整的IEEE802.11帧结构,参考了ndnSIM仿真中的包结构,修改ethernet-transport.cpp,加入了radiotap,durationtime,LLC子层,FCS等字段。
原来的帧结构:(目的地址,源地址,协议类型(0x8624),NDN包)
现在的帧结构:(radiotap,durationtime,目的地址,源地址,LLC子层,协议类型,NDN包,FCS)
1 | void |
构造后的包在wireshark中抓包如下:
5. 修改收包流程
首先需要修改接收到包对收发地址和协议类型的判断,在ethernet-protocal.cpp中
1 | std::pair<const ether_header*, std::string> |
最后是修改ethernet-transport的收包流程,收包时跳过对应的帧头字段。
1 | void |