grthtrhthjhtyjytjytkergtrhtrjytjerhrfh4:24 29/09/2026a ,-Þi:Âã:@sDddlmZzddlmZWney:ddlmZYn0ddlmZddlZ ddl m Z ddl Z ddl Z ddlZddlZddlZddlmZmZmZmZmZddlmZdd lmZdZd Zd Zd Zd ZdZdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0d Z1d!Z2d"Z3d#Z4d$Z5d%Z6ed&ed'ed(ed)ed*ed+e d,e!d-e"d.e#d/e$d0e%d1e&d2e'd3e(d4e)d5e*d6e+d7e,d8e-d9e.d:e/d;e0de3d?e4d@e5dAe6dBiZ7dCa8dDZ9dEZ:dFdG„Z;d€dHdI„ZdNdO„Z?dPdQ„Z@dRdS„ZAdTdU„ZBGdVdW„dWeƒZCGdXdY„dYeCƒZDGdZd[„d[eDƒZEGd\d]„d]eCƒZFGd^d_„d_eFƒZGGd`da„daeFƒZHGdbdc„dcƒZIGddde„deeFƒZJGdfdg„dgeFƒZKGdhdi„dieDƒZLGdjdk„dkeLƒZMGdldm„dmeFƒZNGdndo„doeCƒZOGdpdq„dqeCƒZPGdrds„dseFƒZQGdtdu„dueFƒZRGdvdw„dweFƒZSGdxdy„dyeFƒZTGdzd{„d{eDƒZUGd|d}„d}eCƒZVGd~d„dƒZWdS)‚é)Úprint_function)ÚMutableMapping)ÚstrftimeN)Úreduceé)ÚlibÚ _RAW_CB_TYPEÚ _LOST_CB_TYPEÚ_RINGBUF_CB_TYPEÚbcc_perf_buffer_opts)Úget_online_cpus)Úget_possible_cpuséééééééé é é é é ééééééééééééééééZHASHZARRAYZ PROG_ARRAYZPERF_EVENT_ARRAYZ PERCPU_HASHZ PERCPU_ARRAYZ STACK_TRACEZ CGROUP_ARRAYZLRU_HASHZLRU_PERCPU_HASHZLPM_TRIEZ ARRAY_OF_MAPSZ HASH_OF_MAPSZDEVMAPZSOCKMAPZCPUMAPZXSKMAPZSOCKHASHZCGROUP_STORAGEZREUSEPORT_SOCKARRAYZPERCPU_CGROUP_STORAGEZQUEUEZSTACKZ SK_STORAGEZ DEVMAP_HASHZ STRUCT_OPSZRINGBUFZ INODE_STORAGEZ TASK_STORAGEé(éAicCsXd}d}||||dks<||dkr*q<|d7}|d7}q||krT|dd…d}|S)NrÚrÚ*éÿÿÿÿú+©)ÚvalÚval_maxÚwidthÚiÚtextr0r0ú-/usr/lib/python3.9/site-packages/bcc/table.pyÚ_starsds  r7cCst||dd�S)N)Úsection_bucket)Ú_get_json_hist)ÚvalsÚval_typer8r0r0r6Ú get_json_histpsr<c Cs¾g}d}tt|ƒƒD]}||dkr|}qd}d}tt|ƒƒD]V}|dkr>||kr>|d}i}||d<t|ƒd|d<t||ƒ|d<| |¡|}q>tdƒ||dœ} |rº|d| |d<| S) Nrrrzinterval-startz interval-endÚcountz%Y-%m-%d %H:%M:%S)Útsr;Údata)ÚrangeÚlenÚintÚappendr) r:r;r8Z hist_listZmax_nonzero_idxr4ÚindexÚprevZlist_objZ histogramr0r0r6r9ss(  r9c Csd}d}d}t|ƒD] \}}|dkr(|}||kr|}q|dkrLd}d} t} nd}d} ttd ƒ} |dkrtt||ƒtd |d ƒD]~}d |>d ?} d |>d } | | kr®| d 8} ||} |râ| ràt| | | | | t| || ƒfƒd }q‚t| | | | | t| || ƒfƒq‚dS) Né@r.ré z# %-19s : count distributionz%10d -> %-10d : %-8d |%-*s|z- %-29s : count distributionz%20d -> %-20d : %-8d |%-*s|rrF)Ú enumerateÚ stars_maxrBÚprintr@r7)r:r;Ústrip_leading_zeroÚ log2_dist_maxÚidx_maxr2r4ÚvÚheaderÚbodyÚstarsZlowZhighr1r0r0r6Ú_print_log2_histŒs<       ÿ  ÿrRc Cs¼d}d}d}t|ƒD] \}}|dkr(|}||kr|}qd}d} t} |dkrVt||ƒtd|dƒD]R}||} |rš| r¶t| || | t| || ƒfƒd}qdt| || | t| || ƒfƒqddS)NrFr.rz# %-13s : count distributionz %-10d : %-8d |%-*s|rF)rHrIrJr@r7) r:r;rKrLrMr2r4rNrOrPrQr1r0r0r6Ú_print_linear_hist²s,    ÿ  ÿrScCs$z t|WStyYdS0dS)Nz )Ú map_type_nameÚKeyError)Úttyper0r0r6Úget_table_type_nameÏs  rWc Cs‚tjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtj tj tj tj tj tj dtj dtj dœ}t  d¡}g}t |jj|j¡}d}||k�rnt |jj|j|¡ ¡}t  d|¡}| d¡}| d¡} t  d| ¡räd} | | ¡}zD|�r| ||| d¡t| d¡ƒf¡n| ||| f¡Wn0t�ybtd | tjd �t d¡Yn0|d7}q’td tj fd |iƒS) Nr)ÚcharZs8z unsigned charÚu8zu8 *zchar *ZshortZs16zunsigned shortÚu16rBZs32Úenumz unsigned intÚu32Zlongz unsigned longz long longZs64zunsigned long longZu64Z__int128zunsigned __int128zvoid *z(\S+(?: \S+)*) ?\[([0-9]+)\]$rz (.*)#(.*)rzenum .*r[zGType: '%s' not recognized. Please define the data with ctypes manually.)Úfiler,Ú_fields_)!ÚctZc_charZc_ubyteZc_char_pZc_shortZc_ushortÚc_intÚc_uintZc_longZc_ulongZ c_longlongZ c_ulonglongZc_void_pÚreÚcompilerZbpf_perf_event_fieldsÚbpfÚmoduleÚ_nameZbpf_perf_event_fieldÚdecodeÚmatchÚgrouprCrBrUrJÚsysÚstderrÚexitÚtypeÚ Structure) Z event_mapZ ct_mappingZ array_typeÚfieldsÚ num_fieldsr4ZfieldÚmÚ field_nameZ field_typer0r0r6Ú_get_event_classÖsdè       (ÿÿ rsc KsBt |j|¡}d}|tkr.t|||||ƒ}�nú|tkrJt|||||ƒ}�nÞ|tkrft|||||ƒ}�nÂ|t kr„t ||||||ƒ}�n¤|t kr¨t |||||fi|¤Ž}�n€|t krÌt|||||fi|¤Ž}�n\|tkrèt|||||ƒ}�n@|tk�rt|||||ƒ}�n"|tk�r$t|||||ƒ}�n|tk�r@t|||||ƒ}nè|tk�r\t|||||ƒ}nÌ|tk�rxt|||||ƒ}n°|tk�r”t|||||ƒ}n”|tk�r°t|||||ƒ}nx|tk�rÌt |||||ƒ}n\|t!k�rèt"|||||ƒ}n@|t#k�sü|t$k�r t%||||ƒ}n|t&k�r(t'||||||ƒ}|dk�r>t(d|ƒ‚|S)z|Table(bpf, map_id, map_fd, keytype, leaftype, **kwargs) Create a python object out of a reference to a bpf table handleNzUnknown table type %d))rÚbpf_table_type_idreÚBPF_MAP_TYPE_HASHÚ HashTableÚBPF_MAP_TYPE_ARRAYÚArrayÚBPF_MAP_TYPE_PROG_ARRAYÚ ProgArrayÚBPF_MAP_TYPE_PERF_EVENT_ARRAYÚPerfEventArrayÚBPF_MAP_TYPE_PERCPU_HASHÚ PerCpuHashÚBPF_MAP_TYPE_PERCPU_ARRAYÚ PerCpuArrayÚBPF_MAP_TYPE_LPM_TRIEÚLpmTrieÚBPF_MAP_TYPE_STACK_TRACEÚ StackTraceÚBPF_MAP_TYPE_LRU_HASHÚLruHashÚBPF_MAP_TYPE_LRU_PERCPU_HASHÚ LruPerCpuHashÚBPF_MAP_TYPE_CGROUP_ARRAYÚ CgroupArrayÚBPF_MAP_TYPE_DEVMAPÚDevMapÚBPF_MAP_TYPE_CPUMAPÚCpuMapÚBPF_MAP_TYPE_XSKMAPÚXskMapÚBPF_MAP_TYPE_ARRAY_OF_MAPSÚ MapInMapArrayÚBPF_MAP_TYPE_HASH_OF_MAPSÚ MapInMapHashÚBPF_MAP_TYPE_QUEUEÚBPF_MAP_TYPE_STACKÚ QueueStackÚBPF_MAP_TYPE_RINGBUFÚRingBufÚ Exception) rdÚmap_idÚmap_fdÚkeytypeÚleaftypeÚnameÚkwargsrVÚtr0r0r6ÚTablesR            r¢c@s eZdZdDdd„Zdd„Zdd„Zdd „Zd d „Zd d „Zdd„Z dd„Z dd„Z dd„Z dd„Z dd„Zdd„Zdd„ZdEdd „ZdFd!d"„Zd#d$„ZdGd%d&„Zd'd(„Zd)d*„ZdHd,d-„Zd.d/„Zd0d1„Zd2d3„Zd4d5„ZGd6d7„d7eƒZd8d9„Zefd:d;„Z dId>d?„Z!dJd@dA„Z"dKdBdC„Z#dS)LÚ TableBaseNcCsn||_||_||_||_||_t |jj|j¡|_t  |jj|j¡|_ i|_ ||_ t t |jj|j¡ƒ|_dS©N)rdr›rœÚKeyÚLeafrrtrerVÚbpf_table_flags_idÚflagsÚ_cbsrfrBÚbpf_table_max_entries_idÚ max_entries)Úselfrdr›rœr�ržrŸr0r0r6Ú__init__Cs ÿzTableBase.__init__cCs|jSr¤)rœ©r¬r0r0r6Úget_fdPszTableBase.get_fdc CsNt t |j¡d¡}t |jj|j|t |ƒt  |¡¡}|dkrHt dƒ‚|j S)NrrzCould not printf key) r_Úcreate_string_bufferÚsizeofr¥rZbpf_table_key_snprintfrdrer›rAÚbyrefršÚvalue)r¬ÚkeyÚbufÚresr0r0r6Ú key_sprintfSsÿzTableBase.key_sprintfc CsNt t |j¡d¡}t |jj|j|t |ƒt  |¡¡}|dkrHt dƒ‚|j S©NrrzCould not printf leaf© r_r°r±r¦rZbpf_table_leaf_snprintfrdrer›rAr²ršr³©r¬Úleafrµr¶r0r0r6Ú leaf_sprintf[sÿzTableBase.leaf_sprintfcCs8| ¡}t |jj|j|t |¡¡}|dkr4tdƒ‚|S)NrzCould not scanf key) r¥rZbpf_table_key_sscanfrdrer›r_r²rš)r¬Zkey_strr´r¶r0r0r6Ú key_scanfcsÿzTableBase.key_scanfcCs8| ¡}t |jj|j|t |¡¡}|dkr4tdƒ‚|S©NrzCould not scanf leaf© r¦rZbpf_table_leaf_sscanfrdrer›r_r²rš©r¬Zleaf_strr»r¶r0r0r6Ú leaf_scanfksÿzTableBase.leaf_scanfcCs4| ¡}t |jt |¡t |¡¡}|dkr0t‚|S©Nr©r¦rZbpf_lookup_elemrœr_r²rU©r¬r´r»r¶r0r0r6Ú __getitem__ss zTableBase.__getitem__cCsDt |jt |¡t |¡d¡}|dkr@t t ¡¡}td|ƒ‚dS)NrzCould not update table: %s© rÚbpf_update_elemrœr_r²ÚosÚstrerrorÚ get_errnorš)r¬r´r»r¶Úerrstrr0r0r6Ú __setitem__zszTableBase.__setitem__cCs$t |jt |¡¡}|dkr t‚dSrÂ)rZbpf_delete_elemrœr_r²rU)r¬r´r¶r0r0r6Ú __delitem__€szTableBase.__delitem__c cs0|D]&}z||VWqty(Yq0qdSr¤©rU©r¬r´r0r0r6Ú itervalues‡s  zTableBase.itervaluesc cs4|D]*}z|||fVWqty,Yq0qdSr¤rÎrÏr0r0r6Ú iteritems�s  zTableBase.iteritemscCsdd„| ¡DƒS)NcSsg|]}|‘qSr0r0)Ú.0Úitemr0r0r6Ú ˜óz#TableBase.items..)rÑr®r0r0r6Úitems—szTableBase.itemscCsdd„| ¡DƒS)NcSsg|]}|‘qSr0r0©rÒr³r0r0r6rÔ›rÕz$TableBase.values..©rÐr®r0r0r6ÚvaluesšszTableBase.valuescCs| ¡D]}| |¡qdSr¤)ÚkeysrÍ©r¬Úkr0r0r6Úclear�s zTableBase.clearFcCsvd}}|s |s t d¡ddfS|s,|j}n|dks>||jkrFtdƒ‚|rV|j|ƒ}|rf|j|ƒ}t |¡||fS)aáAllocate keys and/or values arrays. Useful for in items_*_batch. Args: alloc_k (bool): True to allocate keys array, False otherwise. Default is False. alloc_v (bool): True to allocate values array, False otherwise. Default is False. count (int): number of elements in the array(s) to allocate. If count is None then it allocates the maximum number of elements i.e self.max_entries. Returns: tuple: (count, keys, values). Where count is ct.c_uint32, and keys and values an instance of ct.Array Raises: ValueError: If count is less than 1 or greater than self.max_entries. Nrrz Wrong count)r_Úc_uint32r«Ú ValueErrorr¥r¦)r¬Úalloc_kÚalloc_vr=rÚrÙr0r0r6Ú_alloc_keys_values¢s  zTableBase._alloc_keys_valuescCsrd}||fD]:}|r t|tjƒs$t‚t|ƒ}|dks>||jkr tdƒ‚q |rh|rht|ƒt|ƒkrhtdƒ‚t |¡S)aòCheck if the given keys or values have the right type and size. Args: keys (ct.Array): keys array to check values (ct.Array): values array to check Returns: ct.c_uint32 : the size of the array(s) Raises: ValueError: If length of arrays is less than 1 or greater than self.max_entries, or when both arrays length are different. TypeError: If the keys and values are not an instance of ct.Array rrzArray's length is wrongz(keys array length != values array length)Ú isinstancer_rxÚ TypeErrorrAr«rßrÞ)r¬rÚrÙZarr_lenÚelemr0r0r6Ú_sanity_check_keys_valuesÅs    z#TableBase._sanity_check_keys_valuesccs$|jdd�D]\}}||fVq dS)aLook up all the key-value pairs in the map. Args: None Yields: tuple: The tuple of (key,value) for every entries that have been looked up. Notes: lookup batch on a keys subset is not supported by the kernel. F©ÚdeleteN©Ú)_items_lookup_and_optionally_delete_batch©r¬rÜrNr0r0r6Úitems_lookup_batchãs  zTableBase.items_lookup_batchcCsf|durP|j|d�}t |jt |¡t |¡¡}|dkrbtdt t  ¡¡ƒ‚n|  ¡D]}dSdS)a¨Delete the key-value pairs related to the keys given as parameters. Note that if no key are given, it is faster to call lib.bpf_lookup_and_delete_batch than create keys array and then call lib.bpf_delete_batch on these keys. Args: ct_keys (ct.Array): keys array to delete. If an array of keys is given then it deletes all the related keys-values. If keys is None (default) then it deletes all entries. Yields: tuple: The tuple of (key,value) for every entries that have been deleted. Raises: Exception: If bpf syscall return value indicates an error. N)rÚrz#BPF_MAP_DELETE_BATCH has failed: %s) rærZbpf_delete_batchrœr_r²ršrÈrÉrÊÚitems_lookup_and_delete_batch)r¬Úct_keysÚct_cntr¶Ú_r0r0r6Úitems_delete_batchñs þ ÿ zTableBase.items_delete_batchcCsT|j||d�}t |jt |¡t |¡t |¡¡}|dkrPtdt t  ¡¡ƒ‚dS)aqUpdate all the key-value pairs in the map provided. The arrays must be the same length, between 1 and the maximum number of entries. Args: ct_keys (ct.Array): keys array to update ct_values (ct.Array): values array to update Raises: Exception: If bpf syscall return value indicates an error. )rÚrÙrz#BPF_MAP_UPDATE_BATCH has failed: %sN) rærZbpf_update_batchrœr_r²ršrÈrÉrÊ)r¬rîÚ ct_valuesrïr¶r0r0r6Úitems_update_batchs ý ÿzTableBase.items_update_batchccs$|jdd�D]\}}||fVq dS)a?Look up and delete all the key-value pairs in the map. Args: None Yields: tuple: The tuple of (key,value) for every entries that have been looked up and deleted. Notes: lookup and delete batch on a keys subset is not supported by the kernel. TrçNrérër0r0r6rí$s  z'TableBase.items_lookup_and_delete_batchTc csj|durtj}d}n tj}d}|jddd�\}}}t d¡}}d} |j| |_||j| rdt |¡ndt |¡t |t  |j ¡| ¡t |t  |j ¡| ¡t |¡ƒ} t  ¡} | |j7} | dkrà| t jkràtd|t | ¡fƒ‚| dkrì�q | |jkrú�q |jdkrD�q qDtd| ƒD]P} || } || }t| tjƒ�s@|  | ¡} t|tjƒ�sX|  |¡}| |fV�qdS)aýLook up and optionally delete all the key-value pairs in the map. Args: delete (bool) : look up and delete the key-value pairs when True, else just look up. Yields: tuple: The tuple of (key,value) for every entries that have been looked up and deleted. Raises: Exception: If bpf syscall return value indicates an error. Notes: lookup and delete batch on a keys subset is not supported by the kernel. TZBPF_MAP_LOOKUP_AND_DELETE_BATCHZBPF_MAP_LOOKUP_BATCH)ràrárNz%s has failed: %s)rZbpf_lookup_and_delete_batchZbpf_lookup_batchrâr_rÞr³rœr²r±r¥r¦rÊÚerrnoÚENOENTršrÈrÉr@rãrn)r¬rèZ bpf_batchZbpf_cmdZ ct_buf_sizerîròZ ct_out_batchrïÚtotalr¶Zerrcoder4rÜrNr0r0r6rê3sLÿ  û ÿ    z3TableBase._items_lookup_and_optionally_delete_batchcCs"t| ¡ƒD]}| ¡||<q dSr¤)ÚlistrÚr¦rÛr0r0r6ÚzeropszTableBase.zerocCs t |¡Sr¤)r£ÚIterr®r0r0r6Ú__iter__xszTableBase.__iter__cCs| ¡Sr¤©rúr®r0r0r6Úiter{rÕzTableBase.itercCs| ¡Sr¤rûr®r0r0r6rÚ|rÕzTableBase.keysc@s,eZdZdd„Zdd„Zdd„Zdd„Zd S) zTableBase.ItercCs||_d|_dSr¤)Útabler´)r¬rýr0r0r6r­szTableBase.Iter.__init__cCs|Sr¤r0r®r0r0r6rú‚szTableBase.Iter.__iter__cCs| ¡Sr¤©Únextr®r0r0r6Ú__next__„szTableBase.Iter.__next__cCs|j |j¡|_|jSr¤)rýrÿr´r®r0r0r6rÿ†szTableBase.Iter.nextN©Ú__name__Ú __module__Ú __qualname__r­rúrrÿr0r0r0r6rù~srùcCs^| ¡}|dur0t |jt |¡t |j¡¡}nt |jt |¡t |¡¡}|dkrZtƒ‚|SrÂ) r¥rZbpf_get_first_keyrœr_r²r±Zbpf_get_next_keyÚ StopIteration)r¬r´Znext_keyr¶r0r0r6rÿŠs ÿÿzTableBase.nextcCsÎ|jjdd}|jjdd}|dkrHt|jjƒdkrH|jjdd}| ¡D]L\}} t||ƒ} |rn|| ƒ} | | dg|¡} || <t||ƒ} | j| | <qPt| ¡ƒ} |r¶|| ƒ} | D]} |  | ¡qºdS)NrrZ__pad_1rr) r¥r^rArÖÚgetattrÚgetr³r÷rÚrC)r¬ÚtmpÚbucketsÚ bucket_fnÚbucket_sort_fnZ index_maxÚf1Úf2rÜrNÚbucketr:ZslotZ buckets_lstr0r0r6Údecode_c_struct˜s     zTableBase.decode_c_structr³ú Bucket ptrc Cs t| ¡tjƒrfi}g}| ||||¡|D]6}||} |rJ|||ƒf} n||f} tt| || ƒƒq,n6dgt} | ¡D]\} } | j | | j <qxtt| |ƒƒdS)a.print_json_hist(val_type="value", section_header="Bucket ptr", section_print_fn=None, bucket_fn=None, bucket_sort_fn=None): Prints a table as a json histogram. The table must be stored as log2. The val_type argument is optional, and is a column header. If the histogram has a secondary key, the dictionary will be split by secondary key If section_print_fn is not None, it will be passed the bucket value to format into a string as it sees fit. If bucket_fn is not None, it will be used to produce a bucket value for the histogram keys. If bucket_sort_fn is not None, it will be used to sort the buckets before iterating them, and it is useful when there are multiple fields in the secondary key. The maximum index allowed is log2_index_max (65), which will accommodate any 64-bit integer in the histogram. rN) rãr¥r_rnrrJr9Úlog2_index_maxrÖr³) r¬r;Úsection_headerÚsection_print_fnr r rr rr:r8rÜrNr0r0r6Úprint_json_hist¯s zTableBase.print_json_histc Csªt| ¡tjƒrri}g}| ||||¡|D]B} || } |rRtd||| ƒfƒntd|| fƒt| ||ƒq,n4dgt} | ¡D]\} } | j | | j <q„t| ||ƒdS)a“print_log2_hist(val_type="value", section_header="Bucket ptr", section_print_fn=None, bucket_fn=None, strip_leading_zero=None, bucket_sort_fn=None): Prints a table as a log2 histogram. The table must be stored as log2. The val_type argument is optional, and is a column header. If the histogram has a secondary key, multiple tables will print and section_header can be used as a header description for each. If section_print_fn is not None, it will be passed the bucket value to format into a string as it sees fit. If bucket_fn is not None, it will be used to produce a bucket value for the histogram keys. If the value of strip_leading_zero is not False, prints a histogram that is omitted leading zeros from the beginning. If bucket_sort_fn is not None, it will be used to sort the buckets before iterating them, and it is useful when there are multiple fields in the secondary key. The maximum index allowed is log2_index_max (65), which will accommodate any 64-bit integer in the histogram. ú %s = %sú %s = %rrN) rãr¥r_rnrrJrRrrÖr³© r¬r;rrr rKr rr rr:rÜrNr0r0r6Úprint_log2_histÓs ÿ  zTableBase.print_log2_histc CsÖt| ¡tjƒrti}g}| ||||t¡|D]B} || } |rTtd||| ƒfƒntd|| fƒt| ||ƒq.n^dgt} | ¡D]>\} } z| j | | j <Wq†t yÂt d| j tfƒ‚Yq†0q†t| ||ƒdS)a¶print_linear_hist(val_type="value", section_header="Bucket ptr", section_print_fn=None, bucket_fn=None, strip_leading_zero=None, bucket_sort_fn=None) Prints a table as a linear histogram. This is intended to span integer ranges, eg, from 0 to 100. The val_type argument is optional, and is a column header. If the histogram has a secondary key, multiple tables will print and section_header can be used as a header description for each. If section_print_fn is not None, it will be passed the bucket value to format into a string as it sees fit. If bucket_fn is not None, it will be used to produce a bucket value for the histogram keys. If the value of strip_leading_zero is not False, prints a histogram that is omitted leading zeros from the beginning. If bucket_sort_fn is not None, it will be used to sort the buckets before iterating them, and it is useful when there are multiple fields in the secondary key. The maximum index allowed is linear_index_max (1025), which is hoped to be sufficient for integer ranges spanned. rrrz5Index in print_linear_hist() of %d exceeds max of %d.N) rãr¥r_rnrÚlinear_index_maxrJrSrÖr³Ú IndexErrorrr0r0r6Úprint_linear_histûs*ÿ   ÿzTableBase.print_linear_hist)N)FFN)NN)N)T)r³rNNN)r³rNNNN)r³rNNNN)$rrrr­r¯r·r¼r½rÁrÅrÌrÍrÐrÑrÖrÙrÝrârærìrñrórírêrørúrürÚÚobjectrùrÿrrrrrr0r0r0r6r£AsN   #   =  ÿ $þ (þr£cs$eZdZ‡fdd„Zdd„Z‡ZS)rvcstt|ƒj|i|¤ŽdSr¤)Úsuperrvr­©r¬Úargsr ©Ú __class__r0r6r­,szHashTable.__init__cCsd}|D] }|d7}q|S©Nrrr0©r¬r4rÜr0r0r6Ú__len__/szHashTable.__len__©rrrr­r$Ú __classcell__r0r0r r6rv+s rvcseZdZ‡fdd„Z‡ZS)r†cstt|ƒj|i|¤ŽdSr¤)rr†r­rr r0r6r­5szLruHash.__init__©rrrr­r&r0r0r r6r†4sr†cspeZdZ‡fdd„Zdd„Zdd„Z‡fdd„Z‡fd d „Z‡fd d „Zd d„Z dd„Z Gdd„de ƒZ ‡Z S)Ú ArrayBasecstt|ƒj|i|¤ŽdSr¤)rr(r­rr r0r6r­9szArrayBase.__init__cCsVt|tƒr(|dkrt|ƒ|}| |¡}t|tjƒs.raw_cb_c sNz ˆ|ƒWn<tyH}z$|jtjkr0tƒn|‚WYd}~n d}~00dSr¤rK)rðZlostrO)rHr0r6Úlost_cb_æs   z2PerfEventArray._open_perf_buffer..lost_cb_r.zCould not open perf buffer)rr r_rAr ÚpidrPrIrZbpf_open_perf_buffer_optsr²ršZperf_reader_fdr¦r¥rdr?r>r©r<) r¬rPrFrGrHrIrQrRÚfnZlost_fnZoptsÚreaderr/r0)rFrPrHr6rEÝs   z PerfEventArray._open_perf_bufferr.cCsBt ||||¡}|dkr tdƒ‚| |¡|| |¡<||j|<dS)Nrzbpf_open_perf_event failed)rZbpf_open_perf_eventršr¦r¥r<)r¬rPÚtypÚconfigrSr/r0r0r6Ú_open_perf_eventÿs zPerfEventArray._open_perf_eventcCs tƒD]}| ||||¡qdS)zæopen_perf_event(typ, config) Configures the table such that calls from the bpf program to table.perf_read(CUR_CPU_IDENTIFIER) will return the hardware counter denoted by event ev on the local cpu. N)r rX)r¬rVrWrSr4r0r0r6Úopen_perf_events zPerfEventArray.open_perf_event)rNr)r.)r.) rrrr­r5rÍrDrJrErXrYr&r0r0r r6r|¥s   " r|csTeZdZ‡fdd„Z‡fdd„Zdd„Z‡fdd„Zd d „Zd d „Zd d„Z ‡Z S)r~cs¨| dd¡|_tt|ƒj|i|¤Ž|j|_ttƒƒ|_ t   |j¡d|_ |j dkrd|j|j |_n@|jt j kr€t j|j |_n$|jt jkrœt j|j |_ntdƒ‚dS©NÚreducerrrzLeaf must be aligned to 8 bytes)Úpopr[rr~r­r¦ÚsLeafrAr Ú total_cpur_r±Ú alignmentraÚc_uint64r`Úc_int64rrr r0r6r­s    zPerCpuHash.__init__csPtt|ƒ |¡}|jdkr |}n,|j|jƒ}td|jƒD]}||||<q:|SrÂ)rr~rÅr_r]r^r@©r¬r´ÚresultÚretr4r r0r6Úgetvalue$s zPerCpuHash.getvaluecCs&|jrt|j| |¡ƒS| |¡SdSr¤©r[rrerÏr0r0r6rÅ.szPerCpuHash.__getitem__cstt|ƒ ||¡dSr¤)rr~rÌr*r r0r6rÌ4szPerCpuHash.__setitem__cCs,t| ¡tjƒrtdƒ‚| t| |¡ƒ¡S©Nz6Leaf must be an integer type for default sum functions©rãr¦r_rnrr]ÚsumrerÏr0r0r6ri7szPerCpuHash.sumcCs,t| ¡tjƒrtdƒ‚| t| |¡ƒ¡S©Nz6Leaf must be an integer type for default max functions©rãr¦r_rnrr]ÚmaxrerÏr0r0r6rl<szPerCpuHash.maxcCs| |¡}|j|jSr¤©rir³r^©r¬r´rcr0r0r6ÚaverageAs zPerCpuHash.average) rrrr­rerÅrÌrirlror&r0r0r r6r~s   r~cseZdZ‡fdd„Z‡ZS)rˆcstt|ƒj|i|¤ŽdSr¤)rrˆr­rr r0r6r­FszLruPerCpuHash.__init__r'r0r0r r6rˆEsrˆcs\eZdZ‡fdd„Z‡fdd„Zdd„Z‡fdd„Zd d „Zd d „Zd d„Z dd„Z ‡Z S)r€cs¨| dd¡|_tt|ƒj|i|¤Ž|j|_ttƒƒ|_ t   |j¡d|_ |j dkrd|j|j |_n@|jt j kr€t j|j |_n$|jt jkrœt j|j |_ntdƒ‚dSrZ)r\r[rr€r­r¦r]rAr r^r_r±r_rar`r`rarrr r0r6r­Js    zPerCpuArray.__init__csPtt|ƒ |¡}|jdkr |}n,|j|jƒ}td|jƒD]}||||<q:|SrÂ)rr€rÅr_r]r^r@rbr r0r6re\s zPerCpuArray.getvaluecCs&|jrt|j| |¡ƒS| |¡SdSr¤rfrÏr0r0r6rÅfszPerCpuArray.__getitem__cstt|ƒ ||¡dSr¤)rr€rÌr*r r0r6rÌlszPerCpuArray.__setitem__cCs| |¡dSr¤r.rÏr0r0r6rÍoszPerCpuArray.__delitem__cCs,t| ¡tjƒrtdƒ‚| t| |¡ƒ¡SrgrhrÏr0r0r6risszPerCpuArray.sumcCs,t| ¡tjƒrtdƒ‚| t| |¡ƒ¡SrjrkrÏr0r0r6rlxszPerCpuArray.maxcCs| |¡}|j|jSr¤rmrnr0r0r6ro}s zPerCpuArray.average) rrrr­rerÅrÌrÍrirlror&r0r0r r6r€Is   r€cs$eZdZ‡fdd„Zdd„Z‡ZS)r‚cstt|ƒj|i|¤ŽdSr¤)rr‚r­rr r0r6r­‚szLpmTrie.__init__cCst‚dSr¤)ÚNotImplementedErrorr®r0r0r6r$…szLpmTrie.__len__r%r0r0r r6r‚�s r‚csZeZdZdZdZdZdZdZ‡fdd„ZGdd „d e ƒZ dd d „Z d d„Z dd„Z ‡ZS)r„érGrrrcstt|ƒj|i|¤ŽdSr¤)rr„r­rr r0r6r­�szStackTrace.__init__c@s.eZdZd dd„Zdd„Zdd„Zdd „ZdS) zStackTrace.StackWalkerNcCs||_d|_||_||_dSr,)ÚstackÚnÚresolver¨)r¬rrr¨rtr0r0r6r­”szStackTrace.StackWalker.__init__cCs|Sr¤r0r®r0r0r6rúšszStackTrace.StackWalker.__iter__cCs| ¡Sr¤rþr®r0r0r6r�szStackTrace.StackWalker.__next__cCs¬|jd7_|jtjkr tƒ‚|jtj@rZ|jj|j}|jtj ksR|jtj krhtƒ‚n|jj |j}|dkr˜t   ¡ d¡r’|jdkr˜|jdkr˜tƒ‚|jr¨| |¡S|S)NrrZppcr)rsr„Ú MAX_DEPTHrr¨ÚBPF_F_STACK_BUILD_IDrrZtraceÚstatusÚBPF_STACK_BUILD_ID_IPÚBPF_STACK_BUILD_ID_EMPTYÚipÚplatformÚmachineÚ startswithrt)r¬Úaddrr0r0r6rÿ s    ÿ*zStackTrace.StackWalker.next)Nrr0r0r0r6Ú StackWalker“s rNcCst || |¡|j|¡Sr¤)r„rr¥r¨)r¬Zstack_idrtr0r0r6Úwalk³szStackTrace.walkcCsd}|D] }|d7}q|Sr"r0r#r0r0r6r$¶szStackTrace.__len__cCsdSr¤r0r®r0r0r6rÝ»szStackTrace.clear)N)rrrrurvryZBPF_STACK_BUILD_ID_VALIDrxr­rrr€r$rÝr&r0r0r r6r„‰s  r„cseZdZ‡fdd„Z‡ZS)rŒcstt|ƒj|i|¤ŽdSr¤)rrŒr­rr r0r6r­¿szDevMap.__init__r'r0r0r r6rŒ¾srŒcseZdZ‡fdd„Z‡ZS)rŽcstt|ƒj|i|¤ŽdSr¤)rrŽr­rr r0r6r­ÃszCpuMap.__init__r'r0r0r r6rŽÂsrŽcseZdZ‡fdd„Z‡ZS)r�cstt|ƒj|i|¤ŽdSr¤)rr�r­rr r0r6r­ÇszXskMap.__init__r'r0r0r r6r�Æsr�cseZdZ‡fdd„Z‡ZS)r’cstt|ƒj|i|¤ŽdSr¤)rr’r­rr r0r6r­ËszMapInMapArray.__init__r'r0r0r r6r’Êsr’cseZdZ‡fdd„Z‡ZS)r”cstt|ƒj|i|¤ŽdSr¤)rr”r­rr r0r6r­ÏszMapInMapHash.__init__r'r0r0r r6r”Îsr”csFeZdZ‡fdd„Zdd„Zdd„Zdd„Zd d „Zdd d „Z‡Z S)r™cs&tt|ƒj|i|¤Žd|_d|_dSr¤)rr™r­Z_ringbufr=rr r0r6r­ÓszRingBuf.__init__cCsdSr¤r0rÏr0r0r6Z __delitemØszRingBuf.__delitemcCsdSr¤r0r®r0r0r6r5ÛszRingBuf.__del__cCsdSrÂr0r®r0r0r6r$ÞszRingBuf.__len__cCs*|jdkrt|ƒ|_t |t |j¡¡jS)aevent(data) When ring buffers are opened to receive custom event, the underlying event data struct which is defined in C in the BPF program can be deduced via this function. This avoids redundant definitions in Python. Nr@rCr0r0r6rDás  z RingBuf.eventNcs4‡fdd„}t|ƒ}|j |j||¡||jd<dS)zåopen_ring_buffer(callback) Opens a ring buffer to receive custom event data from the bpf program. The callback will be invoked for each event submitted from the kernel, up to millions per second. c spz.ˆ|||ƒ}z t|ƒ}Wnd}Yn0Wn<tyj}z$|jtjkrRtƒn|‚WYd}~n d}~00|SrÂ)rBrLrôrMrl)Úctxr?rNrdrO©rFr0r6Ú ringbuf_cb_õs   z-RingBuf.open_ring_buffer..ringbuf_cb_rN)r rdZ_open_ring_bufferrœr©)r¬rFr�rƒrTr0r‚r6Úopen_ring_bufferís zRingBuf.open_ring_buffer)N) rrrr­Z_RingBuf__delitemr5r$rDr„r&r0r0r r6r™Òs   r™c@sReZdZdZdd„Zdd„Zdd„Zdd d „Zd d „Zd d„Z dd„Z dd„Z dS)r—rcCs\||_||_||_||_t |jj|j¡|_t |jj|j¡|_ t t  |jj|j¡ƒ|_ dSr¤) rdr›rœr¦rrtrerVr§r¨rBrªr«)r¬rdr›rœržr0r0r6r­s ÿzQueueStack.__init__c CsNt t |j¡d¡}t |jj|j|t |ƒt  |¡¡}|dkrHt dƒ‚|j Sr¸r¹rºr0r0r6r¼sÿzQueueStack.leaf_sprintfcCs8| ¡}t |jj|j|t |¡¡}|dkr4tdƒ‚|Sr¾r¿rÀr0r0r6rÁ!sÿzQueueStack.leaf_scanfrcCs>t |jdt |¡|¡}|dkr:t t ¡¡}td|ƒ‚dS)NrzCould not push to table: %srÆ)r¬r»r¨r¶rËr0r0r6Úpush)szQueueStack.pushcCs2| ¡}t |jdt |¡¡}|dkr.tdƒ‚|S)NrzCould not pop from table)r¦rZbpf_lookup_and_deleterœr_r²rU©r¬r»r¶r0r0r6r\/s zQueueStack.popcCs2| ¡}t |jdt |¡¡}|dkr.tdƒ‚|S)NrzCould not peek tablerÃr†r0r0r6Úpeek6s zQueueStack.peekccs<|j}|r8z| ¡V|d8}Wqty4YdS0qdSr-)r«r\rU)r¬Zcntr0r0r6rÐ=s   zQueueStack.itervaluescCsdd„| ¡DƒS)NcSsg|]}|‘qSr0r0r×r0r0r6rÔHrÕz%QueueStack.values..rØr®r0r0r6rÙGszQueueStack.valuesN)r) rrrZ BPF_EXISTr­r¼rÁr…r\r‡rÐrÙr0r0r0r6r— s   r—)N)N)XZ __future__rÚcollections.abcrÚ ImportErrorÚ collectionsÚtimerZctypesr_Ú functoolsrrÈrôrbrjr{Zlibbccrrr r r Zutilsr r rurwryr{r}rrƒr‰r…r‡r�r‘r“r‹ZBPF_MAP_TYPE_SOCKMAPr�r�ZBPF_MAP_TYPE_SOCKHASHZBPF_MAP_TYPE_CGROUP_STORAGEZ BPF_MAP_TYPE_REUSEPORT_SOCKARRAYZ"BPF_MAP_TYPE_PERCPU_CGROUP_STORAGEr•r–ZBPF_MAP_TYPE_SK_STORAGEZBPF_MAP_TYPE_DEVMAP_HASHZBPF_MAP_TYPE_STRUCT_OPSr˜ZBPF_MAP_TYPE_INODE_STORAGEZBPF_MAP_TYPE_TASK_STORAGErTrIrrr7r<r9rRrSrWrsr¢r£rvr†r(rxrzr1rŠr|r~rˆr€r‚r„rŒrŽr�r’r”r™r—r0r0r0r6ÚsÚ      ã   &;0m 8 l4859