Support QUIC Client connection IDs

This CL is almost exclusively plumbing client connection IDs through the stack now that previous CLs handled the behavior changes. It also adds tests for the new behavior at each layer.

gfe-relnote: support client connection IDs, protected by quic_do_not_override_connection_id
PiperOrigin-RevId: 251599233
Change-Id: I7cda028f8aa56e6da451b6d86877fd0f84d93531
diff --git a/quic/core/quic_connection.h b/quic/core/quic_connection.h
index 9392f26..a0d0cd0 100644
--- a/quic/core/quic_connection.h
+++ b/quic/core/quic_connection.h
@@ -582,6 +582,10 @@
     return effective_peer_address_;
   }
   QuicConnectionId connection_id() const { return server_connection_id_; }
+  QuicConnectionId client_connection_id() const {
+    return client_connection_id_;
+  }
+  void set_client_connection_id(QuicConnectionId client_connection_id);
   const QuicClock* clock() const { return clock_; }
   QuicRandom* random_generator() const { return random_generator_; }
   QuicByteCount max_packet_length() const;
@@ -1173,6 +1177,10 @@
   QuicRandom* random_generator_;
 
   QuicConnectionId server_connection_id_;
+  QuicConnectionId client_connection_id_;
+  // On the server, the connection ID is set when receiving the first packet.
+  // This variable ensures we only set it this way once.
+  bool client_connection_id_is_set_;
   // Address on the last successfully processed packet received from the
   // direct peer.
   QuicSocketAddress self_address_;