int ossl_quic_tx_packetiser_set_cur_scid(OSSL_QUIC_TX_PACKETISER *txp,
const QUIC_CONN_ID *scid);
-/* Change the destination L4 address the TXP uses to send datagrams. */
+/*
+ * Change the destination L4 address the TXP uses to send datagrams. Specify
+ * NULL (or AF_UNSPEC) to disable use of addressed mode.
+ */
int ossl_quic_tx_packetiser_set_peer(OSSL_QUIC_TX_PACKETISER *txp,
const BIO_ADDR *peer);
int ossl_quic_channel_get_peer_addr(QUIC_CHANNEL *ch, BIO_ADDR *peer_addr)
{
+ if (!ch->addressed_mode)
+ return 0;
+
*peer_addr = ch->cur_peer_addr;
return 1;
}
int ossl_quic_channel_set_peer_addr(QUIC_CHANNEL *ch, const BIO_ADDR *peer_addr)
{
- ch->cur_peer_addr = *peer_addr;
+ if (ch->state != QUIC_CHANNEL_STATE_IDLE)
+ return 0;
+
+ if (peer_addr == NULL || BIO_ADDR_family(peer_addr) == AF_UNSPEC) {
+ BIO_ADDR_clear(&ch->cur_peer_addr);
+ ch->addressed_mode = 0;
+ return 1;
+ }
+
+ ch->cur_peer_addr = *peer_addr;
+ ch->addressed_mode = 1;
return 1;
}
/* Inhibit tick for testing purposes? */
unsigned int inhibit_tick : 1;
+ /* Are we using addressed mode? */
+ unsigned int addressed_mode : 1;
+
/* Saved error stack in case permanent error was encountered */
ERR_STATE *err_state;
};
const BIO_ADDR *peer)
{
if (peer == NULL) {
- ERR_raise(ERR_LIB_SSL, ERR_R_PASSED_NULL_PARAMETER);
- return 0;
+ BIO_ADDR_clear(&txp->args.peer);
+ return 1;
}
txp->args.peer = *peer;