• Tidak ada hasil yang ditemukan

Limited Flooding Algorithms Source Code

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) {

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)I

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