Contiki Rpl Timers
description
Transcript of Contiki Rpl Timers
-
6/8/2015 contiki/rpltimers.catmastercontikios/contikiGitHub
https://github.com/contikios/contiki/blob/master/core/net/rpl/rpltimers.c 1/7
Explore Features Enterprise Blog
contiki/core/net/rpl/rpltimers.c
7contributors
simonduqon10MayRPL:whennoprobingtargetisfound,probeleastrecentlyupdatedpa
Signup SigninThisrepository Search
329 1,436 1,027Watch Star Forkcontikios / contiki
masterBranch:
424lines(381sloc) 14.279kB
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
Raw Blame History
/**Copyright(c)2010,SwedishInstituteofComputerScience.*Allrightsreserved.**Redistributionanduseinsourceandbinaryforms,withorwithout*modification,arepermittedprovidedthatthefollowingconditions*aremet:*1.Redistributionsofsourcecodemustretaintheabovecopyright*notice,thislistofconditionsandthefollowingdisclaimer.*2.Redistributionsinbinaryformmustreproducetheabovecopyright*notice,thislistofconditionsandthefollowingdisclaimerinthe*documentationand/orothermaterialsprovidedwiththedistribution.*3.NeitherthenameoftheInstitutenorthenamesofitscontributors*maybeusedtoendorseorpromoteproductsderivedfromthissoftware*withoutspecificpriorwrittenpermission.**THISSOFTWAREISPROVIDEDBYTHEINSTITUTEANDCONTRIBUTORS``ASIS''AND*ANYEXPRESSORIMPLIEDWARRANTIES,INCLUDING,BUTNOTLIMITEDTO,THE*IMPLIEDWARRANTIESOFMERCHANTABILITYANDFITNESSFORAPARTICULARPURPOSE*AREDISCLAIMED.INNOEVENTSHALLTHEINSTITUTEORCONTRIBUTORSBELIABLE*FORANYDIRECT,INDIRECT,INCIDENTAL,SPECIAL,EXEMPLARY,ORCONSEQUENTIAL*DAMAGES(INCLUDING,BUTNOTLIMITEDTO,PROCUREMENTOFSUBSTITUTEGOODS*ORSERVICES;LOSSOFUSE,DATA,ORPROFITS;ORBUSINESSINTERRUPTION)*HOWEVERCAUSEDANDONANYTHEORYOFLIABILITY,WHETHERINCONTRACT,STRICT*LIABILITY,ORTORT(INCLUDINGNEGLIGENCEOROTHERWISE)ARISINGINANYWAY*OUTOFTHEUSEOFTHISSOFTWARE,EVENIFADVISEDOFTHEPOSSIBILITYOF*SUCHDAMAGE.**ThisfileispartoftheContikioperatingsystem.*/
/***\file*RPLtimermanagement.**\authorJoakimEriksson,NicolasTsiftes*/
/***\addtogroupuip6*@{*/
#include"contikiconf.h"#include"net/rpl/rplprivate.h"#include"net/ipv6/multicast/uipmcast6.h"#include"lib/random.h"#include"sys/ctimer.h"
#defineDEBUGDEBUG_NONE#include"net/ip/uipdebug.h"
/**/staticstructctimerperiodic_timer;
staticvoidhandle_periodic_timer(void*ptr);
-
6/8/2015 contiki/rpltimers.catmastercontikios/contikiGitHub
https://github.com/contikios/contiki/blob/master/core/net/rpl/rpltimers.c 2/7
57585960616263646566676869707172737475767778798081828384858687888990919293949596979899
100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
staticvoidnew_dio_interval(rpl_instance_t*instance);staticvoidhandle_dio_timer(void*ptr);
staticuint16_tnext_dis;
/*dio_send_okistrueifthenodeisreadytosendDIOs*/staticuint8_tdio_send_ok;
/**/staticvoidhandle_periodic_timer(void*ptr){rpl_purge_routes();rpl_recalculate_ranks();
/*handleDIS*/#ifRPL_DIS_SENDnext_dis++;if(rpl_get_any_dag()==NULL&&next_dis>=RPL_DIS_INTERVAL){next_dis=0;dis_output(NULL);}#endifctimer_reset(&periodic_timer);}/**/staticvoidnew_dio_interval(rpl_instance_t*instance){uint32_ttime;clock_time_tticks;
/*TODO:toosmalltimerintervalsformanycases*/time=1ULdio_next_delay=ticks;
/*randomnumberbetweenI/2andI*/ticks=ticks/2+(ticks/2*(uint32_t)random_rand())/RANDOM_RAND_MAX;
/**TheintervalsmustbeequallylongamongthenodesforTrickleto*operateefficiently.Thereforeweneedtocalculatethedelaybetween*therandomizedtimeandthestarttimeofthenextinterval.*/instance>dio_next_delay=ticks;instance>dio_send=1;
#ifRPL_CONF_STATS/*keepsomestats*/instance>dio_totint++;instance>dio_totrecv+=instance>dio_counter;ANNOTATE("#Arank=%u.%u(%u),stats=%d%d%d%d,color=%s\n", DAG_RANK(instance>current_dag>rank,instance),(10*(instance>current_dag>rank%instance>min_hoprankinc))/instance>min_hoprankinc,instance>current_dag>version,instance>dio_totint,instance>dio_totsend,instance>dio_totrecv,instance>dio_intcurrent, instance>current_dag>rank==ROOT_RANK(instance)?"BLUE":"ORANGE");#endif/*RPL_CONF_STATS*/
/*resettheredundancycounter*/instance>dio_counter=0;
/*schedulethetimer*/PRINTF("RPL:SchedulingDIOtimer%luticksinfuture(Interval)\n",ticks);ctimer_set(&instance>dio_timer,ticks,&handle_dio_timer,instance);}/**/staticvoid
-
6/8/2015 contiki/rpltimers.catmastercontikios/contikiGitHub
https://github.com/contikios/contiki/blob/master/core/net/rpl/rpltimers.c 3/7
129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
handle_dio_timer(void*ptr){rpl_instance_t*instance;
instance=(rpl_instance_t*)ptr;
PRINTF("RPL:DIOTimertriggered\n");if(!dio_send_ok){if(uip_ds6_get_link_local(ADDR_PREFERRED)!=NULL){dio_send_ok=1;}else{PRINTF("RPL:PostponingDIOtransmissionsincelinklocaladdressisnotok\n");ctimer_set(&instance>dio_timer,CLOCK_SECOND,&handle_dio_timer,instance);return;}}
if(instance>dio_send){/*sendDIOifcounterislessthandesiredredundancy*/if(instance>dio_redundancy!=0&&instance>dio_counterdio_redundancy){#ifRPL_CONF_STATSinstance>dio_totsend++;#endif/*RPL_CONF_STATS*/dio_output(instance,NULL);}else{PRINTF("RPL:SupressingDIOtransmission(%d>=%d)\n",instance>dio_counter,instance>dio_redundancy);}instance>dio_send=0;PRINTF("RPL:SchedulingDIOtimer%luticksinfuture(sent)\n",instance>dio_next_delay);ctimer_set(&instance>dio_timer,instance>dio_next_delay,handle_dio_timer,instance);}else{/*checkifweneedtodoubleinterval*/if(instance>dio_intcurrentdio_intmin+instance>dio_intdoubl){instance>dio_intcurrent++;PRINTF("RPL:DIOTimerintervaldoubled%d\n",instance>dio_intcurrent);}new_dio_interval(instance);}
#ifDEBUGrpl_print_neighbor_list();#endif}/**/voidrpl_reset_periodic_timer(void){next_dis=RPL_DIS_INTERVAL/2+((uint32_t)RPL_DIS_INTERVAL*(uint32_t)random_rand())/RANDOM_RAND_MAXRPL_DIS_START_DELAY;ctimer_set(&periodic_timer,CLOCK_SECOND,handle_periodic_timer,NULL);}/**//*ResetstheDIOtimerintheinstancetoitsminimalinterval.*/voidrpl_reset_dio_timer(rpl_instance_t*instance){#if!RPL_LEAF_ONLY/*Donotresetifwearealreadyontheminimuminterval,unlessforcedtodoso.*/if(instance>dio_intcurrent>instance>dio_intmin){instance>dio_counter=0;instance>dio_intcurrent=instance>dio_intmin;new_dio_interval(instance);}#ifRPL_CONF_STATSrpl_stats.resets++;#endif/*RPL_CONF_STATS*/#endif/*RPL_LEAF_ONLY*/}
/**/
-
6/8/2015 contiki/rpltimers.catmastercontikios/contikiGitHub
https://github.com/contikios/contiki/blob/master/core/net/rpl/rpltimers.c 4/7
201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
staticvoidhandle_dao_timer(void*ptr);staticvoidset_dao_lifetime_timer(rpl_instance_t*instance){if(rpl_get_mode()==RPL_MODE_FEATHER){return;}
/*SetupanotherDAOwithinhalftheexpirationtime,ifsuchatimehasbeenconfigured*/if(instance>lifetime_unit!=0xffff&&instance>default_lifetime!=0xff){clock_time_texpiration_time;expiration_time=(clock_time_t)instance>default_lifetime*(clock_time_t)instance>lifetime_unit*CLOCK_SECOND/2;PRINTF("RPL:SchedulingDAOlifetimetimer%uticksinthefuture\n",(unsigned)expiration_time);ctimer_set(&instance>dao_lifetime_timer,expiration_time,handle_dao_timer,instance);}}/**/staticvoidhandle_dao_timer(void*ptr){rpl_instance_t*instance;#ifRPL_CONF_MULTICASTuip_mcast6_route_t*mcast_route;uint8_ti;#endif
instance=(rpl_instance_t*)ptr;
if(!dio_send_ok&&uip_ds6_get_link_local(ADDR_PREFERRED)==NULL){PRINTF("RPL:PostponeDAOtransmission\n");ctimer_set(&instance>dao_timer,CLOCK_SECOND,handle_dao_timer,instance);return;}
/*SendtheDAOtotheDAOparentsetthepreferredparentinourcase.*/if(instance>current_dag>preferred_parent!=NULL){PRINTF("RPL:handle_dao_timersendingDAO\n");/*Settheroutelifetimetothedefaultvalue.*/dao_output(instance>current_dag>preferred_parent,instance>default_lifetime);
#ifRPL_CONF_MULTICAST/*SendDAOsformulticastprefixesonlyiftheinstanceisinMOP3*/if(instance>mop==RPL_MOP_STORING_MULTICAST){/*SendaDAOforownmulticastaddresses*/for(i=0;icurrent_dag>preferred_parent,&uip_ds6_if.maddr_list[i].ipaddr,RPL_MCAST_LIFETIME);}}
/*IterateovermulticastroutesandsendDAOs*/mcast_route=uip_mcast6_route_list_head();while(mcast_route!=NULL){/*Don'tsendifit'salsoourownaddress,donethatalready*/if(uip_ds6_maddr_lookup(&mcast_route>group)==NULL){dao_output_target(instance>current_dag>preferred_parent,&mcast_route>group,RPL_MCAST_LIFETIME);}mcast_route=list_item_next(mcast_route);}}#endif}else{PRINTF("RPL:NosuitableDAOparent\n");}
-
6/8/2015 contiki/rpltimers.catmastercontikios/contikiGitHub
https://github.com/contikios/contiki/blob/master/core/net/rpl/rpltimers.c 5/7
274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
ctimer_stop(&instance>dao_timer);
if(etimer_expired(&instance>dao_lifetime_timer.etimer)){set_dao_lifetime_timer(instance);}}/**/staticvoidschedule_dao(rpl_instance_t*instance,clock_time_tlatency){clock_time_texpiration_time;
if(rpl_get_mode()==RPL_MODE_FEATHER){return;}
expiration_time=etimer_expiration_time(&instance>dao_timer.etimer);
if(!etimer_expired(&instance>dao_timer.etimer)){PRINTF("RPL:DAOtimeralreadyscheduled\n");}else{if(latency!=0){expiration_time=latency/2+(random_rand()%(latency));}else{expiration_time=0;}PRINTF("RPL:SchedulingDAOtimer%uticksinthefuture\n",(unsigned)expiration_time);ctimer_set(&instance>dao_timer,expiration_time,handle_dao_timer,instance);
set_dao_lifetime_timer(instance);}}/**/voidrpl_schedule_dao(rpl_instance_t*instance){schedule_dao(instance,RPL_DAO_LATENCY);}/**/voidrpl_schedule_dao_immediately(rpl_instance_t*instance){schedule_dao(instance,0);}/**/voidrpl_cancel_dao(rpl_instance_t*instance){ctimer_stop(&instance>dao_timer);ctimer_stop(&instance>dao_lifetime_timer);}/**/#ifRPL_WITH_PROBINGstaticrpl_parent_t*get_probing_target(rpl_dag_t*dag){/*Returnsthenextprobingtarget.Thecurrentimplementationprobesthecurrent*preferredparentifwehavenotupdateditslinkforRPL_PROBING_EXPIRATION_TIME.*Otherwise,itpicksatrandombetween:*(1)selectingthebestparentnotupdatedforRPL_PROBING_EXPIRATION_TIME*(2)selectingtheleastrecentlyupdatedparent*/
rpl_parent_t*p;rpl_parent_t*probing_target=NULL;rpl_rank_tprobing_target_rank=INFINITE_RANK;/*min_last_txistheclocktimeRPL_PROBING_EXPIRATION_TIMEinthepast*/clock_time_tmin_last_tx=clock_time();min_last_tx=min_last_tx>2*RPL_PROBING_EXPIRATION_TIME
-
6/8/2015 contiki/rpltimers.catmastercontikios/contikiGitHub
https://github.com/contikios/contiki/blob/master/core/net/rpl/rpltimers.c 6/7
347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
418
?min_last_txRPL_PROBING_EXPIRATION_TIME:1;
if(dag==NULL||dag>instance==NULL||dag>preferred_parent==NULL){returnNULL;}
/*Ourpreferredparentneedsprobing*/if(dag>preferred_parent>last_tx_timepreferred_parent;}
/*With50%probability:probebestparentnotupdatedforRPL_PROBING_EXPIRATION_TIME*/if(probing_target==NULL&&(random_rand()%2)==0){p=nbr_table_head(rpl_parents);while(p!=NULL){if(p>dag==dag&&p>last_tx_timeinstance>of>calculate_rank(p,0);if(probing_target==NULL||p_rankdag==dag){if(probing_target==NULL||p>last_tx_timelast_tx_time){probing_target=p;}}p=nbr_table_next(rpl_parents,p);}}
returnprobing_target;}/**/staticvoidhandle_probing_timer(void*ptr){rpl_instance_t*instance=(rpl_instance_t*)ptr;rpl_parent_t*probing_target=RPL_PROBING_SELECT_FUNC(instance>current_dag);
/*Performprobing*/if(probing_target!=NULL&&rpl_get_parent_ipaddr(probing_target)!=NULL){PRINTF("RPL:probing%3u\n",nbr_table_get_lladdr(rpl_parents,probing_target)>u8[7]);/*Sendprobe,e.g.unicastDIOorDIS*/RPL_PROBING_SEND_FUNC(instance,rpl_get_parent_ipaddr(probing_target));}
/*Schedulenextprobing*/rpl_schedule_probing(instance);
#ifDEBUGrpl_print_neighbor_list();#endif}/**/voidrpl_schedule_probing(rpl_instance_t*instance)
{
-
6/8/2015 contiki/rpltimers.catmastercontikios/contikiGitHub
https://github.com/contikios/contiki/blob/master/core/net/rpl/rpltimers.c 7/7
419420421422423
ctimer_set(&instance>probing_timer,RPL_PROBING_DELAY_FUNC(),handle_probing_timer,instance);}#endif/*RPL_WITH_PROBING*//**@}*/
Status API Training Shop Blog About Help2015GitHub,Inc. Terms Privacy Security Contact