Hi Users. I hope al of u would be OK. I have been working on Mobile IP v4
implemented in ns-2.28. There is a bug in the implementation of Mobile IP in
ns2 and that have been reported by Michal in AUGUST 2005.
The modifications indicated by Michal are infact confusing me.
The function to get the current mobile node get_node_michu() is giving
problems while compiling.
I am posting the modificatins done by Michal. Can any one really give me a
better and working modification in ns-2.28
Thanks
Michal
PS. Below there is ll:recv() function with my modifications.
_/*
This shall be added in arp.cc
MobileNode*
ARPTable::get_node_michu()
{
return node_;
}
*/
void LL::recv(Packet* p, Handler* _/*h*/)
{
hdr_cmn *ch = HDR_CMN(p);
hdr_arp *ah = HDR_ARP(p);
hdr_mip *miph = hdr_mip::access(p);
hdr_ip *ip_h = hdr_ip::access(p);
//char *mh = (char*) HDR_MAC(p);
//struct hdr_sr *hsr = HDR_SR(p);
_/*
* Sanity Check
*/
assert(initialized());
//if(p->incoming) {
//p->incoming = 0;
//}
// XXXXX NOTE: use of incoming flag has been depracated; In order to track
direction of pkt flow, direction_ in hdr_cmn is used instead. see packet.h
for details.
// If direction = UP, then pass it up the stack
// Otherwise, set direction to DOWN and pass it down the stack
if(ch->direction() == hdr_cmn::UP) {
//if(mac_->hdr_type(mh) == ETHERTYPE_ARP)
if(ch->ptype_ == PT_ARP){
if(ah->arp_spa == 4194305) // I mean Mobile Node's IP here. Not very
elegant way to do it
{
if(licznik < 10)
{
nsaddr_t src_arp = arptable_->get_node_michu()->address(); // this host's
IP addr
nsaddr_t dst_arp = miph->ha_; //Home Address of Mobile Node
arptable_->arprequest(src_arp, dst_arp, this);
licznik++;
//printf(" src_arp %d\n", src_arp);
//printf(" dst_arp %d\n", dst_arp);
//printf("arprequest %d\n", licznik);
}
}
if(ah->arp_spa == 4194304) // I mean Mobile Node's IP here. Not very
elegant way to do it
{
if(licznik2 < 10)
{
nsaddr_t src_arp = arptable_->get_node_michu()->address(); // this host's
IP addr
nsaddr_t dst_arp = miph->ha_; //Home Address of Mobile Node
arptable_->arprequest(src_arp, dst_arp, this);
licznik2++;
//printf(" src_arp %d\n", src_arp);
//printf(" dst_arp %d\n", dst_arp);
//printf("arprequest %d\n", licznik);
}
}
if(ah->arp_spa == 8388608) // I mean Mobile Node's IP here. Not very
elegant way to do it
{
if(licznik3 < 10)
{
nsaddr_t src_arp = arptable_->get_node_michu()->address(); // this host's
IP addr
nsaddr_t dst_arp = miph->ha_; //Home Address of Mobile Node
arptable_->arprequest(src_arp, dst_arp, this);
licznik3++;
//printf(" src_arp %d\n", src_arp);
//printf(" dst_arp %d\n", dst_arp);
//printf("arprequest %d\n", licznik);
}
}
arptable_->arpinput(p, this);
//printf("arpinput %d\n", licznik);
}
else
{
if((miph->type_ == MIPT_REG_REQUEST) || (miph->type_ == MIPT_REG_REPLY) ||
(miph->type_ == MIPT_SOL)) //in FA
{
nsaddr_t src = arptable_->get_node_michu()->address(); // this host's IP
addr
nsaddr_t dst = miph->ha_; //Home Address of Mobile Node
arptable_->arprequest(src, dst, this);
//uptarget_ ? sendUp(p) : drop(p);
//printf(" src %d\n", src);
//printf(" dst %d\n", dst);
//printf("uptarget_ MIPT_REG_REQUEST\n");
}
uptarget_ ? sendUp(p) : drop(p);
//printf("uptarget_\n");
}
return;
}
if((miph->type_) == MIPT_REG_REQUEST)
{
//double local_time = Scheduler::instance().clock();
//printf(" local_time MIPT_REG_REQUEST %.9f\n", local_time);
// printf("MIPT_REG_REQUEST %d \n",
arptable_->get_node_michu()->address());
nsaddr_t src_down = 4194305;
//arptable_->get_node_michu()->address(); // this host's IP addr
nsaddr_t dst_down = miph->coa_; //miph->coa_;
arptable_->arprequest(src_down, dst_down, this);
}
else if((miph->type_) == MIPT_ADS)
{
//double local_time = Scheduler::instance().clock();
//printf(" local_time MIPT_REG_REQUEST %.9f\n", local_time);
nsaddr_t src_down = 4194305;
//arptable_->get_node_michu()->address(); // this host's IP addr
nsaddr_t dst_down = miph->coa_;
arptable_->arprequest(src_down, dst_down, this);
}
_/*
nsaddr_t src_down = 4194305;
nsaddr_t dst_down = 8388608;
arptable_->arprequest(src_down, dst_down, this);
nsaddr_t src_down = 8388608;
nsaddr_t dst_down = 4194305;
arptable_->arprequest(src_down, dst_down, this);
nsaddr_t src_down = 8388608;
nsaddr_t dst_down = 4194304;
arptable_->arprequest(src_down, dst_down, this);
*/
double local_time = Scheduler::instance().clock();
if(local_time < 13)
{
printf(" time %.9f node %d packet %s\n", local_time,
arptable_->get_node_michu()->address(), packet_info.name(ch->ptype()));
}
ch->direction() = hdr_cmn::DOWN;
sendDown(p);
}
---------------------------------
New Yahoo! Messenger with Voice. Call regular phones from your PC and save big.