本文档展示如何修改ndn-cxx和NFD的源码,添加一个值基本类型的Tag,下面的过程将展示添加一个值为uint64_t类型的Tag SrcAddress

添加Tag的含义

在NDNLPv2协议中定义了LpPacket,具体的格式如下:

LpPacket = LP-PACKET-TYPE TLV-LENGTH*LpHeaderField[Fragment]LpHeaderField = SequenceSequence = SEQUENCE-TYPE TLV-LENGTH 8OCTETFragment = FRAGMENT-TYPE TLV-LENGTH 1*OCTET
  • 其中Fragment放置的可以是一个NDN报的分片,或者是一个完整的NDN包(NDN包足够小,不需要分片的情况);
  • *LpHeaderField就是一系列的LpPacket的Header,类似一个变长的数组,所以可以自己定义新的LpHeader;
  • 所以添加一个新的Tag实际上就是添加一个新的LpHeader。

修改ndn-cxx

  • 修改ndn-cxx/lp/tlv.hpp,为将要添加的新Tag分配一个新的TLV类型

    enum {LpPacket = 100,Fragment = 80,Sequence = 81,FragIndex = 82,FragCount = 83,PitToken = 98,Nack = 800,NackReason = 801,NextHopFaceId = 816,IncomingFaceId = 817,CachePolicy = 820,CachePolicyType = 821,CongestionMark = 832,Ack = 836,TxSequence = 840,NonDiscovery = 844,PrefixAnnouncement = 848,/ add by qjm, for add new tagSrcAddress = 852/
    };
    

    如上所示,我们给新添加的Tag分配了一个TLV type,这个type是唯一标识一个TLV的。并且该值的分配也是需要遵循一定准则的,具体的分配规则可以参考:https://redmine.named-data.net/projects/nfd/wiki/NDNLPv2

    Reserved Blocks

    Two blocks of TLV-TYPEs have been reserved by link protocols:

    TLV-TYPE numbers for LpHeaderField SHOULD be assigned according to the following rules:

    1. if the field can be safely ignored by a receiver that doesn’t understand the field, pick an unused number in the range [800, 959] whose two least significant bits are 00.
    2. if the field would occur frequently, pick an unused number in the range [81, 99].
    3. otherwise, pick an unused number in the range [800, 959] whose two least significant bits are效果 01.

    Note: number assignment for a TLV-TYPE nested within a LpHeaderField is not restricted by the above rules.

  • 修改ndn-cxx/lp/tags.hpp,定义一个新的Tag:

    /// add by qjm, for add new tag
    typedef SimpleTag<uint64_t, 16> SrcAddressTag;
    ///
    
  • 修改ndn-cxx/lp/fields.hpp,添加新Tag对应的Field:

    // add by qjm, for add new tag
    typedef FieldDecl<field_location_tags::Header,uint64_t, tlv::SrcAddress> SrcAddressField;
    BOOST_CONCEPT_ASSERT((Field<SrcAddressField>));
    ///** \brief Set of all field declarations.
    */
    typedef boost
    ::mpl::set<FragmentField,SequenceField,FragIndexField,FragCountField,PitTokenField,NackField,NextHopFaceIdField,IncomingFaceIdField,CachePolicyField,CongestionMarkField,AckField,TxSequenceField,NonDiscoveryField,PrefixAnnouncementField,/// add by qjm, for add new tagSrcAddressField///
    > FieldSet;
    
  • 修改ndn-cxx/face.cpp => extractLpLocalFields

    template<typename NetPkt>
    static void
    extractLpLocalFields(NetPkt &netPacket, const lp::Packet &lpPacket) {addTagFromField<lp::IncomingFaceIdTag, lp::IncomingFaceIdField>(netPacket, lpPacket);addTagFromField<lp::CongestionMarkTag, lp::CongestionMarkField>(netPacket, lpPacket);// add by qjm, for add new tagaddTagFromField<lp::SrcAddressTag, lp::SrcAddressField>(netPacket, lpPacket);//
    }
    

    上面的静态函数是在一个Face从Transport接收到一个Element,进行解析时调用的,功能是 将收到的LpPacket中的LpHeaderField提取,并保存到指定包的Tag列表当中

  • 如果插入的Tag要在Interest包中生效,则需要修改ndn-cxx/impl/face-impl.hpp => asyncExpressInterest

    void
    asyncExpressInterest(RecordId id, shared_ptr<const Interest> interest,const DataCallback &afterSatisfied,const NackCallback &afterNacked,const TimeoutCallback &afterTimeout) {NDN_LOG_DEBUG("<I " << *interest);this->ensureConnected(true);const Interest &interest2 = *interest;auto &entry = m_pendingInterestTable.put(id, std::move(interest), afterSatisfied, afterNacked,afterTimeout, ref(m_scheduler));lp::Packet lpPacket;addFieldFromTag<lp::NextHopFaceIdField, lp::NextHopFaceIdTag>(lpPacket, interest2);addFieldFromTag<lp::CongestionMarkField, lp::CongestionMarkTag>(lpPacket, interest2);// add by qjm, for add new tagaddFieldFromTag<lp::SrcAddressField, lp::SrcAddressTag>(lpPacket, interest2);//entry.recordForwarding();m_face.m_transport->send(finishEncoding(std::move(lpPacket), interest2.wireEncode(),'I', interest2.getName()));dispatchInterest(entry, interest2);
    }
    

    上面新添的代码的功能是将一个要发送的包(Interest、Data等继承自TagHost)中的Tag提取处理出来,并作为一个LpHeaderField写入新构造的lpPacket当中。

  • 如果插入的Tag要在Data包中生效,则需要修改ndn-cxx/impl/face-impl.hpp => asyncPutData

    void
    asyncPutData(const Data &data) {NDN_LOG_DEBUG("<D " << data.getName());bool shouldSendToForwarder = satisfyPendingInterests(data);if (!shouldSendToForwarder) {return;}this->ensureConnected(true);lp::Packet lpPacket;addFieldFromTag<lp::CachePolicyField, lp::CachePolicyTag>(lpPacket, data);addFieldFromTag<lp::CongestionMarkField, lp::CongestionMarkTag>(lpPacket, data);/// add by qjm, for add new tagaddFieldFromTag<lp::SrcAddressField, lp::SrcAddressTag>(lpPacket, data);//m_face.m_transport->send(finishEncoding(std::move(lpPacket), data.wireEncode(),'D', data.getName()));
    }
    

    上面新添的代码的功能是将一个要发送的包(Interest、Data等继承自TagHost)中的Tag提取处理出来,并作为一个LpHeaderField写入新构造的lpPacket当中。

修改NFD

NFD中需要修改daemon/face/generic-link-service.cpp中的两处代码:

  • GenericLinkService::decodeInterest

    void
    GenericLinkService::decodeInterest(const Block &netPkt, const lp::Packet &firstPkt,const EndpointId &endpointId) {...../// add by qjm, for add srcAddress Tagif (firstPkt.has<lp::SrcAddressField>()) {interest->setTag(make_shared<lp::SrcAddressTag>(firstPkt.get<lp::SrcAddressField>()));}///this->receiveInterest(*interest, endpointId);
    }
    

    上面的代码在GenericLinkService解析Interest的时候,提取对应LpPacket中的Field,写入Interest的tags列表当中。

    ps: 由于此处演示的是添加一个Tag,只对于Interest生效,所以需要修改这个函数,如果要对Data包或者Nack等包生效,类比上述代码,对GenericLinkService::decodeDataGenericLinkService::decodeNack之类的进行修改即可

  • GenericLinkService::encodeLpFields

    void
    GenericLinkService::encodeLpFields(const ndn::PacketBase &netPkt, lp::Packet &lpPacket) {...../// add by qjm, for add srcAddress Tagauto srcAddressTag = netPkt.getTag<lp::SrcAddressTag>();if (srcAddressTag != nullptr) {lpPacket.add<lp::SrcAddressField>(*srcAddressTag);}///auto pitToken = netPkt.getTag<lp::PitToken>();if (pitToken != nullptr) {lpPacket.add<lp::PitTokenField>(*pitToken);}
    }
    

    上面新添的代码会在发送一个包的时候调用,目的是将Tag提取出来,座位一个LpHeaderField 添加到LpPacket中。

添加成功后的效果

NDN新增tag的方案相关推荐

  1. 新增网站组网方案与解释说明

    新增网站组网方案与解释说明 1)网站服务内容介绍 当前域名:xxx.com是用来做个人生活记录及信息等功能. 网站结构目录:(子栏目可以根据需求改动) 内容介绍: 网站主要记录生活与分享励志文章的个人 ...

  2. 人才招聘系统phpyun6.0_v6.0.1_6.0.2新增阿里云方案短信插件支持短信群发视频面试聊天插件

    phpyun在招聘类系统里除了骑士外就是行业的佼佼者.但有一个缺点就是短信类业务/视频面试和聊天都是独立自主的系统非第三方,这样很多开发者在使用方面就受到了不少限制,比如二次开发还有就是性价比方面,阿 ...

  3. 【NDN实验】ndnSIM: NDN simulator for NS-3 全文翻译

    ndnSIM: NDN simulator for NS-3 Alexander Afanasyev, Ilya Moiseenko, and Lixia Zhang 摘要 命名数据网络是一种新提出的 ...

  4. 一种用于NDN的安全的链路状态路由协议

    原文地址:A Secure Link State Routing Protocol for NDN 摘要(Abstract) 命名数据链路状态路由协议(NLSR,Named-data Link Sta ...

  5. 强平日志模块-埋点方案

    文章目录 背景介绍 当前日志精简图 当前强平流程图 当前互斥模块流程图 整体需求 功能需求 质量需求 整体流程 日志流程 日志写入交互时序 写入日志文件 写入消息队列交互时序 日志查询交互时序 从日志 ...

  6. git tag 功能笔记

    您可以在專案裡面隨意新增 Tag,方便您紀錄訊息,底下一些基本的操作來學習如何使用標籤(Tag)功能(新增標籤.以及各種不同類型標籤之間的差別). 列出既有標籤 直接使用 git tag 即可 $ g ...

  7. 【NDN转发】Community Aware Content Retrieval in Disruption Tolerant Networks 全文翻译

    Community Aware Content Retrieval in Disruption Tolerant Networks 延迟容忍网络中基于社团感知的内容获取研究 You Lu, Mario ...

  8. 文档标签化的几种方案

    前言: 文档标签化, 就是从文档中抽取若干标签,来定义和表示文本,使文档更容易的进行计算.索引.表示.当然前提是已经有了一个标签词库.量少的话可以人工进行编写业务相关词典.量大的话可以用机器生成然后进 ...

  9. 金蝶云星空与管易云对接集成其他入库查询打通其他入库单新增完结接口v2

    数据源平台:金蝶云星空 金蝶K/3Cloud结合当今先进管理理论和数十万家国内客户最佳应用实践,面向事业部制.多地点.多工厂等运营协同与管控型企业及集团公司,提供一个通用的ERP服务平台.K/3Clo ...

最新文章

  1. 火狐推荐几个实用的插件
  2. Java带有运算符的字符串转换为Long型
  3. Centos Another app is currently holding the yum lock
  4. mysql数据库中的校对集
  5. 3dmax导出obj序列_Houdini导出序列图片
  6. 指路明灯,99%自动化测试从业者都该看的职业规划
  7. 【java学习之路】(java SE篇)004.面向对象基础入门part1
  8. 无线鼠标全国产化电子元件推荐方案
  9. jQuery源码解读一
  10. QTreeView QTreeWidget改变图标大小
  11. 编写程序:实现输出100以内质数的功能
  12. 如何把caj转成pdf
  13. python控制led灯渐变_LED彩灯渐变控制器使用说明书
  14. 大一作业HTML网页作业:简单的旅游 1页 (旅游主题)
  15. 第八章、使用matplotlib绘制高级图表
  16. GNU Radio: 射频子板
  17. 为什么全国计算机考小黑,稳住!我想你应该需要计算机二级考后须知
  18. 浏览器内核引擎分类归纳
  19. jitsi-meet 主持人退出会议后结束会议室(网页访问)
  20. 南邮-软件设计实验(Java GUI版)

热门文章

  1. 一维参照物的摄像机定标
  2. 阿里云视频点播服务(上传,删除,获取播放地址,获取播放凭证)
  3. iPhone无法连接Wi-Fi解决方法
  4. 4K秒开,稀缺宝藏影视APP!
  5. 数据结构与算法综合实验——队列实现停车场管理系统
  6. 超级玛丽游戏(C语言)
  7. 常用DOS命令之通俗易懂篇
  8. (文献随笔)肿瘤浸润的活化B细胞抑制结直肠癌的肝转移(Cell Report, 2022年8月30日)
  9. 修改VirtualBox上的macOS屏幕分辨率1920*1080,virtualbox5.2版本方法
  10. 大数据面试技巧——个人总结(持续更新)