ndnSIM实现添加自定义字段–tag添加(一)

添加标签的主要步骤有三个:添加标签定义、在处理包时加入标签处理、在需要的地方插入标签。前面两处的代码修改是固定的,而最后一个“在需要的地方插入标签”的实现则很灵活。

1.添加标签(Tag)的定义

需要修改../src/ndnSIM/ndn-cxx/ndn-cxx/lp下的fields.hpp、tlv.hpp和tags.hpp三个文件。

1.1 tags.hpp修改

修改该文件,添加Tag的定义。这里以添加一个LcdInsertTag为例。

typedef SimpleTag<uint64_t, 0x60000001> LcdInsertTag;

SimpleTag的定义为template<typename T, int TypeId> class SimpleTag: public Tag,它有两个模版参数。上面定义的uint64_t为typename,0x60000001为TypeId。

TypeId的规范在https://redmine.named-data.net/projects/ndn-cxx/wiki/PacketTagTypes中。在某个范围内是可以自己定义的,在这里选择0x60000001是因为前面ndnSIM定义了一个HopCountTag的TypeId为0x60000000,因此按顺序给TypeId加一。

1.2 tlv.hpp修改

修改该文件,添加Tag的tlv-numbers定义。

 enum {
    LpPacket = 100,
    Fragment = 80,
    Sequence = 81,
    FragIndex = 82,
    FragCount = 83,
    HopCountTag = 84,
    Nack = 800,
    NackReason = 801,
    NextHopFaceId = 816,
    IncomingFaceId = 817,
    CachePolicy = 820,
    CachePolicyType = 821,
    CongestionMark = 832,
    Ack = 836,
    TxSequence = 840,
    NonDiscovery = 844,
    PrefixAnnouncement = 848,
    LcdInsertTag = 849,    //添加tag定义
    };

1.3 fields.hpp修改

添加Tag内容的定义,一般是Tag name+Field。例如一个Tag的名字是HopCountTag,那么这里Tag的内容名字为HopCountTagField。

这里有一系列的ndnSIM定义的其他Tag,因此可以仿照它们的定义来写。例如下面的代码加入了一个LcdInsertTagField。

//加入一个LcdInsertTagField
 typedef FieldDecl<field_location_tags::Header,
                   uint64_t,
                   tlv::LcdInsertTag> LcdInsertTagField;
 BOOST_CONCEPT_ASSERT((Field<LcdInsertTagField>));

 将上面的LcdInsertTagField加入集合中。这个集合也是已有的,里面已经加入了ndnSIM定义的其他TagField,这里将上面自定义的LcdInsertTagField加入即可,如下面代码的红色部分。

 typedef boost::mpl::set<
   FragmentField,
   SequenceField,
   FragIndexField,
   FragCountField,
   NackField,
   NextHopFaceIdField,
   CachePolicyField,
   IncomingFaceIdField,
   CongestionMarkField,
   AckField,
   TxSequenceField,
   NonDiscoveryField,
   PrefixAnnouncementField,
   HopCountTagField,
   LcdInsertTagField
   > FieldSet;

2.在处理包时加入标签处理

需要修改../src/ndnSIM/NFD/daemon/face/generic-link-service.cpp,这里是将Interest和Data packet转成lp::packet的地方,因此在Interest/Data->lp::packet和lp::packet->Interest/Data两个方向都要加入标签处理。

2.1 修改generic-link-service.cpp

 Interest/Data->lp::packet方向,修改encodeLpFields()方法。ndnSIM中已经有其他Tag的处理了,这里是按照他们的处理方法将LcdInsertTag加上去。

void
  GenericLinkService::encodeLpFields(const ndn::PacketBase& netPkt, lp::Packet& lpPacket)
  {
    /**
    * 其他原有的Tag处理
    **/
     //判断Interest/Data中是否有LcdInsertTag,如果有,加入到lpPacket中。
    shared_ptr<lp::LcdInsertTag> lcdInsertTag = netPkt.getTag<lp::LcdInsertTag>();
    if(lcdInsertTag != nullptr){
        lpPacket.add<lp::LcdInsertTagField>(*lcdInsertTag);
        NFD_LOG_DEBUG("LcdInsertTag in generic-link-service in encodeLpFields: " << *lcdInsertTag);
      }else{
        NFD_LOG_DEBUG("LcdInsertTag in generic-link-service in encodeLpFields: lost**********");
      }
  }

lp::packet->Interest/Data方向,修改decodeData()或者decodeInterest()方法。如果标签是加入在Data中,那么需要修改decodeData();如果标签是加入Interest中,那么需要修改decodeInterest()。以修改decodeData()为例:

void
 GenericLinkService::decodeData(const Block& netPkt, const lp::Packet& firstPkt)
 {
  /**
    * 其他原有Tag的处理
    */
   //判断packet中是否有LcdInsertTagField,如果有,构造Tag加入到数据包中。
   if(firstPkt.has<lp::LcdInsertTagField>()){
     data->setTag(make_shared<lp::LcdInsertTag>(firstPkt.get<lp::LcdInsertTagField>()));
   }
 
   this->receiveData(*data);
 }

3.在需要的地方插入标签

这个可以根据实验的算法在代码的任意位置插入。比较常用的有两处:一是在消费者/生产者产生数据包或兴趣包时,即在Consumer/Producer的实现类中;二是在路由节点处理每个到达的的兴趣包或数据包时,即在../NFD/daemon/forwarder.cpp中。

如果某处代码以前没有使用过标签,要记得加上头文件 #include<ndn-cxx/lp/tags.hpp>

以在Producer产生数据包时加入标签为例,可以通过修改../src/ndnSIM/apps/ndn-producer.cpp中的onInterest()实现:

  #include <ndn-cxx/lp/tags.hpp>
  void
   Producer::OnInterest(shared_ptr<const Interest> interest)
   {
     /**
      * 其他处理
      */
     //使用setTag()方法加入LcdInsertTag,并且Tag的数值设置为2.
     data->setTag(make_shared<lp::LcdInsertTag>(2));
     //输出LcdInsertTag的值进行检查
    NS_LOG_INFO("Data packet add LcdInsertTag: " << data->getTag<lp::LcdInsertTag>()->get());
  
    // to create real wire encoding
    data->wireEncode();
  
    m_transmittedDatas(data, this, m_face);
    m_appLink->onReceiveData(*data);
  }
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇