// insert a new message in the retransmission list void Retrans::add (Msg *msg) { retransq *n ; sync_time (curtime) ; // synchronize curtime n = (retransq *) malloc (sizeof (retransq)) ; n->msg = msg ; n->timelast = curtime ; n->timenext = curtime + ALEA (ACK_TIMEOUT * ACK_RANDOM_FACTOR) ; n->ntrans = 0 ; n->next = retransq_ ; retransq_ = n ; }
int main() { printf("begin to check time............\n"); struct timeval tv; struct timezone tz; gettimeofday(&tv,&tz); tz.tz_minuteswest = -480; tz.tz_dsttime = 0; settimeofday(&tv,&tz); sync_time(); printf("check time success\n"); printf("tv_sec:%d\n",tv.tv_sec); printf("tv_usec:%d\n",tv.tv_usec); printf("tz_minuteswest:%d\n",tz.tz_minuteswest); printf("tz_dsttime:%d\n",tz.tz_dsttime); }
static void accept_ready(mowgli_eventloop_t *ev, mowgli_eventloop_io_t *io, mowgli_eventloop_io_dir_t dir, void *priv) { mowgli_eventloop_pollable_t *poll = mowgli_eventloop_io_pollable(io); u_conn *conn; u_link *link; sync_time(); link = link_create(); if (!(conn = u_conn_accept(ev, &u_link_conn_ctx, link, 0, poll->fd))) { link_destroy(link); /* TODO: close listener, maybe? */ return; } u_log(LG_VERBOSE, "new connection from %s", conn->ip); }
// TODO void Retrans::loop (l2net &l2, time_t &curtime) { // DBGLN1 (F ("retransmit loop")) ; if (*master_addr_ == NULL) { // master has been reset by the CASAN engine (waiting-unknown state) reset () ; return ; } else { retransq *cur, *prev ; prev = NULL ; cur = retransq_ ; while (cur != NULL) { retransq *next ; next = cur->next ; if (cur->ntrans >= MAX_RETRANSMIT) { // remove the message from the queue del (prev, cur) ; // prev is not modified } else { if (cur->timenext < curtime) { cur->msg->send (**master_addr_) ; cur->ntrans++ ; cur->timenext = cur->timenext + (2* (cur->timenext - cur->timelast)); sync_time (cur->timelast) ; } prev = cur ; } cur = next ; } } }
Casan::Casan (l2net *l2, int mtu, long int slaveid) { memset (this, 0, sizeof *this) ; l2_ = l2 ; slaveid_ = slaveid ; curtime = 0 ; // global variable sync_time (curtime) ; defmtu_ = l2->mtu () ; // get default L2 MTU if (mtu > 0 && mtu < defmtu_) defmtu_ = mtu ; // set a different default MTU reset_master () ; // master_ is reset (broadcast addr, mtu) hlid_ = -1 ; curid_ = 1 ; retrans_.master (&master_) ; status_ = SL_COLDSTART ; }
void Casan::loop () { Msg in (l2_) ; Msg out (l2_) ; l2net::l2_recv_t ret ; uint8_t oldstatus ; long int hlid ; l2addr *srcaddr ; int mtu ; // mtu announced by master in assoc msg oldstatus = status_ ; // keep old value for debug display sync_time (curtime) ; // get current time retrans_.loop (*l2_, curtime) ; // check needed retransmissions srcaddr = NULL ; ret = in.recv () ; // get received message if (ret == l2net::RECV_OK) srcaddr = l2_->get_src () ; // get a new address switch (status_) { case SL_COLDSTART : send_discover (out) ; twait_.init (curtime) ; status_ = SL_WAITING_UNKNOWN ; break ; case SL_WAITING_UNKNOWN : if (ret == l2net::RECV_OK) { retrans_.check_msg_received (in) ; if (is_ctl_msg (in)) { if (is_hello (in, hlid)) { DBGLN1 (F ("Received a CTL HELLO msg")) ; change_master (hlid, -1) ; // don't change mtu twait_.init (curtime) ; status_ = SL_WAITING_KNOWN ; } else if (is_assoc (in, sttl_, mtu)) { DBGLN1 (F ("Received a CTL ASSOC msg")) ; change_master (-1, mtu) ; // "unknown" hlid send_assoc_answer (in, out) ; trenew_.init (curtime, sttl_) ; status_ = SL_RUNNING ; } else DBGLN1 (F (RED ("Unkwnon CTL"))) ; } } if (status_ == SL_WAITING_UNKNOWN && twait_.next (curtime)) send_discover (out) ; break ; case SL_WAITING_KNOWN : if (ret == l2net::RECV_OK) { retrans_.check_msg_received (in) ; if (is_ctl_msg (in)) { if (is_hello (in, hlid)) { DBGLN1 (F ("Received a CTL HELLO msg")) ; change_master (hlid, -1) ; // don't change mtu } else if (is_assoc (in, sttl_, mtu)) { DBGLN1 (F ("Received a CTL ASSOC msg")) ; change_master (-1, mtu) ; // unknown hlid send_assoc_answer (in, out) ; trenew_.init (curtime, sttl_) ; status_ = SL_RUNNING ; } else DBGLN1 (F (RED ("Unkwnon CTL"))) ; } } if (status_ == SL_WAITING_KNOWN) { if (twait_.expired (curtime)) { reset_master () ; // master_ is no longer known send_discover (out) ; twait_.init (curtime) ; // reset timer status_ = SL_WAITING_UNKNOWN ; } else if (twait_.next (curtime)) { send_discover (out) ; } } break ; case SL_RUNNING : case SL_RENEW : if (ret == l2net::RECV_OK) { retrans_.check_msg_received (in) ; if (is_ctl_msg (in)) { if (is_hello (in, hlid)) { DBGLN1 (F ("Received a CTL HELLO msg")) ; if (! same_master (srcaddr) || hlid != hlid_) { int oldhlid = hlid_ ; change_master (hlid, 0) ; // reset mtu if (oldhlid != -1) { twait_.init (curtime) ; status_ = SL_WAITING_KNOWN ; } } } else if (is_assoc (in, sttl_, mtu)) { DBGLN1 (F ("Received a CTL ASSOC msg")) ; if (same_master (srcaddr)) { negociate_mtu (mtu) ; send_assoc_answer (in, out) ; trenew_.init (curtime, sttl_) ; status_ = SL_RUNNING ; } } else DBGLN1 (F (RED ("Unkwnon CTL"))) ; } else // request for a normal resource { // deduplicate () ; process_request (in, out) ; out.send (*master_) ; } } else if (ret == l2net::RECV_TRUNCATED) { DBGLN1 (F (RED ("Request too large"))) ; out.set_type (COAP_TYPE_ACK) ; out.set_id (in.get_id ()) ; out.set_token (in.get_token ()) ; option o (option::MO_Size1, l2_->mtu ()) ; out.push_option (o) ; out.set_code (COAP_CODE_TOO_LARGE) ; out.send (*master_) ; } check_observed_resources (out) ; if (status_ == SL_RUNNING && trenew_.renew (curtime)) { send_discover (out) ; status_ = SL_RENEW ; } if (status_ == SL_RENEW && trenew_.next (curtime)) { send_discover (out) ; } if (status_ == SL_RENEW && trenew_.expired (curtime)) { reset_master () ; // master_ is no longer known send_discover (out) ; twait_.init (curtime) ; // reset timer status_ = SL_WAITING_UNKNOWN ; } break ; default : DBGLN1 (F ("Error : casan status not known")) ; DBGLN1 (status_) ; break ; } if (oldstatus != status_) { DBG1 (F ("Status: " C_GREEN)) ; print_status (oldstatus) ; DBG1 (F (C_RESET " -> " C_GREEN)) ; print_status (status_) ; DBGLN1 (F (C_RESET)) ; } if (srcaddr != NULL) delete srcaddr ; }