请各位大侠分析一段代码,放分200
代码是路由协议AODV中的一段,大致是做返回错误分析处理的
贴在如下,请帮忙逐句注释,牵涉到其他文件中的函数过程中猜测意思即可
顶就有分,解决后最佳答案加放100,谢谢
#ifdef NS_PORT
#include "ns/aodv-uu.h"
#else
#include <netinet/in.h>
#include "aodv_rerr.h"
#include "routing_table.h"
#include "aodv_socket.h"
#include "aodv_timeout.h"
#include "defs.h"
#include "debug.h"
#include "params.h"
#endif
RERR *NS_CLASS rerr_create(u_int8_t flags, struct in_addr dest_addr,
u_int32_t dest_seqno)
{
RERR *rerr;
DEBUG(LOG_DEBUG, 0, "Assembling RERR about %s seqno=%d",
ip_to_str(dest_addr), dest_seqno);
rerr = (RERR *) aodv_socket_new_msg();
rerr->type = AODV_RERR;
rerr->n = (flags & RERR_NODELETE ? 1 : 0);
rerr->res1 = 0;
rerr->res2 = 0;
rerr->dest_addr = dest_addr.s_addr;
rerr->dest_seqno = htonl(dest_seqno);
rerr->dest_count = 1;
return rerr;
}
void NS_CLASS rerr_add_udest(RERR * rerr, struct in_addr udest,
u_int32_t udest_seqno)
{
RERR_udest *ud;
ud = (RERR_udest *) ((char *) rerr + RERR_CALC_SIZE(rerr));
ud->dest_addr = udest.s_addr;
ud->dest_seqno = htonl(udest_seqno);
rerr->dest_count++;
}
void NS_CLASS rerr_process(RERR * rerr, int rerrlen, struct in_addr ip_src,
struct in_addr ip_dst)
{
RERR *new_rerr = NULL;
RERR_udest *udest;
rt_table_t *rt;
u_int32_t rerr_dest_seqno;
struct in_addr udest_addr, rerr_unicast_dest;
int i;
rerr_unicast_dest.s_addr = 0;
DEBUG(LOG_DEBUG, 0, "ip_src=%s", ip_to_str(ip_src));
log_pkt_fields((AODV_msg *) rerr);
if (rerrlen < ((int) RERR_CALC_SIZE(rerr))) {
alog(LOG_WARNING, 0, __FUNCTION__,
"IP data too short (%u bytes) from %s to %s. Should be %d bytes.",
rerrlen, ip_to_str(ip_src), ip_to_str(ip_dst),
RERR_CALC_SIZE(rerr));
return;
}
/* Check which destinations that are unreachable. */
udest = RERR_UDEST_FIRST(rerr);
while (rerr->dest_count) {
udest_addr.s_addr = udest->dest_addr;
rerr_dest_seqno = ntohl(udest->dest_seqno);
DEBUG(LOG_DEBUG, 0, "unreachable dest=%s seqno=%lu",
ip_to_str(udest_addr), rerr_dest_seqno);
rt = rt_table_find(udest_addr);
if (rt && rt->state == VALID && rt->next_hop.s_addr == ip_src.s_addr) {
/* Checking sequence numbers here is an out of draft
* addition to AODV-UU. It is here because it makes a lot
* of sense... */
if (0 && (int32_t) rt->dest_seqno > (int32_t) rerr_dest_seqno) {
DEBUG(LOG_DEBUG, 0, "Udest ignored because of seqno");
udest = RERR_UDEST_NEXT(udest);
rerr->dest_count--;
continue;
}
DEBUG(LOG_DEBUG, 0, "removing rte %s - WAS IN RERR!!",
ip_to_str(udest_addr));
#ifdef NS_PORT
interfaceQueue((nsaddr_t) udest_addr.s_addr, IFQ_DROP_BY_DEST);
#endif
/* Invalidate route: */
if (!rerr->n) {
rt_table_invalidate(rt);
}
/* (a) updates the corresponding destination sequence number
with the Destination Sequence Number in the packet, and */
rt->dest_seqno = rerr_dest_seqno;
/* (d) check precursor list for emptiness. If not empty, include
the destination as an unreachable destination in the
RERR... */
if (rt->nprec && !(rt->flags & RT_REPAIR)) {
if (!new_rerr) {
u_int8_t flags = 0;
if (rerr->n)
flags |= RERR_NODELETE;
new_rerr = rerr_create(flags, rt->dest_addr,
rt->dest_seqno);
DEBUG(LOG_DEBUG, 0, "Added %s as unreachable, seqno=%lu",
ip_to_str(rt->dest_addr), rt->dest_seqno);
if (rt->nprec == 1)
rerr_unicast_dest =
FIRST_PREC(rt->precursors)->neighbor;
} else {
/* Decide whether new precursors make this a non unicast RERR */
rerr_add_udest(new_rerr, rt->dest_addr, rt->dest_seqno);
DEBUG(LOG_DEBUG, 0, "Added %s as unreachable, seqno=%lu",
ip_to_str(rt->dest_addr), rt->dest_seqno);
if (rerr_unicast_dest.s_addr) {
list_t *pos2;
list_foreach(pos2, &rt->precursors) {
precursor_t *pr = (precursor_t *) pos2;
if (pr->neighbor.s_addr != rerr_unicast_dest.s_addr) {
rerr_unicast_dest.s_addr = 0;
break;
}
}
}
}
} else {
DEBUG(LOG_DEBUG, 0,
"Not sending RERR, no precursors or route in RT_REPAIR");
}
/* We should delete the precursor list for all unreachable
destinations. */
if (rt->state == INVALID)
precursor_list_destroy(rt);
} else {
DEBUG(LOG_DEBUG, 0, "Ignoring UDEST %s", ip_to_str(udest_addr));
}
udest = RERR_UDEST_NEXT(udest);
rerr->dest_count--;
} /* End while() */
/* If a RERR was created, then send it now... */
if (new_rerr) {
rt = rt_table_find(rerr_unicast_dest);
if (rt && new_rerr->dest_count == 1 && rerr_unicast_dest.s_addr)
aodv_socket_send((AODV_msg *) new_rerr,
rerr_unicast_dest,
RERR_CALC_SIZE(new_rerr), 1,
&DEV_IFINDEX(rt->ifindex));
else if (new_rerr->dest_count > 0) {
/* FIXME: Should only transmit RERR on those interfaces
* which have precursor nodes for the broken route */
for (i = 0; i < MAX_NR_INTERFACES; i++) {
struct in_addr dest;
if (!DEV_NR(i).enabled)
continue;
dest.s_addr = AODV_BROADCAST;
aodv_socket_send((AODV_msg *) new_rerr, dest,
RERR_CALC_SIZE(new_rerr), 1, &DEV_NR(i));
}
}
}
}
问题点数:100、回复次数:54Top
1 楼Galatin(找个女朋友,还是养条狗)回复于 2006-03-09 09:51:18 得分 0
从语法上注释即可,谢谢啊----Top
2 楼Galatin(找个女朋友,还是养条狗)回复于 2006-03-09 10:47:39 得分 0
救命啊,这是段开源的代码
帮顶就有分,谢谢大家Top
3 楼piaochen_2002(执子之手,与子偕老!)回复于 2006-03-09 10:49:19 得分 0
不懂,帮顶.............Top
4 楼SK_MadFrog(平凡但不平庸的人)回复于 2006-03-09 12:42:50 得分 0
顶Top
5 楼ugg(逸学堂(exuetang.net))回复于 2006-03-09 12:50:27 得分 0
帮顶就有分,也帮你顶..Top
6 楼allensoso(死性不改)回复于 2006-03-09 12:51:53 得分 0
水平太低。。。只能帮顶下了。。Top
7 楼jinjiajie(leorio)回复于 2006-03-09 12:52:08 得分 0
顶...做读程序太累了,收个小分算了Top
8 楼discory(discory)回复于 2006-03-09 13:02:02 得分 0
我帮,顶,完全看不懂,呵呵Top
9 楼libiao_1985(libiao)回复于 2006-03-09 13:09:06 得分 0
我也顶哈哦 ~~~Top
10 楼ydfivy(我就是一送外卖的)回复于 2006-03-09 13:09:24 得分 0
老天爷呀.顶.Top
11 楼xiaohuoma7620(小火马)回复于 2006-03-09 14:15:36 得分 0
....................Top
12 楼wqtl_357(Step By Step!)回复于 2006-03-09 19:41:56 得分 0
自己好好分析下,能从中学到不少东西。Top
13 楼btc2005(小扬)回复于 2006-03-09 20:15:01 得分 0
顶啊 先顶再研究Top
14 楼minsavage(帆野)回复于 2006-03-09 20:53:33 得分 0
markTop
15 楼jixingzhong(瞌睡虫·星辰)回复于 2006-03-09 20:57:16 得分 0
顶 ...
^_^
楼主是这个领域的么?
你分析起来比我们分析要轻松很多啊 ~Top
16 楼hotonion(菜鸟怎么变大牛呢?)回复于 2006-03-09 21:15:12 得分 0
完全不懂 帮顶Top
17 楼Sky_Killer(Sky_Killer)回复于 2006-03-09 22:00:00 得分 0
顶Top
18 楼0delphi(睡个舒服觉)回复于 2006-03-09 22:07:39 得分 0
这个世界太疯狂Top
19 楼ASCII945(崛起吧!)回复于 2006-03-09 22:13:47 得分 0
虽然不懂,不过还是帮你顶下Top
20 楼Galatin(找个女朋友,还是养条狗)回复于 2006-03-09 22:17:30 得分 0
晕倒,全是接小分的
继续上啊
明天解决不了也放分,大家平均分了Top
21 楼youranjianke(悠然剑客)回复于 2006-03-10 08:21:54 得分 0
复杂,看不懂Top
22 楼wqtl_357(Step By Step!)回复于 2006-03-10 08:40:08 得分 0
代码看起来很诱人!Top
23 楼ouyh12345(五岭散人)回复于 2006-03-10 08:42:24 得分 0
upTop
24 楼baggio1984(good good study ,day day up !)回复于 2006-03-10 08:43:50 得分 0
水平太低,接个小分Top
25 楼abblly(西边日出东边雨)回复于 2006-03-10 08:46:17 得分 0
貌似专业性很强,帮顶一下Top
26 楼terryjwf(开大奔的帅哥)回复于 2006-03-10 08:49:58 得分 0
哈哈,偶水平太菜鸟,友情up!Top
27 楼waveslide(waveslide)回复于 2006-03-10 10:58:36 得分 0
顶哈,顶哈Top
28 楼TZT_TZT(T小样T)回复于 2006-03-10 11:05:31 得分 0
水平太低。。。只能帮顶下了。。
Top
29 楼doway(john)回复于 2006-03-10 12:50:20 得分 0
UP :)Top
30 楼yisong_net(李松)回复于 2006-03-10 13:06:48 得分 0
小样新来的吧,要有耐心,自己分析效率更高,收益更好~Top
31 楼aniude(重返荣耀)回复于 2006-03-10 13:09:12 得分 0
纯粹顶Top
32 楼sukyin()回复于 2006-03-10 13:46:59 得分 0
#ifdef NS_PORT/*是否有定义NS端口,如果没有的话,包含下面那个头文件*/
#include "ns/aodv-uu.h"
#else
#include <netinet/in.h>/*输入*/
#include "aodv_rerr.h"/*rerr头文件*/
#include "routing_table.h"/*路由表*/
#include "aodv_socket.h"/*aodv线程*/
#include "aodv_timeout.h"/*aodv超时*/
#include "defs.h"/*定义*/
#include "debug.h"/*debug*/
#include "params.h"/*参数*/
#endif
/*说明一下,因为很专业,所以RERR是什么都不知道。但是知道是一个结构。
用到的结构还有in_addr。从后面看,rerr应该是一种数据包。
*/
/* 函数:创建rerr。
参数:unsigned int 8位,入地址结构,unsigned int 32位
*/
RERR *NS_CLASS rerr_create(u_int8_t flags, /*标记*/
struct in_addr dest_addr,/* 目的地址*/
u_int32_t dest_seqno)/* 目的序列序号*/
{
RERR *rerr;/*定义RERR的一个指针*/
DEBUG(LOG_DEBUG, 0, "Assembling RERR about %s seqno=%d",
ip_to_str(dest_addr), dest_seqno);/*写log文件:把RERR集中到目的地址,序列号是seqno*/
rerr = (RERR *) aodv_socket_new_msg();/*调用aodv的socket新消息函数得到RERR的结构*/
rerr->type = AODV_RERR;/*以下6行赋值*/
rerr->n = (flags & RERR_NODELETE ? 1 : 0);
rerr->res1 = 0;
rerr->res2 = 0;
rerr->dest_addr = dest_addr.s_addr;
rerr->dest_seqno = htonl(dest_seqno);
rerr->dest_count = 1;
return rerr;
}
/* 函数:rerr与不能到达地址的和
参数:结构RERR,入地址结构,unsigned int 32位
*/
void NS_CLASS rerr_add_udest(RERR * rerr,/*RERR指针*/
struct in_addr udest,/*不能到达地址*/
u_int32_t udest_seqno)/*udest序号*/
{
RERR_udest *ud;/*RERR_udest结构的一个指针*/
ud = (RERR_udest *) ((char *) rerr + RERR_CALC_SIZE(rerr));
/*这个好像是把rerr和重新分配空间的rerr相加,这样能得到新的空间大小*/
ud->dest_addr = udest.s_addr;/*目的地址赋值*/
ud->dest_seqno = htonl(udest_seqno);/*应该是新的编号*/
rerr->dest_count++;/*rerr中的目的数+1*/
}
/* 函数:rerr处理
参数:结构RERR,入地址结构,入地址结构
*/
void NS_CLASS rerr_process(RERR * rerr, /*RERR指针*/
int rerrlen, /*RERR长度*/
struct in_addr ip_src,/*源ip*/
struct in_addr ip_dst)/*目的ip*/
{
RERR *new_rerr = NULL;/*新建空RERR指针*/
RERR_udest *udest;/*RERR_udest结构的一个指针*/
rt_table_t *rt;/*路由表结构指针*/
u_int32_t rerr_dest_seqno;/*rerr目的序号*/
struct in_addr udest_addr, rerr_unicast_dest;/*两个地址,前一个是udest地址,
后一个是rerr的唯一转换目的地址?又是猜的*/
int i;/*循环变量*/
rerr_unicast_dest.s_addr = 0;/*地址初值为0*/
DEBUG(LOG_DEBUG, 0, "ip_src=%s", ip_to_str(ip_src));/*写log文件,源ip*/
log_pkt_fields((AODV_msg *) rerr);/*log打包域?*/
if (rerrlen < ((int) RERR_CALC_SIZE(rerr))) {/*如果输入的长度小于rerr分配的长度*/
alog(LOG_WARNING, 0, __FUNCTION__,
"IP data too short (%u bytes) from %s to %s. Should be %d bytes.",
rerrlen, ip_to_str(ip_src), ip_to_str(ip_dst),
RERR_CALC_SIZE(rerr));/*写log,ip数据太短,应该为多长*/
return;
}
/* Check which destinations that are unreachable. */
udest = RERR_UDEST_FIRST(rerr);
while (rerr->dest_count) {/*如果rerr的目的数还大于0的话*/
udest_addr.s_addr = udest->dest_addr;/*赋值*/
rerr_dest_seqno = ntohl(udest->dest_seqno);
DEBUG(LOG_DEBUG, 0, "unreachable dest=%s seqno=%lu",
ip_to_str(udest_addr), rerr_dest_seqno);/*写log*/
rt = rt_table_find(udest_addr);/*路由表中间找这个不能到达的地址*/
if (rt && rt->state == VALID && rt->next_hop.s_addr == ip_src.s_addr) {
/*如果路由表中查到的地址是合法的,而且下一跳的地址就是源地址的话*/
/* Checking sequence numbers here is an out of draft
* addition to AODV-UU. It is here because it makes a lot
* of sense... */
if (0 && (int32_t) rt->dest_seqno > (int32_t) rerr_dest_seqno) {
/*这个if不知道是搞什么用的,0 && 的话都是0了啊,从英文注释看,是测试
序列号的,可能实际用的时候要把0 && 删除吧。*/
DEBUG(LOG_DEBUG, 0, "Udest ignored because of seqno");
udest = RERR_UDEST_NEXT(udest);
rerr->dest_count--;
continue;
}
DEBUG(LOG_DEBUG, 0, "removing rte %s - WAS IN RERR!!",
ip_to_str(udest_addr));
/*下面还有一段*/ Top
33 楼sukyin()回复于 2006-03-10 13:47:11 得分 0
#ifdef NS_PORT/*如果定义了端口的话呢,就要把不可达地址在端口排队*/
interfaceQueue((nsaddr_t) udest_addr.s_addr, IFQ_DROP_BY_DEST);
#endif
/* Invalidate route: */
if (!rerr->n) {
rt_table_invalidate(rt);/*不合法检验*/
}
/* (a) updates the corresponding destination sequence number
with the Destination Sequence Number in the packet, and */
rt->dest_seqno = rerr_dest_seqno;
/* (d) check precursor list for emptiness. If not empty, include
the destination as an unreachable destination in the
RERR... */
if (rt->nprec && !(rt->flags & RT_REPAIR)) {
/*如果precursor list不是空,并且标记是RT_REPAIR(路由修复)*/
if (!new_rerr) {/*如果新rerr分配成功*/
u_int8_t flags = 0;/*标记置零*/
if (rerr->n)/*如果合法*/
flags |= RERR_NODELETE;/*标记设置为rerr勿删(简单的或运算
前面用的是与运算)*/
new_rerr = rerr_create(flags, rt->dest_addr,
rt->dest_seqno);/*调用上面的创建rerr的函数*/
DEBUG(LOG_DEBUG, 0, "Added %s as unreachable, seqno=%lu",
ip_to_str(rt->dest_addr), rt->dest_seqno);
if (rt->nprec == 1)/*如果precursor list不是空*/
rerr_unicast_dest =
FIRST_PREC(rt->precursors)->neighbor;
/*unicast地址设置为FIRST_PREC返回参数的neighbor属性*/
} else {/*如果如果precursor list是空*/
/* Decide whether new precursors make this a non unicast RERR */
rerr_add_udest(new_rerr, rt->dest_addr, rt->dest_seqno);
/*调用上面的相加函数把路由表中找到的目的地址和目的序号放到new rerr中*/
DEBUG(LOG_DEBUG, 0, "Added %s as unreachable, seqno=%lu",
ip_to_str(rt->dest_addr), rt->dest_seqno);
if (rerr_unicast_dest.s_addr) {/*如果unicast目的的地址不是空的话*/
list_t *pos2;/*列表的指针*/
list_foreach(pos2, &rt->precursors) {/*这里不知道干嘛的!*/
precursor_t *pr = (precursor_t *) pos2;
if (pr->neighbor.s_addr != rerr_unicast_dest.s_addr) {
rerr_unicast_dest.s_addr = 0;
break;
}
}
}
}
} else {
DEBUG(LOG_DEBUG, 0,
"Not sending RERR, no precursors or route in RT_REPAIR");
}
/* We should delete the precursor list for all unreachable
destinations. */
if (rt->state == INVALID)/*不合法则destroy*/
precursor_list_destroy(rt);
} else {/*如果地址合法*/
DEBUG(LOG_DEBUG, 0, "Ignoring UDEST %s", ip_to_str(udest_addr));
}
udest = RERR_UDEST_NEXT(udest);/*取next*/
rerr->dest_count--;
}/* End while() */
/* If a RERR was created, then send it now... */
if (new_rerr) {
rt = rt_table_find(rerr_unicast_dest);/*路由表中找不可达地址*/
if (rt && new_rerr->dest_count == 1 && rerr_unicast_dest.s_addr)
/*如果有不可达地址,并且新rerr中目的地址唯一,并且rerr的unicast目的也有的话*/
aodv_socket_send((AODV_msg *) new_rerr,
rerr_unicast_dest,
RERR_CALC_SIZE(new_rerr), 1,
&DEV_IFINDEX(rt->ifindex));/*发送*/
else if (new_rerr->dest_count > 0) {/*如果新rerr中目的地址数大于0*/
/* FIXME: Should only transmit RERR on those interfaces
* which have precursor nodes for the broken route */
for (i = 0; i < MAX_NR_INTERFACES; i++) {
struct in_addr dest;
if (!DEV_NR(i).enabled)
continue;
dest.s_addr = AODV_BROADCAST;/*采用广播方式发送*/
aodv_socket_send((AODV_msg *) new_rerr, dest,
RERR_CALC_SIZE(new_rerr), 1, &DEV_NR(i));?
}
}
}
}
Top
34 楼sukyin()回复于 2006-03-10 13:48:56 得分 0
copy到vc下,或者文本编辑器editplus,ultraedit什么的里面就能清楚了Top
35 楼Ninstein(www.Ninstein.Com)回复于 2006-03-10 14:20:23 得分 0
JFTop
36 楼xsp919(末末)回复于 2006-03-10 16:22:12 得分 0
顶~~ 看得头大了~~不懂。Top
37 楼bbbbcccc()回复于 2006-03-10 16:47:41 得分 0
http://valenhua.go3.icpcn.com/Top
38 楼zh1369(口一华)回复于 2006-03-10 16:53:53 得分 0
这也能注释,nb!
Top
39 楼Free_Wind22(还没想好...)回复于 2006-03-10 18:40:06 得分 0
牛X
注释了也看不懂..
帮顶..Top
40 楼co_diy(开创智能时代)回复于 2006-03-10 19:27:23 得分 0
upTop
41 楼xust999()回复于 2006-03-10 19:32:02 得分 0
顶Top
42 楼jie_cs()回复于 2006-03-10 19:50:11 得分 0
顶一下
Top
43 楼cattlenzq(吃狼的豆腐(不要给分了,散起来真麻烦!))回复于 2006-03-10 20:30:45 得分 0
顶Top
44 楼bombwang(王)回复于 2006-03-10 20:38:13 得分 0
水平太低。。。只能帮顶下了。。Top
45 楼zncn2(embedded system)回复于 2006-03-10 23:09:00 得分 0
markTop
46 楼ccs02287(☆兜兜里有糖☆偶滴兜兜里有糖,你和我玩不?)回复于 2006-03-10 23:34:57 得分 0
前来学习INGTop
47 楼fwh_danny(风)回复于 2006-03-10 23:59:11 得分 0
学习中。。。。不错Top
48 楼wangmuqq88(挥着翅膀的尼姑)回复于 2006-03-12 00:44:18 得分 0
欢迎加群20641933,欢迎大家共同交流.提高!(不怕不会,就怕不学.)Top
49 楼ttttjava()回复于 2006-03-13 09:04:41 得分 0
学习Top
50 楼abillchen(依然)回复于 2006-03-13 09:38:49 得分 0
学习Top
51 楼hehe(呵呵)回复于 2006-03-13 17:05:49 得分 0
niu ,bu dong !Top
52 楼sparrow009(奇疯)回复于 2006-03-13 23:11:05 得分 0
顶!
呵呵Top
53 楼wangmuqq88(挥着翅膀的尼姑)回复于 2006-03-13 23:24:27 得分 0
欢迎大家加群(C/C++)20641933欢迎大家共同学习交流Top
54 楼michael_g_hu(一代风云)回复于 2006-03-14 00:20:03 得分 0
太多了,帮你顶一下算了
Top




