18static void set_trickle_t_time(PRPL_NODE r)
20 r->trickle.t = ((UINT)NETSIM_RAND() % ((UINT)(r->trickle.I / 2))) + r->trickle.I / 2;
23void rpl_trickle_reset(NETSIM_ID ndevId)
25 NetSim_EVENTDETAILS pevent;
26 PRPL_NODE r = GET_RPL_NODE(ndevId);
28#ifdef DEBUG_RPL_TRICKLE
29 print_rpl_log(
"node '%d',Time '%0.3lf ms': resetting trickle timer", ndevId,pstruEventDetails->dEventTime/1000);
32 if (rpl_node_is_root(r))
34 r->trickle.Imin = pow(2, r->root_info->dio_interval_min)*MILLISECOND;
35 r->trickle.Imax = r->root_info->dio_interval_doublings;
36 r->trickle.k = r->root_info->dio_redundancy_constant;
38 else if (rpl_node_is_joined(r) || rpl_node_is_poisoning(r))
40 r->trickle.Imin = pow(2, r->joined_dodag->dio_interval_min)*MILLISECOND;
41 r->trickle.Imax = r->joined_dodag->dio_interval_doublings;
42 r->trickle.k = r->joined_dodag->dio_redundancy_constant;
49 r->trickle.I = r->trickle.Imin;
51 set_trickle_t_time(r);
54 fnDeleteEvent(r->trickle.trickle_i_eventid);
55 fnDeleteEvent(r->trickle.trickle_t_eventid);
57 memset(&pevent, 0,
sizeof pevent);
60 r->trickle.last_trickle_t_schedule_time = ldEventTime + r->trickle.t;
61 pevent.dEventTime = r->trickle.last_trickle_t_schedule_time;
62 pevent.nDeviceId = ndevId;
63 pevent.nDeviceType = DEVICE_TYPE(ndevId);
64 pevent.nEventType = TIMER_EVENT;
65 pevent.nProtocolId = NW_PROTOCOL_RPL;
66 pevent.nSubEventType = RPL_TRICKLE_T_TIMEOUT;
67 r->trickle.trickle_t_eventid = fnpAddEvent(&pevent);
70 r->trickle.last_trickle_i_schedule_time = ldEventTime + r->trickle.I;
71 pevent.dEventTime = r->trickle.last_trickle_i_schedule_time;
72 pevent.nSubEventType = RPL_TRICKLE_I_TIMEOUT;
73 r->trickle.trickle_i_eventid = fnpAddEvent(&pevent);
76void rpl_trickle_handle_t_timeout()
78 PRPL_NODE r = GET_RPL_NODE(pstruEventDetails->nDeviceId);
80 NetSim_PACKET *dio_pdu = create_current_dio_message(pstruEventDetails->nDeviceId, pstruEventDetails->dEventTime, TRUE);
83 rpl_node_send_msg(pstruEventDetails->nDeviceId, dio_pdu);
86void rpl_trickle_handle_i_timeout()
88 PRPL_NODE rpl = GET_RPL_NODE(pstruEventDetails->nDeviceId);
90 if (rpl_node_is_root(rpl))
92 if (rpl->trickle.C < rpl->trickle.Imax)
98 else if (rpl_node_is_joined(rpl))
100 if (rpl->trickle.C < rpl->trickle.Imax)
106 else if (rpl_node_is_poisoning(rpl))
108 if (rpl->poison_count_so_far < RPL_DEFAULT_POISON_COUNT)
110 rpl->poison_count_so_far++;
115 PRPL_CTRL_MSG preferred_dodag_pdu = get_preferred_dodag_dio_pdu(pstruEventDetails->nDeviceId,
117 pstruEventDetails->dEventTime);
119 if (preferred_dodag_pdu != NULL)
121 join_dodag_iteration(pstruEventDetails->nDeviceId, preferred_dodag_pdu);
122 choose_parents_and_siblings(pstruEventDetails->nDeviceId);
126 start_as_root(pstruEventDetails->nDeviceId);
134 fnNetSimError(
"Unknown node status for node %s in rpl\n", pstruEventDetails->nDeviceId);
138 set_trickle_t_time(rpl);
140#ifdef DEBUG_RPL_TRICKLE
141 print_rpl_log(
"node '%d': trickle time is generated at t=%0.3lf, i=%0.2lf",
142 pstruEventDetails->nDeviceId,
143 (ldEventTime + rpl->trickle.t) / 1000,
144 (ldEventTime + rpl->trickle.I) / 1000);
147 NetSim_EVENTDETAILS pevent;
149 memset(&pevent, 0,
sizeof pevent);
152 rpl->trickle.last_trickle_t_schedule_time = ldEventTime + rpl->trickle.t;
153 pevent.dEventTime = rpl->trickle.last_trickle_t_schedule_time;
154 pevent.nDeviceId = pstruEventDetails->nDeviceId;
155 pevent.nDeviceType = pstruEventDetails->nDeviceType;
156 pevent.nEventType = TIMER_EVENT;
157 pevent.nProtocolId = NW_PROTOCOL_RPL;
158 pevent.nSubEventType = RPL_TRICKLE_T_TIMEOUT;
159 rpl->trickle.trickle_t_eventid = fnpAddEvent(&pevent);
162 rpl->trickle.last_trickle_i_schedule_time = ldEventTime + rpl->trickle.I;
163 pevent.dEventTime = rpl->trickle.last_trickle_i_schedule_time;
164 pevent.nSubEventType = RPL_TRICKLE_I_TIMEOUT;
165 rpl->trickle.trickle_i_eventid = fnpAddEvent(&pevent);