mirror of
https://github.com/openssl/openssl.git
synced 2025-01-18 13:44:20 +08:00
fa4e92a70a
This is the initial implementation of the ACK Manager for OpenSSL's QUIC support, with supporting design documentation and tests. Because the ACK Manager also depends on the Statistics Manager, it is also implemented here. The Statistics Manager is quite simple, so this does not amount to a large amount of extra code. Because the ACK Manager depends on a congestion controller, it adds a no-op congestion controller, which uses the previously workshopped congestion control API. Reviewed-by: Tomas Mraz <tomas@openssl.org> Reviewed-by: Richard Levitte <levitte@openssl.org> (Merged from https://github.com/openssl/openssl/pull/18676)
151 lines
5.3 KiB
C
151 lines
5.3 KiB
C
/*
|
|
* Copyright 2022 The OpenSSL Project Authors. All Rights Reserved.
|
|
*
|
|
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
|
* this file except in compliance with the License. You can obtain a copy
|
|
* in the file LICENSE in the source distribution or at
|
|
* https://www.openssl.org/source/license.html
|
|
*/
|
|
#ifndef OSSL_QUIC_CC_H
|
|
# define OSSL_QUIC_CC_H
|
|
|
|
#include "openssl/params.h"
|
|
#include "internal/time.h"
|
|
|
|
typedef struct ossl_cc_data_st *OSSL_CC_DATA;
|
|
|
|
typedef struct ossl_cc_method_st {
|
|
void *dummy;
|
|
|
|
/*
|
|
* Create a new OSSL_CC_DATA object to handle the congestion control
|
|
* calculations.
|
|
*
|
|
* |settings| are mandatory settings that will cause the
|
|
* new() call to fail if they are not understood).
|
|
* |options| are optional settings that will not
|
|
* cause the new() call to fail if they are not understood.
|
|
* |changeables| contain additional parameters that the congestion
|
|
* control algorithms need that can be updated during the
|
|
* connection lifetime - for example size of the datagram payload.
|
|
* To avoid calling a function with OSSL_PARAM array every time
|
|
* these parameters are changed the addresses of these param
|
|
* values are considered permanent and the values can be updated
|
|
* any time.
|
|
*/
|
|
OSSL_CC_DATA *(*new)(OSSL_PARAM *settings, OSSL_PARAM *options,
|
|
OSSL_PARAM *changeables);
|
|
|
|
/*
|
|
* Release the OSSL_CC_DATA.
|
|
*/
|
|
void (*free)(OSSL_CC_DATA *ccdata);
|
|
|
|
/*
|
|
* Reset the congestion control state.
|
|
* |flags| to support different level of reset (partial/full).
|
|
*/
|
|
void (*reset)(OSSL_CC_DATA *ccdata, int flags);
|
|
|
|
/*
|
|
* Set number of packets exempted from CC - used for probing
|
|
* |numpackets| is a small value (2).
|
|
* Returns 0 on error, 1 otherwise.
|
|
*/
|
|
int (*set_exemption)(OSSL_CC_DATA *ccdata, int numpackets);
|
|
|
|
/*
|
|
* Get current number of packets exempted from CC.
|
|
* Returns negative value on error, the number otherwise.
|
|
*/
|
|
int (*get_exemption)(OSSL_CC_DATA *ccdata);
|
|
|
|
/*
|
|
* Returns 1 if sending is allowed, 0 otherwise.
|
|
*/
|
|
int (*can_send)(OSSL_CC_DATA *ccdata);
|
|
|
|
/*
|
|
* Returns number of bytes allowed to be sent.
|
|
* |time_since_last_send| is time since last send operation
|
|
* in microseconds.
|
|
* |time_valid| is 1 if the |time_since_last_send| holds
|
|
* a meaningful value, 0 otherwise.
|
|
*/
|
|
size_t (*get_send_allowance)(OSSL_CC_DATA *ccdata,
|
|
OSSL_TIME time_since_last_send,
|
|
int time_valid);
|
|
|
|
/*
|
|
* Returns the maximum number of bytes allowed to be in flight.
|
|
*/
|
|
size_t (*get_bytes_in_flight_max)(OSSL_CC_DATA *ccdata);
|
|
|
|
/*
|
|
* To be called when a packet with retransmittable data was sent.
|
|
* |num_retransmittable_bytes| is the number of bytes sent
|
|
* in the packet that are retransmittable.
|
|
* Returns 1 on success, 0 otherwise.
|
|
*/
|
|
int (*on_data_sent)(OSSL_CC_DATA *ccdata,
|
|
size_t num_retransmittable_bytes);
|
|
|
|
/*
|
|
* To be called when retransmittable data was invalidated.
|
|
* I.E. they are not considered in-flight anymore but
|
|
* are neither acknowledged nor lost. In particular used when
|
|
* 0RTT data was rejected.
|
|
* |num_retransmittable_bytes| is the number of bytes
|
|
* of the invalidated data.
|
|
* Returns 1 if sending is unblocked (can_send returns 1), 0
|
|
* otherwise.
|
|
*/
|
|
int (*on_data_invalidated)(OSSL_CC_DATA *ccdata,
|
|
size_t num_retransmittable_bytes);
|
|
|
|
/*
|
|
* To be called when sent data was acked.
|
|
* |time_now| is current time in microseconds.
|
|
* |largest_pn_acked| is the largest packet number of the acked
|
|
* packets.
|
|
* |num_retransmittable_bytes| is the number of retransmittable
|
|
* packet bytes that were newly acked.
|
|
* Returns 1 if sending is unblocked (can_send returns 1), 0
|
|
* otherwise.
|
|
*/
|
|
int (*on_data_acked)(OSSL_CC_DATA *ccdata,
|
|
OSSL_TIME time_now,
|
|
uint64_t last_pn_acked,
|
|
size_t num_retransmittable_bytes);
|
|
|
|
/*
|
|
* To be called when sent data is considered lost.
|
|
* |largest_pn_lost| is the largest packet number of the lost
|
|
* packets.
|
|
* |largest_pn_sent| is the largest packet number sent on this
|
|
* connection.
|
|
* |num_retransmittable_bytes| is the number of retransmittable
|
|
* packet bytes that are newly considered lost.
|
|
* |persistent_congestion| is 1 if the congestion is considered
|
|
* persistent (see RFC 9002 Section 7.6), 0 otherwise.
|
|
*/
|
|
void (*on_data_lost)(OSSL_CC_DATA *ccdata,
|
|
uint64_t largest_pn_lost,
|
|
uint64_t largest_pn_sent,
|
|
size_t num_retransmittable_bytes,
|
|
int persistent_congestion);
|
|
|
|
/*
|
|
* To be called when all lost data from the previous call to
|
|
* on_data_lost() was actually acknowledged.
|
|
* This reverts the size of the congestion window to the state
|
|
* before the on_data_lost() call.
|
|
* Returns 1 if sending is unblocked, 0 otherwise.
|
|
*/
|
|
int (*on_spurious_congestion_event)(OSSL_CC_DATA *ccdata);
|
|
} OSSL_CC_METHOD;
|
|
|
|
extern const OSSL_CC_METHOD ossl_cc_dummy_method;
|
|
|
|
#endif
|