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;
};
- DSR中使用到的主要数据结构
- RBD中主要的数据结构
- java jdk中使用到的数据结构
- dsr 源代码从rh9.0移植到fc2的过程
- dsr中包发送函数的调用关系
- 数据结构的主要概念
- linux中platform_bus_type注册使用到的数据结构和函数
- linux内核中usb系统主要的数据结构
- OptimalJ开发中使用的主要模型
- OptimalJ开发中使用的主要模型
- Ecos里面的DSR是什么?
- DSR 和AODV的对比
- Linux实用的主要数据结构
- u-boot主要的数据结构
- Linux实用的主要数据结构
- SVN与Git使用后我想到的主要区别
- NS2中DSDV, AODV, DSR协议评估
- 爬虫中使用的数据结构
- 浏览器兼容性问题:IE下form表单被提交两次
- cocos2dx 实现全局定时器
- 2015年内地人为什么去香港生宝宝?
- poj【数论/组合/博弈论】题目列表
- Lua与C/C++的交互1:C/C++与Lua最简单的互动
- DSR中使用到的主要数据结构
- Java加密技术(一)——BASE64与单向加密算法MD5&SHA&MAC
- OJ刷题之分数序列
- wireshark error: There are no interfaces on which a capture can be done.
- MFC中获得系统时间的方法
- 多项式加法
- C语言学习入门 (九) typedef 关键字
- [leetcode]Binary Tree Preorder Traversal
- 再探扩展欧几里得算法的应用