a
    kÄ#dúw  ã                   @   s–  d Z ddlmZ ddlmZ ddlZddlmZ ddlmZ ddl	m
Z
 ddlmZmZmZmZmZ dd	lmZmZmZmZmZmZ dd
lmZ ddlm  mZ ddlmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* ddl+m,Z, e*rþddl-m.Z. e$dde,fde,fgƒZ/e(de,e/ƒZ0e 1e¡G dd„ de!e0 ƒƒZ2G dd„ de2e, ee, eƒZ3e)e#e, e,ee, e2e, f Z4G dd„ de2e/ ee/ eƒZ5dS )zH
PacketList: holds several packets and allows to do operations on them.
é    )Úabsolute_import)Úprint_functionN)Údefaultdict)Úlambda_tuple_converter)Úconf)Ú
BasePacketÚBasePacketListÚPacketList_metaclassÚSetGenÚ_CanvasDumpExtended)Údo_graphÚhexdumpÚ
make_tableÚmake_lined_tableÚmake_tex_tableÚ	issubtype©Úreduce)ÚAnyÚCallableÚDefaultDictÚDictÚGenericÚIteratorÚListÚ
NamedTupleÚOptionalÚTupleÚTypeÚTypeVarÚUnionÚTYPE_CHECKING)ÚPacket)ÚLine2DÚQueryAnswerÚqueryZanswerÚ_Innerc                   @   sD  e Zd Zg d¢ZdJd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d„ Zdd„ ZedddƒZdd„ ZdKdd„ZdLd d!„Zd"d#„ Zd$d%„ Zd&d'„ Zd(d)„ Zd*d+„ ZdMd-d.„ZdNd0d1„ZdOd2d3„Zd4d5„ ZdPd6d7„ZdQd8d9„ZdRd:d;„ZdSd<d=„Z dTd>d?„Z!dUd@dA„Z"dBdC„ Z#dVdDdE„Z$dFdG„ Z%dWdHdI„Z&dS )XÚ_PacketList)ÚstatsÚresÚlistnameNÚ
PacketListc                 C   sH   |du rt j}|| _|du r$g | _nt|tƒr8|j| _n|| _|| _dS )z®create a packet list from a list of packets
           res: the list of packets
           stats: a list of classes that will appear in the stats (defaults to [TCP,UDP,ICMP])N)r   Zstats_classic_protocolsr(   r)   Ú
isinstancer'   r*   ©Úselfr)   Únamer(   © r0   úB/var/www/html/gsl.tools/lib/python3.9/site-packages/scapy/plist.pyÚ__init__E   s    	

z_PacketList.__init__c                 C   s
   t | jƒS ©N)Úlenr)   ©r.   r0   r0   r1   Ú__len__Y   s    z_PacketList.__len__c                 C   s   |S r3   r0   ©r.   Úeltr0   r0   r1   Ú_elt2pkt]   s    z_PacketList._elt2pktc                 C   s   |  ¡ S r3   ©Úsummaryr7   r0   r0   r1   Ú_elt2suma   s    z_PacketList._elt2sumc                 C   s
   |   |¡S r3   )r<   r7   r0   r0   r1   Ú	_elt2showe   s    z_PacketList._elt2showc              	   C   sò   dd„ | j D ƒ}d}| jD ]F}d}|D ],}|  |¡ |¡r&||  d7  < d} qTq&|s|d7 }qd}tj}| j D ].}|d| |j¡| d¡| 	|| ¡f 7 }qr|d| d¡| d¡| 	|¡f 7 }d	| d
¡| 
| j¡| d¡|| d¡f S )Nc                 S   s   i | ]
}|d “qS )r   r0   ©Ú.0Úxr0   r0   r1   Ú
<dictcomp>k   ó    z(_PacketList.__repr__.<locals>.<dictcomp>r   é   Ú z %s%s%sú:ÚOtherz
%s%s%s%s%sú<ú>)r(   r)   r9   Úhaslayerr   Úcolor_themeZpacketlist_protoÚ_nameÚpunctZpacketlist_valueZpacketlist_namer*   )r.   r(   ÚotherÚrÚfÚpÚsÚctr0   r0   r1   Ú__repr__i   s8    


þ
þ

üz_PacketList.__repr__c                 C   s   | j | j| jdœ}|S )z³
        Creates a basic representation of the instance, used in
        conjunction with __setstate__() e.g. by pickle

        :returns: dict representing this instance
        ©r)   r(   r*   rT   ©r.   Ústater0   r0   r1   Ú__getstate__…   s
    	ýz_PacketList.__getstate__c                 C   s"   |d | _ |d | _|d | _dS )zº
        Sets instance attributes to values given by state, used in
        conjunction with __getstate__() e.g. by pickle

        :param state: dict representing this instance
        r)   r(   r*   NrT   rU   r0   r0   r1   Ú__setstate__”   s    

z_PacketList.__setstate__c                 C   s
   | j  ¡ S r3   )r)   Ú__iter__r5   r0   r0   r1   rY       s    z_PacketList.__iter__c                 C   s   t | j|ƒS r3   )Úgetattrr)   )r.   Úattrr0   r0   r1   Ú__getattr__¤   s    z_PacketList.__getattr__c                    sh   t ˆ tƒr6ˆj‡ ‡fdd„ˆjD ƒdˆ jˆjf d�S tˆ tƒr\ˆjˆj ˆ ¡dˆj d�S ˆj ˆ ¡S )Nc                    s   g | ]}ˆ ˆ  |¡v r|‘qS r0   )r9   r>   ©Úitemr.   r0   r1   Ú
<listcomp>«   rB   z+_PacketList.__getitem__.<locals>.<listcomp>z
%s from %s©r/   zmod %s)	r   r   Ú	__class__r)   Ú__name__r*   r,   ÚsliceÚ__getitem__)r.   r^   r0   r]   r1   rd   ¨   s    
ÿ
ÿz_PacketList.__getitem__Ú_TÚ
SndRcvListc                 C   s"   | j | j|j d| j|jf d�S )Nz%s+%sr`   )ra   r)   r*   )r.   rM   r0   r0   r1   Ú__add__µ   s    
þþz_PacketList.__add__c                 C   sf   |durt |ƒ}|dur t |ƒ}| jD ]:}|dur<||Ž s<q&|du rTt|  |¡ƒ q&t||Ž ƒ q&dS )a  prints a summary of each packet

        :param prn: function to apply to each packet instead of
                    lambda x:x.summary()
        :param lfilter: truth function to apply to each packet to decide
                        whether it will be displayed
        N)r   r)   Úprintr<   )r.   ÚprnÚlfilterrN   r0   r0   r1   r;   Á   s    
z_PacketList.summaryc                 C   s†   |durt |ƒ}|dur t |ƒ}t| jƒD ]V\}}|durD||Ž sDq*ttjj|dd�dd� |du rtt|  |¡ƒ q*t||Ž ƒ q*dS )a)  prints a summary of each packet with the packet's number

        :param prn: function to apply to each packet instead of
                    lambda x:x.summary()
        :param lfilter: truth function to apply to each packet to decide
                        whether it will be displayed
        Nú%04i©Úfmtú )Úend)r   Ú	enumerater)   rh   r   rJ   Úidr<   )r.   ri   rj   Úir)   r0   r0   r1   ÚnsummaryÜ   s    z_PacketList.nsummaryc                 O   s   | j |i |¤ŽS )zBBest way to display the packet list. Defaults to nsummary() method)rs   ©r.   ÚargsÚkargsr0   r0   r1   Úshowø   s    z_PacketList.showc                    s,   t ˆ ƒ‰ | j‡ fdd„| jD ƒd| j d�S )z¦Returns a packet list filtered by a truth function. This truth
        function has to take a packet as the only argument and return
        a boolean value.
        c                    s   g | ]}ˆ |Ž r|‘qS r0   r0   r>   ©Úfuncr0   r1   r_     rB   z&_PacketList.filter.<locals>.<listcomp>zfiltered %sr`   )r   ra   r)   r*   )r.   ry   r0   rx   r1   Úfilterý   s    ÿz_PacketList.filterc                 O   s   t | jg|¢R i |¤ŽS )zÜPrints a table using a function that returns for each packet its head column value, head row value and displayed value  # noqa: E501
        ex: p.make_table(lambda x:(x[IP].dst, x[TCP].dport, x[TCP].sprintf("%flags%")) )r   r)   rt   r0   r0   r1   r   	  s    z_PacketList.make_tablec                 O   s   t | jg|¢R i |¤ŽS )z0Same as make_table, but print a table with lines)r   r)   rt   r0   r0   r1   r     s    z_PacketList.make_lined_tablec                 O   s   t | jg|¢R i |¤ŽS )z7Same as make_table, but print a table with LaTeX syntax)r   r)   rt   r0   r0   r1   r     s    z_PacketList.make_tex_tableFc           
         s¨   ddl m}m}m} tˆ ƒ‰ ˆdur,tˆƒ‰ˆdu rJ‡ fdd„| jD ƒ}n‡ ‡fdd„| jD ƒ}|i krl|}|r†|jt|Ž i |¤Ž}	n|j|fi |¤Ž}	|s¤| ¡  |	S )zçApplies a function to each packet to get a value that will be plotted
        with matplotlib. A list of matplotlib.lines.Line2D is returned.

        lfilter: a truth function that decides whether a packet must be plotted
        r   ©ÚpltÚMATPLOTLIB_INLINEDÚMATPLOTLIB_DEFAULT_PLOT_KARGSNc                    s   g | ]}ˆ |Ž ‘qS r0   r0   ©r?   Úe©rO   r0   r1   r_   4  rB   z$_PacketList.plot.<locals>.<listcomp>c                    s   g | ]}ˆ|Ž rˆ |Ž ‘qS r0   r0   r   ©rO   rj   r0   r1   r_   6  rB   )	Úscapy.libs.matplotr|   r}   r~   r   r)   ÚplotÚziprw   )
r.   rO   rj   Úplot_xyrv   r|   r}   r~   Úlst_pktsÚlinesr0   r‚   r1   r„     s    z_PacketList.plotrC   c           
         s’   ddl m}m}m} ˆdu r@‡ ‡fdd„ttˆjƒ| ƒD ƒ}n$‡ ‡‡fdd„ttˆjƒ| ƒD ƒ}|i krp|}|j|fi |¤Ž}	|sŽ| ¡  |	S )z›diffplot(f, delay=1, lfilter=None)
        Applies a function to couples (l[i],l[i+delay])

        A list of matplotlib.lines.Line2D is returned.
        r   r{   Nc                    s&   g | ]}ˆ ˆj | ˆj |d   ƒ‘qS ©rC   ©r)   ©r?   rr   )rO   r.   r0   r1   r_   \  s   ÿz(_PacketList.diffplot.<locals>.<listcomp>c                    s4   g | ],}ˆˆj | ƒrˆ ˆj | ˆj |d   ƒ‘qS r‰   rŠ   r‹   ©rO   rj   r.   r0   r1   r_   _  s   þ)	rƒ   r|   r}   r~   Úranger4   r)   r„   rw   )
r.   rO   Údelayrj   rv   r|   r}   r~   r‡   rˆ   r0   rŒ   r1   ÚdiffplotF  s    ÿÿz_PacketList.diffplotc                    sä   ddl m‰m}m} tˆ ƒ‰ ˆdur,tˆƒ‰ˆdu rJ‡ fdd„| jD ƒ}n‡ ‡fdd„| jD ƒ}i }|D ]\}	}
| |	g ¡ |
¡ qhˆsŒ|‰|r¬‡‡fdd„t 	|¡D ƒ}n‡‡fd	d„t 	|¡D ƒ}ˆj
d
dd� |sàˆ ¡  |S )z³Uses a function that returns a label and a value for this label, then
        plots all the values label by label.

        A list of matplotlib.lines.Line2D is returned.
        r   r{   Nc                 3   s   | ]}ˆ |Ž V  qd S r3   r0   r   r�   r0   r1   Ú	<genexpr>‰  rB   z(_PacketList.multiplot.<locals>.<genexpr>c                 3   s   | ]}ˆ|Ž rˆ |Ž V  qd S r3   r0   r   r‚   r0   r1   r�   ‹  rB   c              	      s,   g | ]$\}}ˆj t|Ž i tˆ |d �¤Ž‘qS ©)Úlabel)r„   r…   Údict©r?   ÚkÚpl©rv   r|   r0   r1   r_   —  s   ÿz)_PacketList.multiplot.<locals>.<listcomp>c              	      s*   g | ]"\}}ˆj |fi tˆ |d �¤Ž‘qS r‘   )r„   r“   r”   r—   r0   r1   r_   š  s   ÿzcenter right)g      ø?g      à?)ÚlocZbbox_to_anchor)rƒ   r|   r}   r~   r   r)   Ú
setdefaultÚappendÚsixÚ	iteritemsZlegendrw   )r.   rO   rj   r†   rv   r}   r~   r‡   Údr•   Úvrˆ   r0   )rO   rv   rj   r|   r1   Ú	multiplotn  s.    ÿÿz_PacketList.multiplotc                 C   s   | D ]}t |  |¡ƒ qdS )z5Prints an hexadecimal dump of each packet in the listN)r   r9   )r.   rP   r0   r0   r1   Ú
rawhexdump¤  s    z_PacketList.rawhexdumpc                 C   s|   t | jƒD ]l\}}|  |¡}|dur.||ƒs.q
tdtjj|dd�| d¡|  |¡f ƒ | 	tj
¡r
t| tj
¡jƒ q
dS )z±Same as nsummary(), except that if a packet has a Raw layer, it will be hexdumped  # noqa: E501
        lfilter: a truth function that decides whether a packet must be displayedNú%s %s %srk   rl   ú%.time%)rp   r)   r9   rh   r   rJ   rq   Úsprintfr<   rI   Z	raw_layerr   ÚgetlayerÚload©r.   rj   rr   r)   rP   r0   r0   r1   Úhexrawª  s    
þz_PacketList.hexrawc                 C   sf   t | jƒD ]V\}}|  |¡}|dur.||ƒs.q
tdtjj|dd�| d¡|  |¡f ƒ t	|ƒ q
dS )zŒSame as nsummary(), except that packets are also hexdumped
        lfilter: a truth function that decides whether a packet must be displayedNr¡   rk   rl   r¢   )
rp   r)   r9   rh   r   rJ   rq   r£   r<   r   r¦   r0   r0   r1   r   ¸  s    
þz_PacketList.hexdumpc                 C   sz   t | jƒD ]j\}}|  |¡}| tj¡r
|du s8||ƒr
tdtjj|dd�| 	d¡|  
|¡f ƒ t| tj¡jƒ q
dS )z#Same as hexraw(), for Padding layerNr¡   rk   rl   r¢   )rp   r)   r9   rI   r   Úpadding_layerrh   rJ   rq   r£   r<   r   r¤   r¥   r¦   r0   r0   r1   ÚpaddingÅ  s    
þÿz_PacketList.paddingc                 C   s¢   t | jƒD ]’\}}|  |¡}| tj¡r
| tj¡j}||dd… t|ƒ krPq
|du s`||ƒr
t	dtj
j|dd�| d¡|  |¡f ƒ t| tj¡jƒ q
dS )z+Same as padding() but only non null paddingNrC   r¡   rk   rl   r¢   )rp   r)   r9   rI   r   r¨   r¤   r¥   r4   rh   rJ   rq   r£   r<   r   )r.   rj   rr   r)   rP   Úpadr0   r0   r1   Ú	nzpaddingÓ  s    
þÿz_PacketList.nzpaddingc              	   K   sø   |du rdd„ }|}i }| j D ]t}|  |¡}z||ƒ}W n tyN   Y qY n0 t|ƒdkr~| |dd… tƒ ¡ |d ¡ q| |d¡d ||< qd}t 	|¡D ]<\\}}	}
|d	||	t
|
tƒrÔd
 dd„ |
D ƒ¡n|
f 7 }q¢|d7 }t|fi |¤ŽS )am  Graphes a conversations between sources and destinations and display it
        (using graphviz and imagemagick)

        :param getsrcdst: a function that takes an element of the list and
            returns the source, the destination and optionally
            a label. By default, returns the IP source and
            destination from IP and ARP layers
        :param type: output type (svg, ps, gif, jpg, etc.), passed to dot's
            "-T" option
        :param target: filename or redirect. Defaults pipe to Imagemagick's
            display program
        :param prog: which graphviz program to use
        Nc                 S   s^   d| v r| d j | d jfS d| v r8| d j | d jfS d| v rT| d j| d jfS tƒ ‚dS )zExtract src and dst addressesÚIPÚIPv6ÚARPN)ÚsrcÚdstZpsrcZpdstÚ	TypeError)Zpktr0   r0   r1   Ú
_getsrcdst÷  s    z-_PacketList.conversations.<locals>._getsrcdsté   é   r   rC   zdigraph "conv" {
z	 "%s" -> "%s" [label="%s"]
z, c                 s   s   | ]}t |ƒV  qd S r3   )Ústrr>   r0   r0   r1   r�     rB   z,_PacketList.conversations.<locals>.<genexpr>z}
)r)   r9   Ú	Exceptionr4   r™   ÚsetÚaddÚgetr›   rœ   r,   Újoinr   )r.   Z	getsrcdstrv   r²   ÚconvrP   ÚcÚgrrQ   r�   Úlr0   r0   r1   Úconversationsä  s(    



"$ÿ
z_PacketList.conversationsc              	   K   s  |du rdd„ }|du r dd„ }|du r0dd„ }i }i }i }| j D ]æ}zÈ||ƒ||ƒ||ƒ  }	}
}|	|v r ||	 \}}|d7 }|
|vr’| |
¡ ||f||	< nd|
gf||	< |
|v rê||
 \}}|d7 }||vrÜ| |¡ ||f||
< nd|gf||
< | |d¡d ||< W qB t�y&   Y qBY qB0 qBdd	„ }|d
d„ t |¡D ƒƒ\}}|dd„ t |¡D ƒƒ\}}|t |¡ƒ\}}d}|d7 }|D ]F}	||	 \}}dt|| ƒ||   }|dt|	ƒt|	ƒ||f 7 }�qŒ|d7 }|D ]F}
||
 \}}dt|| ƒ||   }|dt|
ƒt|
ƒ||f 7 }�qà|D ]B}|| }dt|| ƒ||   }|dt|ƒt|ƒ||f 7 }�q,|d7 }|D ]6}	||	 \}}|D ]}
|dt|	ƒt|
ƒf 7 }�q��q||D ]6}
||
 \}}|D ]}|dt|
ƒt|ƒf 7 }�qÌ�q¸|d7 }t|fi |¤ŽS )zÎExperimental clone attempt of http://sourceforge.net/projects/afterglow
        each datum is reduced as src -> event -> dst and the data are graphed.
        by default we have IP.src -> IP.dport -> IP.dstNc                  W   s   | d d j S ©Nr   r¬   )r¯   ©r@   r0   r0   r1   Ú<lambda>%  rB   z'_PacketList.afterglow.<locals>.<lambda>c                  W   s   | d d j S rÀ   )ÚdportrÁ   r0   r0   r1   rÂ   '  rB   c                  W   s   | d d j S rÀ   )r°   rÁ   r0   r0   r1   rÂ   )  rB   rC   r   c                 S   s<   t dd„ dd„ | D ƒƒ\}}||kr(d}|dkr4d}||fS )Nc                 S   s$   t | d |d ƒt| d |d ƒfS )Nr   rC   )ÚminÚmax)ÚaÚbr0   r0   r1   rÂ   F  rB   z7_PacketList.afterglow.<locals>.minmax.<locals>.<lambda>c                 s   s   | ]}||fV  qd S r3   r0   )r?   rÆ   r0   r0   r1   r�   G  rB   z8_PacketList.afterglow.<locals>.minmax.<locals>.<genexpr>r   rC   r   )r@   ÚmÚMr0   r0   r1   ÚminmaxD  s    ÿz%_PacketList.afterglow.<locals>.minmaxc                 s   s   | ]\}}|V  qd S r3   r0   ©r?   r@   Ú_r0   r0   r1   r�   N  rB   z(_PacketList.afterglow.<locals>.<genexpr>c                 s   s   | ]\}}|V  qd S r3   r0   rË   r0   r0   r1   r�   O  rB   z'digraph "afterglow" {
	edge [len=2.5];
z# src nodes
zl"src.%s" [label = "%s", shape=box, fillcolor="#FF0000", style=filled, fixedsize=1, height=%.2f,width=%.2f];
z# event nodes
zp"evt.%s" [label = "%s", shape=circle, fillcolor="#00FFFF", style=filled, fixedsize=1, height=%.2f, width=%.2f];
zr"dst.%s" [label = "%s", shape=triangle, fillcolor="#0000ff", style=filled, fixedsize=1, height=%.2f, width=%.2f];
z###
z "src.%s" -> "evt.%s";
z "evt.%s" -> "dst.%s";
Ú})	r)   rš   r¹   r¶   r›   Ú
itervaluesÚfloatÚreprr   )r.   r¯   Úeventr°   rv   ÚslÚelÚdlrr   rQ   r€   r�   ÚnÚlstrÊ   ZminsZmaxsZmineZmaxeZmindZmaxdr½   rÌ   Zlst1Zlst2r0   r0   r1   Ú	afterglow  sv    




     z_PacketList.afterglowc           	   	   K   s¼   dd l }|j ¡ }t| jƒ}t| jƒD ]�\}}|  |¡jf i |¤Ž}| ¡ }| | 	¡ | 
¡ d d||f |jjjg¡ tjdkrŽt dd¡ | |jj||jjjd|jj dd�¡ q&|S )Nr   rC   z+\font\cmssfont=cmss12\cmssfont{Frame %i/%i}r´   ó   .)ÚpaperformatÚmarginZ	fittosize)ÚpyxZdocumentr4   r)   rp   r9   Úcanvas_dumpZbboxÚtextÚleftÚtopÚsizeZLARGEr   ÚverbÚosÚwriterš   ÚpagerÙ   ZA4ÚunitZt_cm)	r.   rv   rÛ   r�   Zlen_resrr   r)   r¼   Zcbbr0   r0   r1   rÜ   p  s    

,

þ
z_PacketList.canvas_dumpc                 C   sN   |d u rdd„ }|}t | jƒ}| jD ] }||  |¡ƒ}||  |¡ q$t|ƒS )Nc                 S   s¢   d| v ržd| v sd| v r‚d}d}||f}d| v r6d}n<d| v rDd	}n.d
| v rRd}n d| v r`d}nd| v rnd}nd}|   |j|Ž ¡S d| v r”|   d¡S |   d¡S dS )zExtract sessions from packetsZEtherr¬   r­   z{IP:%IP.src%}{IPv6:%IPv6.src%}z{IP:%IP.dst%}{IPv6:%IPv6.dst%}ZTCPz'TCP {}:%r,TCP.sport% > {}:%r,TCP.dport%ZUDPz'UDP {}:%r,UDP.sport% > {}:%r,UDP.dport%ZICMPz?ICMP {} > {} type=%r,ICMP.type% code=%r,ICMP.code% id=%ICMP.id%ZICMPv6z8ICMPv6 {} > {} type=%r,ICMPv6.type% code=%r,ICMPv6.code%zIPv6 {} > {} nh=%IPv6.nh%zIP {} > {} proto=%IP.proto%r®   zARP %ARP.psrc% > %ARP.pdst%zEthernet type=%04xr,Ether.type%rF   )r£   Úformat)rP   Z
ip_src_fmtZ
ip_dst_fmtZaddr_fmtrm   r0   r0   r1   Ú_session_extractor†  s*    

z0_PacketList.sessions.<locals>._session_extractor)r   ra   r)   r9   rš   r“   )r.   Zsession_extractorrç   ÚsessionsrP   Úsessr0   r0   r1   rè   €  s    

ÿz_PacketList.sessionsc                 O   sÜ   |  dd¡}td| j d�}t|d tƒs0|f}| jD ] }|  |¡}d}|D ]~}|d }	|d }
|d }|	jD ]Z}||v rnt|ƒdksš||  	|	j
¡|
krn|s¶| ¡ }|r²| ¡  d	}t|| |	j
|ƒ qnqL| |¡ q6|S )
aN  
        lst.replace(<field>,[<oldvalue>,]<newvalue>)
        lst.replace( (fld,[ov],nv),(fld,[ov,]nv),...)
          if ov is None, all values are replaced
        ex:
          lst.replace( IP.src, "192.168.1.1", "10.0.0.1" )
          lst.replace( IP.ttl, 64 )
          lst.replace( (IP.ttl, 64), (TCP.sport, 666, 777), )
        Údelete_checksumsFzReplaced %sr`   r   rC   éÿÿÿÿr´   T)r¹   r+   r*   r,   Útupler)   r9   Zownersr4   Zgetfieldvalr/   Úcopyrê   Úsetattrrš   )r.   ru   rv   rê   r@   Ú_prP   ÚcopiedÚschemeZfldÚoldÚnewÚor0   r0   r1   Úreplace«  s,    


 z_PacketList.replacec                    s|   |du rd  ˆj|j¡}|du r&ˆj}i ‰ |dur<ˆ  |¡ |ˆ d< |durT|ˆ d< tdd„ ‡ ‡fdd„ˆjD ƒD ƒ||ƒS )	aû  Returns the packet list from a given layer.

        See ``Packet.getlayer`` for more info.

        :param cls: search for a layer that is an instance of ``cls``
        :type cls: Type[scapy.packet.Packet]

        :param nb: return the nb^th layer that is an instance of ``cls``
        :type nb: Optional[int]

        :param flt: filter parameters for ``Packet.getlayer``
        :type flt: Optional[Dict[str, Any]]

        :param name: optional name for the new PacketList
        :type name: Optional[str]

        :param stats: optional list of protocols to give stats on; if not
                      specified, inherits from this PacketList.
        :type stats: Optional[List[Type[scapy.packet.Packet]]]
        :rtype: scapy.plist.PacketList
        Nz{} layer {}ÚclsÚnbc                 S   s   g | ]}|d ur|‘qS r3   r0   )r?   Zpcr0   r0   r1   r_   ö  s   þz(_PacketList.getlayer.<locals>.<listcomp>c                 3   s$   | ]}ˆ  |¡jf i ˆ ¤ŽV  qd S r3   )r9   r¤   )r?   rP   ©Zgetlayer_argr.   r0   r1   r�   ÷  s   z'_PacketList.getlayer.<locals>.<genexpr>)ræ   r*   rb   r(   Úupdater+   r)   )r.   rö   r÷   Zfltr/   r(   r0   rø   r1   r¤   Í  s"    
ÿÿüz_PacketList.getlayer)Nr+   N)NN)NN)NF)rC   N)NF)N)N)N)N)N)NNN)N)NNNN)'rb   Ú
__module__Ú__qualname__Ú	__slots__r2   r6   r9   r<   r=   rS   rW   rX   rY   r\   rd   r   re   rg   r;   rs   rw   rz   r   r   r   r„   r�   rŸ   r    r§   r   r©   r«   r¿   r×   rÜ   rè   rõ   r¤   r0   r0   r0   r1   r'   A   sr      ý

  þ
  þ
  ý
/  ý
*  ý
6



 ÿ
7   ý
V þ
+#    ür'   c                   @   s   e Zd Zddd„ZdS )r+   FNc           	      C   sè   | j dd… }g }d}|du s&|dkr.t|ƒ}|t|ƒk rÆ|| }|}|t|| t|ƒd ƒk r¼|d7 }|| }| |¡rF| t||ƒ¡ |r¤d|| _d|| _qF||= ||= |d8 }q¼qF|d7 }q.|rØdd„ |D ƒ}t|ƒt|ƒfS )ag  
        Matches packets in the list

        :param multi: True if a packet can have multiple answers
        :param lookahead: Maximum number of packets between packet and answer.
                          If 0 or None, full remaining list is
                          scanned for answers
        :return: ( (matched couples), (unmatched packets) )
        Nr   rC   r´   c                 S   s   g | ]}t |d ƒs|‘qS )Ú	_answered)Úhasattrr>   r0   r0   r1   r_   #  rB   z!PacketList.sr.<locals>.<listcomp>)	r)   r4   rÄ   Zanswersrš   r$   rý   rf   r+   )	r.   ÚmultiZ	lookaheadZremainÚsrrr   rQ   ÚjrN   r0   r0   r1   r     s2    



zPacketList.sr)FN)rb   rú   rû   r   r0   r0   r0   r1   r+   þ  s   r+   c                       s2   e Zd Zg Zd	‡ fdd„	Zdd„ Zdd„ Z‡  ZS )
rf   NÚResultsc                    s   t t| ƒ |||¡ d S r3   )Úsuperrf   r2   r-   ©ra   r0   r1   r2   4  s    zSndRcvList.__init__c                 C   s   |d S )NrC   r0   r7   r0   r0   r1   r9   <  s    zSndRcvList._elt2pktc                 C   s   d|d   ¡ |d   ¡ f S )Nz	%s ==> %sr   rC   r:   r7   r0   r0   r1   r<   @  s    zSndRcvList._elt2sum)Nr  N)rb   rú   rû   rü   r2   r9   r<   Ú__classcell__r0   r0   r  r1   rf   /  s      ýrf   )6Ú__doc__Ú
__future__r   r   râ   Úcollectionsr   Zscapy.compatr   Zscapy.configr   Zscapy.base_classesr   r   r	   r
   r   Zscapy.utilsr   r   r   r   r   r   Ú	functoolsr   Zscapy.libs.sixZlibsr›   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   Zscapy.packetr"   rƒ   r#   r$   r&   Úadd_metaclassr'   r+   Z_PacketIterablerf   r0   r0   r0   r1   Ú<module>   sR    @þ     Aþ)ýÿþ