NDN新加Tag
本文档展示如何修改ndn-cxx和NFD的源码,添加一个值基本类型的Tag,下面的过程将展示添加一个值为uint64_t
类型的Tag SrcAddress。
添加Tag的含义
在NDNLPv2协议中定义了LpPacket,具体的格式如下:
1 | LpPacket = LP-PACKET-TYPE TLV-LENGTH |
- 其中Fragment放置的可以是一个NDN报的分片,或者是一个完整的NDN包(NDN包足够小,不需要分片的情况);
- LpHeaderField就是一系列的LpPacket的Header,类似一个变长的数组,所以可以自己定义新的LpHeader;
- 所以添加一个新的Tag实际上就是添加一个新的LpHeader。
修改ndn-cxx
- 修改
ndn-cxx/lp/tlv.hpp
,为将要添加的新Tag分配一个新的TLV类型
1 | enum { |
如上所示,我们给新添加的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:
- [80, 100]: 1-octet encoding
- [800, 1000]: 3-octet encoding
TLV-TYPE numbers for LpHeaderField SHOULD be assigned according to the following rules:
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.
if the field would occur frequently, pick an unused number in the range [81, 99].
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:
1 | /// add by LZH, for add new tag |
- 修改ndn-cxx/lp/fields.hpp,添加新Tag对应的Field:
1 | // add by qjm, for add new tag |
- 修改
ndn-cxx/face.cpp => extractLpLocalFields
:
1 | template<typename NetPkt> |
上面的静态函数是在一个Face从Transport接收到一个Element,进行解析时调用的,功能是 将收到的LpPacket中的LpHeaderField提取,并保存到指定包的Tag列表当中。
- 如果插入的Tag要在Interest包中生效,则需要修改
ndn-cxx/impl/face-impl.hpp => ExpressInterest:
1 | void |
上面新添的代码的功能是将一个要发送的包(Interest、Data等继承自TagHost)中的Tag提取处理出来,并作为一个LpHeaderField写入新构造的lpPacket当中。
如果插入的Tag要在Data包中生效,则需要修改ndn-cxx/impl/face-impl.hpp => PutData:
1 | void |
上面新添的代码的功能是将一个要发送的包(Interest、Data等继承自TagHost)中的Tag提取处理出来,并作为一个LpHeaderField写入新构造的lpPacket当中。
修改NFD
NFD中需要修改daemon/face/generic-link-service.cpp
中的两处代码:
GenericLinkService::decodeInterest
1 | void |
上面的代码在GenericLinkService解析Interest的时候,提取对应LpPacket中的Field,写入Interest的tags列表当中。
ps: 由于此处演示的是添加一个Tag,只对于Interest生效,所以需要修改这个函数,如果要对Data包或者Nack等包生效,类比上述代码,对GenericLinkService::decodeData,GenericLinkService::decodeNack之类的进行修改即可
GenericLinkService::encodeLpFields
1 | void |
上面新添的代码会在发送一个包的时候调用,目的是将Tag提取出来,座位一个LpHeaderField 添加到LpPacket中。
最后还需要对consumer.cpp和producer.cpp进行修改,可以实现对tag的设置,取数据等处理
1 | //setTag处理 |