Пример #1
0
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;
}
Пример #2
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;
}
Пример #3
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;
}