void coap_check_timeouts(coap_endpoint_mgr_t * p_endpoint_mgr, int i)
{
	struct queue_hdr_t *p = NULL, *next = NULL;
	coap_endpoint_t * p_endpoint = coap_get_endpoint(p_endpoint_mgr, i);
	if (NULL == p_endpoint)
	{
		return;
	}

	for (p = p_endpoint->m_send_queue.next; p != &p_endpoint->m_send_queue; p = next)
	{
		coap_pkt_t * p_pkt = queue_entry(p, coap_pkt_t, node);
		next = p->next;
		if (p_pkt->last_transmit_time + p_pkt->retransmit_interval < p_endpoint_mgr->m_endpoint_mgr_time_cache) 
		{
			if (p_pkt->retransmit_count < COAP_MAX_RETRANSMIT)
			{
				coap_log_debug_packet((char *)p_pkt);
				sendto(p_endpoint->m_servsock, (const char *)&p_pkt->hdr, p_pkt->packet_length, 0, (struct sockaddr *)&p_endpoint->m_servaddr, sizeof(p_endpoint->m_servaddr));
				
				p_pkt->last_transmit_time = coap_get_milliseconds();
				p_pkt->retransmit_interval <<= 1;
				p_pkt->retransmit_count++;
			}
			else
			{
				coap_free_endpoint(p_endpoint_mgr, i);
				coap_set_endpoint(p_endpoint_mgr, i, NULL);
				break;
			}
		}
	}

	return;
}
예제 #2
0
파일: coap_io.c 프로젝트: Trilliant/libcoap
coap_endpoint_t *
coap_new_endpoint(const coap_address_t *addr, int flags) {
  struct coap_endpoint_t *ep = coap_malloc_contiki_endpoint();

  if (ep) {
    memset(ep, 0, sizeof(struct coap_endpoint_t));
    ep->handle.conn = udp_new(NULL, 0, NULL);

    if (!ep->handle.conn) {
      coap_free_endpoint(ep);
      return NULL;
    }

    coap_address_init(&ep->addr);
    uip_ipaddr_copy(&ep->addr.addr, &addr->addr);
    ep->addr.port = addr->port;
    udp_bind((struct uip_udp_conn *)ep->handle.conn, addr->port);
  }
  return ep;
}