Contiki Rpl Timers

download Contiki Rpl Timers

of 7

description

gibbbbb

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