From 4cdc461996b6ef26c65e6dd3d2dc29a3ef62a08b Mon Sep 17 00:00:00 2001 From: Yuhan Li <1325861244@qq.com> Date: Mon, 23 May 2022 14:12:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=B7=9F=E8=B8=AA=E9=A1=B9?= =?UTF-8?q?=E7=A6=81=E7=94=A8=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 通过使用特定的语法来决定哪些跟踪项在哪些内核版本中启用. 并切换 __netif_receive_skb_core使用该功能来实现. Signed-off-by: Yuhan Li <1325861244@qq.com> --- nettrace.py | 44 +++++++++++++++++--------------------------- skb.yaml | 7 ++++++- utils.py | 26 ++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 28 deletions(-) diff --git a/nettrace.py b/nettrace.py index c97120e..40b94dd 100755 --- a/nettrace.py +++ b/nettrace.py @@ -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: @@ -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): @@ -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()): @@ -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'] @@ -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()) diff --git a/skb.yaml b/skb.yaml index a4dae53..c9d8f44 100644 --- a/skb.yaml +++ b/skb.yaml @@ -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 diff --git a/utils.py b/utils.py index ea2200f..38afd3c 100644 --- a/utils.py +++ b/utils.py @@ -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): @@ -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: