chunk_appendf(b, " ms_bidi=%llu", (ull)p->initial_max_streams_bidi);
chunk_appendf(b, " ms_uni=%llu\n", (ull)p->initial_max_streams_uni);
- if (p->disable_active_migration || p->with_stateless_reset_token ||
- p->with_preferred_address) {
+ if (p->disable_active_migration || p->with_stateless_reset_token) {
int prev = 0;
chunk_appendf(b, " (");
prev = 1;
chunk_appendf(b, "stless_rst_tok");
}
- if (p->with_preferred_address) {
- if (prev)
- chunk_appendf(b, ",");
- prev = 1;
- chunk_appendf(b, "pref_addr");
- }
chunk_appendf(b, ")");
}
+ if (p->with_preferred_address) {
+ char bufaddr[INET6_ADDRSTRLEN];
+ chunk_appendf(b, " pref_addr=");
+ inet_ntop(AF_INET, &p->preferred_address.ipv4_addr,
+ bufaddr, sizeof(bufaddr));
+ chunk_appendf(b, "%s:%hu ", bufaddr, p->preferred_address.ipv4_port);
+
+ inet_ntop(AF_INET6, &p->preferred_address.ipv6_addr,
+ bufaddr, sizeof(bufaddr));
+ chunk_appendf(b, "[%s]:%hu ", bufaddr, p->preferred_address.ipv6_port);
+ quic_tp_cid_dump(b, &p->preferred_address.cid);
+ chunk_appendf(b, "\n");
+ }
+
quic_tp_version_info_dump(b, &p->version_information, local);
}
}
/* Encode <addr> preferred address transport parameter in <buf> without its
- * "type+len" prefix. Note that the IP addresses must be encoded in network byte
- * order.
- * So ->ipv4_addr and ->ipv6_addr, which are buffers, must contained values
- * already encoded in network byte order.
+ * "type+len" prefix.
* It is the responsibility of the caller to check there is enough room in <buf> to encode
* this address.
* Never fails.
write_n16(*buf, addr->ipv4_port);
*buf += sizeof addr->ipv4_port;
- memcpy(*buf, addr->ipv4_addr, sizeof addr->ipv4_addr);
- *buf += sizeof addr->ipv4_addr;
+ memcpy(*buf, (uint8_t *)&addr->ipv4_addr.s_addr, sizeof(addr->ipv4_addr.s_addr));
+ *buf += sizeof(addr->ipv4_addr.s_addr);
write_n16(*buf, addr->ipv6_port);
*buf += sizeof addr->ipv6_port;
- memcpy(*buf, addr->ipv6_addr, sizeof addr->ipv6_addr);
- *buf += sizeof addr->ipv6_addr;
+ memcpy(*buf, addr->ipv6_addr.s6_addr, sizeof(addr->ipv6_addr.s6_addr));
+ *buf += sizeof(addr->ipv6_addr.s6_addr);
*(*buf)++ = addr->cid.len;
if (addr->cid.len) {
{
ssize_t addr_len;
- addr_len = sizeof addr->ipv4_port + sizeof addr->ipv4_addr;
- addr_len += sizeof addr->ipv6_port + sizeof addr->ipv6_addr;
- addr_len += sizeof addr->cid.len;
+ addr_len = sizeof(addr->ipv4_port) + sizeof(addr->ipv4_addr.s_addr);
+ addr_len += sizeof(addr->ipv6_port) + sizeof(addr->ipv6_addr.s6_addr);
+ addr_len += sizeof(addr->cid.len);
if (end - *buf < addr_len)
return 0;
- memcpy(addr->ipv4_addr, *buf, sizeof addr->ipv4_addr);
- *buf += sizeof addr->ipv4_addr;
+ memcpy((uint8_t *)&addr->ipv4_addr.s_addr, *buf, sizeof(addr->ipv4_addr.s_addr));
+ *buf += sizeof(addr->ipv4_addr.s_addr);
addr->ipv4_port = read_n16(*buf);
*buf += sizeof addr->ipv4_port;
- memcpy(addr->ipv6_addr, *buf, sizeof addr->ipv6_addr);
- *buf += sizeof addr->ipv6_addr;
+ memcpy(addr->ipv6_addr.s6_addr, *buf, sizeof(addr->ipv6_addr.s6_addr));
+ *buf += sizeof(addr->ipv6_addr.s6_addr);
addr->ipv6_port = read_n16(*buf);
*buf += sizeof addr->ipv6_port;
}
/* Encode <addr> preferred address into <buf>.
- * Note that the IP addresses must be encoded in network byte order.
- * So ->ipv4_addr and ->ipv6_addr, which are buffers, must contained
- * values already encoded in network byte order.
* Returns 1 if succeeded, 0 if not.
*/
static int quic_transport_param_enc_pref_addr(unsigned char **buf,
{
uint64_t addr_len = 0;
- addr_len += sizeof addr->ipv4_port + sizeof addr->ipv4_addr;
- addr_len += sizeof addr->ipv6_port + sizeof addr->ipv6_addr;
+ addr_len += sizeof(addr->ipv4_port) + sizeof(addr->ipv4_addr.s_addr);
+ addr_len += sizeof(addr->ipv6_port) + sizeof(addr->ipv6_addr.s6_addr);
addr_len += sizeof_quic_cid(&addr->cid);
- addr_len += sizeof addr->stateless_reset_token;
+ addr_len += sizeof(addr->stateless_reset_token);
if (!quic_transport_param_encode_type_len(buf, end, QUIC_TP_PREFERRED_ADDRESS, addr_len))
return 0;