void rudp_peer_reset(struct rudp_peer *peer) { struct rudp_packet_chain *pc, *tmp; rudp_list_for_each_safe(struct rudp_packet_chain*, pc, tmp, &peer->sendq, chain_item) { rudp_list_remove(&pc->chain_item); rudp_packet_chain_free(peer->rudp, pc); } if ( peer->scheduled ) ela_remove(peer->rudp->el, peer->service_source); peer->scheduled = 0; peer->abs_timeout_deadline = rudp_timestamp() + DROP_TIMEOUT; peer->in_seq_reliable = (uint16_t)-1; peer->in_seq_unreliable = 0; peer->out_seq_reliable = rudp_random(peer->rudp); peer->out_seq_unreliable = 0; peer->out_seq_acked = peer->out_seq_reliable - 1; peer->state = PEER_NEW; peer->last_out_time = rudp_timestamp(); peer->srtt = 100; peer->rttvar = peer->srtt / 2; peer->rto = MAX_RTO; peer->must_ack = 0; peer->sendto_err = 0; }
rudp_error_t rudp_init( struct rudp *rudp, struct ela_el *el, const struct rudp_handler *handler) { rudp->handler = handler; rudp->el = el; rudp_list_init(&rudp->free_packet_list); rudp->free_packets = 0; rudp->allocated_packets = 0; rudp->seed = rudp_timestamp(); rudp_random(rudp); rudp_random(rudp); rudp_random(rudp); return 0; }
uint32_t rudp_sequence( socket_t* socket) { uint8_t* md5_cypher = malloc(MD5_DIGEST_LENGTH* sizeof(uint8_t)); uint32_t* md5_plain = malloc(5* sizeof(uint32_t)); md5_plain[0] = ntohl(socket->local_addr.sin_addr.s_addr); md5_plain[1] = ntohs(socket->local_addr.sin_port); md5_plain[2] = ntohl(socket->remote_addr.sin_addr.s_addr); md5_plain[3] = ntohs(socket->remote_addr.sin_port); md5_plain[4] = rudp_random(); MD5((uint8_t*)md5_plain, sizeof(md5_plain) * sizeof(uint32_t), md5_cypher); uint32_t sequence_no = *(uint32_t*) md5_cypher; free(md5_cypher); free(md5_plain); return sequence_no; }