
    fP                        d dl mZ d dlZddlmZ  G d dej                        Z G d dej                        Z G d	 d
ej                        Z
 G d dej                        Z G d d      ZddZd Zd Z G d d      ZddZy)    )linesepN   )get_table_type_namec                   D    e Zd Zdej                  fdej
                  fgZy)OffsetUnionoffsetuoffsetN)__name__
__module____qualname__ctc_uint16c_int16_fields_     2/usr/lib/python3/dist-packages/bcc/disassembler.pyr   r      s    BKK(8RZZ*@AHr   r   c                   D    e Zd Zdej                  fdej
                  fgZy)ImmUnionimmuimmN)r
   r   r   r   c_uint32c_int32r   r   r   r   r   r      s    %rzz':;Hr   r   c                   v    e Zd ZdZdZdej                  fdej                  dfdej                  dfdefdefgZ	y	)
BPFInstrFieldsr   )oiopcodedst   srcr   r   N)
r
   r   r   _pack__anonymous_r   c_uint8r   r   r   r   r   r   r   r      sJ    FK2::&

A&

A&k"h	!Hr   r   c                   8    e Zd ZdZdZdefdej                  fgZy)BPFInstrr   sinstrN)	r
   r   r   r"   r#   r   r   c_uint64r   r   r   r   r&   r&   "   s$    FKn%'=>Hr   r&   c                   X   e Zd ZdZg dZ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*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFi dGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhi didjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddi dddddddddddddddddddddddddddddddddddddddddddddddZed        Zy)
BPFDecoderr   )]unspecmap_lookup_elemmap_update_elemmap_delete_elem
probe_readktime_get_nstrace_printkget_prandom_u32get_smp_processor_idskb_store_bytesl3_csum_replacel4_csum_replace	tail_callclone_redirectget_current_pid_tgidget_current_uid_gidget_current_commget_cgroup_classidskb_vlan_pushskb_vlan_popskb_get_tunnel_keyskb_set_tunnel_keyperf_event_readredirectget_route_realmperf_event_outputskb_load_bytesget_stackid	csum_diffskb_get_tunnel_optskb_set_tunnel_optskb_change_protoskb_change_typeskb_under_cgroupget_hash_recalcget_current_taskprobe_write_usercurrent_task_under_cgroupskb_change_tailskb_pull_datacsum_updateset_hash_invalidget_numa_node_idskb_change_headxdp_adjust_headprobe_read_strget_socket_cookieget_socket_uidset_hash
setsockoptskb_adjust_roomredirect_mapsk_redirect_mapsock_map_updatexdp_adjust_metaperf_event_read_valueperf_prog_read_value
getsockoptoverride_returnsock_ops_cb_flags_setmsg_redirect_mapmsg_apply_bytesmsg_cork_bytesmsg_pull_databindxdp_adjust_tailskb_get_xfrm_state	get_stackskb_load_bytes_relative
fib_lookupsock_hash_updatemsg_redirect_hashsk_redirect_hashlwt_push_encaplwt_seg6_store_byteslwt_seg6_adjust_srhlwt_seg6_action	rc_repeat
rc_keydownskb_cgroup_idget_current_cgroup_idget_local_storagesk_select_reuseportskb_ancestor_cgroup_idsk_lookup_tcpsk_lookup_udp
sk_releasemap_push_elemmap_pop_elemmap_peek_elemmsg_push_datamsg_pop_datarc_pointer_relr    )add32dstimm+=       )jajoffN@      )addr   r   r      )r   dstsrcr   r      )r   r   r   r      )sub32r   -=r      )jeq
jdstimmoff==r      )subr   r   r      )lddwr   Nr      )r   r   r   r      )r   
jdstsrcoffr   r      )r   r   r   r   r   )ldabswldabsNr   $   )mul32r   *=r   %   )jgtr   >r   '   )mulr   r   r   (   )ldabshr   N   ,   )r   r   r   r   -   )r   r   r   r   /   )r   r   r   r   0   )ldabsbr   N   4   )div32r   /=r   5   )jger   >=r   7   )divr   r   r   8   )ldabsdwr   Nr   <   )r   r   r   r   =   )r   r   r   r   ?   )r   r   r   r   r   )ldindwldindNr   D   )or32	dstimm_bw|=r   E   )jsetr   &r   G   )orr   r   r   H   )ldindhr   Nr   L   )r   r   r   r   M   )r   r   r   r   O   )r   r   r   r   P   )ldindbr   Nr   T   )and32r   &=r   U   )jner   !=r   W   )andr   r   r   X   )ldinddwr   Nr   \   )r   r   r   r   ]   )r   r   r   r   _   )r   r   r   r   a   )ldxw
ldstsrcoffNr   b   )stw
sdstoffimmNr   c   )stxw
sdstoffsrcNr   d   )lsh32r   <<=r   e   )jsgtr   s>r   g   )lshr   r   r   i   )ldxhr   Nr   j   )sthr   Nr   k   )stxhr   Nr   l   )r   r   r   r   m   )r   r   r   r   o   )r   r   r   r   q   )ldxbr   Nr   r   )stbr   Nr   s   )stxbr   Nr   t   )rsh32r   >>=r   u   )jsger   s>=r   w   )rshr   r  r   y   )ldxdwr   Nr   z   )stdwr   Nr   {   )stxdwr   Nr   |   )r  r   r  r   }   )r  r   r	  r      )r  r   r  r      )neg32r   ~r      )callr  Nr      )negr   r  r      )mod32r   %=r      )exitr   Nr      )modr   r  r      )r  r   r  r      )r"  r   r  r      )xor32r   ^=r      )jltr   <r      )xorr   r'  r      )r&  r   r'  r      )r)  r   r*  r      )r,  r   r'  r      )mov32r   =r      )jler   <=r      )movr   r2  r   )r1  r   r2  r   )r4  r   r5  r   )r7  r   r2  r   )arsh32r   s>>=r   )jsltr   s<r   )arshr   r9  r   )r8  r   r9  r   )r:  r   r;  r   )r<  r   r9  r   )jsler   zs<=r   )endian32r   endianr   )                                    c                    	 | j                   |j                     \  }}}}|dk(  rd|j                  ||j                  fz  dfS |dk(  rd|j                  ||j                  fz  dfS |dk(  r&dd|j
                  z  ||j
                  z   d	z   fz  dfS |d
k(  rd|j                  ||j                  fz  dfS |dk(  r=d|j                  ||j                  d|j
                  z  ||j
                  z   d	z   fz  dfS |dk(  r=d|j                  ||j                  d|j
                  z  ||j
                  z   d	z   fz  dfS |dk(  rh|t        d      |j                  dk(  rd|j                  |j                  fz  d	fS |j                  dz  |j                  z  }d|j                  |fz  d	fS |dk(  rd|d|j                  ddfS |dk(  r!d||j                  d|j                  z  fz  dfS |dk(  r,d|j                  ||j                  d|j
                  z  fz  dfS |dk(  r,d||j                  d|j
                  z  |j                  fz  dfS |dk(  r,d ||j                  d|j
                  z  |j                  fz  dfS |d!k(  rd"|j                  |||j                  fz  dfS |d#k(  r[|j                  | j                  k7  r,	 d$|| j                  |j                     |j                  fz  dfS |d&d|j                  z  dfS |d'k(  r|dfS t        d(      # t        $ r d%||j                  fz  dfcY S w xY w# t        $ r d)|j                  z  cY S w xY w)*Nr   z	r%d %s %dr   r   zr%d %s 0x%xr   zgoto %s <%d>z%+dr   r   z
r%d %s r%dr   zif r%d %s %d goto pc%s <%d>r   zif r%d %s r%d goto pc%s <%d>r   z1lddw requires two instructions to be disassembledzr%d = <map at fd #%d>r   z
r%d = 0x%xr   zr0 = *(uz*)skb[]r   zr0 = *(u%d*)skb[r%d %s]r   zr%d = *(u%d*)(r%d %s)r   z*(u%d*)(r%d %s) = %dr   z*(u%d*)(r%d %s) = r%dr   zr%d = %s (u%s)r%dr  z%s bpf_%s#%dz%s <unknown helper #%d> r   zunknown opcode classzunknown <0x%x>)opcodesr   r   r   r   r	   r!   	ExceptionBPF_PSEUDO_CALLbpf_helpers
IndexErrorKeyError)	clsr   ww1nameopclassopbitsr   s	            r   decodezBPFDecoder.decode   s   F	1&)kk!((&;#D'2t(""aeeR%77::K'$r166'::A==F"%!(();)*QXX)9); ;<=> > H$#quub!%%&88!;;L(4r1556;qxx6H67!((lQ6F8H HIJK K L(5AEE7<7I78188|a7G9I IJKL L F" :#$WXX66Q;2aeeQUU^CQFFvv|quu,#quucl2A55G#04aee<a??G#0D!%%49QUUO4E EFGH H L(.!%%quu271882D2F FGHI I L(-quu16!((1CQUU1L LMNO O L(.$271882Daee2M MNOP P E!*aeeRquu-EEqHHF"55C///K-sqvv7NPQPVPV0WWYZZZ #'8!;;F"Qw 677 & K8B<GJJK  	1#qxx00	1s   A L2 "L2 &*L2 "L2 4AL2 6AL2 8=L2 6.L2 %L2 ?%L2 %0L2 0L2 0L2 8#L2 L2 ;*L &L2 <L2 L2 L/,L2 .L//L2 2MMN)r
   r   r   rQ  rR  rO  classmethodr\  r   r   r   r+   r+   '   s   O\%K|`@t= `@=`@=`@ =`@ =	`@
 =`@ =`@ =`@ =`@ =`@ =`@ =`@ =`@ =`@ =`@ =`@  =!`@" =#`@$ =%`@& ='`@( =)`@* =+`@, =-`@. =/`@0 =1`@2 =3`@4 =5`@6 =7`@8 =9`@: =;`@< ==`@> =?`@@ =A`@B =C`@D =E`@F =G`@H =I`@J =K`@L =M`@N =O`@P =Q`@R =S`@T =U`@V =W`@X =Y`@Z =[`@\ =]`@^ =_`@` =a`@b =c`@d =e`@f =g`@h =i`@j =k`@l =m`@n =o`@p =q`@r =s`@t =u`@v =w`@x =y`@z ={`@| =}`@~ =`@@ =A`@B =C`@D =E`@F =G`@H =I`@J =K`@L =M`@N =O`@P =Q`@R =S`@T =U`@V =W`@X =Y`@Z =[`@\ =]`@^ =_`@` =a`@b =c`@d =e`@f =g`@h =i`@j >===========A`@GD G1 G1r   r+   c                 ^    t         j                  | ||      \  }}d| |j                  |fz  |fS )Nz%4d: (%02x) %s)r+   r\  r   )r   w0rW  r(   skips        r   disassemble_instructionra  3  s5    ##Ar2.KE4q"))U33T99r   c                    t        j                  t        j                  |       t        j                  t                    }t        t        |       dz        }|d   }d}g }t        d|      D ]:  }||   }|r|dz  }d|z  }nt        |dz
  ||      \  }}|j                  |       |}< t        |dz
  |d       \  }}|j                  |       |S )Nr   r   r   z%4d:      (64-bit upper word))
r   castc_char_pPOINTERr&   intlenrangera  append)	bpfstrptrnuminstrr_  r`  
instr_listr   rW  	instr_strs	            r   disassemble_strro  7  s    
''"++f%rzz(';
<C3v;?#H	QBDJ1h VAID71=I5a!eRDOIt)$ .hlBEOIti r   c                 T    d| z  g}|t        |      z  }t        j                  |      S )NzDisassemble of BPF program %s:)ro  r   join)	func_namerj  rm  s      r   disassemble_progrs  J  s-    2i@AJ/&))J<<
##r   c                   ,   e Zd Zi ej                  dej
                  dej                  dej                  dej                  dej                  dej                  dej                  dej                  d	ej                  d
ej                  dej                  dej                   dej"                  dej$                  dej&                  dz  dej(                  dz  dZed        Zedd       Zedd       Zed        Zedd       Zy)
MapDecoder_Boolcharwchar_tzunsigned charshortzunsigned shortrf  zunsigned intlongzunsigned longz	long longzunsigned long longfloatdoublezlong double   __int128zunsigned __int128c                 x   	 t        |t        j                        rd}|S t        |t        j                        rd}|S t        |t        j                        r7| j
                  |j                     dz   t        |j                        z   dz   }|S | j
                  |   }	 |S # t        $ r t        |      }Y |S w xY w)Nstructunion[rM  )

issubclassr   	StructureUnionArray	ctype2str_type_str_length_rT  )rU  tfield_type_names      r   get_ct_namezMapDecoder.get_ct_nameb  s    
	%!R\\*"*  Arxx(")  Arxx("%--"9C"?#ajj/"QTW"W
  #&--"2   	%!!fO	%s"   B! B! AB! B! !B98B9Nc                 *    |sy|d|||fz  S d||fz  S )N z[%d,%d +%d bit]z	[%d +%d] r   )rU  r	   sizeenabled	bitoffsets        r   format_size_infozMapDecoder.format_size_infoq  s/     $	4'@@@fd^++r   c           
         g }	 |j                   D ]  \  }}t        |t        j                        xs t        |t        j                        }| j                  |      }	t        ||      j                  }
t        j                  |      }| j                  ||
z   ||      }|rL|j                  |||	d       || j                  ||dz   ||
z         z  }|j                  |d|d       |j                  |||	d|d        	 |S # t        $ r d}|j                   D ]  }t        |      dk(  rE|\  }}}| j                  |      }	| j                  ||||      }|j                  d|||	||fz         n{|\  }}| j                  |      }	t        ||      j                  }
t        j                  |      }d}d}| j                  ||
z   ||      }|j                  |||	d|d       ||
z  }||z  } Y |S w xY w)	Nz {  z} ;rN  r      z%s%s%s %s:%d;)r   r  r   r  r  r  getattrr	   sizeofr  ri  print_ct_map
ValueErrorrg  )rU  r  indentr	   sizeinfo	map_lines
field_name
field_typeis_structuredr  field_offset
field_sizesizedescoffset_bitsfield
field_bitss                   r   r  zMapDecoder.print_ct_mapy  sG   	.	**+** B&
J!+J!E "B!+J!A "%//*"=&q*5<<YYz2
//0E0:HF $$68_%UV!1!1*284-28<2G"I II $$&*%EF$$VX5D5?&A BB\ 9  	*K *u:?9>6J
J&)ooj&AO"33FK4<j JH$$_8G8B8B8D &D E .3*J
&)ooj&AO#*1j#9#@#@L!#:!6J!"J"#K"33F\4I4> JH$$VX5D5?&A B l*Fz)1*2 9	*s   DD C/G?>G?c                    t        |t        j                        xs t        |t        j                        }| j	                  |      }|r3d|z  g}|| j                  |d|      z  }|j                  d|z         |S d|d|dg}|S )Nz  %s {z    r  z  } %s;r  rN  r  )r  r   r  r  r  r  ri  )rU  r  r  r  r  	type_namer  s          r   print_map_ctypezMapDecoder.print_map_ctype  s    #Ar||4 1#Arxx0 	OOA&	!Y/0I))!Vh)GGIY*56  
 (1*=>Ir   c                     d|||j                   |j                  fz  g}|| j                  |j                  d|      z  }|| j                  |j                  d|      z  }t        j                  |      S )Nz-Layout of BPF map %s (type %s, FD %d, ID %d):keyr  value)map_fdmap_idr  KeyLeafr   rq  )rU  map_namemap_objmap_typer  r  s         r   
decode_mapzMapDecoder.decode_map  s~    DHPHOHOHX X Y	 	S((eh(OO	S((w(RR	||I&&r   )FN)r  r   FF)r
   r   r   r   c_boolc_charc_wcharc_ubytec_shortc_ushortc_intc_uintc_longc_ulong
c_longlongc_ulonglongc_floatc_doublec_longdoublec_int64r)   r  r]  r  r  r  r  r  r   r   r   ru  ru  O  s   9H 9G9Z9 -9 X	9
 /9 69 O9 G9 -9 9 !69 X9 i9 .9 a9  q"6!9I$   , , 1 1f 
 
 ' 'r   ru  c                 J    t        |      }t        j                  | |||      S )Nr  )r   ru  r  )r  r  r  r  map_type_names        r   r  r    s&    '1M  7MH UUr   )Nr  )osr   ctypesr   tabler   r  r   r   r  r   r&   r+   ra  ro  rs  ru  r  r   r   r   <module>r     s      &B"(( B<rxx <!R\\ !?rxx ?
J1 J1X:&$
s' s'jVr   