INET veins-5.1-i2下AODV扩展插入TLV选项报TLVoptions not found错误
无法检索到插入的TlvOption的原因
- 头部指针未更新:你在
setCBFOptionOnNetworkDatagram方法中,是将IPv4头部从数据包中取出、修改本地副本后再插回数据包,但是后续调用getCBFOptionFromNetworkDatagram时传入的还是修改前的旧networkHeader指针,该指针指向的头部没有包含新增的TlvOption,自然检索不到。 - 自定义类未注册:INET框架的TlvOption基于反射机制实现解析,如果你自定义的
CBFOption类没有注册到框架的类工厂,IPv4头部解析时会将对应类型的选项判定为未知选项直接跳过,无法实例化为CBFOption对象,查找时返回空。 - 选项类型冲突:你复用了
IPOPTION_TLV_GPSR作为CBF选项的类型值,如果GPSR协议已经注册了该类型对应的解析类,框架解析时会优先实例化GPSR的选项类,你用check_and_cast转换为CBFOption*时会失败返回空。
修复方案
- 修正头部指针引用逻辑:在完成选项插入操作后,重新从数据包中读取更新后的IPv4头部,用新的头部指针执行检索操作,不要复用修改前的旧指针。
修改ensureRouteForDatagram中的对应代码段:
CBFOption *cbfOption = createCBFOption(networkHeader->getDestinationAddress()); setCBFOptionOnNetworkDatagram(datagram, networkHeader, cbfOption); // 新增:重新从数据包获取更新后的IPv4头部 datagram->trimFront(); auto newIpv4Header = removeNetworkProtocolHeader<Ipv4Header>(datagram); insertNetworkProtocolHeader(datagram, Protocol::ipv4, newIpv4Header); // 用新的头部指针检索选项 auto cOption = const_cast<CBFOption *>(getCBFOptionFromNetworkDatagram(newIpv4Header));
- 注册自定义CBFOption类:在
CBFOption.cc文件中添加类注册代码,让INET框架可以识别并实例化你的自定义选项类:
Register_Class(CBFOption);
同时确认CBFOption类的getOptionType()方法返回值和你设置的IPOPTION_TLV_GPSR一致。
3. 可选:避免选项类型冲突:如果你的项目中同时用到了GPSR协议,建议从IANA未分配的IPv4选项类型码中选择一个值替换IPOPTION_TLV_GPSR,避免不同协议的选项类型冲突。
内容的提问来源于stack exchange,提问作者Dalia Adly
相关产品推荐
相关产品推荐

