
    hC              	       z   d dl mZmZ d dlmZmZmZmZmZm	Z	m
Z
mZmZ d dlmZ d dlmZ d dlmZ d dlmZ 	  G d de          Z G d	 d
e          Z G d de          Z G d de          Z G d de          Z eeed dddd            eeed            eeedd             eeed           dS )    )Packetbind_layers)	BitFieldByteEnumField	ByteFieldFieldLenFieldFieldListFieldIPFieldPacketListField
ShortFieldXShortField)orb)IP)IGMP)confc                       e Zd ZdZd ZddddddZ edd	e           ed
d           edd          gZ	d Z
d Zedd            ZdS )IGMPv3a  IGMP Message Class for v3.

    This class is derived from class Packet.
    The fields defined below are a
    direct interpretation of the v3 Membership Query Message.
    Fields 'type'  through 'qqic' are directly assignable.
    For 'numsrc', do not assign a value.
    Instead add to the 'srcaddrs' list to auto-set 'numsrc'. To
    assign values to 'srcaddrs', use the following methods::

      c = IGMPv3()
      c.srcaddrs = ['1.2.3.4', '5.6.7.8']
      c.srcaddrs += ['192.168.10.24']

    At this point, 'c.numsrc' is three (3)

    'chksum' is automagically calculated before the packet is sent.

    'mrcode' is also the Advertisement Interval field

    zMembership QueryzVersion 3 Membership ReportzMulticast Router AdvertisementzMulticast Router SolicitationzMulticast Router Termination)   "   0   1   2   typer   mrcode   chksumNc                     | j         }|dk     r|}n6|dk    rd}n-d}|dz  }|dk    r|dz  }|dz  }|dk    |dz  }d|z  |d	z  z  }|| _         d
S )a%  Encode and replace the mrcode value to its IGMPv3 encoded time value if needed,  # noqa: E501
        as specified in rfc3376#section-4.1.1.

        If value < 128, return the value specified. If >= 128, encode as a floating  # noqa: E501
        point value. Value can be 0 - 31744.
           i{     r                  N)r   )selfvaluecodeexps       X/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/contrib/igmpv3.pyencode_maxrespcodezIGMPv3.encode_maxrespcode?   s     3;;DDU]]DDCaKE"**q! "** AIC#:.D    c                     t          | j        t                    r| j                            d          S |                     d          S )z'Display a summary of the IGMPv3 object.z)IGMPv3: %IP.src% > %IP.dst% %IGMPv3.type%zIGMPv3 %IGMPv3.type%)
isinstance
underlayerr   sprintfr%   s    r)   	mysummaryzIGMPv3.mysummaryU   s@    dor** 	8?**+VWWW<< 6777r+   c                     |rdt          |          dk    rQt          |d                   dv rt          S t          |d                   dk    rt          |          dk     rt          S t          S )Nr#   r   )         r      )lenr   r   r   )cls_pktargskargss       r)   dispatch_hookzIGMPv3.dispatch_hook\   s`     	CIINN47||111T!W%%#d))b..r+   N)__name__
__module____qualname____doc__nameigmpv3typesr   r   r   fields_descr*   r1   classmethodr<    r+   r)   r   r      s         * D+6987	9 9K !={;;9Xr**;x..0K  ,8 8 8    [  r+   r   c                       e Zd ZdZd Z edd           eddd           eddd           ed	dd
           edd           eddd           e	dd edd          d           gZ
dS )IGMPv3mqz=IGMPv3 Membership Query.
    Payload of IGMPv3 when type=0x11gaddr0.0.0.0resvr   r#   sr"   qrvr    qqicnumsrcNsrcaddrscount_ofsac                     | j         S r=   rO   xs    r)   <lambda>zIGMPv3mq.<lambda>p   s
    cdck r+   
count_from)r>   r?   r@   rA   rB   r
   r   r   r   r	   rD   rF   r+   r)   rH   rH   f   s        ( (D77I..8FAq))8CA&&8E1a((9VQ'' =4*EEE!>*dGGD)4L4LYkYklllnKKKr+   rH   c                       e Zd ZdZd ZdddddddZ ed	d
e           edd           eddd           e	dd           e
dg  e	dd          d           gZd Zd ZdS )IGMPv3grzIGMP Group Record for IGMPv3 Membership Report

    This class is derived from class Packet and should be added in the records
    of an instantiation of class IGMPv3mr.
    zMode Is IncludezMode Is ExcludezChange To Include ModezChange To Exclude ModezAllow New SourceszBlock Old Sources)r"      r    r#         rtyper"   auxdlenr   rO   NrP   rQ   maddrrJ   rS   c                     | j         S r=   rU   rV   s    r)   rX   zIGMPv3gr.<lambda>   s
    abai r+   rY   c                 ,    |                      d          S )z-Display a summary of the IGMPv3 group record.z4IGMPv3 Group Record %IGMPv3gr.type% %IGMPv3gr.maddr%)r/   r0   s    r)   r1   zIGMPv3gr.mysummary   s    ||RSSSr+   c                     t           j        S r=   )r   padding_layer)r%   payloads     r)   default_payload_classzIGMPv3gr.default_payload_class   s    !!r+   )r>   r?   r@   rA   rB   igmpv3grtypesr   r   r   r
   r	   rD   r1   rh   rF   r+   r)   r\   r\   s   s         
 D))00++- -M !=!];;9Y** =4*EEE77I..!>*b''$	2J2JWiWijjj	lKT T T" " " " "r+   r\   c                   h    e Zd ZdZd Z edd           eddd           edg ed 	          gZ	dS )
IGMPv3mrzQIGMP Membership Report extension for IGMPv3.
    Payload of IGMPv3 when type=0x22res2r   numgrpNrecordsrQ   c                     | j         S r=   )rm   rV   s    r)   rX   zIGMPv3mr.<lambda>   s
    QRQY r+   rY   )
r>   r?   r@   rA   rB   r   r   r   r\   rD   rF   r+   r)   rk   rk      sb        ( (D;vq)) =4)DDD"?9b(GYGYZZZ\KKKr+   rk   c                   F    e Zd ZdZd Z edd           edd          gZdS )	IGMPv3mraz^IGMP Multicast Router Advertisement extension for IGMPv3.
    Payload of IGMPv3 when type=0x30qryIntvlr   robustN)r>   r?   r@   rA   rB   r   rD   rF   r+   r)   rq   rq      sB        ( (D:j!,,:h**,KKKr+   rq   r]   r"      z
224.0.0.22)fragprotottltosdstr   )r   r   )r   r   r   N)scapy.packetr   r   scapy.fieldsr   r   r   r   r	   r
   r   r   r   scapy.compatr   scapy.layers.inetr   scapy.contrib.igmpr   scapy.configr   r   rH   r\   rk   rq   rF   r+   r)   <module>r      sW   - , , , , , , ,F F F F F F F F F F F F F F F F F F F F F F                   # # # # # #      E E E E ET E E EP
n 
n 
n 
n 
nv 
n 
n 
n" " " " "v " " "8\ \ \ \ \v \ \ \, , , , , , , , BQ	    FH4 ( ( ( ( FH4 4 4 4 4 FID ) ) ) ) ) )r+   