
    @OOfR                         d dl mZmZmZ ddlmZ ddlmZmZm	Z	m
Z
mZ dZdZdZded	efd
Z G d de	      Z ede       y)    )AnyDictIterable   )QuicSentPacket   )K_INITIAL_WINDOWK_MINIMUM_WINDOWQuicCongestionControlQuicRttMonitorregister_congestion_controlg?gffffff?xreturnc                 $    | dk  r|  dz   S | dz  S )Nr   gUUUUUU? )r   s    ^/var/www/premiumrankchecker/venv/lib/python3.12/site-packages/aioquic/quic/congestion/cubic.pybetter_cube_rootr      s$    1u")$%%y!!    c                        e Zd ZdZdeddf fdZdefdZdefdZdefdZ	dd	Z
d
ededdfdZdeddfdZdee   ddfdZd
edee   ddfdZd
ededdfdZdeeef   f fdZ xZS )CubicCongestionControlz=
    Cubic congestion control implementation for aioquic
    max_datagram_sizer   Nc                     t         |   |       || _        || _        d| _        t               | _        d| _        | j                          d| _	        y )N)r           g{Gz?)
super__init__additive_increase_factor_max_datagram_size_congestion_recovery_start_timer   _rtt_monitorrttresetlast_ack)selfr   	__class__s     r   r   zCubicCongestionControl.__init__   sN    +<=->%'8/2,*,

r   c                     | j                   | j                  z  }t        || j                  z
  dz  z  |z   }t	        || j                  z        S )N   )_W_maxr   	K_CUBIC_CKint)r#   tW_max_segmentstarget_segmentss       r   W_cubiczCubicCongestionControl.W_cubic.   sH    t'>'>>#q466za&77>J?T%<%<<==r   c                 >    | j                  |      | j                  k  S N)r.   _W_est)r#   r+   s     r   is_reno_friendlyz'CubicCongestionControl.is_reno_friendly3   s    ||A,,r   c                 4    | j                   | j                  k  S r0   )congestion_windowr'   r#   s    r   
is_concavez!CubicCongestionControl.is_concave6   s    %%33r   c                     t         | j                  z  | _        d | _        d| _        d| _        d| _        d| _        d| _        d| _	        | j                  | _
        y )NTFr   r   )r	   r   r4   ssthresh_first_slow_start_starting_congestion_avoidancer)   r1   _cwnd_epoch_t_epochr'   r5   s    r   r!   zCubicCongestionControl.reset9   sV    !1D4K4K!K!%.3+,,r   nowpacketc                @   | xj                   |j                  z  c_         |j                  | _        | j                  | j
                  | j                  k  r | xj
                  |j                  z  c_        y | j                  r| j                  sd| _        | j
                  | _        || _	        | j
                  | _
        | j                  | _        | j                  | j                  z  }| j                  | j                  z  }t        ||z
  t        z        | _        | j                  rd| _        d| _        || _	        | j
                  | _
        | j                  | _        | j                  | j                  z  }| j                  | j                  z  }t        ||z
  t        z        | _        t!        | j                  | j"                  |j                  | j
                  z  z  z         | _        || j                  z
  }d}| j%                  || j&                  z         }|| j
                  k  r| j
                  }n-|d| j
                  z  kD  rt!        | j
                  dz        }n|}| j)                  |      r| j                  | _        y | j+                         rEt!        | j
                  || j
                  z
  | j                  | j
                  z  z  z         | _        y t!        | j
                  || j
                  z
  | j                  | j
                  z  z  z         | _        y )NFr   g      ?)bytes_in_flight
sent_bytes	sent_timer"   r8   r4   r9   r:   r'   r<   r;   r1   r   r   r(   r)   r*   r   r.   r    r2   r6   )r#   r=   r>   r,   cwnd_epoch_segmentsr+   targetr.   s           r   on_packet_ackedz&CubicCongestionControl.on_packet_ackedE   s    1 11((== D$:$:T]]$J""f&7&77" %%d.Q.Q).&"44 ##'#9#9 "..!%t/F/F!F&*&6&69P9P&P#)#&99YF
 226;3).& ##'#9#9 "..!%t/F/F!F&*&6&69P9P&P#)#&99YF //$$t'='==??DK dmm#AFll1txx<0G/////3!7!777T33c9: $$Q' *.&" *-**$"8"8822T5K5KKM*& *-**$"8"8822T5K5KKM*&r   c                    | xj                   |j                  z  c_         | j                  dk(  ry |j                  | j                  z
  }|t        k\  r| j                          y y )Nr   )r@   rA   r"   rB   K_CUBIC_MAX_IDLE_TIMEr!   )r#   r>   elapsed_idles      r   on_packet_sentz%CubicCongestionControl.on_packet_sent   sS     1 11==C''$--700JJL 1r   packetsc                P    |D ]!  }| xj                   |j                  z  c_         # y r0   )r@   rA   )r#   rJ   r>   s      r   on_packets_expiredz)CubicCongestionControl.on_packets_expired   s(     	6F  F$5$55 	6r   c                <   d}|D ]-  }| xj                   |j                  z  c_         |j                  }/ || j                  kD  r|| _        | j                  A| j
                  | j                  k  r(t        | j
                  dt        z   z  dz        | _        n| j
                  | _        | j                   }t        t        |t        z        t        | j                  z        }|| _        t        | j                  t        | j                  z        | _        d| _        y y )Nr   r   r   T)r@   rA   rB   r   r'   r4   r*   K_CUBIC_LOSS_REDUCTION_FACTORmaxr
   r   r8   r:   )r#   r=   rJ   lost_largest_timer>   flight_sizenew_ssthreshs          r   on_packets_lostz&CubicCongestionControl.on_packets_lost   s    	1F  F$5$55  & 0 0	1 tCCC36D0 {{&4+A+ADKK+O!**a2O.OPSTT #44 ..KK"??@ 4#:#::L )DM%(/$2I2II&D"
 37D/5 Dr   r    c                    || _         | j                  0| j                  j                  ||      r| j                  | _        y y y )N)r    r=   )r    r8   r   is_rtt_increasingr4   )r#   r=   r    s      r   on_rtt_measurementz)CubicCongestionControl.on_rtt_measurement   sH    == T%6%6%H%H &I &
 !22DM&
 r   c                 T    t         |          }t        | j                        |d<   |S )Nz
cubic-wmax)r   get_log_datar*   r'   )r#   datar$   s     r   rX   z#CubicCongestionControl.get_log_data   s(    w#% -\r   )r   N)__name__
__module____qualname____doc__r*   r   r.   boolr2   r6   r!   floatr   rE   rI   r   rL   rS   rV   r   strr   rX   __classcell__)r$   s   @r   r   r      s    # $ >C >
-T -4D 4
-Me M^ M M^ 4 6Xn-E 6$ 6"7e "7h~6N "7SW "7H3 3U 3t 3d38n  r   r   cubicN)typingr   r   r   packet_builderr   baser	   r
   r   r   r   r(   rN   rG   r_   r   r   r   r   r   <module>rf      s[    & & +  	 #  " "% "w2 wt G%; <r   