
    hr                        d 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dl
mZ ddlmZm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mZmZmZmZm Z m!Z!m"Z" dd	l#m$Z$ dd
l%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+  G d de          Z, G d de          Z- G d de          Z. ee,e.d            G d de          Z/ G d de          Z0 G d de          Z1 G d de          Z2 G d de          Z3 ee,e3d            ee,e3d            ee,e3d            ee,e3d             G d! d"e          Z4 G d# d$e          Z5 ee,e5d%            ee,e5d&            ee,e5d'           d(d)d*d+d,d-Z6 G d. d/e          Z7 G d0 d1e          Z8 ee,e8d2            ee,e8d3            ee,e8d4            G d5 d6e          Z9d7Z:d8Z;d9Z<d:ed;e(e         fd<Z=ej>        fd=Z?d> Z@d? ZAd@ ZBdA ZCdB ZDdS )Czg
This file implements the rtnetlink API that is used to read the network
configuration of the machine.
    N)
BIG_ENDIAN)conf)log_loading)Packetbind_layers)atolitom)ByteEnumField	ByteField	EnumFieldFieldFieldLenField
FlagsFieldIP6FieldIPFieldLenFieldMACFieldMayEndMultipleTypeFieldPacketListFieldPadFieldStrLenFieldXStrLenField)
_iff_flags)AnyDictListOptionalTupleTypec                      e Zd Z eddd           eddddd	d
ddddddddd           edderdnddddddddddd 	           ed!dd           ed"dd          gZd#e	d$e	d%e	fd&Z
d'e	d%ee	ee	         f         fd(Zd)ed%efd*ZdS )+rtmsghdr	nlmsg_lenN=Lfmt
nlmsg_typer   
NLMSG_DONERTM_NEWLINKRTM_DELLINKRTM_GETLINKRTM_SETLINKRTM_NEWADDRRTM_DELADDRRTM_GETADDRRTM_NEWROUTERTM_DELROUTERTM_GETROUTE)                                 =Hnlmsg_flagsr4   iNLM_F_REQUESTNLM_F_MULTI	NLM_F_ACK
NLM_F_ECHONLM_F_DUMP_INTRNLM_F_DUMP_FILTERED
NLM_F_ROOTNLM_F_MATCHNLM_F_ATOMIC)	            r4                	nlmsg_seq	nlmsg_pidpktpayreturnc                 x    ||z  }| j         -t          j        dt          |                    |dd          z   }|S )Nr$   rK   )r#   structpacklen)selfrS   rT   s      ^/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/arch/linux/rtnetlink.py
post_buildzrtmsghdr.post_buildm   s<    s
>!+dCHH--ABB7C
    sc                 J    |d | j         dz
           || j         dz
  d          fS )Nr4   )r#   )rZ   r^   s     r[   extract_paddingzrtmsghdr.extract_paddings   s1    &4>B&&'4>B+>+@+@)AAAr]   otherc                 <    t          |j        | j        k              S N)boolrQ   )rZ   ra   s     r[   answerszrtmsghdr.answersv   s    EOt~5666r]   )__name__
__module____qualname__r   r   r   r   r   fields_descbytesr\   r   r   r`   r   rd   re    r]   r[   r"   r"   ?   sp       d---	  !!!!!!!""" " )	
 	
 	
, 	
%BB#%#!"'+#$% 		
 	
" 	k1$'''k1$'''U+KZe % E    B B51G+H B B B B7V 7 7 7 7 7 7 7r]   r"   c                       e Zd Z eddddd            eddi d	           e eg  edd
d                     d          gZde	de
e         fdZdS )nlmsgerr_rtattrrta_lenNrta_datar>   c                     |dz   S NrK   rk   _xs     r[   <lambda>znlmsgerr_rtattr.<lambda>       QRUVQV r]   	length_ofr&   adjustrta_typer   r%   r]   c                     | j         dz
  S rq   rn   rS   s    r[   ru   znlmsgerr_rtattr.<lambda>       CK!O r]   length_fromrK   alignpayloadrU   c                     t           j        S rc   r   padding_layerrZ   r   s     r[   default_payload_classz%nlmsgerr_rtattr.default_payload_class       !!r]   )rf   rg   rh   r   r   r   r   r   ri   rj   r    r   r   rk   r]   r[   rm   rm   }   s        tztDVDV	
 	
 	
 				
 	
 	
 	 ; ;    
	
 
	
 
	
K."U "tF| " " " " " "r]   rm   c                   V    e Zd Z e eddd                     edg e          gZdS )nlmsgerrstatusr   r$   r%   dataN)rf   rg   rh   r   r   r   rm   ri   rk   r]   r[   r   r      sD        uuXqd+++,,O44KKKr]   r   r3   r'   c                       e Zd Z eddddd            eddd	d
dd           e eg  eddd                     d          gZde	de
e         fdZdS )ifla_af_spec_inet_rtattrrn   Nro   r>   c                     |dz   S rq   rk   rr   s     r[   ru   z!ifla_af_spec_inet_rtattr.<lambda>   rv   r]   rw   rz   r   IFLA_INET_UNSPECIFLA_INET_CONF)r   rI   r%   r]   c                     | j         dz
  S rq   r|   r}   s    r[   ru   z!ifla_af_spec_inet_rtattr.<lambda>   r~   r]   r   rK   r   r   rU   c                     t           j        S rc   r   r   s     r[   r   z.ifla_af_spec_inet_rtattr.default_payload_class   r   r]   rf   rg   rh   r   r   r   r   r   ri   rj   r    r   r   rk   r]   r[   r   r      s        tztDVDV	
 	
 	
 		(&  	
 	
 	
 	 ; ;    
	
 
	
 
	
K4"U "tF| " " " " " "r]   r   c                       e Zd Z eddddd            eddd	d
ddddddddd
d           e eg  eddd                     d          gZde	de
e         fdZdS )ifla_af_spec_inet6_rtattrrn   Nro   r>   c                     |dz   S rq   rk   rr   s     r[   ru   z"ifla_af_spec_inet6_rtattr.<lambda>   rv   r]   rw   rz   r   IFLA_INET6_UNSPECIFLA_INET6_FLAGSIFLA_INET6_CONFIFLA_INET6_STATSIFLA_INET6_MCASTIFLA_INET6_CACHEINFOIFLA_INET6_ICMP6STATSIFLA_INET6_TOKENIFLA_INET6_ADDR_GEN_MODEIFLA_INET6_RA_MTU)
r   rI   rJ   r3   rK            rL   	   r%   r]   c                     | j         dz
  S rq   r|   r}   s    r[   ru   z"ifla_af_spec_inet6_rtattr.<lambda>   r~   r]   r   rK   r   r   rU   c                     t           j        S rc   r   r   s     r[   r   z/ifla_af_spec_inet6_rtattr.default_payload_class   r   r]   r   rk   r]   r[   r   r      s        tztDVDV	
 	
 	
 		)('((,-(0)  	
 	
 	
" 	 ; ;    
	
 
	
 
	
+ KD"U "tF| " " " " " "r]   r   c                      e Zd Z eddddd            eddej        d	           e e e	dg e
d
           d f e	dg ed           d fg eddd                     d          gZdedee         fdZdS )ifla_af_spec_rtattrrn   Nro   r>   c                     |dz   S rq   rk   rr   s     r[   ru   zifla_af_spec_rtattr.<lambda>   rv   r]   rw   rz   r   r%   c                     | j         dz
  S rq   r|   r}   s    r[   ru   zifla_af_spec_rtattr.<lambda>       CK!O r]   r   c                     | j         dk    S )NrJ   rz   r}   s    r[   ru   zifla_af_spec_rtattr.<lambda>   s    CLA$5 r]   c                     | j         dz
  S rq   r|   r}   s    r[   ru   zifla_af_spec_rtattr.<lambda>  r   r]   c                     | j         dk    S )N
   r   r}   s    r[   ru   zifla_af_spec_rtattr.<lambda>  s    CLB$6 r]   r]   c                     | j         dz
  S rq   r|   r}   s    r[   ru   zifla_af_spec_rtattr.<lambda>  r~   r]   rK   r   r   rU   c                     t           j        S rc   r   r   s     r[   r   z)ifla_af_spec_rtattr.default_payload_class  r   r]   )rf   rg   rh   r   r   socketAddressFamilyr   r   r   r   r   r   ri   rj   r    r   r   rk   r]   r[   r   r      s4       tztDVDV	
 	
 	
 		*a!54@@@ (&4(C(C	   65	 (&5(C(C	   76	,  ; ;  / : =	
 	
 	
%KN"U "tF| " " " " " "r]   r   c                   h   e Zd Z eddddd            eddi dd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)i d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKi dLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydz           e e edd{          d| f edd}d~           d f e	dg e
d           d fg edd}d                     d          gZdedee         fdZdS )ifinfomsg_rtattrrn   Nro   r>   c                     |dz   S rq   rk   rr   s     r[   ru   zifinfomsg_rtattr.<lambda>  rv   r]   rw   rz   r   IFLA_UNSPECrI   IFLA_ADDRESSrJ   IFLA_BROADCASTr3   IFLA_IFNAMErK   IFLA_MTUr   	IFLA_LINKr   
IFLA_QDISCr   
IFLA_STATSrL   	IFLA_COSTr   IFLA_PRIORITYr   IFLA_MASTER   IFLA_WIRELESS   IFLA_PROTINFO   IFLA_TXQLEN   IFLA_MAP   IFLA_WEIGHTr4   IFLA_OPERSTATEr5   IFLA_LINKMODEr6   IFLA_LINKINFOr7   IFLA_NET_NS_PIDr8   IFLA_IFALIASr9   IFLA_NUM_VSr:   IFLA_VFINFO_LIST   IFLA_STATS64r;   IFLA_VF_PORTSr<   IFLA_PORT_SELFr=   IFLA_AF_SPEC   
IFLA_GROUP   IFLA_NET_NS_FD   IFLA_EXT_MASK   IFLA_PROMISCUITY   IFLA_NUM_TX_QUEUESrM   IFLA_NUM_RX_QUEUES!   IFLA_CARRIER"   IFLA_PHYS_PORT_ID#   IFLA_CARRIER_CHANGES$   IFLA_PHYS_SWITCH_ID%   IFLA_LINK_NETNSID&   IFLA_PHYS_PORT_NAME'   IFLA_PROTO_DOWN(   IFLA_GSO_MAX_SEGS)   IFLA_GSO_MAX_SIZE*   IFLA_PAD+   IFLA_XDP,   
IFLA_EVENT-   IFLA_NEW_NETNSID.   IFLA_IF_NETNSID/   IFLA_CARRIER_UP_COUNT0   IFLA_CARRIER_DOWN_COUNT1   IFLA_NEW_IFINDEX2   IFLA_MIN_MTUIFLA_MAX_MTUIFLA_PROP_LISTIFLA_ALT_IFNAMEIFLA_PERM_ADDRESSIFLA_PROTO_DOWN_REASONIFLA_PARENT_DEV_NAMEIFLA_PARENT_DEV_BUS_NAMEIFLA_GRO_MAX_SIZEIFLA_TSO_MAX_SIZEIFLA_TSO_MAX_SEGSIFLA_ALLMULTI)3   4   5   6   7   8   9   :   ;   <   =   r%   00:00:00:00:00:00c                     | j         dv S )N)rI   r  r   r}   s    r[   ru   zifinfomsg_rtattr.<lambda>i  s    CLL$@ r]   r]   c                     | j         dz
  S rq   r|   r}   s    r[   ru   zifinfomsg_rtattr.<lambda>n      S[ST_ r]   r   c                     | j         dv S N)r3   r   r}   s    r[   ru   zifinfomsg_rtattr.<lambda>p      CLF$: r]   c                     | j         dz
  S rq   r|   r}   s    r[   ru   zifinfomsg_rtattr.<lambda>x  r   r]   c                     | j         dk    S )Nr=   r   r}   s    r[   ru   zifinfomsg_rtattr.<lambda>z  s    CLD$8 r]   c                     | j         dz
  S rq   r|   r}   s    r[   ru   zifinfomsg_rtattr.<lambda>  r~   r]   r   r   rU   c                     t           j        S rc   r   r   s     r[   r   z&ifinfomsg_rtattr.default_payload_class  r   r]   )rf   rg   rh   r   r   r   r   r   r   r   r   r   ri   rj   r    r   r   rk   r]   r[   r   r     sI       tztDVDV	
 	
 	
 		?m?n? &? m	?
 j? k? l? l? k? o? m? o? o? m? j?  m!?" &#? ?$ o%?& o'?( ')?* n+?, m-?. (/?0 n1?2 o3?4 &5?6 n7?8 l9?: &;?< o=?> (??@ *A?B *C?D nE? ? ?F )G?H ,I?J +K?L )M?N +O?P 'Q?R )S?T )U?V jW?X jY?Z l[?\ (]?^ '_?` -a?b /c?d (e?f ng? ?h %&').,0)))%}? ? ?@ GD	
 D	
 D	
J 	 !-@AA@@ $&9T9T   ;: (&/(C(C	   98	0  ; ;  3 > A!	
 !	
 !	
SkKZ"U "tF| " " " " " "r]   r   c                       e Zd Z eddej                   edd           eddd           eddd           ed	de	rd
nde
           eddd           edg e          gZdS )	ifinfomsg
ifi_familyr   resifi_typer>   r%   	ifi_indexz=i	ifi_flagsrM   
ifi_change=Ir   N)rf   rg   rh   r
   r   r   r   r   r   r   r   r   r   ri   rk   r]   r[   r-  r-    s        lAv';<<	%j!&&&k1$'''
%BB#		
 	
 	lA4((($455KKKr]   r-  r4   r5   r6   r7   c                   $   e Zd Z eddddd            eddd	d
dddddddddddd           e e edd          d f edd          d f e	ddd           d fg e
ddd                     d !          gZd"ed#ee         fd$ZdS )%ifaddrmsg_rtattrrn   Nro   r>   c                     |dz   S rq   rk   rr   s     r[   ru   zifaddrmsg_rtattr.<lambda>  rv   r]   rw   rz   r   
IFA_UNSPECIFA_ADDRESS	IFA_LOCAL	IFA_LABELIFA_BROADCASTIFA_ANYCASTIFA_CACHEINFOIFA_MULTICAST	IFA_FLAGSIFA_RT_PRIORITYIFA_TARGET_NETNSID	IFA_PROTOr   rI   rJ   r3   rK   r   r   r   rL   r   r   r   r%   0.0.0.0c                 B    | j         o| j         j        dk    o| j        dv S )NrJ   rI   rJ   rK   parent
ifa_familyrz   r}   s    r[   ru   zifaddrmsg_rtattr.<lambda>  s-    CJ %?J1Q6%?L,>> r]   ::c                 B    | j         o| j         j        dk    o| j        dv S )Nr   rH  rI  r}   s    r[   ru   zifaddrmsg_rtattr.<lambda>  s-    CJ %?J1R7%?L,>> r]   r]   c                     | j         dz
  S rq   r|   r}   s    r[   ru   zifaddrmsg_rtattr.<lambda>  r$  r]   r   c                     | j         dv S r&  r   r}   s    r[   ru   zifaddrmsg_rtattr.<lambda>  r'  r]   c                     | j         dz
  S rq   r|   r}   s    r[   ru   zifaddrmsg_rtattr.<lambda>  r~   r]   rK   r   r   rU   c                     t           j        S rc   r   r   s     r[   r   z&ifaddrmsg_rtattr.default_payload_class  r   r]   )rf   rg   rh   r   r   r   r   r   r   r   r   ri   rj   r    r   r   rk   r]   r[   r7  r7    st       tztDVDV	
 	
 	
 		"#!!%#%%!'*!  #	
 	
 	
& 	  
I66? ? !T22? ? $&9T9T   ;:,  ; ;  / : =	
 	
 	
/7Kr"U "tF| " " " " " "r]   r7  c                       e Zd Z eddej                   edd           eddddddd	d
dddd           edd           eddd           e	dg e
          gZdS )	ifaddrmsgrK  r   ifa_prefixlen	ifa_flagsiIFA_F_SECONDARYIFA_F_NODADIFA_F_OPTIMISTICIFA_F_DADFAILEDIFA_F_HOMEADDRESSIFA_F_DEPRECATEDIFA_F_TENTATIVEIFA_F_PERMANENT)rI   rJ   rK   rL   r4   rM   @      	ifa_scope	ifa_indexr$   r%   r   N)rf   rg   rh   r
   r   r   r   r   r   r   r7  ri   rk   r]   r[   rS  rS    s        lAv';<<	/1%%
'#(')(''	 			
 	
 		+q!!k1$'''$455+KKKr]   rS  r8   r9   r:   RT_TABLE_UNSPECRT_TABLE_COMPATRT_TABLE_DEFAULTRT_TABLE_MAINRT_TABLE_LOCAL)r               c                      e Zd Z eddddd            eddi dd	d
dddddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6           e e edd7          d8 f edd9          d: f e	ddd;6          d< f edde
d;6          d= fg edd>d? @                    dA          gZdBedCee         fdDZdS )Ertmsg_rtattrrn   Nro   r>   c                     |dz   S rq   rk   rr   s     r[   ru   zrtmsg_rtattr.<lambda>  rv   r]   rw   rz   r   
RTA_UNSPECrI   RTA_DSTrJ   RTS_SRCr3   RTS_IIFrK   RTS_OIFr   RTA_GATEWAYr   RTA_PRIORITYr   RTA_PREFSRCrL   RTA_METRICSr   RTA_MULTIPATHr   RTA_FLOWr   RTA_CACHEINFOr   	RTA_TABLEr4   RTA_MARKr5   RTA_MFC_STATSr6   RTA_VIAr7   
RTA_NEWDSTRTA_PREFRTA_ENCAP_TYPE	RTA_ENCAPRTA_EXPIRESRTA_PADRTA_UIDRTA_TTL_PROPAGATERTA_IP_PROTO	RTA_SPORT	RTA_DPORT	RTA_NH_ID)r8   r9   r:   r   r;   r<   r=   r   r   r   r   r%   rF  c                 B    | j         o| j         j        dk    o| j        dv S )NrJ   rI   rJ   r   r   rJ  
rtm_familyrz   r}   s    r[   ru   zrtmsg_rtattr.<lambda>=  s/    CJ %EJ1Q6%EL,DD r]   rL  c                 B    | j         o| j         j        dk    o| j        dv S )Nr   r  r  r}   s    r[   ru   zrtmsg_rtattr.<lambda>C  s/    CJ %EJ1R7%EL,DD r]   r5  c                     | j         dv S )N)rK   r   r4   r   r}   s    r[   ru   zrtmsg_rtattr.<lambda>J  s    CL4F$F r]   c                     | j         dv S )N)r   r   r}   s    r[   ru   zrtmsg_rtattr.<lambda>O  r'  r]   r]   c                     | j         dz
  S rq   r|   r}   s    r[   ru   zrtmsg_rtattr.<lambda>U  r~   r]   r   r   r   rU   c                     t           j        S rc   r   r   s     r[   r   z"rtmsg_rtattr.default_payload_class\  r   r]   )rf   rg   rh   r   r   r   r   r   r   r   RT_CLASSr   ri   rj   r    r   r   rk   r]   r[   rl  rl    se       tztDVDV	
 	
 	
 		li i i	
 i m n m m o j o k j o  i!" l#$ !&!#)$!!!9  < C"	
 "	
 "	
F 	  
I66E E !T22E E j!666FF "	*atDDD::)2  ; ;  5 @ C"	
 "	
 "	
OJKX"U "tF| " " " " " "r]   rl  c                   V   e Zd Z eddej                   edd           edd           edd           edde           edddd	d
ddd           edddddddd           eddddddddddddd d!d"           ed#de	rd$nd%d&d'd(d)d*d+d,d-d.d/	           e
d0g e          g
Zd1S )2rtmsgr  r   rtm_dst_lenrtm_src_lenrtm_tos	rtm_tablertm_protocolRTPROT_UNSPECRTPROT_REDIRECTRTPROT_KERNELRTPROT_BOOTRTPROT_STATIC)r   rI   rJ   r3   rK   	rtm_scopeRT_SCOPE_UNIVERSERT_SCOPE_SITERT_SCOPE_LINKRT_SCOPE_HOSTRT_SCOPE_NOWHERE)r      rh  ri  rj  rtm_type
RTN_UNSPECRTN_UNICAST	RTN_LOCALRTN_BROADCASTRTN_ANYCASTRTN_MULTICASTRTN_BLACKHOLERTN_UNREACHABLERTN_PROHIBIT	RTN_THROWRTN_NATRTN_XRESOLVErE  	rtm_flagsrM   r3  RTM_F_NOTIFYRTM_F_CLONEDRTM_F_EQUALIZERTM_F_PREFIXRTM_F_LOOKUP_TABLERTM_F_FIB_MATCHRTM_F_OFFLOAD
RTM_F_TRAPRTM_F_OFFLOAD_FAILED)	rN   rO   rP   i      i    i @     i    r   N)rf   rg   rh   r
   r   r   r   r  r   r   r   rl  ri   rk   r]   r[   r  r  `  sp       lAv';<<	-##	-##	)Q	
 	

 	%'%#% 
	
 
	
 	&$$$' 
	
 
	
 	"#!%#%%'$!$ 	
 	
$ 	
%BB#%%'%,)'$2
 
		
 	
" 	L11GDKKKr]   r  r;   r<   r=   c                   .    e Zd Z edg ed          gZdS )	rtmsghdrsmsgsr  )	max_countN)rf   rg   rh   r   r"   ri   rk   r]   r[   r  r    s5        	
 	
 	
KKKr]   r  i  r   r   rS   rU   c                 <   t          j         t           j        t           j        t           j        z  t           j                  }|                    t           j        t           j        d           |                    t           j        t           j        d           	 |                    t          t          d           n# t          $ r Y nw xY w|                    d           	 |                    t          t          d           n# t          $ r Y nw xY w|                    t          t!          | g                               g }	 	 t!          |                    d                    }|s*t%          j        d           g |                                 S |j        D ]}|j        j        r|j        d	k    r|j        d	k    rt2          |v r|j        d
k    r|j        ry|j        d
         j        dk    rct%          j        d|                     d          |j        d
         j                                                    g c |                                 S |c |                                 S |!                    |           =# |                                 w xY w)z,
    Send / Receive a rtnetlink request
    r  i   rI   )r   r   )r  Ti  z+Failed to read the routes using RTNETLINK !r3   r   z2Scapy RTNETLINK error on %s: '%s'. Please report !z%nlmsg_type%)"r   
AF_NETLINKSOCK_RAWSOCK_CLOEXECNETLINK_ROUTE
setsockopt
SOL_SOCKET	SO_SNDBUF	SO_RCVBUFSOL_NETLINKNETLINK_EXT_ACKOSErrorbindNETLINK_GET_STRICT_CHKsendrj   r  recvr   warningcloser  r?   rA   r'   r   r   r   rz   debugsprintfro   decodeappend)rS   sockresultsr  msgs        r[   _sr1_rtrequestr    s   
 =&-- D 	OOF%v'7???OOF%v'7AAA_a8888    	IIf%;Q????    	IIeIC5)))**+++G	$TYYu--..D #$QRRR  	

 y $ $2 
#cn6I6I~**x33:QR??8 &(<(A(A'- T #N ; ; # 4 ; ; = =  
 $&II 	

 #NN 	

 s####%	$( 	

sC   !B; ;
CC!!D 
DD:J B*J J -J Jc           
         t          t          ddt          t          j                                        t	          | g           z            }i }|D ]}|j        }d}|j        }|j        D ]}|j        dk    r	|j	        } n|c|||d}|dk    r"t          j                            |          |d	<   |                    |t                                                    |           |S )
zG
    Return a mapping of all interfaces IP using a NETLINK socket.
    r/   $NLM_F_REQUEST+NLM_F_ROOT+NLM_F_MATCHr'   r?   rQ   )rK  r   NrI   )	af_familyindexaddressr   scope)r  r"   inttimerS  ra  rK  r   rz   ro   scapyutils6in6_getscope
setdefaultlistr  )	r  r  ipsr  ifindexr  familyattrr   s	            r[   _get_ipsr    s    
 $>$)++&&	
 	
 	

  
 
 
	

 
G ,.C 9 9-H 	 	D}$$- % # " D
 || % 9 9' B BWNN7DFF++224888Jr]   c            
         t          t          ddt          t          j                                        t	          g           z            } t                      }i }| D ]}|j        }d}d}|j        }|j        }g }	|j	        D ]A}
|
j
        dk    r|
j        }|
j
        dk    r!|
j        dd	                                         }B|||v r||         }	||||||	d
||<   |S )z:
    Read the interfaces list using a NETLINK socket.
    r+   r  r  )r   Nr!  rI   r3   )namer  flagsmactyper  )r  r"   r  r  r-  r  r1  r0  r2  r   rz   ro   r  )r  lifips
interfacesr  r  ifnamer  itypeifflagsr  r  s              r[   _get_if_listr    s2   
 $>$)++&&	
 	
 	

 
 
 
	
	 	G ZZFJ  -!-H 	5 	5D}$$m$&&ss+2244&  Wo  # #Jw r]   c            	         t          t          j                  } t                      }g }|                                 D ]G}|D ]B}|d         |v r6|                    |d         |d         ||d                  d         f           CH|S )z
    Returns a list of 3-tuples of the form (addr, scope, iface) where
    'addr' is the address of scope 'scope' associated to the interface
    'iface'.

    This is the list of all addresses of all interfaces available on
    the system.
    r  r  r  r  r  )r  r   AF_INET6r  valuesr  )r  ifacesresultintipips        r[   in6_getifaddrr  D  s     V_
-
-
-C^^FF Y Y 	Y 	YB'{f$$r)}bk6"W+;Nv;VWXXX	Y Mr]   c                    g }dD ]t}|                     t          t          ddt          t	          j                                        t          | t          d|          g          z                       ud |D             S )	z-
    Read routes using a NETLINK socket.
    )rf  re  r2   r  r  rz  )rz   ro   )r  r   c                 (    g | ]}|j         d k    |S )r;   r   ).0r  s     r[   
<listcomp>z _read_routes.<locals>.<listcomp>n  s$    ;;;Ccn&:&:C&:&:&:r]   )extendr  r"   r  r  r  rl  )r  r  rttables      r[   _read_routesr  X  s    
 G6 
 
- F!$)++..  
 ($kGLLL  
 	
 	
 	
 	
 <;7;;;;r]   c            	         g } t                      }t          t          j                  }|D ]}|j        t          j        k    rd}t          |j                  }d}d}d}d}	|j        D ]}
|
j        dk    rt          |
j
                  }"|
j        dk    r*|
j
        }||v r||         d         }Gt          |          }W|
j        dk    r|
j
        }j|
j        dk    r|
j
        }	}|
j        d	k    r|
j
        }|                     ||||||	f           |                                D ]a}|d
         j        rR	 t          d |d         D                       }n# t           $ r Y <w xY w|                     ddd|d         |df           b| S )z.
    Read IPv4 routes for current process
    r   rF   rI   rK   r  r   r   r   r  c              3   R   K   | ]"}|d          t           j        k    |d         V  #dS )r  r  N)r   AF_INETr  rt   s     r[   	<genexpr>zread_routes.<locals>.<genexpr>  sC        ~77 iL7777 r]   r  l      @ l      `    )r  r  r   r  r  r	   r  r   rz   r   ro   strr  r   	MULTICASTnextStopIteration)routesr  r  r  netmaskgwifaceaddrmetricr  r  _ifaces                r[   read_routesr   q  s   
 F^^F6>**G < <>V^++CO$$H 	% 	%D}$$4=))$&&F??"5M&1EEJJEE$&&]$&&$&&}sD"eT6:;;;;--//  '?$ 	  #E]    
 !   MMJ	6&>4    Ms   9E
E&%E&c            	      L   g } t                      }t          t          j                  }t	          t          j                  }|D ]}|j        t          j        k    rd}|j        }d}d}dd}	|j        D ]o}
|
j        dk    r|
j	        }|
j        dk    r*|
j	        }||v r||         d         :t          |          J|
j        dk    r|
j	        }]|
j        d	k    r|
j	        }	pfd
|                    |g           D             }t          j                            |||          }|r|                     |||||	f           |                                D ]E}|d         j        r6d |d         D             }|s$|                     ddd|d         |df           F| S )z.
    Read IPv6 routes for current process
    r  rL  r   r  rI   rK   r  r   r   c              3   :   K   | ]}|d          |d         fV  dS )r  r  Nrk   )r  rt   r  s     r[   r  zread_routes6.<locals>.<genexpr>  s2      VV!Qy\1W:u5VVVVVVr]   r  c                 J    g | ] }|d          t           j        k    |d         !S )r  r  )r   r  r  s     r[   r	  z read_routes6.<locals>.<listcomp>  s7       [>V_44 )444r]   r  zff00::rL   r  )r  r  r   r  r  r  r  r   rz   ro   r  getr  r  construct_source_candidate_setr  r   r  )r  r  r  lifaddrr  prefixplennhr  r  r  devaddrscsetr  addrsr  s                  @r[   read_routes6r-    s   
 F^^F6?++G111G C C>V_,,H 	' 	'D}$$$&&F??"5M&1EEJJEE$&&]$&&VVVVw{{5RT?U?UVVV|::64RR 	CMM64UD&ABBB--//  '?$ 
	   E
  MM!T6&>5#    Mr]   )E__doc__r   rW   r  scapy.utils6r  scapy.constsr   scapy.configr   scapy.errorr   scapy.packetr   r   scapy.utilsr   r	   scapy.fieldsr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   scapy.arch.commonr   typingr   r   r   r   r   r    r"   rm   r   r   r   r   r   r-  r7  rS  r  rl  r  r  r  r  r  r  	AF_UNSPECr  r  r  r  r   r-  rk   r]   r[   <module>r9     s   
        # # # # # #       # # # # # #        # " " " " " " "                                   & ) ( ( ( ( (               87 87 87 87 87v 87 87 87|" " " " "f " " "8    v    Hh1 - - - -" " " " "v " " ">$" $" $" $" $" $" $" $"N)" )" )" )" )"& )" )" )"Xo" o" o" o" o"v o" o" o"d       $ HiB / / / / HiB / / / / HiB / / / / HiB / / / /;" ;" ;" ;" ;"v ;" ;" ;"|       4 HiB / / / / HiB / / / / HiB / / / / 				 N" N" N" N" N"6 N" N" N"bE E E E EF E E EP He + + + + He + + + + He + + + +	 	 	 	 	 	 	 	  0 04< 0 0 0 0f ' " " " "J( ( (V  (< < <21 1 1h2 2 2 2 2r]   