DSR中使用到的主要数据结构

来源:互联网 发布:oracle sql截取字符串 编辑:程序博客网 时间:2024/05/24 07:01

1、class hdr_sr {

       int valid_;         //协议头是否有效

       int salvaged_; 

       int num_addrs_; //下面数组中元素个数,源路由路径

       int cur_addr_;  //源路由中当前地址

       struct sr_addr addrs_[MAX_SR_LEN]; //源路由

struct route_request   sr_request_;//路由请求

       struct route_reply       sr_reply_; //路由回复

       struct route_error       sr_error_;//路由错误

};

这个类定义了分组的协议头,协议使用了源路由的方式;另外使用了三种信号:路由请求,路由回复,路由错误。

struct sr_addr {

   int addr_type;        /* same as hdr_cmn in packet.h */

       nsaddr_t addr;//实际类型是uint_32;

       double Pt_;//作用不详。没见到后面用到

};

structroute_request {

       int  req_valid_;//路由请求是否有效

       int  req_id_;     //请求号

       int  req_ttl_;    //请求跳数

};

struct route_reply{

       int  rep_valid_;      //路由回复是否有效

       int  rep_rtlen_;      //路由回复的跳数

       struct sr_addr rep_addrs_[MAX_SR_LEN];  //回复中携带的路径

};

2、struct ID {

  friend class Path; //声明友元类Path

  unsigned long addr;//地址

  ID_Type type;   //地址类型

  Time t;                  //when was this ID added to the route

}

这个结构体中最主要的两个变量是:地址与地址类型。这里的地址类型与hdr_sr中源路由中的地址类型以及commom头中的地址类型都是一致的,其定义在下面:

enum ID_Type {NONE= NS_AF_NONE, MAC = NS_AF_ILINK, IP = NS_AF_INET };

 

class Path {

  int len;//链表的长度

  int cur_index;//当前的地址

  ID* path;//ID类型的链表

  ID path_owner;//没什么用

}

Path类是一个值得仔细思考的类;如果仔细阅读Path类的构造函数会发现:这个类实际上是ID类型对象的链表(数组),而len实际上是链表(数组)的长度,cur_index实际上是当前的地址。

ID类的主要成员变量是:地址与地址类型。这一点与hdr_sr中源路由数组中的元素是一致的。Path的主要成员是ID类型的数组,这一点与hdr_sr中源路由数组是一致的。从Path类的成员函数定义的操作也可以发现:Path类与hdr_sr中的源路由实际上同一种逻辑结构,都是记录了一系列的地址。

3、struct SRPacket {

  ID dest; //目的地址

  ID src; //源地址

  Packet *pkt;                     /*the inner NS packet */

  Path route;//上面说了,这其实是ID类型的数组

};

SRPacket结构体在DSR中是一个非常关键的结构体;实际上DSR协议中的各函数传递的参数大都是SRPacket类的对象的指针或是引用。这个结构体像是一个载体,将数据包传输到各个函数中。为了说明这个结构的作用,我作一个场景假设:假设分组A被节点1接收,其中分组A是一个正常的分组(这里所说的正常,是指这个分组既不是路由请求分组,也不是路由回复分组,这个分组头部的源路由中携带了完整的路由路径,节点接收到这个分组,只需要按照源路由转发即可。)节点1将分组封装到SRPacket中:pkt指向分组的地址,dest为目的地址,src为源地址,分组头中的源路由赋值给route;协议中的函数对这个SRPacket对象进行分析后,再将SRPacket中的分组定时转发。

4、struct SendBufEntry {

  Time t;                  //insertion time

  SRPacket p;

};

DSR协议中定义了一个发送缓冲区send_buf[],为了保存需要路由发现的分组;这个数组的元素类型就是struct SendBufEntry。

5、DSR协议中还定义了一段缓存,是为了存储已经找到的路由。这个结构定义的比较隐秘,在DSRAgent中只看到有这么一个成员变量:RouteCache* route_cache;仔细看DSRAgent的构造函数以及上面的预处理命令发现,其实这个route_cache指向的结构是class MobiCache。

class MobiCache :public RouteCache {

friend classCache;

friend classMobiHandler;

protected:

  Cache *primary_cache; 

  Cache *secondary_cache;

}

这个类中有两个Cache类型的指针;primary_cache主要指向路由发现找到的路由,secondary_cache主要指向分组头源路由中的路由。

Cache::Cache(char*name, int size, MobiCache *rtcache)

{

  this->name = name;

  this->size = size;

  cache = new Path[size];

  routecache = rtcache;

  victim_ptr = 0;

}

Cache的定义可以发现,cache的核心是一个Path[],上面讲过path类本身就是一个ID[],也就是说cache类存着一条条的路由记录。

6、class RequestTable {

private:

  Entry *table;

  int size;

  int ptr;

};

REquestTable类存储最近的路由请求,核心成员是一个Entry[],这个数组存储的记录可以理解为:源节点地址与路由请求号的组合。当接收到某路由请求时,判断这个请求是否重复。

struct Entry {

  ID MAC_id;

  ID net_id;

  int req_num;

  Time last_arp;

  int rt_reqs_outstanding;

  Time last_rt_req;

  LastType last_type;

};

0 0