
    h                     F	   d Z ddlZddlZddlZddlZddl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mZ ddl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'm(Z( dd
l)m*Z* ddl+m,Z,m-Z-m.Z.m/Z/m0Z0m1Z1  e2ed          sde_3        erej4        5                    ej6        7                    d                    Z8 ej9        ej:                  ej;        ej<         ej9        ej=                  ej<        ej=        ge8j>        _?        ej:        e8j>        _@        ndZ8g dZAer@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d0d1d2d3d4d5d6d7d8ZBne	r6i ddddddddddddddddd d!d"d#d$d%d&d5d(d6d*d3d,d/d.d9dd:ZBnve
r;i ddddddddddddddddd d!d"d#d$d%d&d5d(d6d*d3d,d;d.d<d=d>d?d@dAZBn9i ddddddddddddddddd d!d"d#d$d%d&d5d(d6d*d3d,d;d.d<dd/d=d0iZBdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQZCdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dae
rdbdcddndedfdddgdhdidjdkdldme
r
dndodpdqdrdsdtdundvdwdxdyZDdzd{d|d}d~dddddddZE G d de          ZF eeFejG        d            G d de          ZH G d de#          ZIe	r G d de          ZJn0er G d de          ZJne
r G d de          ZJn G d de          ZJe	r G d de          ZKn G d de          ZK eeFeKd*           er eeFeKd           e	r G d de          ZLner G d de          ZLn G d de          ZL eeFeLd&            eeFeLd(           er eeFeLd            eeFeLd            G d de          ZM eeFeMd,            eeFeMd.            G d de          ZN eeFeMd           e	r G d de          ZOn0er G d de          ZOne
r G d de          ZOn G d de          ZOe	r G d de          ZPn0er G d de          ZPne
r G d de          ZPn G d de          ZP eeFeP            G d de          ZQdZRe
rdZSndZSdZTerdZUndZUde/e         fdZVd ZWd ZXd ZYdS )zf
This file implements the PF_ROUTE API that is used to read the network
configuration of the machine.
    N)
BIG_ENDIANBSDNETBSDOPENBSDDARWIN)conf)log_runtime)Packetbind_layers)atol)in6_mask2cidrin6_getscope)ByteEnumField	ByteFieldConditionalFieldField
FlagsFieldIP6FieldIPFieldMACFieldMultipleTypeFieldPacketFieldPacketListFieldFieldListFieldPadFieldStrFieldStrFixedLenFieldStrLenFieldXStrLenField)	inet_pton)AnyDictOptionalListTupleTypePF_ROUTE   c)UP	BROADCASTDEBUGLOOPBACKPOINTOPOINT
NEEDSEPOCHDRV_RUNNINGNOARPPROMISCALLMULTIDRV_OACTIVESIMPLEXLINK0LINK1LINK2	MULTICAST
CANTCONFIGPPROMISCMONITOR	STATICARP	STICKYARPDYINGRENAMINGSPARE	NETLINK_1   RTM_ADD   
RTM_DELETE   
RTM_CHANGE   RTM_GET   
RTM_LOSING   RTM_REDIRECT   RTM_MISS   RTM_LOCK	   
RTM_OLDADD
   
RTM_OLDDEL   RTM_RESOLVE   RTM_ONEWADDR   RTM_ODELADDR   RTM_OOIFINFO   RTM_OIFINFO   RTM_IFANNOUNCERTM_IEEE80211RTM_SETGATERTM_LLINFO_UPD
RTM_IFINFORTM_OCHGADDRRTM_NEWADDRRTM_DELADDRRTM_CHGADDR)                     
RTM_DESYNCRTM_INVALIDATERTM_NEWMADDRRTM_DELMADDRrk   RTM_IFINFO2RTM_NEWMADDR2RTM_GET2)rl   rm   RTA_DSTRTA_GATEWAYRTA_NETMASKRTA_GENMASKRTA_IFPRTA_IFA
RTA_AUTHORRTA_BRDRTA_SRCRTA_SRCMASK	RTA_LABELRTA_BFDRTA_DNS
RTA_STATIC
RTA_SEARCH)rC   rE   rI   rQ   ra       @                          @  RTF_UPRTF_GATEWAYRTF_HOST
RTF_REJECTRTF_DYNAMICRTF_MODIFIEDRTF_DONERTF_MASKRTF_CONNECTEDRTF_XRESOLVE
RTF_LLDATA
RTF_STATICRTF_BLACKHOLE
RTF_PROTO2
RTF_PROTO1)rC   rE   rI   rQ   ra   r   r   r   r   r   r   r   r   r      RTF_PRCLONINGRTF_WASCLONED)i   i   RTF_SRCRTF_ANNOUNCE
RTF_PROTO3RTF_FIXEDMTU
RTF_PINNED	RTF_LOCALRTF_BROADCASTRTF_MULTICAST)i   i   i   i    i  @ i   RTF_IFSCOPERTF_CONDEMNED	RTF_IFREF	RTF_PROXY
RTF_ROUTERRTF_DEAD
RTF_GLOBAL)   i         i   i    i   @
RTF_STICKYRTF_RNH_LOCKEDRTF_GWFLAG_COMPAT)r   r   r   IFCAP_CSUM_IPv4IFCAP_CSUM_TCPv4IFCAP_CSUM_UDPv4IFCAP_VLAN_MTUIFCAP_VLAN_HWTAGGINGIFCAP_CSUM_TCPv6IFCAP_CSUM_UDPv6IFCAP_TSOv4IFCAP_TSOv6	IFCAP_LRO	IFCAP_WOL)rC   rE   rI   ra   r   r   r   r   r   r   r   c                       e Zd Z eddd           edd           edde          ger eddd          gng z   Zerd	e	d
e
e	ee	         f         fdZdS d	e	d
e
e	ee	         f         fdZdS )pfmsghdr
rtm_msglenr   =Hfmtrtm_versionrK   rtm_type
rtm_hdrlensreturnc                 h    | j         dk     r|dfS |d | j         dz
           || j         dz
  d          fS )NrM       r   selfr   s     Z/mounts/lovelace/software/anaconda3/lib/python3.11/site-packages/scapy/arch/bpf/pfroute.pyextract_paddingzpfmsghdr.extract_padding-  G    ""#v*t**+Qt/B/D/D-EEEr   c                 h    | j         dk     r|dfS |d | j         dz
           || j         dz
  d          fS )NrI   r   r   r   s     r   r   zpfmsghdr.extract_padding4  r   r   N)__name__
__module____qualname__r   r   r   	_RTM_TYPEr   fields_descbytesr%   r#   r    r   r   r   r     s        lA4(((	-##j!Y// 	|QD	)	)	)**	K  F	FU 	FuUHUO5K/L 	F 	F 	F 	F 	F 	F	FU 	FuUHUO5K/L 	F 	F 	F 	F 	F 	Fr   r   r   c                      e Zd Z edd           eddej                   e eddd          d            e e	dd          d	            e e
d
dd          d            e eddd          d            e eddd          d            e edd          d            e eddd          d            e eddd          d            e eddd          d            e eddd          d            e ed dd          d!            e ed"dd          d#            e ed$dd% &          d'            e e ed(d)          d* fg ed(dd+ &                    d,            e ed-dd. &          d/            e ed0dd1 &          d2            e ed3d4d5 &          d6            e ed7dd8 &          d9           gZd:ed;ee         fd<Zd)S )=sockaddrsa_lenr   	sa_familysin_portr   r   c                 ,    | j         t          j        k    S Nr   socketAF_INETpkts    r   <lambda>zsockaddr.<lambda>G      8W r   sin_addrc                 ,    | j         t          j        k    S r   r   r   s    r   r   zsockaddr.<lambda>J  s    0O r   sin_zero rQ   lengthc                 B    | j         t          j        k    o
| j        dk    S )NrO   )r   r   r   r   r   s    r   r   zsockaddr.<lambda>N  s    7JCJN r   	sin6_portc                 ,    | j         t          j        k    S r   r   r   AF_INET6r   s    r   r   zsockaddr.<lambda>S      8 r   sin6_flowinfo=Ic                 ,    | j         t          j        k    S r   r   r   s    r   r   zsockaddr.<lambda>W  r   r   	sin6_addr::c                 ,    | j         t          j        k    S r   r   r   s    r   r   zsockaddr.<lambda>Z  s    S]fo5U r   sin6_scope_idc                 ,    | j         t          j        k    S r   r   r   s    r   r   zsockaddr.<lambda>^  r   r   	sdl_indexc                 ,    | j         t          j        k    S r   r   r   AF_LINKr   s    r   r   zsockaddr.<lambda>b  s    &.9X r   sdl_typez=Bc                 ,    | j         t          j        k    S r   r  r   s    r   r   zsockaddr.<lambda>e  r   r   sdl_nlenc                 ,    | j         t          j        k    S r   r  r   s    r   r   zsockaddr.<lambda>h  r   r   sdl_alenc                 ,    | j         t          j        k    S r   r  r   s    r   r   zsockaddr.<lambda>k  r   r   sdl_slenc                 ,    | j         t          j        k    S r   r  r   s    r   r   zsockaddr.<lambda>n  r   r   	sdl_ifacec                     | j         S r   )r  r   s    r   r   zsockaddr.<lambda>q  s     r   )length_fromc                 ,    | j         t          j        k    S r   r  r   s    r   r   zsockaddr.<lambda>r      7 r   sdl_addrNc                     | j         dk    S )NrM   r	  r   s    r   r   zsockaddr.<lambda>v  s    #,!:K r   c                     | j         S r   r  r   s    r   r   zsockaddr.<lambda>w  s    CL r   c                 ,    | j         t          j        k    S r   r  r   s    r   r   zsockaddr.<lambda>y  r  r   sdl_selc                     | j         S r   )r  r   s    r   r   zsockaddr.<lambda>|  s    s| r   c                 ,    | j         t          j        k    S r   r  r   s    r   r   zsockaddr.<lambda>}  r  r   sdl_datac                 b    t          | j        | j        z
  | j        z
  | j        z
  dz
  d          S )NrQ   r   )maxr   r  r	  r  r   s    r   r   zsockaddr.<lambda>  s2    J-<s|KaOQR) ) r   c                 ,    | j         t          j        k    S r   r  r   s    r   r   zsockaddr.<lambda>  r  r   sdl_padr   c                     d| j         z
  S Nra   r   r   s    r   r   zsockaddr.<lambda>  s    cj r   c                 B    | j         dk     o| j        t          j        k    S r   )r   r   r   r  r   s    r   r   zsockaddr.<lambda>  s    
RKCMV^,K r   sa_datac                 0    | j         dk    r
| j         dz
  ndS )NrE   r   r!  r   s    r   r   zsockaddr.<lambda>  s    #*//
Qq r   c                 V    | j         t          j        t          j        t          j        fvS r   )r   r   r   r   r  r   s    r   r   zsockaddr.<lambda>  s!     r   payloadr   c                     t           j        S r   r   padding_layerr   r&  s     r   default_payload_classzsockaddr.default_payload_class  s    !!r   )r   r   r   r   r   r   AddressFamilyr   r   r   r   r   r   r   r   r   r   r   r&   r
   r+  r   r   r   r   r   @  s        		(Ak1f&:;;E*aT***,W,W	
 	
 	GJ""$O$O	
 	
 	ZA666JJ	
 	

 	E+qd+++88	
 	
 	E/1$///88	
 	
 	H[$'')U)U	
 	
 	E/1$///88	
 	

 	E+qd+++-X-X	
 	
 	E*aT***,W,W	
 	
 	E*aT***,W,W	
 	
 	E*aT***,W,W	
 	
 	E*aT***,W,W	
 	
 	KR5M5MNNN77	
 	
 	(:t,,.K.KLMJ8P8PQQQ  87	
 	
 	K	23K3KLLL77	
 	
 	L    87		
 		
 	LC5P5PQQQKK	
 	

 	LPP  
 	
 	
[ZKx"U "tF| " " " " " "r   r   c                   "     e Zd ZdZ fdZ xZS )SockAddrsFieldrC   c                     t           rd}nd}t          t          |                               |g t	          t          dd t                    |                     d S )NrI   rQ   r   )r   superr.  __init__r   r   r   )r   namealign	__class__s      r   r1  zSockAddrsField.__init__  sb     	EEEnd##,,[T844e<<	
 	
 	
 	
 	
r   )r   r   r   holds_packetsr1  __classcell__)r4  s   @r   r.  r.    s=        M	
 	
 	
 	
 	
 	
 	
 	
 	
r   r.  c                   b   e Zd Z edd           edd           edd           edd           eddd           ed	dd           ed
dd           eddd           eddd           eddd           eddd           eddd           eddd           eddd           eddd           eddd           eddd           eddd           eddd           eddd           edderdnde           eddd          gZ	de
d ee         fd!Zd"S )#if_dataifi_typer   ifi_addrlen
ifi_hdrlenifi_link_stateifi_mtur   r   
ifi_metricifi_rdomainifi_baudrate=Qifi_ipacketsifi_ierrorsifi_opacketsifi_oerrorsifi_collision
ifi_ibytes
ifi_obytesifi_imcastsifi_omcastsifi_iqdropsifi_oqdropsifi_noprotoifi_capabilitiesr   ifi_lastchangera   r   r&  r   c                     t           j        S r   r(  r*  s     r   r+  zif_data.default_payload_class      %%r   N)r   r   r   r   r   r   r   _IFCAPr   r   r   r&   r
   r+  r   r   r   r8  r8    s        Ij!$$ImQ''IlA&&I&**E)QD)))E,t,,,E----E.!...E.!...E----E.!...E----E/1$///E,t,,,E,t,,,E----E----E----E----E----J" )c	  -q<<<7
<	& 	&4< 	& 	& 	& 	& 	& 	&r   r8  c                      e Zd Z edd           edd           edd           eddd           eddd	           ed
dd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd	           eddd          gZdedee	         fdZ
dS )r8  r9  r   r:  r;  r<  r   r   r=  rA  r>  r@  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rM  rP  ra   r   r&  r   c                     t           j        S r   r(  r*  s     r   r+  zif_data.default_payload_class  rR  r   Nr   r   r   r   r   r   r   r   r&   r
   r+  r   r   r   r8  r8    s        Ij!$$ImQ''IlA&&E"A4000E)QD)))E,t,,,E.!...E.!...E----E.!...E----E/1$///E,t,,,E,t,,,E----E----E----E-----q<<<'
,	& 	&4< 	& 	& 	& 	& 	& 	&r   c                       e Zd Z edd           edd           edd           edd           edd           edd           edd           ed	d           ed
dd           eddd           eddd           eddd           eddd           eddd           eddd           eddd           eddd           eddd           eddd           eddd           eddd           eddd           eddd           eddd           eddd           eddd           eddd           ed dd          gZd!ed"ee         fd#Z	d$S )%r8  r9  r   ifi_typelenifi_physicalr:  r;  ifi_recvquotaifi_xmitquota
ifi_unusedr=  r   r   r>  r@  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rM  ifi_recvtimingifi_xmittimingrP  rA  ifi_unused2ifi_hwassistifi_reservedr&  r   c                     t           j        S r   r(  r*  s     r   r+  zif_data.default_payload_class  rR  r   N)
r   r   r   r   r   r   r   r&   r
   r+  r   r   r   r8  r8    sN        Ij!$$ImQ''Ina((ImQ''IlA&&Ioq))Ioq))IlA&&E)QD)))E,t,,,E.!...E.!...E----E.!...E----E/1$///E,t,,,E,t,,,E----E----E----E----E"A4000E"A4000E"A4000E----E.!...E.!...9
>	& 	&4< 	& 	& 	& 	& 	& 	&r   c                      e Zd Z edd           edd           edd           edd           edd           edd           eddd	
           eddd
           eddd
           eddd
           eddd
           eddd
           eddd
           eddd
           eddd
           eddd
           eddd
           eddd
           eddd
           eddd
           eddd
           eddd
           eddd
           eddd
           eddd           gZd!ed"ee	         fd#Z
d$S )%r8  r9  r   rY  r:  r;  r<  ifi_vhidifi_datalenr   r   r=  r   r>  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  r`  tttvra   r   r&  r   c                     t           j        S r   r(  r*  s     r   r+  zif_data.default_payload_class9  rR  r   NrV  r   r   r   r8  r8    s        Ij!$$Ina((ImQ''IlA&&I&**Ij!$$E----E)QD)))E,t,,,E.!...E.!...E----E.!...E----E/1$///E,t,,,E,t,,,E----E----E----E----E----E.!...E$t$$$T1R0003
8	& 	&4< 	& 	& 	& 	& 	& 	&r   c                       e Zd Z eddd           eddd           eddd           edderdnd	e           ed
derdnd	e           eddd           e e	dg e
          d           ed          gZdS )	if_msghdr	ifm_indexr   r   r   ifm_tableid_ifm_pad	ifm_addrsr   rO  	ifm_flags
ifm_xflagsr   ifm_datarQ   addrsN)r   r   r   r   r   r   
_RTM_ADDRS_bsd_iff_flagsr   r   r8  r.  r   r   r   r   rj  rj  ?  s        E+qd+++E----E*aT***J )c	  J )c	  E,t,,,HJG44  N7##+
r   rj  c                       e Zd Z edderdnde           edderdnde           eddd           ed	dd           e e	d
g e
          d           ed          gZdS )rj  rn  r   r   rO  ro  rk  r   r   _ifm_spare1rq  rQ   rr  N)r   r   r   r   r   rs  rt  r   r   r   r8  r.  r   r   r   r   rj  rj  Z  s        J )c	  J )c	  E+qd+++E----HJG44  N7##'
r   )r   rm   c                   `    e Zd Zej        dd          eddd           ed          gz   ZdS )
ifa_msghdrNrK   ifam_metricr   r   r   rr  r   r   r   rj  r   r   r.  r   r   r   rx  rx  y  J        +BQB/E----N7##3
 
r   rx  c                       e Zd Z eddd           eddd           edderdnde           ed	derdnde           ed
dd           eddd           e eddd          d           e	d          gZ
dS )rx  rk  r   r   r   _rtm_spare1ro  r   rO  rn  ifam_pidr   ifam_addrflagsry  rQ   rr  N)r   r   r   r   r   r   rt  rs  r   r.  r   r   r   r   rx  rx    s        E+qd+++E----J )c	  J )c	  E*aT***E"A4000HmQD111  N7##+
r   c                   `    e Zd Zej        dd          eddd           ed          gz   ZdS )rx  NrI   ry  r   r   r   rr  rz  r   r   r   rx  rx    r{  r   ro   rp   c                   ,    e Zd Zej        dd         ZdS )ifma_msghdrNrI   )r   r   r   rj  r   r   r   r   r  r    s        '+KKKr   r  c                   \    e Zd Z eddd           edd           eddd          gZdS )	if_announcemsghdr
ifan_indexr   r   r   	ifan_namer   	ifan_whatN)r   r   r   r   r   r   r   r   r   r  r    sL        lA4(((b!!k1$'''KKKr   r  c                   f   e Zd Z eddd           eddd           eddd           ed	dd           ed
dd           eddd           eddd           eddd           eddd           eddd           eddd           eddd          gZdedee         fdZdS )
rt_metrics
rmx_pksentr   rA  r   
rmx_expirez=q	rmx_locksr   rmx_mtu
rmx_refcntrmx_hopcountrmx_recvpipermx_sendpipermx_sshthreshrmx_rtt
rmx_rttvarrmx_padr&  r   c                     t           j        S r   r(  r*  s     r   r+  z rt_metrics.default_payload_class  rR  r   N	r   r   r   r   r   r   r&   r
   r+  r   r   r   r  r    s1       E,t,,,E,t,,,E+qd+++E)QD)))E,t,,,E.!...E.!...E.!...E/1$///E)QD)))E,t,,,E)QD)))
	& 	&4< 	& 	& 	& 	& 	& 	&r   r  c                   2   e Zd Z eddd           eddd           eddd           eddd           eddd           ed	dd           ed
dd           eddd           eddd           eddd          g
Zdedee         fdZdS )r  r  r   rA  r   r  r  r  r  r  r  r  r  r  r&  r   c                     t           j        S r   r(  r*  s     r   r+  z rt_metrics.default_payload_class  rR  r   Nr  r   r   r   r  r    s	       E+qd+++E)QD)))E.!...E.!...E.!...E/1$///E)QD)))E,t,,,E,t,,,E,t,,,
	& 	&4< 	& 	& 	& 	& 	& 	&r   c                   L   e Zd Z eddd           eddd           eddd           eddd           ed	dd           ed
dd           eddd           eddd           eddd           eddd           eddd          gZdedee         fdZ	dS )r  r  r   r   r   r  r  r  z=ir  r  r  r  r  r  
rmx_fillerr   ra   r   r&  r   c                     t           j        S r   r(  r*  s     r   r+  z rt_metrics.default_payload_class  rR  r   N
r   r   r   r   r   r   r   r&   r
   r+  r   r   r   r  r    s       E+qd+++E)QD)))E.!...E,t,,,E.!...E.!...E/1$///E)QD)))E,t,,,E,t,,,\3r:::
	& 	&4< 	& 	& 	& 	& 	& 	&r   c                      e Zd Z eddd           eddd           eddd           eddd           eddd           ed	dd           ed
dd           eddd           eddd           eddd           eddd           eddd           eddd          gZdedee         fdZ	dS )r  r  r   rA  r   r  r  r  r  r  r  r  r  r  
rmx_weight	rmx_nhidxr  r   ra   r   r&  r   c                     t           j        S r   r(  r*  s     r   r+  z rt_metrics.default_payload_class  rR  r   Nr  r   r   r   r  r    sF       E+qd+++E)QD)))E.!...E,t,,,E.!...E.!...E/1$///E)QD)))E,t,,,E,t,,,E,t,,,E+qd+++\3r:::
 	& 	&4< 	& 	& 	& 	& 	& 	&r   c                      e Zd Z eddd           eddd           edd           edd           edderd	nd
e           edderd	nd
e           eddd           eddd           eddd           eddd           eddd           e	 e
d e            e          d           ed          gZdS )	rt_msghdr	rtm_indexr   r   r   rtm_tableidrtm_priorityrtm_mpls	rtm_addrsr   rO  	rtm_flags	rtm_fmaskr   rtm_pidrtm_seq	rtm_errno	rtm_initsrtm_rmxrQ   rr  N)r   r   r   r   r   r   r   rs  
_RTM_FLAGSr   r   r  r.  r   r   r   r   r  r    sC       E+qd+++E----Ina((Ij!$$J )c	  J )c	  E+qd+++E)QD)))E)QD)))E+qd+++E+qd+++HIzz||Z@@  N7##5
r   r  c                   p   e Zd Z eddd           eddd           edderdnde           ed	derdnde           ed
dd           eddd           eddd           eddd           e eddd          d           e e	d e
            e
          d           ed          gZdS )r  r  r   r   r   r}  r  r   rO  r  r  r   r  r  rtm_user  rQ   r  rr  Nr   r   r   r   r   r   r  rs  r   r   r  r.  r   r   r   r   r  r  2  s9       E+qd+++E----J )c	  J )c	  E)QD)))E)QD)))E+qd+++E)QD)))Hk1$///  HIzz||Z@@  N7##7
r   c                   d   e Zd Z eddd           eddd           edderdnde           ed	derdnde           ed
dd           edderdnde           eddd           eddd           eddd           e e	d e
            e
          d           ed          gZdS )r  r  r   r   r   r}  r  r   rO  r  
rtm_refcntr   rtm_parentflagsrtm_reservedr  r  r  rI   rr  Nr  r   r   r   r  r  S  s9        E+qd+++E----J )c	  J )c	  E,t,,,J! )c	  E.!...E)QD)))E+qd+++HIzz||Z@@  N7##;
r   c                   \   e Zd Z eddd           eddd           edderdnde           ed	derdnde           ed
dd           eddd           eddd           eddd           eddd           e e	d e
            e
          d           ed          gZdS )r  r  r   r   r   r}  r  r   rO  r  r  r   r  r  r  r  rA  r  rQ   rr  Nr  r   r   r   r  r  w  s%       E+qd+++E----J )c	  J )c	  E)QD)))E)QD)))E+qd+++E+qd+++E+qd+++HIzz||Z@@  N7##1
r   c                   .    e Zd Z edg ed          gZdS )	pfmsghdrsmsgsr   )	max_countN)r   r   r   r   r   r   r   r   r   r  r    s5        	
 	
 	
KKKr   r  r   c                    t          j                    }t                              | t	          |           dt          j        |          dd          }|dk    rdS t          j        |j                  }t                              | t	          |           |t          j        |          dd          }|dk    rdS t          t          |                    S )z%
    Send / Receive a BSD sysctl
    Nr   )
ctypesc_size_tLIBCsysctllenbyrefcreate_string_buffervaluer  r   )miboldplenroldps       r   _sr1_bsdsysctlr    s     oGCW		 	A 	Avvt&w}55DCW		 	A 	AvvtU4[[!!!r   c            	         t           t          j        dt          t          j                  t
          dg} t          s(t          s!t          rd}nd}| 	                    |           t          j        t          |           z  |  } t          |           }|sg S t                      }g }|j        D ]B}|j        dk    rt          r|j        dk    r!|j        }|j        s0t          r|j        r|j        j        rK|j        }d}d}	d}
d}d}d}d}	 |j        r$t1          |j        |         j                  }|dz  }|j        r<|j        |         j        t          j        k    rd}
n|j        |         j        pd}
|dz  }|j        r|j        |         }|j        t          j        k    rt1          |j                  }	nn|j        d	v r=t?          j         d
|j!        dd         "                    dd                    d         }	n(t          #                    |j!        dd         d          }	|dz  }|j$        r|dz  }|j%        r+|j        |         j&        '                    d          }|dz  }|j(        r|j        |         j        }|dz  }n5# tR          $ r( tU          j+        dtY          |          z             Y w xY w|s||j-                 d         }|	                    ||	|
|||f           Dt          st          r|S |.                                D ]a}|d         j/        rR	 ta          d |d         D                       }n# tb          $ r Y <w xY w|	                    ddd|d         |df           b|S )z-
    Read the IPv4 routes using PF_ROUTE
    r   rI   rm   l    r   rC   z0.0.0.0)r      z<IN    bigignoreerrorsFailed to read route %sr2  flagsc              3   R   K   | ]"}|d          t           j        k    |d         V  #dS )	af_familyaddressN)r   r   .0xs     r   	<genexpr>zread_routes.<locals>.<genexpr>%  sC        ~77 iL7777 r   ipsl      @ l      `    )2CTL_NETr   r'   intr   NET_RT_DUMPr   r   r   appendr  c_intr  r  _get_if_listr  r   r  r   r   r  r   r  ry   r   rr  r   rz   r   r  r{   structunpackr#  rjust
from_bytesr|   r}   r  decoder~   	Exceptionr	   debugreprr  valuesr9   nextStopIteration)r  fibrespifacesroutesmsgr  rr  netmaskgwifaceaddrmetricinm_ifaces                    r   read_routesr    s   
 		FN	C  &  	CCC

3<#c(("S
)C#D 	^^FFy 2< 2<<3#,$2F2F| 	 	e) 	c.A.O 		} 39Q<011Q  9Q<)V^;;"BB1.;)BQ  Yq\<6>11,,DD\\11!=rz"1"~/C/CAw/O/OPPQRSDD>>"*RaR.%@@DQ  Q} 	!.55X5FFQ} y|,Q 	 	 	7$s))CDDDH	  	23=)&1EsD"eT6:;;;; & --//  '?$ 	  #E]    
 !   MMZF6ND#N   Ms%   E;J.J:9J:#M
MMc            	         t           t          j        dt          t          j                  t
          dg} t          s(t          s!t          rd}nd}| 	                    |           t          j        t          |           z  |  } t          |           }|sg S t                      }g }|j        D ]W}|j        dk    rt          r|j        dk    r!|j        }|j        s0t          r|j        r|j        j        rK|j        }d}d}	d}
d}d}g }d}	 |j        r|j        |         j        }|dz  }|j        r<|j        |         j        t          j        k    rd}
n|j        |         j        pd}
|dz  }|j        r|j        |         }|j        t          j        k    r8t=          t?          t          j        |j        |         j                            }	nZ|j        d	v r1t=          |j         d
d         !                    dd                    }	n t          "                    |j         d          }	|dz  }|j#        r|dz  }|j$        r+|j        |         j%        &                    d          }|dz  }|j'        r*|	                    |j        |         j                   |dz  }n5# tP          $ r( tS          j*        dtW          |          z             Y #w xY w|s||j,                 d         }|	                    ||	|
|||f           Yt          st          r|S |-                                D ]E}|d         j.        r6d |d         D             }|s$|	                    ddd|d         |df           F|S )z-
    Read the IPv6 routes using PF_ROUTE
    r   r  rI   rm   r   r   r   rC   )r  r   rM   Nra   r  r  r  r  r  r2  r  c                 J    g | ] }|d          t           j        k    |d         !S )r  r  )r   r   r  s     r   
<listcomp>z read_routes6.<locals>.<listcomp>  s3       !"q~7X7X)7X7X7Xr   r  zff00::rQ   r  )/r  r   r'   r  r   r  r   r   r   r  r  r  r  r  r  r  r   r  r   r   r  r   r  ry   rr  r   rz   r   r  r{   r   r    r#  ljustr  r|   r}   r  r  r~   r  r	   r  r  r  r  r9   )r  r  r  r  r  r  r  rr  prefixplennhr  r  
candidatesr  r  r  s                    r   read_routes6r  2  s   
 		FO	C  &  	CCC

3<#c(("S
)C#D 	^^FFy 7E 7E<3#,$2F2F| 	 	e) 	c.A.O 	
"	} 1/Q  9Q<)V^;;BB1/74BQ  Yq\<6?22(!&/39Q<3IJJ DD \\11(
122,,R99 DD
 >>"*e<<DQ  Q} 	!.55X5FFQ} !!#)A,"8999Q 	 	 	7$s))CDDDH	  	23=)&1EvtR
FCDDDD & --// K K'?$ 	K &,Um  E  MM8QfVneSIJJJMs   FJ.KKc                  4   t          j        dz  t          t          j        dt          t          j                  t          d          } t          |           }|si S i }|j	        D ]}|j
        dvr|j        j        s|j        }|j        j        |j        j        z   |j        j        z   |j        j        z   }|j        |         }|j        t          j        t          j        fvr|j        ||j        d}|j        t          j        k    r|j        |d<   n/|                    |j        t3          |j                  d           |                    |t7                                                    |           i }|j	        D ]}|j
        dk    rt:          r|j
        dk    r |j        }d	}	d
}
|j        }g }|j        D ]>}|j        t          j        k    r'|j         !                                }	|j"        r|j"        }
?|	||v r||         }|	|||
|d||<   |S )z;
    Read the interfaces list using a PF_ROUTE socket.
    rM   r   )rY   ro   )r  indexr  r  )r  scoper]   rm   Nz00:00:00:00:00:00)r2  r  r  macr  )#r  r  r  r   r'   r  	AF_UNSPECNET_RT_IFLISTr  r  r   rn  r~   rk  ry   rz   r{   r|   rr  r   r   r   r   updater   r   
setdefaultlistr  r   ro  r  r  r  r  )r  r  lifipsr  ifindex	addrindexr  data
interfacesifnamer
  ifflagsr  s                r   r  r    sa   
 <!	F	 C #D 	Fy 8 8<|++}$ 	-M!m'(m'( m'( 	 y#>&.&/!BBB}
 

 >V^++"mDOOKK#~)$.99    	'466**11$7777Jy  <3#,$2F2F-!-I 	( 	(D~//..00= (-C&  Wo  # #Jw r   )Z__doc__r  ctypes.utilr   r  scapy.constsr   r   r   r   r   scapy.configr   scapy.errorr	   scapy.packetr
   r   scapy.utilsr   scapy.utils6r   r   scapy.fieldsr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   scapy.pton_ntopr    typingr!   r"   r#   r$   r%   r&   hasattrr'   cdllLoadLibraryutilfind_libraryr  POINTERr  c_uintc_void_pr  r  argtypesrestypert  r   rs  r  rS  r   	raw_layerr   r.  r8  rj  rx  r  r  r  r  r  r  r  NET_RT_TABLEr  r  r  r  r  r   r   r   <module>r.     s   
        A A A A A A A A A A A A A A       # # # # # #              4 4 4 4 4 4 4 4                                     & & % % % % %                wvz"" FO  ;""6;#;#;C#@#@AADv|$$v''DK !,DKD  8 
 ]i 	l 	l	
 	i 	l 	n 	j 	j 	l 	l 	m 	n 	n 	n  	m!" 	#$ 	o%& 3  II6  Ai 	l 	l	
 	i 	l 	n 	j 	j 	l 	l 	m 	m 	m 	l  	!" 	l#$ 	%II(  ,i 	l 	l	
 	i 	l 	n 	j 	j 	l 	l 	m 	m 	m 	l  	n!" 	n#$ 	m%& )  II.i 	l 	l	
 	i 	l 	n 	j 	j 	l 	l 	m 	m 	m 	l  	n!" 	n#$ 	%& 	o' I. 






 
& 






2 2* 		
$$	
 	
 	
 #
 
-26 A2 2 2V 	
$&""$"$	
 	
 	
 $'*
 
Y2
j """ &""
 
"F F F F Fv F F F6 Hdn 3 3 3 3^" ^" ^" ^" ^"v ^" ^" ^"B
 
 
 
 
^ 
 
 
  J&!& !& !& !& !&& !& !& !& !&F  e&& & & & && & & & &6  H&"& "& "& "& "&& "& "& "& "&N& & & & && & & &D  2

 
 
 
 
F 
 
 
 
6
 
 
 
 
F 
 
 
0 Hi$ / / / /	 4K)d3333  )

 
 
 
 
V 
 
 
 
  !

 
 
 
 
V 
 
 
 
6
 
 
 
 
V 
 
 
 Hj4 0 0 0 0 Hj4 0 0 0 0	 5K*t4444K*t4444, , , , ,& , , , HkD 1 1 1 1 HkD 1 1 1 1        HkD 1 1 1 1  P&& & & & &V & & & &&  ;&& & & & &V & & & &"  (&& & & & &V & & & &(& & & & &V & & &*  A

 
 
 
 
F 
 
 
 
<  a

 
 
 
 
F 
 
 
 
>  @
 
  
  
  
  
F  
  
  
  
H
 
 
 
 
F 
 
 
: Hi      	 	 	 	 	 	 	 	 	 KKK	 MMM"4< " " " "B] ] ]@] ] ]@G G G G Gr   