Skip to content

Commit fd70a16

Browse files
authored
Add early data reason interface.
2 parents d7084a6 + 9596868 commit fd70a16

File tree

5 files changed

+67
-7
lines changed

5 files changed

+67
-7
lines changed

include/tquic.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1006,7 +1006,14 @@ void quic_conn_session(struct quic_conn_t *conn, const uint8_t **out, size_t *ou
10061006
/**
10071007
* Return details why 0-RTT was accepted or rejected.
10081008
*/
1009-
int quic_conn_early_data_reason(struct quic_conn_t *conn, const uint8_t **out, size_t *out_len);
1009+
int quic_conn_early_data_reason(struct quic_conn_t *conn);
1010+
1011+
/**
1012+
* Return a string representation for reason why 0-RTT was accepted or rejected.
1013+
*/
1014+
int quic_conn_early_data_reason_string(struct quic_conn_t *conn,
1015+
const uint8_t **out,
1016+
size_t *out_len);
10101017

10111018
/**
10121019
* Send a Ping frame on the active path(s) for keep-alive.

src/connection/connection.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3401,10 +3401,15 @@ impl Connection {
34013401
}
34023402

34033403
/// Return details why 0-RTT was accepted or rejected.
3404-
pub fn early_data_reason(&self) -> Result<Option<&str>> {
3404+
pub fn early_data_reason(&self) -> tls::SslEarlyDataReason {
34053405
self.tls_session.early_data_reason()
34063406
}
34073407

3408+
/// Return a string representation for reason why 0-RTT was accepted or rejected.
3409+
pub fn early_data_reason_string(&self) -> Result<Option<&str>> {
3410+
self.tls_session.early_data_reason_string()
3411+
}
3412+
34083413
/// Check whether the connection is draining.
34093414
///
34103415
/// If true, the connection object can not yet be dropped, but no data can

src/ffi.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1083,12 +1083,18 @@ pub extern "C" fn quic_conn_session(
10831083

10841084
/// Return details why 0-RTT was accepted or rejected.
10851085
#[no_mangle]
1086-
pub extern "C" fn quic_conn_early_data_reason(
1086+
pub extern "C" fn quic_conn_early_data_reason(conn: &mut Connection) -> c_int {
1087+
conn.early_data_reason() as c_int
1088+
}
1089+
1090+
/// Return a string representation for reason why 0-RTT was accepted or rejected.
1091+
#[no_mangle]
1092+
pub extern "C" fn quic_conn_early_data_reason_string(
10871093
conn: &mut Connection,
10881094
out: &mut *const u8,
10891095
out_len: &mut size_t,
10901096
) -> c_int {
1091-
match conn.early_data_reason() {
1097+
match conn.early_data_reason_string() {
10921098
Ok(reason) => {
10931099
match reason {
10941100
Some(reason) => {

src/tls/boringssl/tls.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,8 @@ struct SslQuicMethod {
9292
}
9393

9494
#[repr(C)]
95-
enum SslEarlyDataReason {
95+
#[derive(PartialEq, Debug)]
96+
pub enum SslEarlyDataReason {
9697
// The handshake has not progressed far enough for the 0-RTT status to be known.
9798
Unknown = 0,
9899
// 0-RTT is disabled for this connection.
@@ -774,7 +775,11 @@ impl Session {
774775
Some(peer_cert)
775776
}
776777

777-
pub fn early_data_reason(&self) -> Result<Option<&str>> {
778+
pub fn early_data_reason(&self) -> SslEarlyDataReason {
779+
unsafe { SSL_get_early_data_reason(self.as_ptr()) }
780+
}
781+
782+
pub fn early_data_reason_string(&self) -> Result<Option<&str>> {
778783
let reason = unsafe {
779784
let reason = SSL_early_data_reason_string(SSL_get_early_data_reason(self.as_ptr()));
780785
match ffi::CStr::from_ptr(reason).to_str() {

src/tls/tls.rs

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ pub use boringssl::crypto::Algorithm;
4141
pub use boringssl::crypto::Open;
4242
pub use boringssl::crypto::Seal;
4343
pub use boringssl::tls::SslCtx;
44+
pub use boringssl::tls::SslEarlyDataReason;
4445

4546
#[repr(C)]
4647
#[derive(Clone, Copy, Debug, PartialEq, Eq, EnumIter, EnumCount)]
@@ -581,9 +582,13 @@ impl TlsSession {
581582
self.session.peer_sign_algor()
582583
}
583584

584-
pub fn early_data_reason(&self) -> Result<Option<&str>> {
585+
pub fn early_data_reason(&self) -> SslEarlyDataReason {
585586
self.session.early_data_reason()
586587
}
588+
589+
pub fn early_data_reason_string(&self) -> Result<Option<&str>> {
590+
self.session.early_data_reason_string()
591+
}
587592
}
588593

589594
#[derive(Clone, Debug, PartialEq, Eq)]
@@ -1020,6 +1025,14 @@ pub(crate) mod tests {
10201025
assert!(tls_session_pair.client.is_resumed());
10211026
assert!(tls_session_pair.server.is_completed());
10221027
assert!(tls_session_pair.server.is_resumed());
1028+
assert_eq!(
1029+
tls_session_pair.server.early_data_reason_string(),
1030+
Ok(Some("accepted"))
1031+
);
1032+
assert_eq!(
1033+
tls_session_pair.server.early_data_reason(),
1034+
SslEarlyDataReason::Accepted
1035+
);
10231036
tls_session_pair.check_keys(true)
10241037
}
10251038

@@ -1045,6 +1058,14 @@ pub(crate) mod tests {
10451058
assert!(tls_session_pair.client.is_resumed());
10461059
assert!(tls_session_pair.server.is_completed());
10471060
assert!(tls_session_pair.server.is_resumed());
1061+
assert_eq!(
1062+
tls_session_pair.server.early_data_reason_string(),
1063+
Ok(Some("disabled"))
1064+
);
1065+
assert_eq!(
1066+
tls_session_pair.server.early_data_reason(),
1067+
SslEarlyDataReason::Disabled
1068+
);
10481069
tls_session_pair.check_keys(false)
10491070
}
10501071

@@ -1071,6 +1092,14 @@ pub(crate) mod tests {
10711092
assert!(tls_session_pair.client.data.early_data_rejected);
10721093
assert!(tls_session_pair.server.is_completed());
10731094
assert!(tls_session_pair.server.is_resumed());
1095+
assert_eq!(
1096+
tls_session_pair.server.early_data_reason_string(),
1097+
Ok(Some("disabled"))
1098+
);
1099+
assert_eq!(
1100+
tls_session_pair.server.early_data_reason(),
1101+
SslEarlyDataReason::Disabled
1102+
);
10741103
tls_session_pair.check_keys(false)
10751104
}
10761105

@@ -1098,6 +1127,14 @@ pub(crate) mod tests {
10981127
assert!(tls_session_pair.client.data.early_data_rejected);
10991128
assert!(tls_session_pair.server.is_completed());
11001129
assert!(!tls_session_pair.server.is_resumed());
1130+
assert_eq!(
1131+
tls_session_pair.server.early_data_reason_string(),
1132+
Ok(Some("session_not_resumed"))
1133+
);
1134+
assert_eq!(
1135+
tls_session_pair.server.early_data_reason(),
1136+
SslEarlyDataReason::SessionNotResumed
1137+
);
11011138
tls_session_pair.check_keys(false)
11021139
}
11031140

0 commit comments

Comments
 (0)