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