
    @OOf4                         d dl Z d dlZd dlmZmZmZmZmZmZ ddl	m
Z
mZ ddlmZmZ ddlmZ ddlmZmZ ddlmZ d	Zd
ZdZdZ G d d      Z G d d      Z G d d      Zy)    N)AnyCallableDictIterableListOptional   )cubicreno)K_GRANULARITYcreate_congestion_control)QuicLoggerTrace)QuicDeliveryStateQuicSentPacket)RangeSet   g      ?gư>g      ?c                       e Zd ZddZy)QuicPacketSpaceNc                     d | _         t               | _        d| _        d| _        d| _        d | _        d| _        d| _        d | _	        i | _
        y )NFr   )ack_atr   	ack_queue	discardedexpected_packet_numberlargest_received_packetlargest_received_timeack_eliciting_in_flightlargest_acked_packet	loss_timesent_packetsselfs    V/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/aioquic/quic/recovery.py__init__zQuicPacketSpace.__init__   sR    '+!&'#')$6:" ()$$%!*.79    returnN)__name__
__module____qualname__r$    r%   r#   r   r      s    :r%   r   c                   `    e Zd ZdeddfdZdedefdZdeddfdZdeddfdZd	ed
eddfdZ	y)QuicPacketPacermax_datagram_sizer'   Nc                J    || _         d| _        d| _        d| _        d | _        y )N        )_max_datagram_size
bucket_maxbucket_timeevaluation_timepacket_time)r"   r.   s     r#   r$   zQuicPacketPacer.__init__#   s)    "3!$"%&),0r%   nowc                 |    | j                   0| j                  |       | j                  dk  r|| j                   z   S y )Nr6   r   r5   update_bucketr3   r"   r6   s     r#   next_send_timezQuicPacketPacer.next_send_time*   sA    '3'1$T----r%   c                     | j                   S| j                  |       | j                  | j                   k  rd| _        y | xj                  | j                   z  c_        y y )Nr8   r0   r9   r;   s     r#   update_after_sendz!QuicPacketPacer.update_after_send1   sW    '3'$"2"22#&   D$4$44  (r%   c                     || j                   kD  r=t        | j                  || j                   z
  z   | j                        | _        || _         y y N)r4   minr3   r2   r;   s     r#   r:   zQuicPacketPacer.update_bucket9   sK    %%%"  C$*>*>$>? D $'D 	 &r%   congestion_windowsmoothed_rttc                 V   |t        |t              z  }t        t        t        | j                  |z  t                    | _        t        d| j                  z  t        |dz  d| j                  z              |z  | _        | j                  | j                  kD  r| j                  | _        y y )N         )maxK_MICRO_SECONDrA   r1   K_SECONDr5   r2   r3   )r"   rB   rC   pacing_rates       r#   update_ratezQuicPacketPacer.update_rate@   s    '#lN*KKC 7 7+ ExP

 D+++%*B1H1H,HI 	 	 doo-#D .r%   )
r(   r)   r*   intr$   floatr<   r>   r:   rL   r+   r%   r#   r-   r-   "   sh    1S 1T 1% E 5U 5t 5' '4 '/S / /$ /r%   r-   c                   \   e Zd ZdZddddededededeg df   d	e	e
j                     d
e	e   ddfdZedefd       Zedefd       ZdeddfdZdefdZdefdZdededededdf
dZdeddfdZdededdfdZdeddfdZdededdfdZde	e   fdZd d!dZdedee   deddfdZy)"QuicPacketRecoveryz0
    Packet loss and congestion controller.
    N)loggerquic_loggercongestion_control_algorithminitial_rttr.   !peer_completed_address_validation
send_proberQ   rR   r'   c                *   d| _         || _        g | _        || _        || _        || _        d| _        || _        d| _        d| _	        t        j                  | _        d| _        d| _        d| _        t!        ||      | _        t%        |      | _        y )Ng?r   Fr0   )r.   )max_ack_delayrU   spaces_logger_quic_logger_send_probe
_pto_count_rtt_initial_rtt_initialized_rtt_latestmathinf_rtt_min_rtt_smoothed_rtt_variance'_time_of_last_sent_ack_eliciting_packetr   _ccr-   _pacer)r"   rS   rT   r.   rU   rV   rQ   rR   s           r#   r$   zQuicPacketRecovery.__init__V   s     #1R.-/ '% ' %  7:4 -(<M
 &8IJr%   c                 .    | j                   j                  S r@   )rg   bytes_in_flightr!   s    r#   rj   z"QuicPacketRecovery.bytes_in_flightz   s    xx'''r%   c                 .    | j                   j                  S r@   )rg   rB   r!   s    r#   rB   z$QuicPacketRecovery.congestion_window~   s    xx)))r%   spacec                 H   || j                   v sJ | j                  j                  t        d |j                  j                                      |j                  j                          d |_        d|_        d |_	        d| _
        | j                  | j                          y y )Nc                     | j                   S r@   )	in_flight)xs    r#   <lambda>z2QuicPacketRecovery.discard_space.<locals>.<lambda>   s
    Q[[ r%   )packetsr   )rY   rg   on_packets_expiredfilterr    valuesclearr   r   r   r]   r[   _log_metrics_updated)r"   rl   s     r#   discard_spacez QuicPacketRecovery.discard_space   s    #####0%2D2D2K2K2MN 	$ 	
 	  "()% (%%' )r%   c                     | j                         }||j                  S | j                  rt        d | j                  D              dkD  r/| j                         d| j                  z  z  }| j                  |z   S y )Nc              3   4   K   | ]  }|j                     y wr@   )r   ).0rl   s     r#   	<genexpr>z=QuicPacketRecovery.get_loss_detection_time.<locals>.<genexpr>   s     JU500Js   r   rE   )_get_loss_spacer   rU   sumrY   get_probe_timeoutr]   rf   )r"   
loss_spacetimeouts      r#   get_loss_detection_timez*QuicPacketRecovery.get_loss_detection_time   st    ))+
!''' 66JdkkJJQN,,.!T__2DEG??'IIr%   c                     | j                   sd| j                  z  S | j                  t        d| j                  z  t
              z   | j                  z   S )NrE   rF   )r_   r^   rd   rH   re   r   rX   r!   s    r#   r   z$QuicPacketRecovery.get_probe_timeout   sR    $$t((((!d(((-89  !	
r%   ack_rangeset	ack_delayr6   c                v   d}|j                         j                  dz
  }d}d}||j                  kD  r||_        t        |j                  j                               D ]  }	|	|kD  r n|	|v s|j                  j                  |	      }
|
j                  rd}|xj                  dz  c_        |
j                  r| j                  j                  |
|       |	}|
j                  }|
j                  D ]  \  }} |t        j                  g|    |y||k(  rh|re||z
  }d}t!        || j"                        }t%        |d      | _        | j&                  | j(                  k  r| j&                  | _        | j&                  | j(                  |z   kD  r| xj&                  |z  c_        | j*                  sd| _        |dz  | _        || _        n^d| j,                  z  d	t1        | j(                  | j&                  z
        z  z   | _        d
| j.                  z  d| j&                  z  z   | _        | j                  j3                  ||       | j4                  j7                  | j                  j8                  | j.                         nd}| j;                  ||       d| _        | j>                  | jA                  |       yy)zH
        Update metrics as the result of an ACK being received.
        Fr	   NT)packetr6   gMbP?rE   g      ?g      ?g      ?g      ?)r6   rttrB   rC   r6   rl   r   )log_rtt)!boundsstopr   sortedr    keyspopis_ack_elicitingr   ro   rg   on_packet_acked	sent_timedelivery_handlersr   ACKEDrA   rX   rH   r`   rc   r_   re   rd   abson_rtt_measurementrh   rL   rB   _detect_lossr]   r[   rw   )r"   r   r   r6   rl   r   largest_ackedlargest_newly_ackedlargest_sent_timepacket_numberr   handlerargs
latest_rttr   s                  r#   on_ack_receivedz"QuicPacketRecovery.on_ack_received   s    !$++-22Q6" 5555)6E&#E$6$6$;$;$=> 	<M},,++//>**'+$11Q61##HH,,F,D&3#$*$4$4! &,%=%= <MGT-33;d;<	<& &//4D00JG It'9'9:I  #:u5D$--/ $ 0 0$--)";;  I- (((,%%/!^"%/"%*T-?-?%?%#MMD$4$44K C &" D...9I9I1II "
 HH''CZ'@KK##"&(("<"<!// $  Gc/ (%%g%6 )r%   c                    | j                         }|| j                  ||       y | xj                  dz  c_        | j                  |       y )Nr   r	   r8   )r}   r   r]   reschedule_data)r"   r6   r   s      r#   on_loss_detection_timeoutz,QuicPacketRecovery.on_loss_detection_timeout  sH    ))+
!#Z8OOq O  S )r%   r   c                >   ||j                   |j                  <   |j                  r|xj                  dz  c_        |j                  rW|j                  r|j
                  | _        | j                  j                  |       | j                  | j                          y y y )Nr	   )r   )r    r   r   r   ro   r   rf   rg   on_packet_sentr[   rw   )r"   r   rl   s      r#   r   z!QuicPacketRecovery.on_packet_sent
  s    396//0""))Q.)&&?E?O?O< HH##6#2  ,))+ - r%   c                *   d}| j                   D ]I  }t        t        d |j                  j	                                     }|s4| j                  |||       d}K |r'| j                  | j                  j                  d       | j                          y)z8
        Schedule some data for retransmission.
        Fc                     | j                   S r@   )is_crypto_packet)is    r#   rq   z4QuicPacketRecovery.reschedule_data.<locals>.<lambda>!  s    !3!3 r%   r6   rr   rl   TNz(Scheduled CRYPTO data for retransmission)	rY   tuplert   r    ru   _on_packets_lostrZ   debugr\   )r"   r6   crypto_scheduledrl   rr   s        r#   r   z"QuicPacketRecovery.reschedule_data  s    
 ![[ 	(E3U5G5G5N5N5PQG %%#we%L#' 	(  8LLIJ 	r%   c                   t         | j                  r t        | j                  | j                        n| j
                  z  }|j                  t        z
  }||z
  }g }d|_        |j                  j                         D ]n  \  }}||j                  kD  r nZ||k  s|j                  |k  r|j                  |       =|j                  |z   }	|j                  |j                  |	kD  sh|	|_        p | j                  |||       y)zD
        Check whether any packets should be declared lost.
        Nr   )K_TIME_THRESHOLDr_   rH   r`   rd   r^   r   K_PACKET_THRESHOLDr   r    itemsr   appendr   )
r"   r6   rl   
loss_delaypacket_thresholdtime_thresholdlost_packetsr   r   packet_loss_times
             r#   r   zQuicPacketRecovery._detect_loss,  s     &$$   $"4"45""


 !558JJz)%*%7%7%=%=%? 		7!M6u999 00F4D4D4V##F+#)#3#3j#@ ??*eoo@P.P&6EO		7 	#|5Ir%   c                     d }| j                   D ]-  }|j                  ||j                  |j                  k  s,|}/ |S r@   )rY   r   )r"   r   rl   s      r#   r}   z"QuicPacketRecovery._get_loss_spaceG  sH    
[[ 	#E*"eoo
8L8L&L"
		#
 r%   c                    | j                   j                         }|r|j                  | j                  j	                  | j
                        | j                  j	                  | j                        | j                  j	                  | j                        | j                  j	                  | j                        d       | j                  j                  dd|       y )N)r   min_rttrC   rtt_variancerecoverymetrics_updatedcategoryeventdata)
rg   get_log_dataupdater[   encode_timer`   rc   rd   re   	log_event)r"   r   r   s      r#   rw   z'QuicPacketRecovery._log_metrics_updatedP  s    #xx446KK"&"3"3"?"?@P@P"Q#00<<T]]K$($5$5$A$A$BTBT$U$($5$5$A$A$BTBT$U	 	##'8t 	$ 	
r%   rr   c                   g }|D ]  }|j                   |j                  = |j                  r|j                  |       |j                  r|xj
                  dz  c_        | j                  ^| j                  j                  dd| j                  j                  |j                        |j                  d       | j                          |j                  D ]  \  }} |t        j                  g|    |rv| j                  j                  ||       | j                  j!                  | j                  j"                  | j$                         | j                  | j                          y y y )Nr	   r   packet_lost)typer   r   )r6   rr   r   )r    r   ro   r   r   r   r[   r   packet_typerw   r   r   LOSTrg   on_packets_lostrh   rL   rB   rd   )r"   r6   rr   rl   lost_packets_ccr   r   r   s           r#   r   z#QuicPacketRecovery._on_packets_losta  sZ     	7F""6#7#78&&v.&&--2-  ,!!++'' $ 1 1 = =f>P>P Q)/)=)= ,  ))+ "(!9!9 7)..667+	72 HH$$o$FKK##"&(("<"<!// $    ,))+ - r%   )Fr&   ) r(   r)   r*   __doc__strrN   rM   boolr   r   loggingLoggerAdapterr   r$   propertyrj   rB   r   rx   r   r   r   r   r   r   r   r   r   r}   rw   r   r   r+   r%   r#   rP   rP   Q   s    3715"K '*"K 	"K
 "K ,0"K RX&"K ../"K o."K 
"KH ( ( ( *3 * *(? (t ($  
5 
S7 S7 	S7
 S7 S7 
S7j* *$ *, , ,SW ,e  &J5 J JT J6/!: 
"$,$,&.~&>$,GV$,	$,r%   rP   )r   ra   typingr   r   r   r   r   r   
congestionr
   r   congestion.baser   r   rQ   r   packet_builderr   r   rangesetr   r   r   rI   rJ   r   r-   rP   r+   r%   r#   <module>r      sY      @ @ # E # =    : : ,/ ,/^t, t,r%   