GPL关于RIP协议的实现代码分析文档编号:00-6201-100当前版本:1.0.0.0创建日期:2011-12-22编写作者:ganjingweiRIP代码分析前言 (3)关于此文档 (3)参考资料 (3)第一章RIP协议报文格式 (4)1.1 报文位置 (12)1.2 RIP版本1报文 ............................................................................... 错误!未定义书签。
1.3 RIP版本2报文 ............................................................................... 错误!未定义书签。
第二章动态学习过程. (14)2.1 请求与应答...................................................................................... 错误!未定义书签。
2.1.1 初始化 (18)2.1.2 接收到request ...................................................................... 错误!未定义书签。
2.1.3 接收到response .................................................................... 错误!未定义书签。
2.2 更新.................................................................................................. 错误!未定义书签。
2.2.1定期选路更新........................................................................ 错误!未定义书签。
2.2.2触发更新................................................................................ 错误!未定义书签。
2.3 其他机制与策略.............................................................................. 错误!未定义书签。
2.3.1 水平分割............................................................................... 错误!未定义书签。
2.3.2 定时删除............................................................................... 错误!未定义书签。
前言关于此文档此文档是本人这段时间内研究GPL发布的RIP协议源码,总结并且整理出来的文档。
供大家参考。
本文档阐述代码相关研究,各章节说明如下:1 前言,即此章节;2 重要数据结构3 接收与发送处理;4 路由表结构5 线程机制6 ripd配置文件参考资料网络资源。
源码以linux2.6内核userspace为准。
第一章数据结构1.1 收发处理相关1.1.1 struct ripstruct rip{/* RIP socket. */int sock;/* Default version of rip instance. */u_char version;/* Output buffer of RIP. */struct stream *obuf;/* RIP routing information base. */struct route_table *table;/* RIP only static routing information. */struct route_table *route;/* RIP neighbor. */struct route_table *neighbor;/* RIP threads. */struct thread *t_read;/* Update and garbage timer. */struct thread *t_update;/* Triggered update hack. */int trigger;struct thread *t_triggered_update;struct thread *t_triggered_interval;/* RIP timer values. */unsigned long update_time;unsigned long timeout_time;unsigned long garbage_time;/* RIP default metric. */int default_metric;/* RIP default-information originate. */u_char default_information;char *default_information_route_map;/* RIP default distance. */u_char distance;struct route_table *distance_table;/* For redistribute route map. */struct{char *name;struct route_map *map;int metric_config;u_int32_t metric;} route_map[ZEBRA_ROUTE_MAX];};这个结构体包含ripd进程的所有信息,一个ripd进程只有一个struct rip 对象作为全局变量。
struct route_table *table是ripd进程维护的路由表的指针;struct thread *类型的数据为进程中的伪线程链表头指针(下文详细描述);此外还包含其他各种信息。
1.1.2 struct rtestruct rte{u_int16_t family; /* Address family of this route. */u_int16_t tag; /* Route Tag which included in RIP2 packet. */ struct in_addr prefix; /* Prefix of rip route. */struct in_addr mask; /* Netmask of rip route. */struct in_addr nexthop; /* Next hop of rip route. */u_int32_t metric; /* Metric value of rip route. */};这个结构体保存rip报文的每个路由信息单元,按照rip协议规定的格式定义。
1.1.3 struct rip_packetstruct rip_packet{unsigned char command; /* Command type of RIP packet. */unsigned char version;/* RIP version which coming from peer. */ unsigned char pad1; /* Padding of RIP packet header. */unsigned char pad2; /* Same as above. */struct rte rte[1]; /* Address structure. */};这个结构体是包含一个路由信息单元的rip报文,也可以把它当做rip报文的首部,因为没有路由信息单元的报文是非法的。
1.1.4 union rip_bufunion rip_buf{struct rip_packet rip_packet;char buf[RIP_PACKET_MAXSIZ];};这个联合体表示一个rip报文,rip_packet表示报文头,buf作为后续的空间,在代码流程中,这个数据通常伴随有一个值来表示其长度。
1.2 RIP路由表相关1.2.1 struct rip_infostruct rip_info{/* This route's type. */int type;/* Sub type. */int sub_type;/* RIP nexthop. */struct in_addr nexthop;struct in_addr from;/* Which interface does this route come from. */unsigned int ifindex;/* Metric of this route. */u_int32_t metric;/* Tag information of this route. */u_int16_t tag;/* Flags of RIP route. */#define RIP_RTF_FIB 1#define RIP_RTF_CHANGED 2u_char flags;/* Garbage collect timer. */struct thread *t_timeout;struct thread *t_garbage_collect;/* Route-map futures - this variables can be changed. */struct in_addr nexthop_out;u_char metric_set;u_int32_t metric_out;unsigned int ifindex_out;struct route_node *rp;u_char distance;#ifdef NEW_RIP_TABLEstruct rip_info *next;struct rip_info *prev;#endif /* NEW_RIP_TABLE */};这个结构体封装一个路由信息的各种元素,rip进程维护一个完整的路由表。
1.2.2 struct route_nodestruct route_node{/* Actual prefix of this radix. */struct prefix p;/* Tree link. */struct route_table *table;struct route_node *parent;struct route_node *link[2];#define l_left link[0]#define l_right link[1]/* Lock of this radix */unsigned int lock;/* Each node of route. */void *info;/* Aggregation. */void *aggregate;};这个结构体是RIP进程维护的路由表的表的节点。