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