
    F2jX              	         U 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ZddlZddl	m
Z
 ddlmZ dZded	<   d
Zded<    ej        d          Zded<    ej        d          Zded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   dZded<   ej        dk    Zded<   ej        d k    Zded!<   ej        Zded"<    e ed#d          Z!ded$<    e ed%d          Z"ded&<    e#ed'          r ej$        ej%                  ndZ&ded(<    e'd)  e ed*d           e ed+d          fD                       Z(ded,<   d-Z)ded.<   dQd3Z*dRd6Z+dRd7Z,dSd;Z-dTdAZ.dUdCZ/dVdFZ0 G dG dHej1                  Z2	 dWdXdPZ3dS )Yz:
Custom asyncio DatagramTransport with optimized UDP I/O.
    )annotationsN)deque   )UdpSocketStateh   ztyping.FinalUDP_GROg   UDP_SEGMENTz=H_UINT16z@i	_GRO_CMSGi  _DEFAULT_GRO_BUFi   _MAX_GRO_BUF   _HIGH_WATERMARKi @  _LOW_WATERMARK@   _GSO_MAX_SEGMENTSi  _GSO_MAX_PAYLOAD    _RECV_BURST_LIMITlinux	_IS_LINUXwin32_IS_UNIX_SOL_UDP	MSG_TRUNC
_MSG_TRUNC
MSG_CTRUNC_MSG_CTRUNC
CMSG_SPACE_ANCBUFSIZEc              #     K   | ]}||V  	d S N ).0es     ^/home/thesage/.hermes/hermes-agent/venv/lib/python3.11/site-packages/qh3/asyncio/_transport.py	<genexpr>r(   7   s4       . .	 	} 
 }}}. .    EMSGSIZEWSAEMSGSIZE_MSG_TOO_BIG_ERRNOSi8'  _WSAEMSGSIZE_WINERRORexcOSErrorreturnboolc                V    | j         t          v rdS t          | dd          t          k    S )z@Return True when *exc* means the datagram exceeded the path MTU.TwinerrorN)errnor,   getattrr-   )r.   s    r'   _is_msg_too_bigr6   E   s-    
y'''t3
D))-BBBr)   socksocket.socketc                    t           sdS 	 |                     t          t          d           |                     t          t                    dk    S # t
          $ r Y dS w xY w)z?Enable UDP GRO on *sock*. Returns True on success (Linux only).F   )r   
setsockoptr   r   
getsockoptr/   r7   s    r'   
enable_gror>   L   se     u'1---x11Q66   uus   AA 
AAc                    t           sdS 	 |                     t          t          d           t	          |                     t          t                              S # t          $ r Y dS w xY w)zFReturn True if the kernel supports UDP_SEGMENT on *sock* (Linux only).F   )r   r;   r   r
   r1   r<   r/   r=   s    r'   has_gsorA   W   sh     u+t444DOOHk::;;;   uus   AA 
A'&A'ancdatalist[tuple[int, int, bytes]]
int | Nonec                h   | D ]\  }}}|t           k    r|t          k    rt          |          }|t          j        k    r0t          t                              |d          d                   c S |t          j        k    r0t          t                              |d          d                   c S  dS d S Nr   )r   r   lenr   sizeintunpack_fromr   )rB   
cmsg_level	cmsg_type	cmsg_datans        r'   _parse_gro_segment_sizerO   b   s    ,3  (
Iy!!i7&:&:IAIN""900A>>qABBBBBGL  7..y!<<Q?@@@@@114r)   bufbytessegment_sizerI   list[bytes]c                ~     t                     }dk    s|k    r gS  fdt          d|          D             S )Nr   c                *    g | ]}||z            S r$   r$   )r%   irP   rR   s     r'   
<listcomp>z%_split_gro_buffer.<locals>.<listcomp>r   s(    III!CA$$%IIIr)   )rG   range)rP   rR   rN   s   `` r'   _split_gro_bufferrY   n   sT    CAqA--uIIIIIuQ</H/HIIIIr)   rH   c                h    | dk    rt           S t          | z  }|dk     rdS |t           k     r|nt           S Nr   r:   )r   r   )rH   caps     r'   _max_segments_forr]   u   s?    qyy  
d
"C
Qwwq)))33/@@r)   	datagramslist[tuple[int, list[bytes]]]c                   | sg S g }| d         }t          |          }|g}t          |          }| dd          D ]}t          |          }||k    r)t          |          |k     r|                    |           @||k     rDt          |          |k     r1|                    |           |                    ||f           g }d}|r|                    ||f           |}|g}t          |          }|r|                    ||f           |S r[   )rG   r]   append)r^   groupsfirstcurrent_sizecurrent_groupr\   dgramrH   s           r'   _group_for_gsorg   ~   sF     	,.FaLEu::L"'M
L
)
)C122 2 25zz<C$6$6$<$<  ''''L  S%7%7#%=%=  '''MM<7888MLL =|];<<<L"GM#L11CC 5|]3444Mr)   c                       e Zd ZdZdZd= fdZd>d?dZd@dZdAdZdBdZ	dCdZ
dDdZdDdZdEd"ZdDd#ZdDd$ZdDd%ZdDd&ZdDd'ZdDd(ZdFd,Zd>dFd-Zd>dGd0ZdGd1ZdFd2ZdDd3ZdDd4Zd>dHd7ZdDd8ZdId:ZdDd;ZdDd<Z xZ S )JOptimizedDatagramTransportzDatagramTransport that uses recvmmsg/sendmsg for GRO/GSO on Linux.

    When quinn-udp Rust is available, uses it for batched recvmmsg and
    GSO sendmsg. Falls back to Python recvmsg/sendmsg otherwise.
    )_loop_sock_sock_fd	_protocol_address_gro_enabled_gso_enabled_gro_segment_size_recv_buf_size_closing_closed_paused_extra_send_queue_buffer_size_protocol_paused_writer_registered_reader_registered_protocol_supports_batch
_udp_stateloopasyncio.AbstractEventLoopr7   r8   protocolasyncio.DatagramProtocoladdresstuple[str, int] | Nonegro_enabledr1   gso_enabledgro_segment_sizerI   r0   Nonec                   t                                                       || _        || _        |                                | _        || _        || _        || _        || _	        || _
        d| _        d| _        d| _        d| _        d| _        t!                      | _        d| _        d| _        t)          |d          | _        |rt,          nt/          |d          | _        d | _        	 t5          | j                  | _        n# t6          $ r Y nw xY w	 |                                }n# t:          $ r d }Y nw xY w||||j        |j        d| _         d S )NFr   datagrams_receivedi  )peernamesocketsocknamefamilytype)!super__init__rj   rk   filenorl   rm   rn   ro   rp   rq   rs   rt   ru   rz   r{   r   rw   rx   ry   hasattrr|   r   maxrr   r}   _UdpSocketState	Exceptiongetsocknamer/   r   r   rv   )
selfr~   r7   r   r   r   r   r   r   	__class__s
            r'   r   z#OptimizedDatagramTransport.__init__   sy    	

!''!1"'"'<AGG %(/:N(O(O% !,L5Et1L1L 	 '+	-dm<<DOO 	 	 	D		''))HH 	 	 	HHH	   kI
 
s$   +D 
DDD+ +D:9D:Nnamestrdefault
typing.Anyc                8    | j                             ||          S r#   )rv   get)r   r   r   s      r'   get_extra_infoz)OptimizedDatagramTransport.get_extra_info   s    {tW---r)   c                    | j         S r#   )rs   r   s    r'   
is_closingz%OptimizedDatagramTransport.is_closing   s
    }r)   asyncio.BaseProtocolc                    | j         S r#   )rm   r   s    r'   get_protocolz'OptimizedDatagramTransport.get_protocol   s
    ~r)   c                >    || _         t          |d          | _        d S )Nr   )rm   r   r|   )r   r   s     r'   set_protocolz'OptimizedDatagramTransport.set_protocol   s"    !(/:N(O(O%%%r)   c                    | j         S r#   )rx   r   s    r'   get_write_buffer_sizez0OptimizedDatagramTransport.get_write_buffer_size   s      r)   c                    | j         rd S d| _         |                                  | j        s"| j                            | j        d            d S d S NT)rs   _unregister_readerrw   rj   	call_soon_call_connection_lostr   s    r'   closez OptimizedDatagramTransport.close  sc    = 	F!!! 	CJ  !;TBBBBB	C 	Cr)   c                    | j         rd S d| _         | j                                         d| _        | j                            | j        d            d S )NTr   )rs   rw   clearrx   rj   r   r   r   s    r'   abortz OptimizedDatagramTransport.abort  sV    = 	F   
T7>>>>>r)   r.   Exception | Nonec                   | j         rd S d| _         |                                  |                                  	 | j                            |           n!# t
          t          f$ r  t          $ r Y nw xY wd | _        	 | j	        
                                 d S # t          $ r Y d S w xY w# d | _        	 | j	        
                                 w # t          $ r Y w w xY wxY wr   )rt   r   _unregister_writerrm   connection_lostKeyboardInterrupt
SystemExitBaseExceptionr}   rk   r   r/   )r   r.   s     r'   r   z0OptimizedDatagramTransport._call_connection_lost  s'   < 	F!!!!!!	N**3////!:. 	 	 	 	 	 	D	 #DO
  """""    #DO
  """"   s_   A B* A30B* 2A33B* >B 
B'&B'*C3CC
CCCCc                    | j         s| j        rd S 	 | j                            | j        | j                   d| _         d S # t          t          f$ r Y d S w xY wr   )r{   rt   rj   
add_readerrl   _on_readabler/   
ValueErrorr   s    r'   _register_readerz+OptimizedDatagramTransport._register_reader&  sr    " 	dl 	F	J!!$-1BCCC&*D###$ 	 	 	DD	   ,A   AAc                    | j         sd S d| _         	 | j                            | j                   d S # t          t
          f$ r Y d S w xY wNF)r{   rj   remove_readerrl   r/   r   r   s    r'   r   z-OptimizedDatagramTransport._unregister_reader/  d    & 	F"'	J$$T]33333$ 	 	 	DD	   3 AAc                    | j         s| j        rd S 	 | j                            | j        | j                   d| _         d S # t          t          f$ r Y d S w xY wr   )rz   rt   rj   
add_writerrl   _on_write_readyr/   r   r   s    r'   _register_writerz+OptimizedDatagramTransport._register_writer8  sr    " 	dl 	F	J!!$-1EFFF&*D###$ 	 	 	DD	r   c                    | j         sd S d| _         	 | j                            | j                   d S # t          t
          f$ r Y d S w xY wr   )rz   rj   remove_writerrl   r/   r   r   s    r'   r   z-OptimizedDatagramTransport._unregister_writerA  r   r   c                N    | j         sd| _         |                                  d S d S r   )ru   r   r   s    r'   pause_readingz(OptimizedDatagramTransport.pause_readingJ  s5    | 	&DL##%%%%%	& 	&r)   c                N    | j         rd| _         |                                  d S d S r   )ru   r   r   s    r'   resume_readingz)OptimizedDatagramTransport.resume_readingO  s5    < 	$ DL!!#####	$ 	$r)   datarQ   addrc                   	 || j                             ||           d S | j        "| j                             || j                   d S | j                             |           d S # t          $ r}t          |          s Y d }~d S d }~ww xY wr#   )rk   sendtorn   sendr/   r6   )r   r   r   r&   s       r'   	_raw_sendz$OptimizedDatagramTransport._raw_sendT  s    		
!!$-----*
!!$66666
%%%%% 	 	 	"1%%      	s"   A& 'A& 
A& &
B0BBc                T   | j         rd S | j        r|                     ||           d S 	 |                     ||           d S # t          $ r. |                                  |                     ||           Y d S t          $ r%}| j                            |           Y d }~d S d }~ww xY wr#   )	rs   rw   _queue_writer   BlockingIOErrorr   r/   rm   error_received)r   r   r   r.   s       r'   r   z!OptimizedDatagramTransport.sendto`  s    = 	F 	dD)))F	/NN4&&&&& 	* 	* 	*!!###dD)))))) 	/ 	/ 	/N))#.........	/s   A 4B'9	B'B""B'r^   rS   c                <   | j         s|sdS | j        r|D ]}|                     ||           dS | j        }|||n| j        }|	 |                    |t          |d                   t          |d                              dS # t          $ r3 | 	                                 |D ]}|                     ||           Y dS t          $ r Y nw xY w| j        r|                     ||           dS |D ])}|                     ||           | j         s| j        r dS *dS )z2Send multiple datagrams, using GSO when available.Nr   r:   )rs   rw   r   r}   rn   r   r   rI   r   r   r/   rp   _send_gso_pythonr   rt   )r   r^   r   rf   statetargets         r'   sendto_manyz&OptimizedDatagramTransport.sendto_manyp  s   = 		 	F 	" / /!!%....F !-TT4=F!
JJy#fQi..#fQi..IIIF&   ))+++!* 7 7))%6666FF   D  	!!)T22222"  E4(((= DL FF s   =B 9C	CCc           
     D   t          |          }| j        }||n| j        }t          |          D ]m\  }\  }}	 t	          |          dk    r|                     |d         |           n}|?|                    |t          t          t          
                    |          fgd|           n<|                    |t          t          t          
                    |          fg           # t          $ rD |                                  ||d         D ] \  }	}
|
D ]}|                     ||           !Y  dS t          $ r]}t	          |          dk    r|D ]
}	 |                     ||           # t          $ r |                                  |                     ||           |                    |          dz   }||d         D ]}|                     ||           ||dz   d         D ] \  }	}
|
D ]}|                     ||           !Y  Y d}~ dS t          $ r?}| j                            |           | j        s| j        rY d}~ Y d}~ dS Y d}~d}~ww xY wn/| j                            |           | j        s| j        rY d}~ dS Y d}~gd}~ww xY wdS )z/Python fallback: sendmsg with UDP_SEGMENT cmsg.Nr:   r   )rg   rk   rn   	enumeraterG   r   sendmsgr   r
   r   packr   r   r   r/   indexrm   r   rs   rt   )r   r^   r   rb   r7   r   rV   rR   group_szgrf   r.   idxtaildinners                    r'   r   z+OptimizedDatagramTransport._send_gso_python  se   	**z)t}(1&(9(9 -	 -	$A$e,u::??NN58T2222)!&W\\,5O5OPQ"	    !&W\\,5O5OPQ   #   %%'''$QRRj 7 7FC!" 7 7))%66667   u::>>!& ' '' NN5$7777. 	# 	# 	# 11333 --eT:::"'++e"4"4q"8C(-cdd > > $ 1 1$ = = = =*0Q/ ? ?Q)* !? !?A$($5$5a$>$>$>$>!?"FFFFFFFF& ' ' ' N99%@@@#} ' ' &' ' ' ' '''$ N11#666}  -/-	 -	s\   B-C))A	J6
J JE10J1BI	J	I	 (I	JJI	,JJc                4   | j                             ||f           | xj        t          |          z  c_        | j        t          k    rL| j        sGd| _        	 | j                                         d S # t          t          f$ r  t          $ r Y d S w xY wd S d S r   )rw   ra   rx   rG   r   ry   rm   pause_writingr   r   r   )r   r   r   s      r'   r   z'OptimizedDatagramTransport._queue_write  s    t---SYY&//8M/$(D!,,.....%z2        0///s   A4 4BBc                   | j         }| j        }|r$|d         \  }}	  |||           n# t          $ r Y d S t          $ r Y 4t          $ r}|                                 | xj        t          |          z  c_        |                                  	 | j	        
                    |           n!# t          t          f$ r  t          $ r Y nw xY w| j        s| j        rY d }~nUY d }~d }~ww xY w|                                 | xj        t          |          z  c_        |                                  |$|sD|                                  | j        r+| j        s&| j                            | j        d            d S d S d S d S rF   )rw   r   r   InterruptedErrorr/   popleftrx   rG   _maybe_resume_protocolrm   r   r   r   r   rs   rt   r   rj   r   r   )r   queueraw_sendr   r   r.   s         r'   r   z*OptimizedDatagramTransport._on_write_ready  s    > 	*qJD$t$$$$"   #      !!SYY.!!++---N11#6666):6   $   D= DL EEEE MMOOOT*'')))1  	*4  	G##%%%} GT\ G
$$T%?FFFFF	G 	GG G G GsE   + 
C+	C+	C+AC&B-,C&-CC&
CC&&C+c                    | j         rU| j        t          k    rGd| _         	 | j                                         d S # t
          t          f$ r  t          $ r Y d S w xY wd S d S r   )ry   rx   r   rm   resume_writingr   r   r   r   s    r'   r   z1OptimizedDatagramTransport._maybe_resume_protocol  s      	T%6.%H%H$)D!--/////%z2       	 	%H%Hs   ; AAwaiterasyncio.Future[None] | Nonec                    | j                             | j        j        |            | j                             | j                   |"| j                             |j        d            d S d S r#   )rj   r   rm   connection_mader   
set_result)r   r   s     r'   _startz!OptimizedDatagramTransport._start  sg    
T^;TBBB
T2333J  !2D99999 r)   c                    | j         rd S | j        }||                     |           d S | j        r|                                  d S |                                  d S r#   )rs   r}   
_recv_rustro   _recv_gro_python_recv_plain)r   r   s     r'   r   z'OptimizedDatagramTransport._on_readable  sq    = 	FOOE""""" 	!!#####r)   r   c                0   | j         }| j        r|j        nd}|j        }d}|gg }d}t	          t
                    D ]=}	  |            \  }	}
n# t          $ r Y  n"w xY w|	s n|                    |	           |
}>d}|r |||           nW|j        }t	          t
                    D ]9}	  |            \  }	}n# t          $ r Y  dS w xY w|	s dS |	D ]} |||           :d}|r/| j	        s*| j
        r%| j                            | j                   dS dS dS dS )z!Batch-receive via quinn-udp Rust.NFT)rm   r|   r   recvrX   r   r/   extenddatagram_receivedrs   r{   rj   r   r   )r   r   r   batch_cb_recv	hit_limitall_segmentsr   _segmentsar  segs                r'   r   z%OptimizedDatagramTransport._recv_rust  s   > ,H'' 	
 
	(*L#D,-- 
! 
!"'%''KHaa   EE E##H--- 	 -t,,, ( :,-- 
! 
!%*UWWNHdd   FFF FF# 1 1C%%c400001 !	  	4T] 	4t/F 	4J  !233333	4 	4 	4 	4 	4 	4s#   A
AA(B66
CCc                F   | j         }| j        }t          t                    D ]}}	 |                    d          \  }}nF# t
          $ r Y  d S t          $ r Y 5t          $ r!}|                    |           Y d }~ d S d }~ww xY w|s d S |	                    ||           ~d S )Nr   )
rk   rm   rX   r   recvfromr   r   r/   r   r  )r   r7   r   r  r   r   r.   s          r'   r   z&OptimizedDatagramTransport._recv_plainC  s    z>()) 	3 	3A!]]511
dd"   #      '',,,  &&tT2222	3 	3s!   ?
B	B	B!A==Bc                   | j         j        }| j        }|j        }| j        r|j        nd}| j        }t          }t          t                    D ]T}	  || j
        |          \  }}	}
}ni# t          $ r Y  dS t          $ r Y 4t          $ rD}	 |                    |           n!# t          t           f$ r  t"          $ r Y nw xY wY d}~ dS d}~ww xY w|s dS |
t$          z  r0| j
        }|t&          k     rt)          |dz  t&                    | _
        |
t*          z  r |||           t-          |	          }| |||           |dk    r|n|}t/          |          |k    r |||           #t1          ||          }| |||           C|D ]} |||           V| j        s(| j        r#| j                            | j                   dS dS dS )z/Python fallback: recvmsg with GRO cmsg parsing.Nr   r   )rk   recvmsgrm   r  r|   r   rq   r!   rX   r   rr   r   r   r/   r   r   r   r   r   r   minr   rO   rG   rY   rs   r{   rj   r   r   )r   sock_recvmsgr   r  r  default_segment_size
ancbufsizer  r   rB   flagsr   r.   bufsizeparsedrR   r  r	  s                     r'   r   z+OptimizedDatagramTransport._recv_gro_pythonT  s   z)>$6 ,H'' 	
  $5 
()) .	1 .	1A-9\'. .*gudd #   #      ++C0000):6   $   D  z! -\))*-gk<*H*HD'{" !!$---,W55F~!!$---%+aZZ665IL4yyL((!!$---(|<<H#4((((# 1 1C%%c400001 } 	4!8 	4J  !233333	4 	4 	4 	4sB   A((
C6	C	CB! C	!B?<C	>B??C		C)r~   r   r7   r8   r   r   r   r   r   r1   r   r1   r   rI   r0   r   r#   )r   r   r   r   r0   r   )r0   r1   )r0   r   )r   r   r0   r   )r0   rI   )r0   r   )r.   r   r0   r   )r   rQ   r   r   r0   r   )r^   rS   r   r   r0   r   )r   r   r0   r   )r   r   r0   r   )!__name__
__module____qualname____doc__	__slots__r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r   s   @r'   ri   ri      s{        I.5
 5
 5
 5
 5
 5
n. . . . .      P P P P! ! ! !C C C C? ? ? ?   &            & & & &
$ $ $ $

 
 
 
/ / / / / " " " " "H3 3 3 3j
 
 
 
!G !G !G !GF   : : : : :
 
 
 
-4 -4 -4 -4^3 3 3 3">4 >4 >4 >4 >4 >4 >4 >4r)   ri   r@   r~   r   protocol_factory-typing.Callable[[], asyncio.DatagramProtocol]r   :tuple[asyncio.DatagramTransport, asyncio.DatagramProtocol]c           	     ^  K   t          |          }t          |          }t          s|                     ||           d{V S |                    d            |            }t          | ||d|||          }|                                 }|                    |           | d{V  ||fS )z?Create a DatagramTransport with optimized UDP I/O if available.r=   NF)r~   r7   r   r   r   r   r   )r>   rA   r   create_datagram_endpointsetblockingri   create_futurer   )	r~   r  r7   r   r   r   r   	transportr   s	            r'   #create_optimized_datagram_transportr#    s       T""K$--K P223C$2OOOOOOOOOU!!H*)  I !!FV
LLLLLLLhr)   )r.   r/   r0   r1   )r7   r8   r0   r1   )rB   rC   r0   rD   )rP   rQ   rR   rI   r0   rS   )rH   rI   r0   rI   )r^   rS   r0   r_   )r@   )
r~   r   r  r  r7   r8   r   rI   r0   r  )4r  
__future__r   asyncior4   r   structsystypingcollectionsr   _hazmatr   r   r   __annotations__r
   Structr   r   r   r   r   r   r   r   r   platformr   r   SOL_UDPr   r5   r   r   r   r    rH   r!   	frozensetr,   r-   r6   r>   rA   rO   rY   r]   rg   DatagramTransportri   r#  r$   r)   r'   <module>r1     s     # " " " " "     



        8 7 7 7 7 7          &d++ + + + +'&---	 - - - - "'  & & & &# # # # # !* ) ) ) )( ( ( ( ( #%  $ $ $ $!&  & & & & #%  $ $ $ $,'1	 1 1 1 10 0 0 0 0 ' ' ' '"76;::
 : : : :#GFL!<< < < < <)0)F)FMFin%%%A      %.I . . 	z4((}d++. . . % %      ',  + + + +C C C C      	 	 	 	J J J JA A A A   @t4 t4 t4 t4 t4!: t4 t4 t4v !	      r)   