
    mbi7                        d dl mZ d dlZd dlZd dlmZmZmZ ddlm	Z	m
Z
mZ ddlmZ ddlmZmZ d	Zd
ZdZdZdZdZdez  Zdez  ZdZ G d d          Z G d d          Z G d d          ZdS )    )annotationsN)AnyCallableIterable   )QuicPacketPacerQuicRttMonitorRangeSet   )QuicLoggerTrace)QuicDeliveryStateQuicSentPacket   MbP?g      ?gư>g      ?i   
   g      ?c                      e Zd ZddZdS )QuicPacketSpacereturnNonec                    d | _         t                      | _        d| _        d| _        d| _        d | _        d| _        d| _        d | _	        i | _
        d S )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    a/var/www/html/mdtn/previsions/meteo_cartes/venv/lib/python3.11/site-packages/qh3/quic/recovery.py__init__zQuicPacketSpace.__init__   sZ    $(!&'#')$37" ()$$%!'+79    Nr   r   )__name__
__module____qualname__r%    r&   r$   r   r      s(        : : : : : :r&   r   c                  B    e Zd ZdZddZddZddZddZddZddZ	dS )QuicCongestionControlz&
    New Reno congestion control.
    r   r   c                |    d| _         t          | _        d| _        d| _        t                      | _        d | _        d S )Nr           )bytes_in_flightK_INITIAL_WINDOWcongestion_window_congestion_recovery_start_time_congestion_stashr	   _rtt_monitorssthreshr"   s    r$   r%   zQuicCongestionControl.__init__.   s;     !1/2,!"*,,$(r&   packetr   c                `   | xj         |j        z  c_         |j        | j        k    rd S | j        | j        | j        k     r| xj        |j        z  c_        d S | xj        |j        z  c_        | j        | j        z  }|r2| xj        || j        z  z  c_        | xj        |t          z  z  c_        d S d S N)r0   
sent_bytes	sent_timer3   r6   r2   r4   K_MAX_DATAGRAM_SIZE)r#   r7   counts      r$   on_packet_ackedz%QuicCongestionControl.on_packet_acked6   s     11 tCCCF= D$:T]$J$J""f&77"""" ""f&77""*d.DDE F&&%$2H*HH&&&&%2E*EE&&&&F Fr&   c                0    | xj         |j        z  c_         d S r9   r0   r:   )r#   r7   s     r$   on_packet_sentz$QuicCongestionControl.on_packet_sentH   s     11r&   packetsIterable[QuicSentPacket]c                :    |D ]}| xj         |j        z  c_         d S r9   r@   )r#   rB   r7   s      r$   on_packets_expiredz(QuicCongestionControl.on_packets_expiredK   s5     	6 	6F  F$55   	6 	6r&   nowfloatc                    d}|D ]}| xj         |j        z  c_         |j        }|| j        k    rI|| _        t	          t          | j        t          z            t                    | _        | j        | _	        d S d S )Nr/   )
r0   r:   r;   r3   maxintr2   K_LOSS_REDUCTION_FACTORK_MINIMUM_WINDOWr6   )r#   rB   rF   lost_largest_timer7   s        r$   on_packets_lostz%QuicCongestionControl.on_packets_lostO   s     	1 	1F  F$55   & 0 tCCC36D0%(D*-DDEEGW& &D" !2DMMM DCr&   
latest_rttc                j    | j         )| j                            ||          r| j        | _         d S d S d S r9   )r6   r5   is_rtt_increasingr2   )r#   rO   rF   s      r$   on_rtt_measurementz(QuicCongestionControl.on_rtt_measurement`   sE    = T%6%H%H&
 &
  !2DMMM !   r&   Nr'   )r7   r   r   r   )rB   rC   r   r   )rB   rC   rF   rG   r   r   )rO   rG   rF   rG   r   r   )
r(   r)   r*   __doc__r%   r>   rA   rE   rN   rR   r+   r&   r$   r-   r-   )   s         ) ) ) )F F F F$2 2 2 26 6 6 63 3 3 3"3 3 3 3 3 3r&   r-   c                      e Zd ZdZ	 	 d*d+dZed,d            Zed,d            Zd-dZd.dZ	d.dZ
d/dZd0dZd1d Zd0d!Zd2d"Zd3d$Zd4d5d&Zd6d)ZdS )7QuicPacketRecoveryz0
    Packet loss and congestion controller.
    Ninitial_rttrG   !peer_completed_address_validationbool
send_probeCallable[[], None]loggerlogging.LoggerAdapter | Nonequic_loggerQuicLoggerTrace | Noner   r   c                *   d| _         || _        g | _        || _        || _        || _        d| _        || _        d| _        d| _	        t          j        | _        d| _        d| _        d| _        t!                      | _        t%                      | _        d S )Ng?r   Fr/   )max_ack_delayrW   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#   rV   rW   rY   r[   r]   s         r$   r%   zQuicPacketRecovery.__init__m   s     #1R.-/ '% ' %  7:4 )**%''r&   rJ   c                    | j         j        S r9   )ro   r0   r"   s    r$   r0   z"QuicPacketRecovery.bytes_in_flight   s    x''r&   c                    | j         j        S r9   )ro   r2   r"   s    r$   r2   z$QuicPacketRecovery.congestion_window   s    x))r&   spacer   c                @   || j         v sJ | j                            t          d |j                                                             |j                                         d |_        d|_        d |_	        d| _
        | j        |                                  d S d S )Nc                    | j         S r9   )	in_flight)xs    r$   <lambda>z2QuicPacketRecovery.discard_space.<locals>.<lambda>   s    Q[ r&   r   )ra   ro   rE   filterr!   valuesclearr   r   r    re   rc   _log_metrics_updated)r#   rs   s     r$   discard_spacez QuicPacketRecovery.discard_space   s    ######((%*<*C*C*E*EFF	
 	
 	
 	  """()% (%%''''' )(r&   c                    |                                  }||j        S | j        r"t          d | j        D                       dk    r)|                                 d| j        z  z  }| j        |z   S d S )Nc              3  $   K   | ]}|j         V  d S r9   )r   ).0rs   s     r$   	<genexpr>z=QuicPacketRecovery.get_loss_detection_time.<locals>.<genexpr>   s%      JJU50JJJJJJr&   r   r   )_get_loss_spacer    rW   sumra   get_probe_timeoutre   rn   )r#   
loss_spacetimeouts      r$   get_loss_detection_timez*QuicPacketRecovery.get_loss_detection_time   s    ))++
!'' 6	JJJdkJJJJJQNN,,..!T_2DEG?'IItr&   c                ~    | j         s
d| j        z  S | j        t          d| j        z  t
                    z   | j        z   S )Nr      )rg   rf   rl   rI   rm   K_GRANULARITYr`   r"   s    r$   r   z$QuicPacketRecovery.get_probe_timeout   sK    $ 	)t(((!d((-889 !	
r&   ack_rangesetr
   	ack_delayrF   c                   d}|                                 d         dz
  }d}d}||j        k    r||_        t          |j                                                  D ]}	|	|k    r n|	|v r}|j                            |	          }
|
j        rd}|xj        dz  c_        |
j        r| j	        
                    |
           |	}|
j        }|
j        D ]\  }} |t          j        g|R   |dS ||k    r$|r!||z
  }d}t          || j                  }t#          |d          | _        | j        | j        k     r| j        | _        | j        | j        |z   k    r| xj        |z  c_        | j        sd| _        |dz  | _        || _        nId| j        z  dt/          | j        | j        z
            z  z   | _        d	| j        z  d
| j        z  z   | _        | j	                            ||           | j                            | j	        j        | j                   nd}|                     ||           d| _        | j        |                     |           dS dS )zH
        Update metrics as the result of an ACK being received.
        Fr   NTr   r   g      ?g      ?g      ?g      ?rF   r2   smoothed_rttr   )log_rtt) boundsr   sortedr!   keyspopis_ack_elicitingr   rv   ro   r>   r;   delivery_handlersr   ACKEDminr`   rI   rh   rk   rg   rm   rl   absrR   rp   update_rater2   _detect_lossre   rc   r|   )r#   rs   r   r   rF   r   largest_ackedlargest_newly_ackedlargest_sent_timepacket_numberr7   handlerargsrO   r   s                  r$   on_ack_receivedz"QuicPacketRecovery.on_ack_received   s    !$++--a014" 5555)6E&#E$6$;$;$=$=>> 	< 	<M},,,,+//>>* 7'+$11Q611# 5H,,V444&3#$*$4! &,%= < <MGTG-3;d;;;;; &F///4D/00JG It'9::I  #:u55D$-// $ 0$-)";;;  I-  ( 
(,%%/!^"%/""%*T-?%?%#MD$44K K C &" D..9I1II "
 H''
'<<<K##"&("<!/ $     G%S))) (%%g%66666 )(r&   c                    |                                  }||                     ||           d S | xj        dz  c_        |                     |           d S )Nr   r   )r   r   re   reschedule_data)r#   rF   r   s      r$   on_loss_detection_timeoutz,QuicPacketRecovery.on_loss_detection_timeout  se    ))++
!jc22222OOq OO  S )))))r&   r7   r   c                    ||j         |j        <   |j        r|xj        dz  c_        |j        rJ|j        r|j        | _        | j                            |           | j	        | 
                                 d S d S d S )Nr   )r!   r   r   r   rv   r;   rn   ro   rA   rc   r|   )r#   r7   rs   s      r$   rA   z!QuicPacketRecovery.on_packet_sent  s    396/0" 	/))Q.)) 	,& P?E?O< H##F+++ ,))+++++	, 	, -,r&   c                .   d}| j         D ]S}t          t          d |j                                                            }|r|                     |||           d}T|r!| j        | j                            d           |                                  dS )z8
        Schedule some data for retransmission.
        Fc                    | j         S r9   )is_crypto_packet)is    r$   rx   z4QuicPacketRecovery.reschedule_data.<locals>.<lambda>2  s	    !3 r&   rs   rF   TNz(Scheduled CRYPTO data for retransmission)	ra   tuplery   r!   rz   _on_packets_lostrb   debugrd   )r#   rF   crypto_scheduledrs   rB   s        r$   r   z"QuicPacketRecovery.reschedule_data*  s    
 ![ 	( 	(E33U5G5N5N5P5PQQ G  (%%gU%DDD#'  	K 8LIJJJ 	r&   c                   t           | j        rt          | j        | j                  n| j        z  }|j        t          z
  }||z
  }g }d|_        |j	        
                                D ]\\  }}||j        k    r nK||k    s|j        |k    r|                    |           9|j        |z   }	|j        |j        |	k    r|	|_        ]|                     |||           dS )zD
        Check whether any packets should be declared lost.
        Nr   )K_TIME_THRESHOLDrg   rI   rh   rl   rf   r   K_PACKET_THRESHOLDr    r!   itemsr;   appendr   )
r#   rs   rF   
loss_delaypacket_thresholdtime_thresholdlost_packetsr   r7   packet_loss_times
             r$   r   zQuicPacketRecovery._detect_loss=  s    &$#C $"4555"


 !58JJz)%*%7%=%=%?%? 		7 		7!M6u999 000F4D4V4V##F++++#)#3j#@ ?*eo@P.P.P&6EOl%SAAAAAr&   QuicPacketSpace | Nonec                T    d }| j         D ]}|j        ||j        |j        k     r|}|S r9   )ra   r    )r#   r   rs   s      r$   r   z"QuicPacketRecovery._get_loss_spaceX  sA    
[ 	# 	#E*"eo
8L&L&L"
r&   Fc                   | j         j        | j         j        d}| j         j        | j         j        |d<   |r|                    | j                            | j                  | j                            | j                  | j                            | j	                  | j                            | j
                  d           | j                            dd|           d S )N)r0   cwndr6   )rO   min_rttr   rtt_variancerecoverymetrics_updatedcategoryeventdata)ro   r0   r2   r6   updaterc   encode_timerh   rk   rl   rm   	log_event)r#   r   r   s      r$   r|   z'QuicPacketRecovery._log_metrics_updateda  s    #x7H. 
  
 8(#x0D 	KK"&"3"?"?@P"Q"Q#0<<T]KK$($5$A$A$BT$U$U$($5$A$A$BT$U$U	    	##'8t 	$ 	
 	
 	
 	
 	
r&   rB   rC   c                ^   g }|D ]}|j         |j        = |j        r|                    |           |j        r|xj        dz  c_        | j        V| j                            dd| j                            |j                  |j        d           | 	                                 |j
        D ]\  }} |t          j        g|R   |rd| j                            ||           | j                            | j        j        | j                   | j        | 	                                 d S d S d S )Nr   r   packet_lost)typer   r   r   r   )r!   r   rv   r   r   r   rc   r   packet_typer|   r   r   LOSTro   rN   rp   r   r2   rl   )r#   rB   rs   rF   lost_packets_ccr7   r   r   s           r$   r   z#QuicPacketRecovery._on_packets_lostw  s     	7 	7F"6#78 /&&v...& 3--2-- ,!++'' $ 1 = =f>P Q Q)/)=  ,    ))+++ "(!9 7 7).6666667  	,H$$_#$>>>K##"&("<!/ $     ,))+++++	, 	, -,r&   )NN)rV   rG   rW   rX   rY   rZ   r[   r\   r]   r^   r   r   )r   rJ   )rs   r   r   r   )r   rG   )
rs   r   r   r
   r   rG   rF   rG   r   r   )rF   rG   r   r   )r7   r   rs   r   r   r   )rs   r   rF   rG   r   r   )r   r   )Fr'   )rB   rC   rs   r   rF   rG   r   r   )r(   r)   r*   rS   r%   propertyr0   r2   r}   r   r   r   r   rA   r   r   r   r|   r   r+   r&   r$   rU   rU   h   si         04.2( ( ( ( (> ( ( ( X( * * * X*( ( ( ($    
 
 
 
R7 R7 R7 R7h* * * *, , , ,   &B B B B6   
 
 
 
 
,$, $, $, $, $, $,r&   rU   )
__future__r   loggingri   typingr   r   r   _hazmatr   r	   r
   r[   r   packet_builderr   r   r   r   r   K_MICRO_SECONDK_SECONDr<   r1   rL   rK   r   r-   rU   r+   r&   r$   <module>r      s_   " " " " " "   * * * * * * * * * * ? ? ? ? ? ? ? ? ? ? # # # # # # = = = = = = = =     ++ **  : : : : : : : : <3 <3 <3 <3 <3 <3 <3 <3~s, s, s, s, s, s, s, s, s, s,r&   