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