Allow QUIC applications to access path validation context and explicitly cancel path validation.

This will allow Chrome to avoid double probing and handle packet writer error properly.

PiperOrigin-RevId: 347647587
Change-Id: If099f6045f08f27f905b6f9dc2e26d25f8f2f0ee
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index 1a39ec5..1599d10 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -4000,7 +4000,7 @@
   // Cancel the alarms so they don't trigger any action now that the
   // connection is closed.
   CancelAllAlarms();
-  path_validator_.CancelPathValidation();
+  CancelPathValidation();
 }
 
 void QuicConnection::CancelAllAlarms() {
@@ -5447,6 +5447,14 @@
   return path_validator_.HasPendingPathValidation();
 }
 
+QuicPathValidationContext* QuicConnection::GetPathValidationContext() const {
+  return path_validator_.GetContext();
+}
+
+void QuicConnection::CancelPathValidation() {
+  path_validator_.CancelPathValidation();
+}
+
 void QuicConnection::MigratePath(const QuicSocketAddress& self_address,
                                  const QuicSocketAddress& peer_address,
                                  QuicPacketWriter* writer,
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h
index 3424735..f272a6a 100644
--- a/quic/core/quic_connection.h
+++ b/quic/core/quic_connection.h
@@ -1156,6 +1156,10 @@
 
   bool HasPendingPathValidation() const;
 
+  QuicPathValidationContext* GetPathValidationContext() const;
+
+  void CancelPathValidation();
+
   void MigratePath(const QuicSocketAddress& self_address,
                    const QuicSocketAddress& peer_address,
                    QuicPacketWriter* writer,
diff --git a/quic/core/quic_path_validator.cc b/quic/core/quic_path_validator.cc
index e24e053..fe9e046 100644
--- a/quic/core/quic_path_validator.cc
+++ b/quic/core/quic_path_validator.cc
@@ -94,6 +94,10 @@
   return path_context_ != nullptr;
 }
 
+QuicPathValidationContext* QuicPathValidator::GetContext() const {
+  return path_context_.get();
+}
+
 const QuicPathFrameBuffer& QuicPathValidator::GeneratePathChallengePayload() {
   probing_data_.push_back(QuicPathFrameBuffer());
   random_->RandBytes(probing_data_.back().data(), sizeof(QuicPathFrameBuffer));
diff --git a/quic/core/quic_path_validator.h b/quic/core/quic_path_validator.h
index 2f30579..b9c9c5d 100644
--- a/quic/core/quic_path_validator.h
+++ b/quic/core/quic_path_validator.h
@@ -106,6 +106,8 @@
 
   bool HasPendingPathValidation() const;
 
+  QuicPathValidationContext* GetContext() const;
+
   // Send another PATH_CHALLENGE on the same path. After retrying
   // |kMaxRetryTimes| times, fail the current path validation.
   void OnRetryTimeout();