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