/*ARGSUSED*/ static int action_format( uintptr_t addr, const void *data, void *arg) { afdata_t *afp = (afdata_t *)arg; ipp_action_t *ap; int rc; ap = mdb_alloc(sizeof (ipp_action_t), UM_SLEEP); if (mdb_vread(ap, sizeof (ipp_action_t), addr) == -1) { mdb_warn("failed to read ipp_action_t at %p", addr); rc = WALK_ERR; goto done; } if (afp->af_flags & AF_VERBOSE) rc = action_dump(addr, ap, afp->af_banner); else rc = action_summary(addr, ap, afp->af_banner); afp->af_banner = B_FALSE; done: mdb_free(ap, sizeof (ipp_action_t)); return (rc); }
/* json printer */ static int json_printer(char *buf, int pos, struct trace_tree *tree, char *el, struct header *h) { struct trace_tree_V *tv; struct trace_tree_T *tt; struct trace_tree_D *td; struct trace_tree_G *tg; struct trace_tree_L *tl; int offset, length; char ebuf[64]; int j, k; switch(tree->type) { case TT_E: sprintf(ebuf, "To Controller"); break; case TT_V: tv = (struct trace_tree_V *) tree; sprintf(ebuf, "V %s", tv->name); break; case TT_T: tt = (struct trace_tree_T *) tree; sprintf(ebuf, "T %s", tt->name); break; case TT_D: td = (struct trace_tree_D *) tree; return json_printer(buf, pos, td->t, el, h); case TT_G: tg = (struct trace_tree_G *) tree; sprintf(ebuf, "G %s", header_get_name(tg->new_spec)); break; case TT_L: tl = (struct trace_tree_L *) tree; action_summary(tl->ac, ebuf, 64); break; } pos += sprintf(buf+pos, "{\"v\":%lu, \"el\":\"%s\", \"l\":\"%s\", \"p\":{\"x\":650, \"y\":30}, \"c\":[", (long) tree, el, ebuf); switch(tree->type) { case TT_E: break; case TT_V: tv = (struct trace_tree_V *) tree; if(strcmp(tv->name, "in_port")) header_get_field(h, tv->name, &offset, &length); else length = 8; length = (length + 7) / 8; for(j = 0; j < tv->num_branches; j++) { for(k = 0; k < length; k++) { sprintf(ebuf + 2*k, "%02x", tv->branches[j].value.v[k]); } pos = json_printer(buf, pos, tv->branches[j].tree, ebuf, h); if(j < tv->num_branches - 1) pos += sprintf(buf+pos, ","); } break; case TT_T: tt = (struct trace_tree_T *) tree; if(strcmp(tt->name, "in_port")) header_get_field(h, tt->name, &offset, &length); else length = 8; length = (length + 7) / 8; sprintf(ebuf, " = "); for(k = 0; k < length; k++) { sprintf(ebuf + 3 + 2*k, "%02x", tt->value.v[k]); } pos = json_printer(buf, pos, tt->t, ebuf, h); pos += sprintf(buf+pos, ","); ebuf[0] = '!'; pos = json_printer(buf, pos, tt->f, ebuf, h); break; case TT_D: td = (struct trace_tree_D *) tree; pos = json_printer(buf, pos, td->t, "", h); break; case TT_G: tg = (struct trace_tree_G *) tree; pos = json_printer(buf, pos, tg->t, "", tg->new_spec); break; case TT_L: break; } pos += sprintf(buf+pos, "]}"); return pos; }