xref: /xnu-12377.1.9/tools/lldbmacros/ntstat.py (revision f6217f891ac0bb64f3d375211650a4c1ff8ca1ea)
1*f6217f89SApple OSS Distributions""" Please make sure you read the README COMPLETELY BEFORE reading anything below.
2*f6217f89SApple OSS Distributions    It is very critical that you read coding guidelines in Section E in README file.
3*f6217f89SApple OSS Distributions"""
4*f6217f89SApple OSS Distributionsfrom xnu import *
5*f6217f89SApple OSS Distributionsfrom utils import *
6*f6217f89SApple OSS Distributionsfrom string import *
7*f6217f89SApple OSS Distributionsfrom socket import *
8*f6217f89SApple OSS Distributionsfrom enum import IntEnum
9*f6217f89SApple OSS Distributions
10*f6217f89SApple OSS Distributionsimport xnudefines
11*f6217f89SApple OSS Distributionsfrom netdefines import *
12*f6217f89SApple OSS Distributionsfrom routedefines import *
13*f6217f89SApple OSS Distributions
14*f6217f89SApple OSS Distributions######################################
15*f6217f89SApple OSS Distributions# Globals
16*f6217f89SApple OSS Distributions######################################
17*f6217f89SApple OSS Distributions""" Refer to in bsd/net/ntstat.c
18*f6217f89SApple OSS Distributions"""
19*f6217f89SApple OSS DistributionsNSTAT_PROCDETAILS_MAGIC = 0xfeedc001
20*f6217f89SApple OSS DistributionsNSTAT_GENERIC_SHADOW_MAGIC = 0xfadef00d
21*f6217f89SApple OSS DistributionsTU_SHADOW_MAGIC = 0xfeedf00d
22*f6217f89SApple OSS Distributions""" Refer to nstat_provider_type_t in bsd/net/ntstat.h
23*f6217f89SApple OSS Distributions"""
24*f6217f89SApple OSS Distributionsclass NSTAT_PROVIDER(IntEnum):
25*f6217f89SApple OSS Distributions    NONE = 0
26*f6217f89SApple OSS Distributions    ROUTE = 1
27*f6217f89SApple OSS Distributions    TCP_KERNEL = 2
28*f6217f89SApple OSS Distributions    TCP_USERLAND = 3
29*f6217f89SApple OSS Distributions    UDP_KERNEL = 4
30*f6217f89SApple OSS Distributions    UDP_USERLAND = 5
31*f6217f89SApple OSS Distributions    IFNET = 6
32*f6217f89SApple OSS Distributions    SYSINFO = 7
33*f6217f89SApple OSS Distributions    QUIC_USERLAND = 8
34*f6217f89SApple OSS Distributions    CONN_USERLAND = 9
35*f6217f89SApple OSS Distributions    UDP_SUBFLOW = 10
36*f6217f89SApple OSS Distributions
37*f6217f89SApple OSS Distributions######################################
38*f6217f89SApple OSS Distributions# Helper functions
39*f6217f89SApple OSS Distributions######################################
40*f6217f89SApple OSS Distributions
41*f6217f89SApple OSS Distributionsdef FieldPtrToStructPtr(field_ptr,  field_name, element_type):
42*f6217f89SApple OSS Distributions    """ Given a pointer to a field with a structure, return a pointer to the structure itself
43*f6217f89SApple OSS Distributions    params:
44*f6217f89SApple OSS Distributions        field_ptr       - value : pointer to the field
45*f6217f89SApple OSS Distributions        field_name      - str   : string name of the field which holds the list links.
46*f6217f89SApple OSS Distributions        element_type    - str   : type of elements to be linked in the list
47*f6217f89SApple OSS Distributions    returns:
48*f6217f89SApple OSS Distributions        value : A pointer to the start of the structure
49*f6217f89SApple OSS Distributions    """
50*f6217f89SApple OSS Distributions    out_string = ""
51*f6217f89SApple OSS Distributions    if (field_ptr) :
52*f6217f89SApple OSS Distributions        tmp_element = Cast(field_ptr, element_type)
53*f6217f89SApple OSS Distributions        tmp_element_plus_offset = addressof(tmp_element.__getattr__(field_name))
54*f6217f89SApple OSS Distributions        offset = tmp_element_plus_offset - tmp_element
55*f6217f89SApple OSS Distributions        original_ptr_as_char_ptr = Cast(field_ptr, 'char *')
56*f6217f89SApple OSS Distributions        amended_ptr = original_ptr_as_char_ptr - offset
57*f6217f89SApple OSS Distributions        return kern.GetValueFromAddress(unsigned(amended_ptr), element_type)
58*f6217f89SApple OSS Distributions    return field_ptr
59*f6217f89SApple OSS Distributions
60*f6217f89SApple OSS Distributionsdef ReverseIterateTAILQ_AnonymousHEAD(headval, field_name, element_type):
61*f6217f89SApple OSS Distributions    """ reverse iterate over a TAILQ_HEAD in kernel. refer to bsd/sys/queue.h
62*f6217f89SApple OSS Distributions    params:
63*f6217f89SApple OSS Distributions        headval         - value : value object representing the head of the list
64*f6217f89SApple OSS Distributions        field_name      - str   : string name of the field which holds the list links.
65*f6217f89SApple OSS Distributions        element_type    - str   : type of elements to be linked in the list
66*f6217f89SApple OSS Distributions    returns:
67*f6217f89SApple OSS Distributions        A generator does not return. It is used for iterating.
68*f6217f89SApple OSS Distributions        value : an object that is of type as headval->tqh_last. Always a pointer object
69*f6217f89SApple OSS Distributions    example usage:
70*f6217f89SApple OSS Distributions        list_head = kern.GetGlobalVariable('ctl_head')
71*f6217f89SApple OSS Distributions        for entry in ReverseIterateTAILQ_AnonymousHEAD(list_head, 'next', 'struct kctl *'):
72*f6217f89SApple OSS Distributions            print(entry)
73*f6217f89SApple OSS Distributions    """
74*f6217f89SApple OSS Distributions    head_first = headval.__getattr__('tqh_first')
75*f6217f89SApple OSS Distributions    if head_first:
76*f6217f89SApple OSS Distributions        head_first_addr = FieldPtrToStructPtr(addressof(head_first),field_name, element_type)
77*f6217f89SApple OSS Distributions        head_last = headval.__getattr__('tqh_last')
78*f6217f89SApple OSS Distributions        iter_val = FieldPtrToStructPtr(head_last, field_name, element_type)
79*f6217f89SApple OSS Distributions
80*f6217f89SApple OSS Distributions        while (unsigned(iter_val) != unsigned(head_first_addr)) and (unsigned(iter_val) != 0) :
81*f6217f89SApple OSS Distributions            yield iter_val
82*f6217f89SApple OSS Distributions            element = Cast(iter_val, element_type)
83*f6217f89SApple OSS Distributions            tmp  = element.__getattr__(field_name).__getattr__('tqe_prev')
84*f6217f89SApple OSS Distributions            iter_val = FieldPtrToStructPtr(tmp, field_name, element_type)
85*f6217f89SApple OSS Distributions        #end of yield loop
86*f6217f89SApple OSS Distributions
87*f6217f89SApple OSS Distributionsdef ShowNstatTUShadow(inshadow):
88*f6217f89SApple OSS Distributions    """ Display summary for an nstat_tu_shadow struct
89*f6217f89SApple OSS Distributions        params:
90*f6217f89SApple OSS Distributions            inshadow : cvalue object which points to 'struct nstat_tu_shadow *'
91*f6217f89SApple OSS Distributions    """
92*f6217f89SApple OSS Distributions    shad = Cast(inshadow, 'struct nstat_tu_shadow *')
93*f6217f89SApple OSS Distributions    procdetails = shad.shad_procdetails
94*f6217f89SApple OSS Distributions    out_string = ""
95*f6217f89SApple OSS Distributions    if shad :
96*f6217f89SApple OSS Distributions        format_string = "nstat_tu_shadow {0: <#0x}: next={1: <#020x} prev={2: <#020x} context (necp_client *)={3: <#020x} live={4: <d}"
97*f6217f89SApple OSS Distributions        out_string += format_string.format(shad, shad.shad_link.tqe_next, shad.shad_link.tqe_prev, shad.shad_provider_context, shad.shad_live)
98*f6217f89SApple OSS Distributions
99*f6217f89SApple OSS Distributions        magic = unsigned(shad.shad_magic)
100*f6217f89SApple OSS Distributions        if (magic != TU_SHADOW_MAGIC) :
101*f6217f89SApple OSS Distributions            format_string = " INVALID shad magic {0: <#0x}"
102*f6217f89SApple OSS Distributions            out_string += format_string.format(magic)
103*f6217f89SApple OSS Distributions
104*f6217f89SApple OSS Distributions        if (procdetails) :
105*f6217f89SApple OSS Distributions            format_string = "  --> procdetails {0: <#0x}: pid={1: <d} name={2: <s} refcnt={3: <d}"
106*f6217f89SApple OSS Distributions            out_string += format_string.format(procdetails, procdetails.pdet_pid, procdetails.pdet_procname, procdetails.pdet_refcnt)
107*f6217f89SApple OSS Distributions
108*f6217f89SApple OSS Distributions            procmagic = unsigned(procdetails.pdet_magic)
109*f6217f89SApple OSS Distributions            if (procmagic != NSTAT_PROCDETAILS_MAGIC) :
110*f6217f89SApple OSS Distributions                format_string = " INVALID proc magic {0: <#0x}"
111*f6217f89SApple OSS Distributions                out_string += format_string.format(procmagic)
112*f6217f89SApple OSS Distributions
113*f6217f89SApple OSS Distributions    print(out_string)
114*f6217f89SApple OSS Distributions
115*f6217f89SApple OSS Distributionsdef ShowNstatGShadow(inshadow):
116*f6217f89SApple OSS Distributions    """ Display summary for an nstat_generic_shadow
117*f6217f89SApple OSS Distributions        params:
118*f6217f89SApple OSS Distributions            inshadow : cvalue object which points to 'struct nstat_generic_shadow *'
119*f6217f89SApple OSS Distributions    """
120*f6217f89SApple OSS Distributions    gshad = Cast(inshadow, 'struct nstat_generic_shadow *')
121*f6217f89SApple OSS Distributions    procdetails = gshad.gshad_procdetails
122*f6217f89SApple OSS Distributions    out_string = ""
123*f6217f89SApple OSS Distributions    if gshad :
124*f6217f89SApple OSS Distributions        prov_string = GetNstatProviderString(gshad.gshad_provider)
125*f6217f89SApple OSS Distributions        format_string = "nstat_generic_shadow {0: <#0x}: prov={1: <8s} next={2: <#020x} prev={3: <#020x} refcnt={4: <d} "
126*f6217f89SApple OSS Distributions        out_string += format_string.format(gshad, prov_string, gshad.gshad_link.tqe_next, gshad.gshad_link.tqe_prev, gshad.gshad_refcnt)
127*f6217f89SApple OSS Distributions
128*f6217f89SApple OSS Distributions        ## context
129*f6217f89SApple OSS Distributions        if (gshad.gshad_provider == NSTAT_PROVIDER.CONN_USERLAND) :
130*f6217f89SApple OSS Distributions            out_string += "context (necp_client *)={0: <#020x} ".format(gshad.gshad_provider_context)
131*f6217f89SApple OSS Distributions        elif (gshad.gshad_provider == NSTAT_PROVIDER.UDP_SUBFLOW) :
132*f6217f89SApple OSS Distributions            out_string += "context (soflow_hash_entry *)={0: <#020x} ".format(gshad.gshad_provider_context)
133*f6217f89SApple OSS Distributions
134*f6217f89SApple OSS Distributions        magic = unsigned(gshad.gshad_magic)
135*f6217f89SApple OSS Distributions        if (magic != NSTAT_GENERIC_SHADOW_MAGIC) :
136*f6217f89SApple OSS Distributions            format_string = " INVALID gshad magic {0: <#0x}"
137*f6217f89SApple OSS Distributions            out_string += format_string.format(magic)
138*f6217f89SApple OSS Distributions
139*f6217f89SApple OSS Distributions        if (procdetails) :
140*f6217f89SApple OSS Distributions            format_string = " --> procdetails {0: <#0x}: pid={1: <d} name={2: <s} refcnt={3: <d}"
141*f6217f89SApple OSS Distributions            out_string += format_string.format(procdetails, procdetails.pdet_pid, procdetails.pdet_procname, procdetails.pdet_refcnt)
142*f6217f89SApple OSS Distributions
143*f6217f89SApple OSS Distributions            procmagic = unsigned(procdetails.pdet_magic)
144*f6217f89SApple OSS Distributions            if (procmagic != NSTAT_PROCDETAILS_MAGIC) :
145*f6217f89SApple OSS Distributions                format_string = " INVALID proc magic {0: <#0x}"
146*f6217f89SApple OSS Distributions                out_string += format_string.format(procmagic)
147*f6217f89SApple OSS Distributions
148*f6217f89SApple OSS Distributions        print(out_string)
149*f6217f89SApple OSS Distributions
150*f6217f89SApple OSS Distributions        for src in IterateTAILQ_HEAD(gshad.gshad_locus.ntl_src_queue, 'nts_locus_link'):
151*f6217f89SApple OSS Distributions            ShowNstatSrc(src)
152*f6217f89SApple OSS Distributions    else:
153*f6217f89SApple OSS Distributions        print(out_string)
154*f6217f89SApple OSS Distributions
155*f6217f89SApple OSS Distributionsdef GetNstatProcdetailsBrief(procdetails):
156*f6217f89SApple OSS Distributions    """ Display a brief summary for an nstat_procdetails struct
157*f6217f89SApple OSS Distributions        params:
158*f6217f89SApple OSS Distributions            procdetails : cvalue object which points to 'struct nstat_procdetails *'
159*f6217f89SApple OSS Distributions        returns:
160*f6217f89SApple OSS Distributions            str : A string describing various information for the nstat_procdetails structure
161*f6217f89SApple OSS Distributions    """
162*f6217f89SApple OSS Distributions    procdetails = Cast(procdetails, 'struct nstat_procdetails *')
163*f6217f89SApple OSS Distributions    out_string = ""
164*f6217f89SApple OSS Distributions    if (procdetails) :
165*f6217f89SApple OSS Distributions        format_string = " --> pid={0: <d} name={1: <s} refcnt={2: <d}"
166*f6217f89SApple OSS Distributions        out_string += format_string.format(procdetails.pdet_pid, procdetails.pdet_procname, procdetails.pdet_refcnt)
167*f6217f89SApple OSS Distributions
168*f6217f89SApple OSS Distributions        procmagic = unsigned(procdetails.pdet_magic)
169*f6217f89SApple OSS Distributions        if (procmagic != NSTAT_PROCDETAILS_MAGIC) :
170*f6217f89SApple OSS Distributions            format_string = " INVALID proc magic {0: <#0x}"
171*f6217f89SApple OSS Distributions            out_string += format_string.format(procmagic)
172*f6217f89SApple OSS Distributions
173*f6217f89SApple OSS Distributions    return out_string
174*f6217f89SApple OSS Distributions
175*f6217f89SApple OSS Distributionsdef ShowNstatProcdetails(procdetails):
176*f6217f89SApple OSS Distributions    """ Display a summary for an nstat_procdetails struct
177*f6217f89SApple OSS Distributions        params:
178*f6217f89SApple OSS Distributions            procdetails : cvalue object which points to 'struct nstat_procdetails *'
179*f6217f89SApple OSS Distributions    """
180*f6217f89SApple OSS Distributions    procdetails = Cast(procdetails, 'struct nstat_procdetails *')
181*f6217f89SApple OSS Distributions    out_string = ""
182*f6217f89SApple OSS Distributions    if (procdetails) :
183*f6217f89SApple OSS Distributions        format_string = "nstat_procdetails: {0: <#020x} next={1: <#020x} prev={2: <#020x} "
184*f6217f89SApple OSS Distributions        out_string += format_string.format(procdetails, procdetails.pdet_link.tqe_next, procdetails.pdet_link.tqe_prev)
185*f6217f89SApple OSS Distributions        out_string += GetNstatProcdetailsBrief(procdetails)
186*f6217f89SApple OSS Distributions
187*f6217f89SApple OSS Distributions    print(out_string)
188*f6217f89SApple OSS Distributions
189*f6217f89SApple OSS Distributionsdef ShowNstatSockLocus(locus):
190*f6217f89SApple OSS Distributions    """ Display a summary for an nstat_sock_locus struct
191*f6217f89SApple OSS Distributions        params:
192*f6217f89SApple OSS Distributions            locus : cvalue object which points to 'struct nstat_sock_locus *'
193*f6217f89SApple OSS Distributions    """
194*f6217f89SApple OSS Distributions    locus = Cast(locus, 'struct nstat_sock_locus *')
195*f6217f89SApple OSS Distributions    out_string = ""
196*f6217f89SApple OSS Distributions    if (locus) :
197*f6217f89SApple OSS Distributions        format_string = "nstat_sock_locus: {0: <#020x} next={1: <#020x} prev={2: <#020x}"
198*f6217f89SApple OSS Distributions        out_string += format_string.format(locus, locus.nsl_link.tqe_next, locus.nsl_link.tqe_prev)
199*f6217f89SApple OSS Distributions        out_string += GetNstatTULocusBrief(locus);
200*f6217f89SApple OSS Distributions
201*f6217f89SApple OSS Distributions    print(out_string)
202*f6217f89SApple OSS Distributions    iterator = IterateTAILQ_HEAD(locus.nsl_locus.ntl_src_queue, 'nts_locus_link')
203*f6217f89SApple OSS Distributions    for src in iterator:
204*f6217f89SApple OSS Distributions        ShowNstatSrc(src)
205*f6217f89SApple OSS Distributions
206*f6217f89SApple OSS Distributions
207*f6217f89SApple OSS Distributionsdef GetNstatTUShadowBrief(shadow):
208*f6217f89SApple OSS Distributions    """ Display a summary for an nstat_tu_shadow struct
209*f6217f89SApple OSS Distributions        params:
210*f6217f89SApple OSS Distributions            shadow : cvalue object which points to 'struct nstat_tu_shadow *'
211*f6217f89SApple OSS Distributions        returns:
212*f6217f89SApple OSS Distributions            str : A string describing various information for the nstat_tu_shadow structure
213*f6217f89SApple OSS Distributions    """
214*f6217f89SApple OSS Distributions    out_string = ""
215*f6217f89SApple OSS Distributions    shad = Cast(shadow, 'struct nstat_tu_shadow *')
216*f6217f89SApple OSS Distributions    procdetails = shad.shad_procdetails
217*f6217f89SApple OSS Distributions    procdetails = Cast(procdetails, 'struct nstat_procdetails *')
218*f6217f89SApple OSS Distributions    out_string = ""
219*f6217f89SApple OSS Distributions    if shad :
220*f6217f89SApple OSS Distributions        format_string = " shadow {0: <#0x}: necp_client={1: <#020x} live={2: <d}"
221*f6217f89SApple OSS Distributions        out_string += format_string.format(shad, shad.shad_provider_context, shad.shad_live)
222*f6217f89SApple OSS Distributions        magic = unsigned(shad.shad_magic)
223*f6217f89SApple OSS Distributions        if (magic != TU_SHADOW_MAGIC) :
224*f6217f89SApple OSS Distributions            format_string = " INVALID shad magic {0: <#0x}"
225*f6217f89SApple OSS Distributions            out_string += format_string.format(magic)
226*f6217f89SApple OSS Distributions        elif (procdetails) :
227*f6217f89SApple OSS Distributions            out_string += GetNstatProcdetailsBrief(procdetails)
228*f6217f89SApple OSS Distributions
229*f6217f89SApple OSS Distributions    return out_string
230*f6217f89SApple OSS Distributions
231*f6217f89SApple OSS Distributionsdef GetNstatGenericShadowBrief(shadow):
232*f6217f89SApple OSS Distributions    """ Display a summary for an nstat_generic_shadow struct
233*f6217f89SApple OSS Distributions        params:
234*f6217f89SApple OSS Distributions            shadow : cvalue object which points to 'struct nstat_generic_shadow *'
235*f6217f89SApple OSS Distributions        returns:
236*f6217f89SApple OSS Distributions            str : A string describing various information for the nstat_tu_shadow structure
237*f6217f89SApple OSS Distributions    """
238*f6217f89SApple OSS Distributions    gshad = Cast(shadow, 'struct nstat_generic_shadow *')
239*f6217f89SApple OSS Distributions    procdetails = gshad.gshad_procdetails
240*f6217f89SApple OSS Distributions    procdetails = Cast(procdetails, 'struct nstat_procdetails *')
241*f6217f89SApple OSS Distributions    out_string = ""
242*f6217f89SApple OSS Distributions    if gshad :
243*f6217f89SApple OSS Distributions        format_string = " gshadow {0: <#0x}:"
244*f6217f89SApple OSS Distributions        out_string += format_string.format(gshad)
245*f6217f89SApple OSS Distributions        if (gshad.gshad_provider == NSTAT_PROVIDER.CONN_USERLAND) :
246*f6217f89SApple OSS Distributions            out_string += "necp_client={0: <#020x} ".format(gshad.gshad_provider_context)
247*f6217f89SApple OSS Distributions        elif (gshad.gshad_provider == NSTAT_PROVIDER.UDP_SUBFLOW) :
248*f6217f89SApple OSS Distributions            out_string += "soflow_hash_entry={0: <#020x} ".format(gshad.gshad_provider_context)
249*f6217f89SApple OSS Distributions        else :
250*f6217f89SApple OSS Distributions            out_string += "context {0: <#020x} ".format(gshad.gshad_provider_context)
251*f6217f89SApple OSS Distributions        out_string += " refcnt={0: <d} ".format(gshad.gshad_refcnt)
252*f6217f89SApple OSS Distributions
253*f6217f89SApple OSS Distributions        magic = unsigned(gshad.gshad_magic)
254*f6217f89SApple OSS Distributions        if (magic != NSTAT_GENERIC_SHADOW_MAGIC) :
255*f6217f89SApple OSS Distributions            format_string = " INVALID gshad magic {0: <#0x}"
256*f6217f89SApple OSS Distributions            out_string += format_string.format(magic)
257*f6217f89SApple OSS Distributions        elif (procdetails) :
258*f6217f89SApple OSS Distributions            out_string += GetNstatProcdetailsBrief(procdetails)
259*f6217f89SApple OSS Distributions
260*f6217f89SApple OSS Distributions    return out_string
261*f6217f89SApple OSS Distributions
262*f6217f89SApple OSS Distributionsdef GetNstatTULocusBrief(cookie):
263*f6217f89SApple OSS Distributions    """ Display a summary for an nnstat_sock_locus struct
264*f6217f89SApple OSS Distributions        params:
265*f6217f89SApple OSS Distributions            cookie : cvalue object which points to 'struct nstat_sock_locus *'
266*f6217f89SApple OSS Distributions        returns:
267*f6217f89SApple OSS Distributions            str : A string describing various information for the nstat_sock_locus structure
268*f6217f89SApple OSS Distributions    """
269*f6217f89SApple OSS Distributions    out_string = ""
270*f6217f89SApple OSS Distributions    sol = Cast(cookie, 'struct nstat_sock_locus *')
271*f6217f89SApple OSS Distributions    inp = sol.nsl_inp
272*f6217f89SApple OSS Distributions    inpcb = Cast(inp, 'struct inpcb *')
273*f6217f89SApple OSS Distributions    inp_socket = inpcb.inp_socket
274*f6217f89SApple OSS Distributions    sock = Cast(inp_socket, 'struct socket *')
275*f6217f89SApple OSS Distributions    pname = sol.nsl_pname
276*f6217f89SApple OSS Distributions    format_string = " inpcb={0: <#0x}: socket={1: <#020x} process={2: <s}"
277*f6217f89SApple OSS Distributions    out_string += format_string.format(inpcb, sock, pname)
278*f6217f89SApple OSS Distributions    return out_string
279*f6217f89SApple OSS Distributions
280*f6217f89SApple OSS Distributionsdef GetNstatProviderString(provider):
281*f6217f89SApple OSS Distributions    providers = {
282*f6217f89SApple OSS Distributions        NSTAT_PROVIDER.NONE: "none",
283*f6217f89SApple OSS Distributions        NSTAT_PROVIDER.ROUTE: "route",
284*f6217f89SApple OSS Distributions        NSTAT_PROVIDER.TCP_KERNEL: "TCP k",
285*f6217f89SApple OSS Distributions        NSTAT_PROVIDER.TCP_USERLAND: "TCP u",
286*f6217f89SApple OSS Distributions        NSTAT_PROVIDER.UDP_KERNEL: "UDP k",
287*f6217f89SApple OSS Distributions        NSTAT_PROVIDER.UDP_USERLAND: "UDP u",
288*f6217f89SApple OSS Distributions        NSTAT_PROVIDER.IFNET: "ifnet",
289*f6217f89SApple OSS Distributions        NSTAT_PROVIDER.SYSINFO: "sysinfo",
290*f6217f89SApple OSS Distributions        NSTAT_PROVIDER.QUIC_USERLAND: "quic u",
291*f6217f89SApple OSS Distributions        NSTAT_PROVIDER.CONN_USERLAND: "conn u",
292*f6217f89SApple OSS Distributions        NSTAT_PROVIDER.UDP_SUBFLOW: "subflow",
293*f6217f89SApple OSS Distributions    }
294*f6217f89SApple OSS Distributions    return providers.get(unsigned(provider), "unknown")
295*f6217f89SApple OSS Distributions
296*f6217f89SApple OSS Distributionsdef ShowNstatSrc(insrc):
297*f6217f89SApple OSS Distributions    """ Display summary for an nstat_src struct
298*f6217f89SApple OSS Distributions        params:
299*f6217f89SApple OSS Distributions            insrc : cvalue object which points to 'struct nstat_src *'
300*f6217f89SApple OSS Distributions    """
301*f6217f89SApple OSS Distributions    src = Cast(insrc, 'nstat_src *')
302*f6217f89SApple OSS Distributions    prov = src.nts_provider
303*f6217f89SApple OSS Distributions    prov = Cast(prov, 'nstat_provider *')
304*f6217f89SApple OSS Distributions    prov_string = GetNstatProviderString(prov.nstat_provider_id)
305*f6217f89SApple OSS Distributions    out_string = ""
306*f6217f89SApple OSS Distributions    if src :
307*f6217f89SApple OSS Distributions        format_string = "  nstat_src {0: <#0x}: prov={1: <8s} next={2: <#020x} prev={3: <#020x} srcref={4: <d} seq={5: <d}"
308*f6217f89SApple OSS Distributions        out_string += format_string.format(src, prov_string, src.nts_client_link.tqe_next, src.nts_client_link.tqe_prev, src.nts_srcref, src.nts_seq)
309*f6217f89SApple OSS Distributions
310*f6217f89SApple OSS Distributions        if ((prov.nstat_provider_id == NSTAT_PROVIDER.TCP_USERLAND) or
311*f6217f89SApple OSS Distributions            (prov.nstat_provider_id == NSTAT_PROVIDER.UDP_USERLAND) or
312*f6217f89SApple OSS Distributions            (prov.nstat_provider_id == NSTAT_PROVIDER.QUIC_USERLAND)) :
313*f6217f89SApple OSS Distributions            out_string += GetNstatTUShadowBrief(src.nts_cookie);
314*f6217f89SApple OSS Distributions        elif ((prov.nstat_provider_id == NSTAT_PROVIDER.CONN_USERLAND) or
315*f6217f89SApple OSS Distributions            (prov.nstat_provider_id == NSTAT_PROVIDER.UDP_SUBFLOW)) :
316*f6217f89SApple OSS Distributions            out_string += GetNstatGenericShadowBrief(src.nts_cookie);
317*f6217f89SApple OSS Distributions        elif ((prov.nstat_provider_id == NSTAT_PROVIDER.TCP_KERNEL) or
318*f6217f89SApple OSS Distributions            (prov.nstat_provider_id == NSTAT_PROVIDER.UDP_KERNEL)) :
319*f6217f89SApple OSS Distributions            out_string += GetNstatTULocusBrief(src.nts_cookie);
320*f6217f89SApple OSS Distributions
321*f6217f89SApple OSS Distributions    print(out_string)
322*f6217f89SApple OSS Distributions
323*f6217f89SApple OSS Distributionsdef ShowNstatClient(inclient, reverse):
324*f6217f89SApple OSS Distributions    """ Display an nstat_client struct
325*f6217f89SApple OSS Distributions        params:
326*f6217f89SApple OSS Distributions            client : value object representing an nstat_client in the kernel
327*f6217f89SApple OSS Distributions    """
328*f6217f89SApple OSS Distributions    client = Cast(inclient, 'nstat_client *')
329*f6217f89SApple OSS Distributions    out_string = ""
330*f6217f89SApple OSS Distributions    if client :
331*f6217f89SApple OSS Distributions        format_string = "\nnstat_client {0: <#0x}: next={1: <#020x} src-head={2: <#020x} tail={3: <#020x}"
332*f6217f89SApple OSS Distributions        out_string += format_string.format(client, client.ntc_next, client.ntc_src_queue.tqh_first, client.ntc_src_queue.tqh_last)
333*f6217f89SApple OSS Distributions        procdetails = client.ntc_procdetails
334*f6217f89SApple OSS Distributions        if (procdetails) :
335*f6217f89SApple OSS Distributions            format_string = "  --> procdetails {0: <#0x}: pid={1: <d} name={2: <s} refcnt={3: <d}"
336*f6217f89SApple OSS Distributions            out_string += format_string.format(procdetails, procdetails.pdet_pid, procdetails.pdet_procname, procdetails.pdet_refcnt)
337*f6217f89SApple OSS Distributions
338*f6217f89SApple OSS Distributions    print(out_string)
339*f6217f89SApple OSS Distributions    if reverse:
340*f6217f89SApple OSS Distributions         print("reverse nstat_src list:")
341*f6217f89SApple OSS Distributions         iterator = ReverseIterateTAILQ_AnonymousHEAD(client.ntc_src_queue, 'nts_client_link', 'struct nstat_src *')
342*f6217f89SApple OSS Distributions    else:
343*f6217f89SApple OSS Distributions         print("nstat_src list:")
344*f6217f89SApple OSS Distributions         iterator = IterateTAILQ_HEAD(client.ntc_src_queue, 'nts_client_link')
345*f6217f89SApple OSS Distributions    for src in iterator:
346*f6217f89SApple OSS Distributions        ShowNstatSrc(src)
347*f6217f89SApple OSS Distributions
348*f6217f89SApple OSS Distributions######################################
349*f6217f89SApple OSS Distributions# Print functions
350*f6217f89SApple OSS Distributions######################################
351*f6217f89SApple OSS Distributionsdef PrintNstatClientList(reverse):
352*f6217f89SApple OSS Distributions    print("nstat_clients list:")
353*f6217f89SApple OSS Distributions    client = kern.globals.nstat_clients
354*f6217f89SApple OSS Distributions    client = cast(client, 'nstat_client *')
355*f6217f89SApple OSS Distributions    while client != 0:
356*f6217f89SApple OSS Distributions        ShowNstatClient(client, reverse)
357*f6217f89SApple OSS Distributions        client = cast(client.ntc_next, 'nstat_client *')
358*f6217f89SApple OSS Distributions
359*f6217f89SApple OSS Distributionsdef PrintNstatProcdetailList(reverse):
360*f6217f89SApple OSS Distributions    procdetails_head = kern.globals.nstat_procdetails_head
361*f6217f89SApple OSS Distributions    if reverse:
362*f6217f89SApple OSS Distributions        print("\nreverse nstat_procdetails list:\n")
363*f6217f89SApple OSS Distributions        iterator = ReverseIterateTAILQ_AnonymousHEAD(procdetails_head, 'pdet_link', 'struct nstat_procdetails *')
364*f6217f89SApple OSS Distributions    else:
365*f6217f89SApple OSS Distributions        print("\nnstat_procdetails list:\n")
366*f6217f89SApple OSS Distributions        iterator = IterateTAILQ_HEAD(procdetails_head, 'pdet_link')
367*f6217f89SApple OSS Distributions    for procdetails in iterator:
368*f6217f89SApple OSS Distributions        ShowNstatProcdetails(procdetails)
369*f6217f89SApple OSS Distributions
370*f6217f89SApple OSS Distributionsdef PrintNstatGenericShadowList(reverse):
371*f6217f89SApple OSS Distributions    gshadows = kern.globals.nstat_gshad_head
372*f6217f89SApple OSS Distributions    if reverse:
373*f6217f89SApple OSS Distributions        print("\nreverse nstat_ghsad list:\n")
374*f6217f89SApple OSS Distributions        iterator = ReverseIterateTAILQ_AnonymousHEAD(gshadows, 'gshad_link', 'struct nstat_generic_shadow *')
375*f6217f89SApple OSS Distributions    else:
376*f6217f89SApple OSS Distributions        print("\nnstat_ghsad list:\n")
377*f6217f89SApple OSS Distributions        iterator = IterateTAILQ_HEAD(gshadows, 'gshad_link')
378*f6217f89SApple OSS Distributions    for gshad in iterator:
379*f6217f89SApple OSS Distributions        ShowNstatGShadow(gshad)
380*f6217f89SApple OSS Distributions
381*f6217f89SApple OSS Distributionsdef PrintNstatTUShadowList(reverse):
382*f6217f89SApple OSS Distributions    shadows = kern.globals.nstat_userprot_shad_head
383*f6217f89SApple OSS Distributions    if reverse:
384*f6217f89SApple OSS Distributions        print("\nreverse nstat_userprot_shad list:\n")
385*f6217f89SApple OSS Distributions        iterator = ReverseIterateTAILQ_AnonymousHEAD(shadows, 'shad_link', 'struct nstat_tu_shadow *')
386*f6217f89SApple OSS Distributions    else:
387*f6217f89SApple OSS Distributions        print("\nnstat_userprot_shad list:\n")
388*f6217f89SApple OSS Distributions        iterator = IterateTAILQ_HEAD(shadows, 'shad_link')
389*f6217f89SApple OSS Distributions    for shad in iterator:
390*f6217f89SApple OSS Distributions        ShowNstatTUShadow(shad)
391*f6217f89SApple OSS Distributions
392*f6217f89SApple OSS Distributionsdef PrintNstatTCPLocusList(reverse):
393*f6217f89SApple OSS Distributions    loci = kern.globals.nstat_tcp_sock_locus_head
394*f6217f89SApple OSS Distributions    if reverse:
395*f6217f89SApple OSS Distributions        print("\nreverse nstat tcp socket locus list:\n")
396*f6217f89SApple OSS Distributions        iterator = ReverseIterateTAILQ_AnonymousHEAD(loci, 'nsl_link', 'struct nstat_sock_locus *')
397*f6217f89SApple OSS Distributions    else:
398*f6217f89SApple OSS Distributions        print("\nnstat tcp socket locus list:\n")
399*f6217f89SApple OSS Distributions        iterator = IterateTAILQ_HEAD(loci, 'nsl_link')
400*f6217f89SApple OSS Distributions    for locus in iterator:
401*f6217f89SApple OSS Distributions        ShowNstatSockLocus(locus)
402*f6217f89SApple OSS Distributions
403*f6217f89SApple OSS Distributionsdef PrintNstatUDPLocusList(reverse):
404*f6217f89SApple OSS Distributions    loci = kern.globals.nstat_udp_sock_locus_head
405*f6217f89SApple OSS Distributions    if reverse:
406*f6217f89SApple OSS Distributions        print("\nreverse nstat udp socket locus list:\n")
407*f6217f89SApple OSS Distributions        iterator = ReverseIterateTAILQ_AnonymousHEAD(loci, 'nsl_link', 'struct nstat_sock_locus *')
408*f6217f89SApple OSS Distributions    else:
409*f6217f89SApple OSS Distributions        print("\nnstat udp socket locus list:\n")
410*f6217f89SApple OSS Distributions        iterator = IterateTAILQ_HEAD(loci, 'nsl_link')
411*f6217f89SApple OSS Distributions    for locus in iterator:
412*f6217f89SApple OSS Distributions        ShowNstatSockLocus(locus)
413*f6217f89SApple OSS Distributions
414*f6217f89SApple OSS Distributions######################################
415*f6217f89SApple OSS Distributions# LLDB commands
416*f6217f89SApple OSS Distributions######################################
417*f6217f89SApple OSS Distributions# Macro: showallntstat
418*f6217f89SApple OSS Distributions
419*f6217f89SApple OSS Distributions@lldb_command('showallntstat', 'R')
420*f6217f89SApple OSS Distributionsdef ShowAllNtstat(cmd_args=None, cmd_options={}) :
421*f6217f89SApple OSS Distributions    """ Show the contents of various ntstat (network statistics) data structures
422*f6217f89SApple OSS Distributions
423*f6217f89SApple OSS Distributions        usage: showallntstat [-R]
424*f6217f89SApple OSS Distributions            -R  : print ntstat list in reverse
425*f6217f89SApple OSS Distributions    """
426*f6217f89SApple OSS Distributions    reverse = '-R' in cmd_options
427*f6217f89SApple OSS Distributions
428*f6217f89SApple OSS Distributions    PrintNstatClientList(reverse)
429*f6217f89SApple OSS Distributions    PrintNstatTUShadowList(reverse)
430*f6217f89SApple OSS Distributions    PrintNstatGenericShadowList(reverse)
431*f6217f89SApple OSS Distributions    PrintNstatProcdetailList(reverse)
432*f6217f89SApple OSS Distributions    PrintNstatTCPLocusList(reverse)
433*f6217f89SApple OSS Distributions    PrintNstatUDPLocusList(reverse)
434*f6217f89SApple OSS Distributions
435*f6217f89SApple OSS Distributions# EndMacro: showallntstat
436