
    i9Q                       d Z ddlmZ ddlZddlZddlZddlZddlmZ ddlm	Z	m
Z
 ddlmZmZ  ej        d          Zd	Zd
ZdZdZd<dZd<dZd=dZd>dZ	 d?d@d ZdAd"Z G d# d$ej                  Zddej        d%ddd&dBd2Z G d3 d4          Z G d5 d6          Z G d7 d8ej                   Z!	 dCdej        ddd9dDd;Z"dS )Ea(  
High-performance asyncio DatagramTransport with Linux-specific UDP
receive/send coalescing:

  - GRO (receive): ``setsockopt(SOL_UDP, UDP_GRO)`` + ``recvmsg`` cmsg
  - GSO (send):    ``sendmsg`` with ``UDP_SEGMENT`` cmsg

All other platforms fall back to the standard asyncio DatagramTransport.
    )annotationsN)deque)AnyCallable   )UDP_LINUX_GROUDP_LINUX_SEGMENTz=Hi  i   i @  @   socksocket.socketreturnboolc                x    	 |                      t          j        t                    dk    S # t          $ r Y dS w xY w)z<Check if GRO is enabled on *sock* (caller must have set it).   F)
getsockoptsocketSOL_UDPr   OSErrorr   s    Z/root/projects/butler/venv/lib/python3.11/site-packages/urllib3_future/contrib/ssa/_gro.py_sock_has_gror   "   sD    v~}==BB   uus   (+ 
99c                t    	 |                      t          j        t                     dS # t          $ r Y dS w xY w)z+Check if the kernel supports GSO on *sock*.TF)r   r   r   r	   r   r   s    r   _sock_has_gsor   *   sE    (9:::t   uus   %) 
77bufbytessegment_sizeintlist[bytes]c           	         |dk    st          |           |k    r| gS g }t          |           }t          dt          |           |          D ]/}|                    t	          ||||z                                 0|S )Nr   )len
memoryviewrangeappendr   )r   r   segmentsmvoffsets        r   _split_gro_bufferr'   3   s    qCHH44uH	CB3s88\22 C Cb&<*?!?@AABBBBO    	datagramslist[tuple[int, list[bytes]]]c                j   | sg S g }t          | d                   }| d         g}| dd         D ]l}t          |          |k    r.t          |          t          k     r|                    |           C|                    ||f           t          |          }|g}m|                    ||f           |S )zGroup consecutive same-size datagrams for Linux UDP GSO.

    GSO requires all segments to be the same size (except the last,
    which may be shorter).  Max 64 segments per ``sendmsg`` call.r   r   N)r    _GSO_MAX_SEGMENTSr#   )r)   groupscurrent_sizecurrent_groupdgrams        r   _group_by_segment_sizer1   =   s    
  	,.Fy|$$L"+A,M122 $ $u::%%#m*<*<?P*P*P  ''''MM<7888u::L"GMM
MM</000Mr(      bufsizegro_segment_sizebytes | list[bytes]c                ^   t          j        t          j                  }|                     ||          \  }}}}|sdS |}|D ]G\  }	}
}|	t           j        k    r1|
t          k    r&t                              |dd                   \  } nHt          |          |k    r|S t          ||          S )zEBlocking recvmsg with GRO cmsg parsing. Returns bytes or list[bytes].r(   N   )
r   
CMSG_SPACE_UINT16sizerecvmsgr   r   unpackr    r'   )r   r3   r4   
ancbufsizedataancdata_flagsaddrr   
cmsg_level	cmsg_type	cmsg_datas               r   sync_recv_grorE   R   s     "7<00J"&,,w
"C"CD'64 s#L,3  (
Iy''I,F,F%nnYrr];;O\E
4yyL  T<000r(   Nonec           	     <   t          |          D ]\  }}t          |          dk    r|                     |d                    4d                    |          }|                     |gt
          j        t          t          	                    |          fg           dS )z?Batch-send datagrams using GSO. Falls back to individual sends.r   r   r(   N)
r1   r    sendalljoinsendmsgr   r   r	   r9   pack)r   r)   r   groupr   s        r   sync_sendmsg_gsorM   j   s    5i@@ 
 
eu::??LLq"""hhuooEn/l1K1KLM	
 	
 	
 	

 
r(   c                       e Zd ZdZd/ fdZd0d1dZd2dZd3dZd3dZd4dZ	d0d5d!Z
d6d$Zd6d%Zd5d&Zd3d'Zd3d(Zd3d)Zd3d*Zd3d+Zd3d,Zd3d-Zd3d.Z xZS )7_OptimizedDatagramTransport)_loop_sock	_protocol_address_gro_enabled_gso_enabled_gro_segment_size_recv_buf_size_closing_closed_fut_extra_paused_write_ready_send_queue_buffer_size_protocol_pausedloopasyncio.AbstractEventLoopr   r   protocolasyncio.DatagramProtocoladdresstuple[str, int] | Nonegro_enabledr   gso_enabledr4   r   r   rF   c                   t                                                       || _        || _        || _        || _        || _        || _        || _        d| _	        |
                                | _        d| _        d| _        t          j                    | _        d| _        d| _        |rt&          n|| _        |||                                d| _        d S )NFTr   )peernamer   sockname)super__init__rP   rQ   rR   rS   rT   rU   rV   rX   create_futurerY   r[   r\   collectionsr   r]   r^   r_   _DEFAULT_GRO_BUFrW   getsocknamerZ   )	selfr`   r   rb   rd   rf   rg   r4   	__class__s	           r   rl   z$_OptimizedDatagramTransport.__init__   s     	

!''!1151C1C1E1E   	  %2=S..CS  ((**
 
r(   Nnamestrdefaultr   c                8    | j                             ||          S N)rZ   getrq   rs   ru   s      r   get_extra_infoz*_OptimizedDatagramTransport.get_extra_info   s    {tW---r(   c                    | j         S rw   )rX   rq   s    r   
is_closingz&_OptimizedDatagramTransport.is_closing   s
    }r(   c                    | j         rd S d| _         | j                            | j                                                   | j        s"| j                            | j        d            d S d S NT)rX   rP   remove_readerrQ   filenor]   	call_soon_call_connection_lostr|   s    r   closez!_OptimizedDatagramTransport.close   su    = 	F
  !2!2!4!4555 	CJ  !;TBBBBB	C 	Cr(   c                >    d| _         |                     d            d S r   )rX   r   r|   s    r   abortz!_OptimizedDatagramTransport.abort   s#    ""4(((((r(   excException | Nonec                d   	 | j                             | j                                                   | j                             | j                                                   n# t
          $ r Y nw xY w	 | j                            |           | j                                         | j	        
                                s| j	                            d            d S d S # | j                                         | j	        
                                s| j	                            d            w w xY wrw   )rP   r   rQ   r   remove_writer	ExceptionrR   connection_lostr   rY   done
set_resultrq   r   s     r   r   z1_OptimizedDatagramTransport._call_connection_lost   s/   	J$$TZ%6%6%8%8999J$$TZ%6%6%8%89999 	 	 	D		2N**3///J#((** 2 ++D111112 2 J#((** 2 ++D11112s   A"A% %
A21A26C   AD/r>   r   rA   c                   | j         rt          d          |p| j        }| j        s|                     ||           d S 	 || j                            ||           d S | j                            |           d S # t          $ rX d| _        | j	        
                    | j                                        | j                   |                     ||           Y d S t          $ r%}| j                            |           Y d }~d S d }~ww xY w)NTransport is closingF)rX   r   rS   r\   _queue_writerQ   sendtosendBlockingIOErrorrP   
add_writerr   _on_write_readyrR   error_received)rq   r>   rA   targetr   s        r   r   z"_OptimizedDatagramTransport.sendto   s9   = 	20111&  	dF+++F
	/!
!!$/////
%%%%% 	, 	, 	, %DJ!!$*"3"3"5"5t7KLLLdF++++++ 	/ 	/ 	/N))#.........	/s%    A; A; ;AD
	D
%DD
r)   r   c                    | j         rt          d          | j        s$| j        }|D ]}|                     ||           dS | j        r|                     |           dS |D ]}|                     |           dS )zSend multiple datagrams, using GSO when available.

        Falls back to individual ``sendto`` calls when GSO is not
        supported or the socket write buffer is full.r   N)rX   r   r\   rS   r   rU   _send_linux_gsor   )rq   r)   r   r0   s       r   sendto_manyz'_OptimizedDatagramTransport.sendto_many   s    
 = 	20111  	]F" 1 1!!%0000F 	#  +++++" # #E""""# #r(   c           	        t          |          D ]\  }}t          |          dk    r	 | j                            |d                    n# t          $ rd d| _        | j                            | j                                        | j	                   | 
                    |d         | j                   Y  d S t          $ r$}| j                            |           Y d }~nd }~ww xY wd                    |          }	 | j                            |gt"          j        t&          t(                              |          fg           8# t          $ rc d| _        | j                            | j                                        | j	                   |D ]}| 
                    || j                   Y  d S t          $ r%}| j                            |           Y d }~d }~ww xY wd S )Nr   r   Fr(   )r1   r    rQ   r   r   r\   rP   r   r   r   r   rS   r   rR   r   rI   rJ   r   r   r	   r9   rK   )rq   r)   r   rL   r   r   r0   s          r   r   z+_OptimizedDatagramTransport._send_linux_gso   s   #9)#D#D 	3 	3L%5zzQ7JOOE!H----&   (-D%J))$**;*;*=*=t?STTT%%eAh>>>FFF 7 7 7N11#666666667((5//C3
""En&7l9S9STU    #   $)!
%%dj&7&7&9&94;OPPP" < <E%%eT];;;; 3 3 3--c2222222237	3 	3s>    AA)C%8	C%C  C%?AEA(G"4	G"=GG"c                    | j                             ||f           | xj        t          |          z  c_        |                                  d S rw   )r]   r#   r^   r    _maybe_pause_protocolrq   r>   rA   s      r   r   z(_OptimizedDatagramTransport._queue_write  sO    t---SYY&""$$$$$r(   c                    | j         t          k    r;| j        s6d| _        	 | j                                         d S # t
          $ r Y d S w xY wd S d S r   )r^   _HIGH_WATERMARKr_   rR   pause_writingAttributeErrorr|   s    r   r   z1_OptimizedDatagramTransport._maybe_pause_protocol  so    //8M/$(D!,,.....!   	 0///   ; 
A	A	c                    | j         rD| j        t          k    r6d| _         	 | j                                         d S # t
          $ r Y d S w xY wd S d S NF)r_   r^   _LOW_WATERMARKrR   resume_writingr   r|   s    r   _maybe_resume_protocolz2_OptimizedDatagramTransport._maybe_resume_protocol&  ss      	T%6.%H%H$)D!--/////!   		 	%H%Hr   c                p   | j         r| j         d         \  }}	 || j                            ||           n| j                            |           n=# t          $ r Y d S t
          $ r$}| j                            |           Y d }~nd }~ww xY w| j                                          | xj	        t          |          z  c_	        | j         |                                  d| _        | j                            | j                                                   | j        r|                     d            d S d S )Nr   T)r]   rQ   r   r   r   r   rR   r   popleftr^   r    r   r\   rP   r   r   rX   r   )rq   r>   rA   r   s       r   r   z+_OptimizedDatagramTransport._on_write_ready.  sb    	+)!,JD$3#J%%dD1111JOOD)))"    3 3 3--c222222223 $$&&&T*  	+ 	##%%% 
  !2!2!4!4555= 	-&&t,,,,,	- 	-s   8A 
B	B(BBc                    | j         s:d| _         | j                            | j                                                   d S d S r   )r[   rP   r   rQ   r   r|   s    r   pause_readingz)_OptimizedDatagramTransport.pause_readingE  sG    | 	:DLJ$$TZ%6%6%8%899999	: 	:r(   c                    | j         r@d| _         | j                            | j                                        | j                   d S d S r   )r[   rP   
add_readerrQ   r   _on_readabler|   s    r   resume_readingz*_OptimizedDatagramTransport.resume_readingJ  sO    < 	J DLJ!!$*"3"3"5"5t7HIIIII	J 	Jr(   c                    | j                             | j        j        |            | j                             | j                                        | j                   d S rw   )rP   r   rR   connection_mader   rQ   r   r   r|   s    r   _startz"_OptimizedDatagramTransport._startO  sN    
T^;TBBB
dj//1143DEEEEEr(   c                @    | j         rd S |                                  d S rw   )rX   _recv_linux_gror|   s    r   r   z(_OptimizedDatagramTransport._on_readableS  s)    = 	Fr(   c                l   t          j        t          j                  }	 	 | j                            | j        |          \  }}}}n># t          $ r Y d S t          $ r%}| j	        
                    |           Y d }~d S d }~ww xY w|sd S | j        }|D ]G\  }}	}
|t           j        k    r1|	t          k    r&t                              |
d d                   \  } nHt          |          |k    r| j	                            ||           n+t#          ||          }| j	                            ||           )NTr7   )r   r8   r9   r:   rQ   r;   rW   r   r   rR   r   rV   r   r   r<   r    datagram_receivedr'   datagrams_received)rq   r=   r>   r?   r@   rA   r   r   rB   rC   rD   r$   s               r   r   z+_OptimizedDatagramTransport._recv_linux_groX  sd   &w|44
	B.2j.@.@'/ /+gvtt #      --c222  1L4;  0
Iy//I4N4N&-nnYrr]&C&CO\E4yyL((00t<<<<,T<@@11(DAAA1	Bs   %A 
B	BA==B)r`   ra   r   r   rb   rc   rd   re   rf   r   rg   r   r4   r   r   rF   rw   rs   rt   ru   r   r   r   )r   r   r   rF   )r   r   r   rF   )r>   r   rA   re   r   rF   )r)   r   r   rF   )__name__
__module____qualname__	__slots__rl   rz   r}   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)rr   s   @r   rO   rO   w   s       I&$
 $
 $
 $
 $
 $
L. . . . .   C C C C) ) ) )2 2 2 2/ / / / /*# # # #(3 3 3 3>% % % %
      - - - -.: : : :
J J J J
F F F F   
B B B B B B B Br(   rO   F)
local_addrremote_addrfamily
reuse_portr4   r   r`   ra   protocol_factory&Callable[[], asyncio.DatagramProtocol]r   re   r   r   r   socket.socket | None:tuple[asyncio.DatagramTransport, asyncio.DatagramProtocol]c          	     R  K   |*	 |                                 }n# t          $ r d }Y nw xY w|t          j        k    rU|p|}	|	rC|                     |	d         |	d         t          j                   d {V }
|
d         d         }nt          j        }t          j        |t          j                  }|                    d           |r+|                    t          j	        t          j
        d           |r|                    |           d }|r|                     ||           d {V  |}t          |          }t          |          }|s"|s |                     fd|           d {V S              }t!          | ||||||          }|                                 ||fS )Nr   r   )typeFc                                   S rw    )r   s   r   <lambda>z%create_udp_endpoint.<locals>.<lambda>  s    $$&& r(   r   )r`   r   rb   rd   rf   rg   r4   )getpeernamer   r   	AF_UNSPECgetaddrinfo
SOCK_DGRAMAF_INETsetblocking
setsockopt
SOL_SOCKETSO_REUSEPORTbindsock_connectr   r   create_datagram_endpointrO   r   )r`   r   r   r   r   r   r4   r   connected_addrtarget_addrinfosrf   rg   rb   	transports    `             r   create_udp_endpointr   u  s>      	"!--//NN 	" 	" 	"!NNN	" V%%%$3K ("..NKN9J /         q! }VV%677 	GOOF-v/BAFFF 	"IIj!!! 	)##D+666666666(N  %%K%%K 
{ 
22&&&&T 3 
 
 
 
 
 
 
 
 	

  !!H+)  I hs    --c                  L    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ddZ
dS )DatagramReaderu  API-compatible with ``asyncio.StreamReader`` (duck-typed) so that
    ``AsyncSocket`` can assign an instance to ``self._reader`` and the
    existing ``recv()`` code works unchanged.

    When GRO delivers multiple coalesced segments in a single syscall,
    ``feed_datagrams()`` stores them as a single ``list[bytes]`` entry.
    ``read()`` then returns that list directly so the caller can feed
    all segments to the QUIC state-machine in one pass before probing —
    avoiding the per-datagram recv→feed→probe round-trip overhead.r   rF   c                `    t          j                    | _        d | _        d | _        d| _        d S r   )rn   r   _buffer_waiter
_exception_eofr|   s    r   rl   zDatagramReader.__init__  s+    3>3D3F3F4804			r(   r>   r   rA   r   c                b    | j                             |           |                                  dS )z'Feed a single (non-coalesced) datagram.Nr   r#   _wake_waiterr   s      r   feed_datagramzDatagramReader.feed_datagram  0    D!!!r(   r   c                b    | j                             |           |                                  dS )z6Feed a batch of coalesced datagrams as a single entry.Nr   r   s      r   feed_datagramszDatagramReader.feed_datagrams  r   r(   r   BaseExceptionc                <    || _         |                                  d S rw   )r   r   r   s     r   set_exceptionzDatagramReader.set_exception  s!    r(   BaseException | Nonec                N    d| _         ||| _        |                                  d S r   )r   r   r   r   s     r   r   zDatagramReader.connection_lost  s-    	?!DOr(   c                r    | j         }|+|                                s|                    d            d S d S d S rw   )r   r   r   rq   waiters     r   r   zDatagramReader._wake_waiter  sD    fkkmmd##### r(   nr   r5   c                l  K   | j         r| j                                         S | j        | j        | j        rdS t	          j                                                    | _        	 | j         d{V  d| _        n# d| _        w xY w| j         r| j                                         S | j        | j        dS )u   Return the next entry from the buffer.

        * ``bytes``        — a single datagram (non-coalesced).
        * ``list[bytes]``  — a batch of coalesced datagrams from one
          GRO syscall.
        * ``b""``          — EOF.
        Nr(   )r   r   r   r   asyncioget_running_looprm   r   )rq   r   s     r   readzDatagramReader.read  s       < 	*<'')))?&/!9 	3/11??AA	 ,DLL4DL< 	*<'')))?&/!ss   %A: :	BNr   )r>   r   rA   r   r   rF   )r>   r   rA   r   r   rF   )r   r   r   rF   r   r   r   rF   )r   )r   r   r   r5   )r   r   r   __doc__rl   r   r   r   r   r   r   r   r(   r   r   r     s        J J      
   
      $ $ $ $
      r(   r   c                  l    e Zd ZdZddZedd            Zdd
ZddZddZ	ddZ
dddZddZddZdS )DatagramWriterzAPI-compatible with ``asyncio.StreamWriter`` (duck-typed) so that
    ``AsyncSocket`` can assign an instance to ``self._writer`` and the
    existing ``sendall()``, ``close()``, ``wait_for_close()`` code works
    unchanged.r   asyncio.DatagramTransportr   rF   c                    || _         |                    d          | _        t          j                    | _        d| _        d | _        d S )Nri   F)
_transportrz   rS   r   Event_closed_eventr[   _drain_waiterrq   r   s     r   rl   zDatagramWriter.__init__  sC     $090H0H0T0T$]__:>r(   c                    | j         S rw   )r  r|   s    r   r   zDatagramWriter.transport  s
    r(   r>   ,bytes | bytearray | memoryview | list[bytes]c                p   | j                                         rd S t          |t                    rXt	          | j         d          r| j                             |           d S |D ]"}| j                             || j                   #d S | j                             t          |          | j                   d S )Nr   )	r  r}   
isinstancelisthasattrr   r   rS   r   )rq   r>   r0   s      r   writezDatagramWriter.write  s    ?%%'' 	FdD!! 	?t66 A++D11111 " A AEO**5$-@@@@A A O""5;;>>>>>r(   c                   K   | j         sd S t          j                                                    | _        	 | j         d {V  d | _        d S # d | _        w xY wrw   )r[   r   r   rm   r  r|   s    r   drainzDatagramWriter.drain(  st      | 	F$577EEGG	&$$$$$$$$!%DD%%%%s   A 	Ac                8    | j                                          d S rw   )r  r   r|   s    r   r   zDatagramWriter.close1  s    r(   c                H   K   | j                                          d {V  d S rw   )r  waitr|   s    r   wait_closedzDatagramWriter.wait_closed4  s3       %%'''''''''''r(   Nrs   rt   ru   r   c                8    | j                             ||          S rw   )r  rz   ry   s      r   rz   zDatagramWriter.get_extra_info7  s    --dG<<<r(   c                    d| _         d S r   )r[   r|   s    r   _pause_writingzDatagramWriter._pause_writing:  s    r(   c                    d| _         | j        }|+|                                s|                    d            d S d S d S r   )r[   r  r   r   r   s     r   _resume_writingzDatagramWriter._resume_writing=  sL    #fkkmmd##### r(   )r   r   r   rF   )r   r   )r>   r  r   rF   r   rw   r   )r   r   r   r   rl   propertyr   r  r  r   r  rz   r  r  r   r(   r   r   r     s         
? ? ? ?    X? ? ? ?& & & &       ( ( ( (= = = = =   $ $ $ $ $ $r(   r   c                  R    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dZ
ddZdS ) _DatagramBridgeProtocolz^Bridges ``asyncio.DatagramProtocol`` callbacks to
    ``DatagramReader`` / ``DatagramWriter``.readerr   r   rF   c                "    || _         d | _        d S rw   )_reader_writer)rq   r  s     r   rl   z _DatagramBridgeProtocol.__init__H  s    .2r(   r   asyncio.BaseTransportc                    d S rw   r   r  s     r   r   z'_DatagramBridgeProtocol.connection_madeL  s    r(   r>   r   rA   tuple[str, int]c                <    | j                             ||           d S rw   )r  r   r   s      r   r   z)_DatagramBridgeProtocol.datagram_receivedO  s     ""4.....r(   r   c                <    | j                             ||           d S rw   )r  r   r   s      r   r   z*_DatagramBridgeProtocol.datagrams_receivedR  s     ##D$/////r(   r   r   c                :    | j                             |           d S rw   )r  r   r   s     r   r   z&_DatagramBridgeProtocol.error_receivedU  s    ""3'''''r(   r   c                    | j                             |           | j         | j        j                                         d S d S rw   )r  r   r  r  setr   s     r   r   z'_DatagramBridgeProtocol.connection_lostX  sE    $$S)))<#L&**,,,,, $#r(   c                J    | j         | j                                          d S d S rw   )r  r  r|   s    r   r   z%_DatagramBridgeProtocol.pause_writing]  s,    <#L''))))) $#r(   c                J    | j         | j                                          d S d S rw   )r  r  r|   s    r   r   z&_DatagramBridgeProtocol.resume_writinga  s,    <#L((***** $#r(   N)r  r   r   rF   )r   r   r   rF   )r>   r   rA   r"  r   rF   )r>   r   rA   r"  r   rF   )r   r   r   rF   r   r   )r   r   r   r   rl   r   r   r   r   r   r   r   r   r(   r   r  r  D  s        0 03 3 3 3   / / / /0 0 0 0( ( ( (- - - -
* * * *+ + + + + +r(   r  )r   r   r   r4   %tuple[DatagramReader, DatagramWriter]c          	        
K   t          j                    }t                      }t          |          
t	          |
fd|| |||           d {V \  }}t          |          }	|	
_        ||	fS )Nc                      S rw   r   )rb   s   r   r   z'open_dgram_connection.<locals>.<lambda>u  s     r(   )r   r   r   r4   r   )r   r   r   r  r   r   r  )r   r   r   r   r4   r`   r  r   _writerrb   s             @r   open_dgram_connectionr/  f  s       #%%DF&v..H,)        LIq I&&FH6>r(   )r   r   r   r   )r   r   r   r   r   r   )r)   r   r   r*   )r2   )r   r   r3   r   r4   r   r   r5   )r   r   r)   r   r   rF   )r`   ra   r   r   r   re   r   re   r   r   r   r   r4   r   r   r   r   r   rw   )r   re   r   re   r   r   r   r   r4   r   r   r*  )#r   
__future__r   r   rn   r   structr   typingr   r   	_constantr   r	   Structr9   ro   r   r   r,   r   r   r'   r1   rE   rM   DatagramTransportrO   r   r   r   r   DatagramProtocolr  r/  r   r(   r   <module>r7     s    # " " " " "                              9 9 9 9 9 9 9 9
&-

                , @D1 1 1 1 10

 

 

 

{B {B {B {B {B'"; {B {B {BD *.*." !%E E E E E EPG G G G G G G GT:$ :$ :$ :$ :$ :$ :$ :$z+ + + + +g6 + + +F +/ *."!%        r(   