@@ -247,7 +247,7 @@ void QuicSocket::AddSession(
247247 const QuicCID& cid,
248248 BaseObjectPtr<QuicSession> session) {
249249 sessions_[cid.ToStr ()] = session;
250- IncrementSocketAddressCounter (** session->GetRemoteAddress ());
250+ IncrementSocketAddressCounter (session->GetRemoteAddress ()-> GetSockaddrStorage ());
251251 IncrementSocketStat (
252252 1 , &socket_stats_,
253253 session->IsServer () ?
@@ -485,7 +485,7 @@ int QuicSocket::ReceiveStop() {
485485 return udp_->RecvStop ();
486486}
487487
488- void QuicSocket::RemoveSession (const QuicCID& cid, const sockaddr * addr) {
488+ void QuicSocket::RemoveSession (const QuicCID& cid, const sockaddr_storage * addr) {
489489 sessions_.erase (cid.ToStr ());
490490 DecrementSocketAddressCounter (addr);
491491}
@@ -659,7 +659,7 @@ namespace {
659659void QuicSocket::SetValidatedAddress (const sockaddr* addr) {
660660 if (IsOptionSet (QUICSOCKET_OPTIONS_VALIDATE_ADDRESS_LRU)) {
661661 // Remove the oldest item if we've hit the LRU limit
662- validated_addrs_.push_back (addr_hash (addr));
662+ validated_addrs_.push_back (addr_hash (* addr));
663663 if (validated_addrs_.size () > MAX_VALIDATE_ADDRESS_LRU)
664664 validated_addrs_.pop_front ();
665665 }
@@ -669,7 +669,7 @@ bool QuicSocket::IsValidatedAddress(const sockaddr* addr) const {
669669 if (IsOptionSet (QUICSOCKET_OPTIONS_VALIDATE_ADDRESS_LRU)) {
670670 auto res = std::find (std::begin (validated_addrs_),
671671 std::end (validated_addrs_),
672- addr_hash (addr));
672+ addr_hash (* addr));
673673 return res != std::end (validated_addrs_);
674674 }
675675 return false ;
@@ -721,9 +721,13 @@ BaseObjectPtr<QuicSession> QuicSocket::AcceptInitialPacket(
721721 // Check to see if the number of connections for this peer has been exceeded.
722722 // If the count has been exceeded, shutdown the connection immediately
723723 // after the initial keys are installed.
724- if (GetCurrentSocketAddressCounter (addr) >= max_connections_per_host_) {
725- Debug (this , " Connection count for address exceeded" );
726- initial_connection_close = NGTCP2_SERVER_BUSY;
724+ {
725+ sockaddr_storage storage;
726+ memcpy (&storage, addr, SocketAddress::GetLength (addr));
727+ if (GetCurrentSocketAddressCounter (&storage) >= max_connections_per_host_) {
728+ Debug (this , " Connection count for address exceeded" );
729+ initial_connection_close = NGTCP2_SERVER_BUSY;
730+ }
727731 }
728732
729733 // QUIC has address validation built in to the handshake but allows for
@@ -782,22 +786,22 @@ BaseObjectPtr<QuicSession> QuicSocket::AcceptInitialPacket(
782786 return session;
783787}
784788
785- void QuicSocket::IncrementSocketAddressCounter (const sockaddr * addr) {
786- addr_counts_[addr]++;
789+ void QuicSocket::IncrementSocketAddressCounter (const sockaddr_storage * addr) {
790+ addr_counts_[* addr]++;
787791}
788792
789- void QuicSocket::DecrementSocketAddressCounter (const sockaddr * addr) {
790- auto it = addr_counts_.find (addr);
793+ void QuicSocket::DecrementSocketAddressCounter (const sockaddr_storage * addr) {
794+ auto it = addr_counts_.find (* addr);
791795 if (it == std::end (addr_counts_))
792796 return ;
793797 it->second --;
794798 // Remove the address if the counter reaches zero again.
795799 if (it->second == 0 )
796- addr_counts_.erase (addr);
800+ addr_counts_.erase (* addr);
797801}
798802
799- size_t QuicSocket::GetCurrentSocketAddressCounter (const sockaddr * addr) {
800- auto it = addr_counts_.find (addr);
803+ size_t QuicSocket::GetCurrentSocketAddressCounter (const sockaddr_storage * addr) {
804+ auto it = addr_counts_.find (* addr);
801805 if (it == std::end (addr_counts_))
802806 return 0 ;
803807 return it->second ;
0 commit comments