Limited Flooding Algorithms
500 180
~ ~
/* Last Koddified: Augus"t 23, 2000 */
~ ~
~ ~
/ **************************************************************~************/
#:includeIImessagessl.hll
#defille NumberOfNodes
#defille PI 3.141
#defille DEBUG
#defille ARRIVAL 0.4
#defille DATA_RATE 512
#defille Real_to_sim DATA_RATE*1024.0/1000 extern double drand48();
extern double srand480;
/ / THE PROTOCOLS
#defille LllFLOOD1 1
#define LIIFLOOD2 0
#defille LllFLOOD3 0
#define LllFLOOD4 0
#define LllFLOOD5 0
#define LIIFLOOD6 0
#d.efille LKFLOODO 0 / / SIKOLATIONENTITIES
#define ne_exp_"time
#define hello_period
#define LFP_FLG 1
int BELLO_LENGTH = hello_length*Real_to_sim;
int ACK_LENGTH = ack_length*Real_to_sim;
int KINS_PIIT = mins_pkt*ReaJ._to_si.n;
in"t KAXS_PIIT = maxs_pkt*Real_to_sim;
int KINL_PIIT = min.l_pkt*Real_to_sim;
int HAIL_PIIT = maxl_pkt*Real_to_sim;
int ACK_TIMEOUT = ack_timeout*Real_to_sim;
int NE_EXP_TIHE = ne_exp_time*Real_to_sim;
int BELLO_PERIOD =hello_period*Real_to_sim;
double tJ::_usage_data[NumberOfNodes];
double tx_usage_rt [NumherOfNodes] ; double =_usage_data[NUlIlberOfNodes];
double =_usage_rt[NumberOfNodes];
double avg_mobili"ty=O.O,double av~comm=0.0;
double avg..data=O.O,avg..rt=0.0;
int delay [10] ,ne"_time[10] ,old_tiDe [10] ; int avg..num..hellos =0, avg_data_timeou"t=0;
int aVi-data_success= 0, Av~route_success=0;
int avg..data_sent= 0, avg_da"ta_received=0;
int avg_ack_sent O,avg..ack_received=0;
/ / SOME IMPORTANT FUNCTIONS
/I DEFAllI.TVALUES FORPARAKETERS AND CONSTANTS entity MOBILITY();
enti"ty MOBILITY_TRACKD;
enti"ty LinkO;·
enti"ty Node (ill"t ,ename) ;
enti"ty TRANSKITTER(ename,ename);
enti"ty RECEIVER(ename,ename);
#define RANGE
#d.efille Area..Size
#d.efille mins_pk"t
#d.efille lIIllXS_pkt
#defille mi.n.Lpkt lIdefine maxl.-pkt lIdefille ack_"timeout
#define IUX_SIK_TIME lIdefine I118X_S:m-."time
#d.efine hello_length
#d.efine ack_length
#d.efilleVEL_KIN
#defille VEL_KAX
0.4 1.0 2.000 4.500 2.000 5.000 200 1046576 2000 2.442 2.100 0.200 0.500
int expon(int mean) {
re1:urn (int) «-log«double) (double)(1.0-drand480»)* «double)mean»;
}
int uniform_random (illt lov, int high) {
return lov + rand()7.(high-lov+1);
}
double NODE_DISTANCE(illtA, int B) {
double%a, ya, xbJ yb ; double ansver;
int na, nb;
i t (A==B) { re"turn 0.0; } xa=10c_data[A].LocX;
ya=10c_data[A] .LacY;
xb =10c_data[B] .LacX;
yb =10c_data[Il]. LacY;
ansver =sqrt ( (xb-xa) * (xb-xa) + (yb-ya) * (yb-ya) ) ; return answer;
}
int NODE_NUKBER(ename A) {
2
int i;
for (i""; i<NumberOfNodes;i++) {
i f ename_CIIlp(A,~oc_data[i].1iodeName) return 1oc_data[i] .NodeNumber; } return -1;
}
en...1l0DE_NAHE(illt i) {
return 1oc_data[i].NodeName;
}
in"t lI'ODEJjEGREEO {
int degrees =0;
iDt: iJlfroMi
tor (i~;i<NumberOfHodes;i++){
i f « from! -i) U(NODE_DISTANCE(from, i » <=RAHGE) degrees++;
}
re~ degrees;
}
enti"ty KOBILITYO {
bt i;
doublex,y;
enUle mob_con;
charL;
nob_coD =nell KOBILITY_TRACK();
tore; ;) {
hold(200);
{ }
for(i-D;i<JumberDtBodes;i++) {
i f(10c_data[i] • Hoving) {
svitch (loc_data[i].HotiOD_Type) {
case 'L':
% • loc_data[iJ.LocI + 200*10c_data[iJ.Hob_coeft[0];
i f (x>=Area_Size) {
x =Area_Size;
J.oc_da"ta[i) • Kob_coeff [0] = -1 * 10c_data[i] .Kob_coefi[O] ; }
i t (%<=0.0) {
x· 0.0;
1oc_data(i] .Kob_coetf[OJ = -1 * 1oc_data[i) .Hob_coett[OJ;
3
}
10c_data[i] •locI=x;
Y=10c_data[i].LocY+ 200*loc_data[i].Kob_coeff[l];
i f (y >gArea-Size) {
y = Area_Size;
10c_data(i] .Kob_coeff[l] • -1 * loc_data(i] .Kob_coefi[l];
}
i f (y <= 0.0)
{ ,
y = 0.0;
10c_data[i].Kob_coetf[l] =-1 * loc_data[i].Kob_coeff[l];
}
10c_da"ta[i] .LocY= y;
break;
defauJ."t:
prill"tf("# No"t valid moUon profile\n");
} } } } }
void se"tKotionParams(ill"t i) {
in"t vel_variationg (VEL_KAI - VEL_MIN)*Real_"to_sim;
double min_vel c VEL_KI1i*Real_to_simllOOO;
double vel;
int max_s1opec 90;
in"t min_slope =0;
double s1ope. scaling;
double hor,ver;
vel=VEL_1lDI + (VEL_IlAI-VEL_llllO*drand480;
1oc_data[i].vel=vel;
slope = (PI/2)*drand48();
hor=vel/sqrt(l+tan(slope)*tan(slope);
ver • tan(s10pe)*hor;
scaling= l000*Real_to_sim;
hor • hor/scaling;
ver • ver/scaling;
i f«illt) (2.0*drand48(») hor=-1 * hor;
i f«illt) (2.0*drand48()) ver = -1 • veri
loc_data[i).Kob_coeff[OJ • hor;
1oc_da"ta[i] .Kob_coeff [lJ = ver;
}
entity HDBILITY_TRACKO {
illt i,DOll. HOBILITY_TIKE, c=re.nt_even"t_time;
in"t Dert_event [Il1IlIlbe%OfBodesJ ; for(i-O; i<lilllllberDfJilodes; i++)
{
loc_data[i] .Hoving= (illt) (2.0*drand480);
4
{
aVgJlobility += loc_data[i]. ve1*DIaX_sim_time*Real_to_sim;
} else
{
avg_lDObility+=loc_cIata[i]. ve1*next_event [i] ; }
} else
{
next_event[i] = Real_to_sim*(MIN_PAUSE + (HAX_PAOSE - KIN]AUSE)* 1.0*<!rand480);
} } for (;;)
{
no" = simc10ck () :
for (i=O ; i <HumberOfliodes; i++) {
if(no">=next_event [i]) {
i t(loc_data[i] .Hoving) {
l.oc_data[i] .!loving = 0;
next_event[i] +=Real_to_sim*(lUli]AUSE + (HAX]AUSE - llIN_PAUSE)* 1.0*drand480);
} else
{
setMotioIlParams(i);
loc_data[i].lloving = 1;
HOBILITY_TIlIE=Real_to_sim*(MIli_IlOBILITY + (HAX_HOBll.ITY- llIN..HOBll.ITY) * 1. O*drand48 0) ;
current_event_time = next_event[i];
next_event[i] +=I!OBILITY_TIHE;
i f(next_event [i] > ma:l_sim_time*Real_to_sim) {
avg....obility+= loc_data[i].ve1*(max_sim..time*Real_to_sim- current_event_time) ;
} dae
{
aVgJllobility+=loc_data[i] .ve1*HOBILITY_TIlIE:
} } } } hold (1);
}
5
""''''...
{
int priority;
i f «int) (2.0*drand48(») ninfo[i] .ptype =1;
else
ninf0[i] . ptype = 0;
}
void randomd(int i) {
intdest;
int Kax =liumberOfliodes-l;
dest = i;
for(;dest = i;)
dest = (int) (NumberOfNodesH.O*drand480 ) ; ninfo [iJ . Destination = dest;
}
void randomp(int i) {
i f «int) (2.0*drand480»
ninfo[i] .pkt_1ength = IUNS_PIIT+(JUXS_PIIT - KINS_PIIT)* 1. O*drand48 0 ; else
ninfo[i] .pkt_1ength = I!INL_PIIT+(Jun_PIIT - llINL_PIIT)* 1. O*drand480 ;
}
/ / ROUTDlG RELATED FU1lCIIONS
void de1-neighbor_list(struct neighbor_1ist *1.ist) {
struct neighbor_list *current, *nett;
cn:rrent ="listj
"hile(current) {
next = current->next_neighbor;
rree{cu=ent) ; current= next;
} }
strnct rmpr_rtentry* nJPr_rt1ookup{struct routing..tab1e *Xt,mt ipaddr) {
struct routml>-tahle *lptr;
Iptr = rt;
"hile (lptr !=NULL) {
.if (lptr->rtentry->dest= ipaddr) return 1ptr->rtentry;
Iptr=1pt;r->next;
}
returnNULL;
6
strue:t routiDg.."table *table_en"try. *lpt:r;
ire (route=rmpr_r"tloomp(r"t,dest» !.. IIUI.L) {
i.f((sequenee>route->sequenee)II«sequenee-eroute->sequence)tt
Unetrie<route~>lIlItrle)» {
route->dea~• dest;
rou"te->ptypeE ptype;
route->metric • metric;
route->sequence • sequence;
route-~lagsE flags;
} } else {
if«ron"te .. malloe(sizeof(strue:t nDpr_rtentry))) ...NULL) { printf("tOut of ...ory\n.. );
exit(-l);
}
ir«(table_entry .. maJ.loe(si%eof(struC1: routiDg..table)) . .NULL) { printf(·tOut of m....ory\n·);
erit(-l);
}
if (r"t -=IIUI.L){
n .."table_en"try;
lptr=n ; }
else { lptr =r"to
vhile(lptr->ne:rt !=NULL) lptr =lptr->nert;
lptr->nert • table_entry; . lpt:r =lptr->nert;
}
lpt:r->rtentry =route;
lptr->nert • NULL;
lptr->rten"try->des"t • dest;
lp"tr->rtentry->ptype .. ptype;
lp"tr->rtentry->metric .. me'tric;
lptr->rtentry->sequence • sequence;
lp"tr->rtentry-~1ags.. flags;
lptr->rtentry->source_listE NULL;
}
return rt;
}
struC"t rou"ting.."table* rupr_r"tdelroute(struC1: routini-table *r"t,int dst) { struc:1: rou"tiDg.."table *"tIIp_rt. *r"t_pr8V; *lptr;
lptr .. n ;
i fCl1,ptr) return troLl.;
ir(lptr->rtentry->dest-=dst) { tJIp_rt • lptr->nert;
7
}
vhi.le(lptr->next) {
if (lp"tr->next->rtenny->destE : dst) {
"tmp_rt =lp"tr->next;
lptr->next .. lptr->nert->next;
delJ1eighbor_lis"t (tIIp_r"t->rtentry->souree_li.s"t) ; if (tIIlp_r"t->r"tentry) free (tIIlp_rt->rtentry) ; if(tmp_rt) free(tIIlp_r"t);
return. rt;
}
r"t_prev .. lptr;
lptr .. lptr->nert;
}
if (lp"tr->rtentry->dest ... dst) { r"t_prev->nert .. NULL;
del_neighbor_list(lptr->r"tentry->souree_li.st);
if(lptr->rtentry) free(lptr->rtentry);
if(lptr) free(lpn);
}
ret:urnrt;
}
void nnpr_rtaddsre( strnC1: routing..table *r"t,iDt dst.int ipaddr) {
s"truC1: rmpr_rtentry *route0
struC1: neighbor_list *lis"t_item. *last_item;
if «rout;e .. rmpr_rtlookup( n ,dst) ) !=IIUI.L) {
if «(list_item=malloe(sizeot (struC1: neighbor_list)) == HULL) { prin"tt("#Ou"t of memory\n");
exit(-l);
}
list_i"tem->neighbor=ipaddr;
list_i"tea->nert_neighbor • NULL;
if (route->souree_list . . NULL) { route->souree_list =lis"t_item;
} else {
last_i~em• route->source_list;
vbile (last_i"t...>next J1eighbor) { last_it:em .. last_it....->ne:rt_neighbor;
}
last_item->nert_neighbor .. list_item;
} } }
struC1: neighbor_list* LookupJ1e( struet neighbor_li.st *neighbors,int ipaddr) {
struet neighbor_list *lp"tr;
8
local_ftll~ 10cal_fIll->next;
}
returnNULL;
}
return neighbors;
}
r e = NULL;
!=NULL) {
= NULL) { }
return fvl;
}
}
if (fvl= NULL){
else {
if«netl_fvl= maJ.loc(sizeof(struet data_fvl») printfC""Dut of lIemory\n");
exit(-l); .
strnet data_fvl =existinl;-fvl, "Ile..-_f..-l, *lptr;
if«existinl;-fvJ. =rmpr_dflookup(f..-l.src.dst.se<J-DO»
if(existing..ftll->hops_to_source > metric) { existinl;-fIll->src=src;
existinl;-fvl->dst=dst;
existinl;-ftll->sequence_no=seq_no;
existing..fvl->hops_to_source=metric;
return neighbars;
{ }
struet data..fvl* rmpr_fIlladd(struet data_f..-l *fIll.int src.int dst, unsigned J.ong seq_no. int metric)
}
ne_prey=1ptr;
Iptr= Iptr->:nextJieighbor;
}
if (lptr->neighbor= ne) { ne_prev->next_neighbor= NULL;
if(lptr) free(lptr);
}
strnet ad_ftll* rmpr_aflookup(struet ack_ftll *fIlla, int ipaddr. int daddr.lUlSigned long se<J-no) {
strnet ad_fIll *local_fIlJ.a;
local_fvla=fvla;
..-hile(J.ocal_f..-la !=NULL) {
i f «local_f..-la->src= ipaddr) t.!c(local_fvla->sequence_110= seq_no) U (local_f..-la->dst=daddr» return 10cal_fIlla;
local_f..-J.a=local_fIlla->next;
}
strnet data_ftll* rmpr_dflookup(struet data...fIll *fIll, int ipaddr.
int daddr, unsigned long seq_no) {
struct data_fvl *local_ftll;
local~fIll=fvl;
Ilhile(10cal_fIll != NULL) {
if «10cal_fv1->src= ipaddr) U(local_ftll->sequence..no= seq_no) U: Clocal_:fv1->dst=dadd:
if (neighbors= NULL) { neighbors =ne;
Iptr =neighbors;
}
1ptr=neighbors;
Ilhile (1ptr != BULL) {
if (lptr->neighbor=.ipaddr) r e = Iptr;
Iptr=Iptr->next_lleighbor;
}
returnNULL;
}
struet neighbor_lis1:* AdlLne ( struet neighbor_list *neighbors, int ipaddr, lUlSigned long seq_no) {
strnet neighbor_lis1: *ne. -lptr;
if«ipaddr <0) U: (ipaddr >=lIwaberOfNodes» { e::z:it(-1) ;
}
if«ne "" Lookup_ne(neighbors,ipaddr» != NULL) { ne->neighbor=ipaddr;
ne->sequence_no =seq-no;
} else {
if «ne =mali.oc(sizeof(strnet neighbor_list»))= NULL) { printf("#Out of memory\n");
axit(-1) ; }
else {
Iptr .. neighbors;
Ilhile(lptr->llext..neighbor != NULL) Iptr .. 1ptr->next_neighbor;
Iptr->next_neighbor= ne;
Iptr =1ptr->next..neighbor;
}
J.ptr->neighbor "" ipaddr;
J.ptr->sequence_llo= seq_no;
Iptr->next_neighbor =NULL;
}
Ilhile(lptr->next_neighbor) {
if(lptr->nextJieighbor->neighbor==ne) { tmp..ne "" Iptr->next-neigbbor;
Iptr->next-neighbor " lptr->next_neighbor->nextJieighbor;
}
retu:rn neighbors;
}
strnet neighbor_list* Del_ne( 8 t = neighbor_lis1: *neighbors,int ne) { strnet neighbor_list *tDlp-ne. *ne_prey. *lptr;
Iptr .. neighbors;
ifC!lptr) retu=.NULL;
if (lptr->neighbor== ne) { tIIIp_ne= Iptr->next_neighbor;
ifClptr) free(lptr);
neighbors .. tmpJie;
return neigbbors;
9 10
J.ptr =fVJ.;
}
else { J.ptr = fvJ.;
vhile (J.ptr->next != NUll) lptr=J.p1:r->next;
lptr->next= nev_fliJ.;
J.ptr= 1ptr->next;
} lptr->src = src;
lptr->dst =list;
J.ptr->sequence_no=seq_no;
lptr->hops_to_source=Detric;
return fvJ.;
} }
strnct ack_fvl* rmpr_afvladd(struct ad_fvl *fv1a,int src,int ds"t, unsigned J.ong seq_no, int me"tric)
{
struct ack.-fvl *existin&-fvla, *nev_fvla, *J.ptr;
if«exist~fvJ.a= napr_afloolmp(:fvla,src,dst,seqJlo)) !=NULL) { if(eristing_flila->hops_to_source>metric) {
existing..fliJ.a->src =src;
existing..fv1.a->dst =dst;
existin&-fvJ.a->sequence_no= seqJlo;
existing..fvJ.a->hops_to_source=metric;
r e t = fvJ.a;
} } else {
if «nev_fvla= malioc (sizeof (struct a.c:k-.flll))) = NULL) { printf(n#Out of memory\nW);
exit(-I);
}
if (fliJ.a- NULL){
fv1a .. D.Elll_fvla;
lptr .. fllJ.a;
}
else { lptr=fvJ.a;
1lhiJ.e(1ptr->next !=BULL) lptr= J.ptr->next;
lptr->next=nell_flila;
J.ptr= 1ptr->next;
} 1ptr->src= src;
lptr->d.st z dst;
1ptr->sequenceJlo= BeqJlO;
lptr->hops_to_source=metric;
11
retuIn fvla;
} }
void dispJ.ay_neighbors(struct neighbor_list *neighbors, int node_num,int current_time) {
struct neighbor_lis"t *lptr;
lptr= neighbors;
}
void display_da"ta_fJ.ist(struct data..fvl *fvJ., in"t node_nUlll, int current_time) {
strnct data_fvl *J.ptr;
lptr =fvJ.;
vhile(lptr) { lptr= lp1:r->next;
} }
void display_ack_flist (struct ad_fvl *fllla, in"t node_nUlll, int current_time)
{
stract ack_fvl *lptr;
lptr =fvJ.a;
}
void display_routes (struct routing_table *r"t, int node_nUlll, int current_time) {
struct rout ins-table *1rt;
struct rmpr_rtentry *J.route;
struct neighbor_list *src_J.ist;
J.rt =rt;
llhile(J.rt) {
if«J.route= J.rt->rtentry)!=NlJLL) { src_list = lroute->source_list;
}
J.rt =1rt->next;
} }
/ / THE COHHllNICATOR ENTITY entity COIlHUNICATORO
{
i.D.t i,dest~ nov;
int next_packet [HumberOfllodes] ; int next_event [HumberOfllodes] ;
hold(l);
for (izO;i<JlumberOfllodes;i++) { randomd(i) ;
ninfo[i] •Sendi.Dg=(int)(2. O*drand480) ; i f (ni.nfo[iJ .Sending) {
next_event [i] = unifoxm-random(lInCNUH_PKT,H.U..NUlU'KT) *Real_to_sim;
12
next_packet[i] = ninfo[iJ .ph_length;
} else {
next_event[i] = e%pOn«int) «float)l!«:f1oat)ARRIVAL») ..Real_to_sUr.;
} }
noll = simc1ockO;
lihi.le(noli< ReaJ._to_sim"'JDaX_siDLtime) { nOli = simclock0 ;
for (i-O;i<NumberOtHodes;i++) { i f (noli >"'Ile%"t_event (iJ) { i:f (ninfo (i].Sending) {
ninfo[iJ •Sending=0;
next_event(iJ- expon( (int) «float) l/«float)JRRIVAL» )*ReaJ._t:o_sim;
}
else { rBJldomd (i.) ; rBJldomp(i.) ; PacketType(i) ; ninfo[iJ .Sending= 1;
send SERD_IlSG{ninfo [i] .Destination,ninfo [iJ .ptype,ninfo [i.J .ph_length} to NODEJlAME(i);
next_packet [i] = nOli+ninfo [iJ •pkt_length;
next_event(iJ +=1IJIi.foDII_random(HIN_RUH_PKT ,HAX_NUM_PKT)" ReaJ._to_sim;
} }
i:f(Cnov >= ne%"t_packet[i])U ninfo[i] . Sending) { randolllp(i.) ;
PacketType(i);
send SENIUISG{ninfo[iJ .Destinatioll,ninfo[iJ .ptYFe,ninfo[iJ .ph_length}
to NODE_RAME(i) ; }
}
hold(4);
} }
entityTRANSKITTER (ename Parent, enameLink) {
in%; i, src, dest, from, ptype, length, hops, prevJ>op,sqno;
1IJ1SigD.edlong seq_llO. seq-nop, seq..noa;
struet ....ssage..neighbors hello_ne (N1DRberOfNodesJ ;
13
t%~eady_time_data=0;
tx~eady_time_rtng=0;
tx_usage_data[ParentID] =0.0;
t%_usage_rt[ParentIDJ =0.0;
for(;;) {
noli = simclockO;
{
receive(HELLO_HSG h) lihen (noli>=t%_ready_time_rtng) {
src = h.src;
seq-.no ::::h.sequence_no;
i =0;
lihile(ll.hello_ne[iJ .neighbor != -1) {
hello_ne[i].ueighbor=h.hello_ne[i].neighbor;
hello_ne[i] .sequence_DO= h.hello_ne(iJ .sequence..no;
i++;
}
hello_ne [i] .ueighbor= -1;
send HELLO_HSG{src,seq-no,hello_ue} to Link;
t%_ready_time_rtIlg= nOli+HELLO_LENGTH;
t:%_usage_rt[ParentIDJ +=HELLO_LENGTH;
av!-num_hellos++i }
or receive(DATA_PKT datap) lihen (nOli >=t%_ready_time_data) { dest =datap. dest: ;
src= datap.srcj from= datap.from;
sqno= datap. sequence_no;
PtYFe = datap.ptype;
length= datap.length;
send DATA_PKT{dest,src,frcm,sqno,ptype,length} t:-" Link;
tx_ready_t:ime_data=nOli+length;
t%_usage_data[ParentIDJ += length;
}
or receive(DATA_ACK datea) lihen (nOli>= t%_ready_time_data) { dest= dataa.dest;
src= dataa.src;
from= dataa.from;
sqno =dataa.sequence..no;
ptype= dataa.pt:ype;
sendDATA~ACK{dest,src,from,sqno,ptype}to Link;
tx_ready_time_data=nOli+ACK..LENGTH;
tx_usage_data[ParentIDJ += ACK..LENGTH;
}
ort:imeout uter (5) { }
} }
14
}
Node_Ix'" nev 'IlUlISIlI'ITEIl.(sel:f ,Link);
1oc_data[ID] .tx..name '" liode_'Ix;
entity Node (mt ID, enaJle Link) {
ename. Node_'Ix, liode..Rx;
int src, ds't, relayed,prev-Aop. metric, from, ptype;·
unsigned long seq_"o,sqno;
struct aessage_neighbors hello..no[NumberOfNodes];
struct lleighbor_list *lptr;
struct rreq_list *PeDd;
struct routmg..table *DIyroute;
struct nnpr_rtentty *routeen;
mt modi:fied;
int ne:rt_hello_tille;
unsigned longlIlY_seq..no= 0;
unsigned long Seq_"Op - 0;
unsigned long Beq..noa=0;
struct iLeighbor_list *».eighbors • NULL;
struct routiIlg..table *r1: '" 1lllLL:
struct data_fvl *fill '"1lllLL;
struct data_f...l *dfl • 1lllLL;
struct data_fTifl *».ev_fTifl;
struct ack_f l *:fvla'"NULL;
struct ack_f l -.lfla-1lllLL;
struct ack_fvl *».oll_fvla;
struct nnpr_rtentty *route - NULL;
struct neighbor_list "TIIIpr..neighbor=1lULL;
int ne_e%p_timer[JlumberOfNodes];
mt rt_e%p_timer[llumberOtBodes];
strue:t rr_et *rr_oxp_timer '" NULL;
int expec:ted_ack_time [liumberO:fliodes] ; int sencl_ack_tiJDe[IIU11berllfllodes];
int i,nov;
int pkt_length;
ne:rt_hello_tille '" IIEI.LllJERIDD*1.0*drand.48();
for (i=O; i<NumberllfJIodes ;i++) { e:z:pected_aa_tille[iJ • -1;
ne_e%p_t1mer[i] '"-1;
rt_exp_timer [iJ '" -1;
senU_ack_timo[i] =-1;
lUlBigned .long B"'l-no, slKl_noP, seq.Jloa,sqno ; strue:t . . .sage..neighbors bello_ne [BumberO:fliodes] ; mt ParentID;
mt rx..read.y_time_cIata.;
mt rx..ready_tiJDe_rtng;
mt no",;
mt c:otmt;
ParentID - HODEJmKBER(Parent);
rx_relld.y_time_datac 0;
rx..ready_t1me_rtDg ., 0;
=_usage_data(ParentID] ., 0.0;
=_usage_rt (ParentID] • 0.0;
c:ount cO;
for(;;) { nOIl =sillc:loc:il:0 ;
{
receive(BELLO_KSG he) ...hen (noll >c=_rolld.y_time_rtDg) { src. he.src;
seq,.no • he.sequence..no;
ieO;
Ilhile(he.hello..netiJ .neighbor !=-1) { hello..ne[i].neighbor=he.hello_ne[i).neighbor;
hello..ne[iJ .sequ....c:e..no= he.hello_no[i] .sequence..no;
i++j }
hello_D.e[i] .lleighbor=-1;
send HELLD_HSG{src,BIKl..no,hello_ne} to Paren1: after IIEI.Lll_LENGTH;
=_read.y_tiJDe_rtngE nov+ HELLO_LENGm;
r1-us&ge_rt(ParentID] - lIELLO_LENGm;
aTs-num_hellos++;
}
or receiTe(DATA_PKT datap) vhen (nOTif >-rx_ready_time_data) {
deat ., datap. dest;
src: - datap. src;
from • datap. frOll;
sqoo • datap.aequence-no;
ptype =.datap.ptype;
lengt:h • datap.length;
send. DAT.l_PKT{c1est.src,frOll,aqno,ptype,length} to Parent Uter length;
rx_ready_t1ae_data - nov+ length; . r1-usage_data(ParentID] - length;
}
or receive(DATA..J.CK dataa) vhen (no... ==_ready_t:ille_data) { c1est -datu..c1est;
arc" dataa..src;
=_usage_data[ParentID] +=ACK_LE:HGTH;
}
or timeolIt af1:er(20) }
} }
/ / !HEBODEEIlTITT
15 16
}
} else {
it«d:fla = rmpr_aflookup(f"la.src,ds"t,sqno» !=NULL) { NULL) {
}
i t(Lookup_ne (neighbors ,from) !=NULL) { ne_exp_timer{from] = no..+llE..EX!'_'!IHE;
} }
}
fvla = rmpr_afvladd(fvla.src.dst.sqno,metric);
ne"_f,,1a = rmpr_aflookup(f"la.src,dst.aquo);
from :;; ID;
send DATA_ACK{dst,src.from.seq_noa.ptype} to Node_Ix;
metric++;
relayeda++ ; else {
or receive(DATA_ACK dataa) { dst = dataa.dest;
src= dataa.. srcj from =dataa.from;
. sqno =d.ataa. sequence-no;
ptype = datllB.. ptype;
it ( m != src) {
it«m= dst) U (d:fla = rmpr_lItloo!tup(f"la,src,dst,sqno»
ne,,_time[src]=no,,;
delay[src] = ne".."time [src]-old_time [src] ; avg_delay = avg..delay+ de1ay[src];
avg_ack_received++;
fvla = rmpr_af"ladd(f"la,src,dst.sqno.metric);
ne"_fvla = rmpr_aflookup(f"la,src.dst.sqno);
it (no" <=expec"ted_ack_time[src]) { expected_atk_time[src]=-1;
av~data_success++;
} seq..n0P++;
old_time[src]= siJncJ.ockO;
metric++;
expected_ack..:time[dst] = nov + metric*(pkt_length+ACICLEIIGTH) + ACICIDIECJllI;
}
} } else {
if«hello..ne[i].sequence..no >route->sequence)I1«
hello..ne[i] .sequence..no ==rou"te->sequence)U (route->metric > 2») {
rmpr_rtaddrouteert.hello..ne[i).neighbor. src, 2.
hello..ne[i] • sequence_no , 0);
i++j }
hello..ne[i] .neighbor = -1;
i:f«rou"te = rmpr_rtloolrup(rt.src» !=NULL) {
rmpr_rtaddroute(rt.src. src, 1. seq_no, 0);
rt_exp_timer[src]) ; }
else {
rt = rmpr_rtaddroute(rt,src, src, 1. seq_no, 0);
}
rmpr..neighbor .. Lookup_ne(neighbors,src);
if (rmpr_neighbor - HUU.) {
neighbors =Add_ne (neighbors.src ,seq_no) ; ne..exp_tiJller(src] = no..+ llE_EXP_TnlE;
} else {
neighbors =Add_ne(neighbors.src,seq_no);
ne_exp_t:imer[src] = no" + llE..EXP_TIME;
i=Oj
vhil.e(hello..ne[i] .neighbor != -1) { it (hello_ne [i] .neighbor != m) {
i:f«rou"te=rmpr_rtloolrup(rt.hello_ne[i] .neighbor» = HUU.) { rt = rmpr_rtaddroute(rt.hello..ne[i] .neighbor. src. 2,
hello_ne[i].sequence_no.O);
}
i++;
}
receive(IIELLOJlSG he) { src = he.src;
seq..no = he. sequence_no;
i = 0;
"hil.e(.he.hello..ne[i] .neighbor !=-1) {
hello..ne[i] .neighbor = he.hello_ne[i] .neighbor;
hello_ne[i] .sequence..no=he.hello_ne[i] .sequencs..no;
} } }
or receive(SEIiD_KSG sendd) { pkt..length .. sendd.length;
dst =send.d.des1:!J>ation;
}
orreceive(DATA_PKT datap) { det= datap.dest;
src .. datap. src;
from =datap.from;
aquo = datap. sequence..no ;
17 18