Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 17 additions & 27 deletions nettrace.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,15 +23,6 @@ class Tracer:
_cata_enabled = []
_cata_all = None

_v_tracer = {
'4.14': [
{'name': '__netif_receive_skb_core', 'skb': 0, 'level': 1},
],
'5.4': [
{'name': '__netif_receive_skb_core', 'pskb': 0, 'level': 1},
]
}

@staticmethod
def get_cata_all():
if Tracer._cata_all:
Expand Down Expand Up @@ -139,22 +130,16 @@ def print_tracer(tracer, tab=''):
Tracer.print_tracer(i, tab + ' ')

@staticmethod
def fix_version():
import subprocess
code, ver_str = subprocess.getstatusoutput('uname -r')
if code != 0:
return
m = re.match(r'([0-9]+\.[0-9]+)\.', ver_str)
if not m:
return
ver = m.group(1)
if ver not in Tracer._v_tracer:
Helper.pr_warn('''kernel version not found! You can add your kernel
version in '_v_tracer' of nettrace.py\n''')
return
for tracer in Tracer._v_tracer[ver]:
origin = Tracer.get_cata_or_tracer(tracer['name'])
origin.update(tracer)
def check_if(tracer):
if 'if' not in tracer:
return True
cond = tracer['if']
kernelVersion = kernel_version_cur()
cond = cond.replace('kernelVersion', str(kernelVersion))
ret = {'value': False}
cond = '''value = %s''' % cond
exec(cond, ret)
return ret['value']

@staticmethod
def prepare_cata(root=None):
Expand Down Expand Up @@ -192,7 +177,11 @@ def init_tracers():
if not cata:
Helper.pr_warn('the tracer:%s not found' % cata_str)
continue
tracers += Tracer.get_tracers(cata)
for tracer in Tracer.get_tracers(cata):
if Tracer.check_if(tracer):
tracers.append(tracer)
else:
tracer['hidden'] = True
catalogs.append(cata)

for t in set(Helper.get_stack_tracer()):
Expand Down Expand Up @@ -221,7 +210,6 @@ def init_tracers():
Tracer._tracer_enabled = tracers
Tracer._cata_enabled = catalogs
Tracer.bind_parent(Tracer.get_cata_all())
Tracer.fix_version()

for t in tracers:
p = t['parent']
Expand Down Expand Up @@ -447,6 +435,8 @@ def init_args():
Helper._user_args = args

if args.tracer == '?':
args.tracer = 'all'
Tracer.init_tracers()
print('available tracer:')
print('---------------------------------------------------\n')
Tracer.print_tracer(Tracer.get_cata_all())
Expand Down
7 changes: 6 additions & 1 deletion skb.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,18 @@ children:
children:
- napi_gro_receive:1
- enqueue_to_backlog:0
- __netif_receive_skb_core
- name: do_xdp_generic
regex: do_xdp_generic\..*
skb: 1
- xdp_do_generic_redirect:1
- generic_xdp_tx:1
- sch_handle_ingress:0
- name: __netif_receive_skb_core
skb: 0
if: kernelVersion < 504
- name: __netif_receive_skb_core
pskb: 0
if: kernelVersion >= 504
- name: link-out
desc: link layer (L2) of packet out
visual: true
Expand Down
26 changes: 26 additions & 0 deletions utils.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,13 @@
import os
import struct
import socket
import subprocess
import re

from numpy import mat

cur_dir = os.path.dirname(os.path.abspath(__file__))
_cur_version = None


def project_file(name):
Expand All @@ -12,6 +17,27 @@ def project_file(name):
def b2str(b):
return 'true' if b else 'false'

def kernel_version_num(version):
if not version:
return 0

match = re.match("([0-9]+)\.([0-9]+)\.", version)
if not match:
return None
return int(match.group(1)) * 100 + int(match.group(2))

def kernel_version_cur():
return kernel_version_num(kernel_version())

def kernel_version():
global _cur_version
if _cur_version:
return _cur_version
(code, result) = subprocess.getstatusoutput('uname -r')
if code != 0:
return None
_cur_version = result
return result

class NetUtils:

Expand Down