
    7Yd:"                        d Z ddlZddlZddlZd Z	  ej                  ej
                  ej                  d      Zej                  d       [d Z	d Z
d Zd8dZdZdZdZdZdZdZdZeez  dz   ZdZdZdZdZ dZ! G d d      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'dZ(dZ)dZ*dZ+dZ,dZ-d)Z.d*Z/dZ0d+Z1d,Z2d-Z3d.Z4d/Z5d0Z6d1Z7dZ8 G d2 d3      Z9 G d4 d5      Z:d6 Z;d7 Z<y# ej                  $ rZ 	 ddlZd	 Z	d
 Z
d Zd8dZnC# e$ r; ddlZ ej"                  d      Z G d dej&                        Zd Z	d Z
d Zd8dZY nw xY wY w xY w)9z
Netlink message generation/parsing

Copyright 2007        Johannes Berg <johannes@sipsolutions.net>

GPLv2+; See copying for details.
    Nc                     d}t        t        |            D ]%  }|r|dz  dk(  r|dz  }|dt        ||         z  z  }' t        | df       t        |       y )N    r   
z%02x :)rangelenordprint)msgdataarris       )/usr/lib/python3/dist-packages/netlink.pyhexdumpr      sa    
D	
  QAFaK:33tAw<	# 
 Szs    )r   r   c                 &    | j                  |       y N)bind
descriptoraddrs     r   _nl_bindr      s    r   c                 "    | j                         S r   )getsocknamer   s    r   _nl_getsocknamer      s    %%''r   c                 &    | j                  |       y r   )sendr   r   s     r   _nl_sendr!   !   s    r   c                 $    | j                  |      S r   )recvfromr   bufss     r   _nl_recvr&   #   s    ""4((r   c                 R    t        j                  | j                         |d          y N   )_netlinkr   filenor   s     r   r   r   )   s    MM*++-tAw7r   c                 H    t        j                  | j                               S r   )r*   r   r+   r   s    r   r   r   +   s    ''
(9(9(;<<r   c                 L    t        j                  | j                         |       y r   )r*   r   r+   r    s     r   r!   r!   -   s    MM*++-s3r   c                 J    t        j                  | j                         |      S r   )r*   r#   r+   r$   s     r   r&   r&   /   s    $$Z%6%6%8$??r   c                   x    e Zd Zdej                  fdej                  fdej
                  fdej
                  fgZy)SOCKADDR_NL	nl_familynl_padnl_pid	nl_groupsN)__name__
__module____qualname__ctypesc_ushortc_int_fields_ r   r   r0   r0   7   s9    $foo6!foo6!fll3$fll35Hr   r0   c                     t        t        j                  dt        j                         d      }t
        j                  | j                         t        j                  |      t        j                  |            S Nr   )r0   socket
AF_NETLINKosgetpidlibcr   r+   r8   pointersizeofr   s     r   r   r   =   sR    v00!RYY[!DD99Z..0#^^D1#]]402 2r   c                 4   t        dddd      }t        j                  t        j                  |            }t        j                  | j                         t        j                  |      t        j                  |             |j                  |j                  fS r>   )
r0   r8   r:   rE   rC   r   r+   rD   r3   r4   )r   r   r	   s      r   r   r   C   so    q!Q*D,,v}}T23CZ..0#^^D1#^^C02 ;;..r   c                 `    t         j                  | j                         |t        |      d      S r>   )rC   r   r+   r	   r    s     r   r!   r!   K   s$    99Z..0#s3xCCr   c           
         t        dddd      }t        j                  t        j                  |            }t        j                  |      }t
        j                  | j                         ||dt        j                  |      t        j                  |            }t        j                  t        j                  |      |      }||j                  |j                  ffS r>   )r0   r8   r:   rE   create_string_bufferrC   r#   r+   rD   	string_atr3   r4   )r   r%   r   r	   bufrrets          r   r&   r&   N   s    q!Q*D,,v}}T23C--d3Cj//1!4$nnT2FNN34GIA ""6>>##6:Cdnn555r   r)               i   i         r   c                   T    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zd
 Zd Zd Zy)Attrc                 n    || _         t        |      rt        j                  |g| | _        y || _        y r   )typer	   structpackr   )self	attr_typer   valuess       r   __init__zAttr.__init__n   s,    	v;D262DIDIr   c                     t        j                  dt        | j                        dz   | j                        }t        | j                        }|dz   dz
  dz  |z
  }|| j                  z   d|z  z   S )NHHrO   r)       )rX   rY   r	   r   rW   )rZ   hdrlengthpads       r   _dumpz
Attr._dumpu   s`    kk$DIIq 0$))<TYY
Q"$/TYY,,r   c                 J    d| j                   t        | j                        fz  S )Nz<Attr type %d, data "%s">)rW   reprr   rZ   s    r   __repr__zAttr.__repr__{   s    *diidii-IIIr   c                 H    t        j                  d| j                        d   S )NBr   rX   unpackr   rh   s    r   u8zAttr.u8~       }}S$)),Q//r   c                 H    t        j                  d| j                        d   S )NHr   rl   rh   s    r   u16zAttr.u16   ro   r   c                 H    t        j                  d| j                        d   S )Nhr   rl   rh   s    r   s16zAttr.s16   ro   r   c                 H    t        j                  d| j                        d   S )NIr   rl   rh   s    r   u32zAttr.u32   ro   r   c                 H    t        j                  d| j                        d   S )Nr   r   rl   rh   s    r   s32zAttr.s32   ro   r   c                     | j                   S r   )r   rh   s    r   strzAttr.str   s    yyr   c                 >    | j                   j                  d      d   S )N r   )r   splitrh   s    r   nulstrzAttr.nulstr   s    yyt$Q''r   c                 ,    t        | j                        S r   )parse_attributesr   rh   s    r   nestedzAttr.nested   s    		**r   c                 ,    t        | j                        S r   )parse_app_entryr   rh   s    r   get_app_tablezAttr.get_app_table   s    tyy))r   N)r5   r6   r7   r]   re   ri   rn   rr   ru   rx   rz   r|   r   r   r   r<   r   r   rU   rU   m   s?    -J00000(+*r   rU   c                       e Zd Zd Zy)StrAttrc                 L    t         j                  | |dt        |      z  |       y )Nz%dsrU   r]   r	   rZ   r[   r   s      r   r]   zStrAttr.__init__   s    dIus4y'8$?r   Nr5   r6   r7   r]   r<   r   r   r   r      s    @r   r   c                       e Zd Zd Zy)
NulStrAttrc                 N    t         j                  | |dt        |      z  |d       y )Nz%dsBr   r   r   s      r   r]   zNulStrAttr.__init__   s    dIvD	'94Cr   Nr   r<   r   r   r   r      s    Dr   r   c                       e Zd Zd Zy)U32Attrc                 4    t         j                  | |d|       y )Nrw   rU   r]   rZ   r[   vals      r   r]   zU32Attr.__init__       dIsC0r   Nr   r<   r   r   r   r          1r   r   c                       e Zd Zd Zy)U8Attrc                 4    t         j                  | |d|       y )Nrk   r   r   s      r   r]   zU8Attr.__init__   r   r   Nr   r<   r   r   r   r      r   r   r   c                       e Zd Zd Zd Zy)Nestedc                      || _         || _        y r   )attrsrW   )rZ   r[   r   s      r   r]   zNested.__init__   s    
	r   c                     g }| j                   D ]!  }|j                  |j                                # dj                  |      }t	        |      }t        j                  d|dz   | j                        }||z   S )Nr   r_   rO   )r   appendre   joinr	   rX   rY   rW   )rZ   contentsattrrc   rb   s        r   re   zNested._dump   sg    JJ 	*DOODJJL)	*88H%Xkk$q$))4X~r   N)r5   r6   r7   r]   re   r<   r   r   r   r      s    r   r         	   
                  c                        e Zd ZddZd Zd Zy)MessageNc                     || _         || _        || _        d| _        |xs g }t	        |t
              r?g }|D ]!  }|j                  |j                                # dj                  |      | _	        y || _	        y )Nr   )
rW   flagsseqpid
isinstancelistr   re   r   payload)rZ   msg_typer   r   r   r   r   s          r   r]   zMessage.__init__   sn    	
-Rgt$H .

-.88H-DL"DLr   c                 ^   | j                   dk(  r|j                         | _         |j                  | _        t        | j                        }t	        j
                  d|dz   | j                  | j                  | j                   | j                        }|j                  || j                  z          y )Nr   IHHIIr   )	r   r   r	   r   rX   rY   rW   r   r   )rZ   connrc   rb   s       r   r   zMessage.send   sy    88r>xxzDH88T\\"kk'6C<**dhh: 			#$%r   c                     d| j                   | j                  | j                  | j                  t	        | j
                        fz  S )Nz:<netlink.Message type=%d, pid=%d, seq=%d, flags=0x%x "%s">)rW   r   r   r   rg   r   rh   s    r   ri   zMessage.__repr__   s<    KIItxx4::tDLL7IOK K 	Kr   )r   r   N)r5   r6   r7   r]   r   ri   r<   r   r   r   r      s    #
&Kr   r   c                   &    e Zd ZddZd Zd Zd Zy)
ConnectionNc                    t        j                   t         j                  t         j                  |      | _        | j                  j	                  t         j
                  t         j                  d       | j                  j	                  t         j
                  t         j                  d       t        | j                  t        j                         |f       t        | j                        \  | _        | _        d| _        || _        y )Ni   r   )r?   r@   SOCK_RAWr   
setsockopt
SOL_SOCKET	SO_SNDBUF	SO_RCVBUFr   rA   rB   r   r   groups_seq
unexpected)rZ   nltyper   unexpected_msg_handlers       r   r]   zConnection.__init__   s     --(9(9(.A""6#4#4f6F6FN""6#4#4f6F6FN299;"78 / @$+	0r   c                 0    t        | j                  |       y r   )r!   r   )rZ   r   s     r   r   zConnection.send   s    #&r   c           	          g }d}t        | j                        \  }\  }}|t        |      k  rt        j                  d|||dz          \  }}}}	}
t        |||	||dz   ||z          }|
|_        |j                  t        k(  rXt        j                  d|j                  d d       d    }|dk7  r,t        dt        j                  |      |fz        }||_        ||j                  |       ||z  }|t        |      k  r|S )Nr   r   r   r   rO   zNetlink error: %s (%d))r&   r   r	   rX   rm   r   r   rW   NLMSG_ERRORr   OSErrorrA   strerrorerrnor   )rZ   msgsoffsetr   nlpidnlgrpsmsglenr   r   r   r   r   r   errs                 r   recvzConnection.recv   s   $,T__$=!/5& H%06gxPVW]`bWbGc0d-FHeS#(E3"Vf_0UVCCGxx;&sCKKO<Q??A:!":bkk%>PRW=X"XYC %CIIKKfF H% r   c                 D    | xj                   dz  c_         | j                   S r(   )r   rh   s    r   r   zConnection.seq  s    		Q	yyr   )r   N)r5   r6   r7   r]   r   r   r   r<   r   r   r   r      s    1'*r   r   c                     i }t        |       rJt        j                  d| d d       \  }}t        || d|       ||<   |dz   dz
  dz  }| |d  } t        |       rJ|S )Nr_   rO   r)   r`   r	   rX   rm   rU   )r   r   attr_lenr[   s       r   r   r     so    E
d)$mmD$r(;)	4(+;<i\A%+HI	 d)
 Lr   c                     i }d}t        |       rOt        j                  d| d d       \  }}t        || d|       ||<   |dz   }|dz   dz
  dz  }| |d  } t        |       rO|S )Nr   r_   rO   r)   r`   r   )r   r   r   r   r[   s        r   r   r     s|    E	A
d)$mmD$r(;)	4(#34aE\A%+HI d) Lr   )i @  )=__doc__rA   r?   rX   r   r@   r   
_dummysockr   r   r   r!   r&   errorr*   ImportErrorr8   CDLLrC   	Structurer0   NLM_F_REQUESTNLM_F_MULTI	NLM_F_ACK
NLM_F_ECHO
NLM_F_ROOTNLM_F_MATCHNLM_F_ATOMIC
NLM_F_DUMP
NLMSG_NOOPr   
NLMSG_DONENLMSG_OVERRUNNLMSG_MIN_TYPErU   r   r   r   r   r   NETLINK_ROUTENETLINK_UNUSEDNETLINK_USERSOCKNETLINK_FIREWALLNETLINK_INET_DIAGNETLINK_NFLOGNETLINK_XFRMNETLINK_SELINUXNETLINK_ISCSINETLINK_AUDITNETLINK_FIB_LOOKUPNETLINK_CONNECTORNETLINK_NETFILTERNETLINK_IP6_FWNETLINK_DNRTMSGNETLINK_KOBJECT_UEVENTNETLINK_GENERICr   r   r   r   r<   r   r   <module>r      s   
  @6v00&//1EJOOF()r 	

;&!+
 

"* "*H@d @D D1d 11T 1T         K K># #J
S || 3616	8	=	4	@ '6v{{4 	5&** 	5	2	0	E
	6;'636s6   AC8 8E!DE!=EE!EE! E!