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