xref: /xnu-8796.101.5/tools/lldbmacros/ntstat.py (revision aca3beaa3dfbd42498b42c5e5ce20a938e6554e5)
1""" Please make sure you read the README COMPLETELY BEFORE reading anything below.
2    It is very critical that you read coding guidelines in Section E in README file.
3"""
4from __future__ import absolute_import, print_function
5
6from builtins import hex
7from xnu import *
8from utils import *
9from string import *
10from socket import *
11
12import xnudefines
13from netdefines import *
14from routedefines import *
15
16def ShowNstatTUShadow(inshadow):
17    """ Display summary for an nstat_tu_shadow struct
18        params:
19            inshadow : cvalue object which points to 'struct nstat_tu_shadow *'
20    """
21    shad = Cast(inshadow, 'struct nstat_tu_shadow *')
22    procdetails = shad.shad_procdetails
23    out_string = ""
24    if shad :
25        format_string = "nstat_tu_shadow {0: <s}: next={1: <s} prev={2: <s} context (necp_client *)={3: <s} live={4: <d}"
26        out_string += format_string.format(hex(shad), hex(shad.shad_link.tqe_next), hex(shad.shad_link.tqe_prev), hex(shad.shad_provider_context),shad.shad_live)
27
28        magic = unsigned(shad.shad_magic)
29        if (magic != 0xfeedf00d) :
30            format_string = " INVALID shad magic {0: <s}"
31            out_string += format_string.format(hex(magic))
32
33        if (procdetails) :
34            format_string = "  --> procdetails {0: <s}: pid={1: <d} name={2: <s} numflows={3: <d}"
35            out_string += format_string.format(hex(procdetails), procdetails.pdet_pid, procdetails.pdet_procname, procdetails.pdet_numflows)
36
37            procmagic = unsigned(procdetails.pdet_magic)
38            if (procmagic != 0xfeedc001) :
39                format_string = " INVALID proc magic {0: <s}"
40                out_string += format_string.format(hex(procmagic))
41
42    print(out_string)
43
44def GetNstatProcdetailsBrief(procdetails):
45    """ Display a brief summary for an nstat_procdetails struct
46        params:
47            procdetails : cvalue object which points to 'struct nstat_procdetails *'
48        returns:
49            str : A string describing various information for the nstat_procdetails structure
50    """
51    procdetails = Cast(procdetails, 'struct nstat_procdetails *')
52    out_string = ""
53    if (procdetails) :
54        format_string = " --> pid={0: <d} name={1: <s} numflows={2: <d}"
55        out_string += format_string.format(procdetails.pdet_pid, procdetails.pdet_procname, procdetails.pdet_numflows)
56
57        procmagic = unsigned(procdetails.pdet_magic)
58        if (procmagic != 0xfeedc001) :
59            format_string = " INVALID proc magic {0: <s}"
60            out_string += format_string.format(hex(procmagic))
61
62    return out_string
63
64def ShowNstatProcdetails(procdetails):
65    """ Display a summary for an nstat_procdetails struct
66        params:
67            procdetails : cvalue object which points to 'struct nstat_procdetails *'
68    """
69    procdetails = Cast(procdetails, 'struct nstat_procdetails *')
70    out_string = ""
71    if (procdetails) :
72        format_string = "nstat_procdetails: {0: <s} next={1: <s} prev={2: <s} "
73        out_string += format_string.format(hex(procdetails), hex(procdetails.pdet_link.tqe_next), hex(procdetails.pdet_link.tqe_prev))
74        out_string += GetNstatProcdetailsBrief(procdetails)
75
76    print(out_string)
77
78def GetNstatTUShadowBrief(shadow):
79    """ Display a summary for an nstat_tu_shadow struct
80        params:
81            shadow : cvalue object which points to 'struct nstat_tu_shadow *'
82        returns:
83            str : A string describing various information for the nstat_tu_shadow structure
84    """
85    out_string = ""
86    shad = Cast(shadow, 'struct nstat_tu_shadow *')
87    procdetails = shad.shad_procdetails
88    procdetails = Cast(procdetails, 'struct nstat_procdetails *')
89    out_string = ""
90    if shad :
91        format_string = " shadow {0: <s}: necp_client ={1: <s} live={2: <d}"
92        out_string += format_string.format(hex(shad),hex(shad.shad_provider_context),shad.shad_live)
93        magic = unsigned(shad.shad_magic)
94        if (magic != 0xfeedf00d) :
95            format_string = " INVALID shad magic {0: <s}"
96            out_string += format_string.format(hex(magic))
97        elif (procdetails) :
98            out_string += GetNstatProcdetailsBrief(procdetails)
99
100    return out_string
101
102def ShowNstatSrc(insrc):
103    """ Display summary for an nstat_src struct
104        params:
105            insrc : cvalue object which points to 'struct nstat_src *'
106    """
107    src = Cast(insrc, 'nstat_src *')
108    prov = src.provider
109    prov = Cast(prov, 'nstat_provider *')
110    prov_string = "?"
111    if (prov.nstat_provider_id == 2):
112        prov_string = "TCP k"
113    elif (prov.nstat_provider_id == 3):
114        prov_string = "TCP u"
115    elif (prov.nstat_provider_id == 4):
116        prov_string = "UDP k"
117    elif (prov.nstat_provider_id == 5):
118        prov_string = "UDP u"
119    elif (prov.nstat_provider_id == 1):
120        prov_string = "Route"
121    elif (prov.nstat_provider_id == 6):
122        prov_string = "ifnet"
123    elif (prov.nstat_provider_id == 7):
124        prov_string = "sysinfo"
125    else:
126        prov_string = "unknown-provider"
127
128    out_string = ""
129    if src :
130        format_string = "  nstat_src {0: <s}: prov={1: <s} next={2: <s} prev={3: <s} ref={4: <d}"
131        out_string += format_string.format(hex(src), prov_string, hex(src.ns_control_link.tqe_next), hex(src.ns_control_link.tqe_prev), src.srcref)
132
133        if (prov.nstat_provider_id == 3):
134            out_string += GetNstatTUShadowBrief(src.cookie);
135
136    print(out_string)
137
138def ShowNstatCtrl(inctrl):
139    """ Display an nstat_control_state struct
140        params:
141            ctrl : value object representing an nstat_control_state in the kernel
142    """
143    ctrl = Cast(inctrl, 'nstat_control_state *')
144    out_string = ""
145    if ctrl :
146        format_string = "nstat_control_state {0: <s}: next={1: <s} src head={2: <s} tail={3: <s}"
147        out_string += format_string.format(hex(ctrl), hex(ctrl.ncs_next), hex(ctrl.ncs_src_queue.tqh_first), hex(ctrl.ncs_src_queue.tqh_last))
148
149    print(out_string)
150
151    for src in IterateTAILQ_HEAD(ctrl.ncs_src_queue, 'ns_control_link'):
152        ShowNstatSrc(src)
153
154# Macro: showallntstat
155
156@lldb_command('showallntstat')
157def ShowAllNtstat(cmd_args=None) :
158    """ Show the contents of various ntstat (network statistics) data structures
159    """
160    print("nstat_controls list:\n")
161    ctrl = kern.globals.nstat_controls
162    ctrl = cast(ctrl, 'nstat_control_state *')
163    while ctrl != 0:
164        ShowNstatCtrl(ctrl)
165        ctrl = cast(ctrl.ncs_next, 'nstat_control_state *')
166
167    print("\nnstat_userprot_shad list:\n")
168    shadows = kern.globals.nstat_userprot_shad_head
169    for shad in IterateTAILQ_HEAD(shadows, 'shad_link'):
170        ShowNstatTUShadow(shad)
171
172    print("\nnstat_procdetails list:\n")
173    procdetails_head = kern.globals.nstat_procdetails_head
174    for procdetails in IterateTAILQ_HEAD(procdetails_head, 'pdet_link'):
175        ShowNstatProcdetails(procdetails)
176
177# EndMacro: showallntstat
178