Fixup dcubic

This commit is contained in:
Jop Zitman 2025-01-22 18:24:05 +08:00
parent 161f3a6fd3
commit 479f6b3924
4 changed files with 36 additions and 12 deletions

2
extern/picoquic vendored

@ -1 +1 @@
Subproject commit cb052686b0c81e2f56edd6966425c2892ce3927d
Subproject commit e00c93d0a6375a41cf25e1ddf24d891632f77cca

View file

@ -10,7 +10,6 @@ typedef struct st_slot_t {
struct sockaddr_storage peer_addr;
struct sockaddr_storage local_addr;
picoquic_cnx_t* cnx;
uint64_t created_time;
bool is_poll_packet;
bool responded;
} slot_t;

View file

@ -43,7 +43,6 @@ typedef struct st_slipstream_client_ctx_t {
picoquic_network_thread_ctx_t* thread_ctx;
struct st_address_t* server_addresses;
size_t server_address_count;
uint64_t last_request;
bool ready;
bool closed;
int listen_sock;
@ -95,11 +94,14 @@ ssize_t client_encode_segment(dns_packet_t* packet, size_t* packet_len, const un
}
ssize_t client_encode(void* slot_p, void* callback_ctx, unsigned char** dest_buf, const unsigned char* src_buf, size_t src_buf_len, size_t* segment_len, struct sockaddr_storage* peer_addr, struct sockaddr_storage* local_addr) {
assert(callback_ctx);
slipstream_client_ctx_t* client_ctx = callback_ctx;
// optimize path for single segment
if (src_buf_len <= *segment_len) {
#ifdef NOENCODE
*dest_buf = malloc(src_buf_len);
memcpy((void*)*dest_buf, src_buf, src_buf_len);
return src_buf_len;
#endif
size_t packet_len = MAX_DNS_QUERY_SIZE;
unsigned char* packet = malloc(packet_len);
const ssize_t ret = client_encode_segment((dns_packet_t*) packet, &packet_len, src_buf, src_buf_len);
@ -111,11 +113,13 @@ ssize_t client_encode(void* slot_p, void* callback_ctx, unsigned char** dest_buf
*dest_buf = packet;
*segment_len = packet_len;
client_ctx->last_request = picoquic_current_time();
return packet_len;
}
#ifdef NOENCODE
assert(false);
#endif
size_t num_segments = src_buf_len / *segment_len;
unsigned char* packets = malloc(MAX_DNS_QUERY_SIZE * num_segments);
unsigned char* current_packet = packets;
@ -147,14 +151,19 @@ ssize_t client_encode(void* slot_p, void* callback_ctx, unsigned char** dest_buf
*dest_buf = packets;
*segment_len = first_packet_len;
client_ctx->last_request = picoquic_current_time();
return current_packet - packets;
}
ssize_t client_decode(void* slot_p, void* callback_ctx, unsigned char** dest_buf, const unsigned char* src_buf, size_t src_buf_len, struct sockaddr_storage* peer_addr, struct sockaddr_storage* local_addr) {
*dest_buf = NULL;
#ifdef NODECODE
*dest_buf = malloc(src_buf_len);
memcpy((void*)*dest_buf, src_buf, src_buf_len);
return src_buf_len;
#endif
size_t bufsize = DNS_DECODEBUF_4K * sizeof(dns_decoded_t);
dns_decoded_t decoded[DNS_DECODEBUF_4K] = {0};
const dns_rcode_t rc = dns_decode(decoded, &bufsize, (const dns_packet_t*) src_buf, src_buf_len);
@ -804,7 +813,6 @@ int picoquic_slipstream_client(int listen_port, char const* resolver_addresses_f
param.is_client = 1;
param.decode = client_decode;
param.encode = client_encode;
param.delay_max = 5000;
picoquic_network_thread_ctx_t thread_ctx = {0};
thread_ctx.quic = quic;

View file

@ -35,6 +35,17 @@ ssize_t server_encode(void* slot_p, void* callback_ctx, unsigned char** dest_buf
assert(segment_len == NULL || *segment_len == 0 || *segment_len == src_buf_len);
slot_t* slot = (slot_t*) slot_p;
#ifdef NOENCODE
*dest_buf = malloc(src_buf_len);
memcpy((void*)*dest_buf, src_buf, src_buf_len);
memcpy(peer_addr, &slot->peer_addr, sizeof(struct sockaddr_storage));
memcpy(local_addr, &slot->local_addr, sizeof(struct sockaddr_storage));
return src_buf_len;
#endif
dns_query_t *query = (dns_query_t *) slot->dns_decoded;
dns_txt_t answer_txt; // TODO: fix
dns_answer_t edns = {0};
@ -95,7 +106,6 @@ ssize_t server_decode(void* slot_p, void* callback_ctx, unsigned char** dest_buf
*dest_buf = NULL;
slot_t* slot = slot_p;
slot->created_time = picoquic_current_time();
// DNS packets arrive from random source ports, so:
// * save the original address in the dns query slot
@ -105,6 +115,13 @@ ssize_t server_decode(void* slot_p, void* callback_ctx, unsigned char** dest_buf
// Save local address for right response local addr
memcpy(&slot->local_addr, local_addr, sizeof(struct sockaddr_storage));
#ifdef NODECODE
*dest_buf = malloc(src_buf_len);
memcpy((void*)*dest_buf, src_buf, src_buf_len);
return src_buf_len;
#endif
size_t packet_len = DNS_DECODEBUF_4K * sizeof(dns_decoded_t);
dns_decoded_t* packet = slot->dns_decoded;
const dns_rcode_t rc = dns_decode(packet, &packet_len, (const dns_packet_t*) src_buf, src_buf_len);