Hi, all~
I am implementing ETX metric into AODV, and change sendHello(), recvHello() to
calculate the ETX of a link between neighbors.
I want to send a Hello packet with the information of the neighbor list this
node maintians, using sendHello() function by adding
lp->lp_nb = nbhead.lh_first; // point to the head of the neighbor list of
this node.
but when i debugs, result is as follows:
Breakpoint 1, AODV::sendHello (this=0x8801cc8) at aodv/aodv.cc:1326
1326 lp->lp_nb = nbhead.lh_first; // point to the head of the neighbor list
of this node
2: lp->lp_dst = 0
1: lp->lp_nb = (AODV_Neighbor *) 0x0
(gdb)
Continuing.
Breakpoint 2, AODV::recvHello (this=0x8828090, p=0x88aa9c8)
at aodv/aodv.cc:1356
1356 if(nb == 0) {
6: nb->nb_link_probe_count = 98
5: index = 1
4: lp->lp_dst = 0
3: lp->lp_nb = (AODV_Neighbor *) 0x8889998
In the sendHello() , lp->lp_nb is always 0x0, can anybody tell me why?
Best regards.
Follows is the change I have made.
First, in aodv_packet.h, i add a probe packet.(a RREP packet with a pointer)
struct hdr_aodv_link_probe {
u_int8_t lp_type; // Packet Type
u_int8_t reserved[2];
u_int8_t lp_hop_count; // Hop Count
nsaddr_t lp_dst; // Destination IP Address
u_int32_t lp_dst_seqno; // Destination Sequence Number
nsaddr_t lp_src; // Source IP Address
double lp_lifetime; // Lifetime
double lp_timestamp; // when corresponding REQ sent;
// used to compute route discovery latency
AODV_Neighbor * lp_nb; // point to the head of the neighbor
list of this node
inline int size() {
int sz = 0;
/*
sz = sizeof(u_int8_t) // lp_type
+ 2*sizeof(u_int8_t) // lp_flags + reserved
+ sizeof(u_int8_t) // lp_hop_count
+ sizeof(double) // lp_timestamp
+ sizeof(nsaddr_t) // lp_dst
+ sizeof(u_int32_t) // lp_dst_seqno
+ sizeof(nsaddr_t) // lp_src
+ sizeof(u_int32_t) // lp_lifetime
+ sizeof(AODV_Neighbor *); // lp_nb
*/
sz = 6*sizeof(u_int32_t) + sizeof(AODV_Neighbor *);
assert (sz >= 0);
return sz;
}
};
sendHello():
void
AODV::sendHello() {
Packet *p = Packet::alloc();
struct hdr_cmn *ch = HDR_CMN(p);
struct hdr_ip *ih = HDR_IP(p);
struct hdr_aodv_link_probe * lp = HDR_AODV_LINK_PROBE(p); // specified link
probe packet
#ifdef DEBUG
fprintf(stderr, "sending Hello from %d at %.2f\n", index,
Scheduler::instance().clock());
#endif // DEBUG
lp->lp_type = AODVTYPE_HELLO;
//lp->lp_flags = 0x00;
lp->lp_hop_count = 1;
lp->lp_dst = index;
lp->lp_dst_seqno = seqno;
lp->lp_lifetime = (1 + ALLOWED_HELLO_LOSS) * HELLO_INTERVAL;
lp->lp_nb = nbhead.lh_first; // point to the head of the neighbor list of
this node
// ch->uid() = 0;
ch->ptype() = PT_AODV;
ch->size() = IP_HDR_LEN + lp->size();
ch->iface() = -2;
ch->error() = 0;
ch->addr_type() = NS_AF_NONE;
ch->prev_hop_ = index; // AODV hack
ih->saddr() = index;
ih->daddr() = IP_BROADCAST;
ih->sport() = RT_PORT;
ih->dport() = RT_PORT;
ih->ttl_ = 1;
Scheduler::instance().schedule(target_, p, 0.0);
}
recvHello():
void
AODV::recvHello(Packet *p) {
//struct hdr_ip *ih = HDR_IP(p);
struct hdr_aodv_link_probe * lp = HDR_AODV_LINK_PROBE(p); // specified link
probe packet
AODV_Neighbor *nb;
double now = CURRENT_TIME; // use to check whether has time out, if time out
,calculate the etx and reset link_probe_count
nb = nb_lookup(lp->lp_dst); // the term of the sender node in this receiving
node's neighbor list
if(nb == 0) {
nb_insert(lp->lp_dst); //
}
else {
nb->nb_expire = CURRENT_TIME +
(1.5 * ALLOWED_HELLO_LOSS * HELLO_INTERVAL);
// timeout, calculate the ETX of this link, reset timestart and
link_probe_count
if((nb->timestart + COUNT_INTERVAL) < now){
AODV_Neighbor *temp = lp->lp_nb;
for(; temp; temp = temp->nb_link.le_next) {
if(temp->nb_addr == index) break;
}
// the according term of this node in the sender node's neighbor list
AODV_Neighbor * myself = temp;
// the probes sender received from this node
u_int16_t sender_recv_count = myself->nb_link_probe_count;
nb->nb_link_etx = 1.0/ ((sender_recv_count / 100.0) *
(nb->nb_link_probe_count / 100.0));
nb->timestart = CURRENT_TIME;
nb->nb_link_probe_count = 0;
}
else{
nb->nb_link_probe_count++;
}
}
Packet::free(p);
}
/*
* nb_inset(nsaddr_t)函数用于将首次检测到的邻居节点插入邻居节点链表中;同时要完成初始化该新增邻居节点
* 的寿命域,本节点从其接收到的探测分组数,链路的etx值以及计数器启动时间。
*/
void
AODV::nb_insert(nsaddr_t id) {
AODV_Neighbor *nb = new AODV_Neighbor(id);
assert(nb);
/* add by lee */
nb->nb_link_etx = 0.0; // initial the ETX of this link (sender
->receiver)
nb->nb_link_probe_count = 0; // initial the count field, records the
probes sender received from the receiver
nb->timestart = CURRENT_TIME; // initial when to start counting
nb->nb_expire = CURRENT_TIME +
(1.5 * ALLOWED_HELLO_LOSS * HELLO_INTERVAL);
LIST_INSERT_HEAD(&nbhead, nb, nb_link);
seqno += 2; // set of neighbors changed
assert ((seqno%2) == 0);
}
聊天+搜索+邮箱 想要轻松出游,手机MSN帮你搞定! 立刻下载!
_________________________________________________________________
想知道明天天气如何?必应告诉你!
http://cn.bing.com/search?q=%E5%A4%A9%E6%B0%94%E9%A2%84%E6%8A%A5&form=MICHJ2