_cdebbuf *capi_message2str(u8 * msg) { _cdebbuf *cdb; _cmsg *cmsg; cdb = cdebbuf_alloc(); if (unlikely(!cdb)) return NULL; if (likely(cdb == g_debbuf)) cmsg = g_cmsg; else cmsg = kmalloc(sizeof(_cmsg), GFP_ATOMIC); if (unlikely(!cmsg)) { cdebbuf_free(cdb); return NULL; } cmsg->m = msg; cmsg->l = 8; cmsg->p = 0; byteTRcpy(cmsg->m + 4, &cmsg->Command); byteTRcpy(cmsg->m + 5, &cmsg->Subcommand); cmsg->par = cpars[command_2_index(cmsg->Command, cmsg->Subcommand)]; cdb = bufprint(cdb, "%-26s ID=%03d #0x%04x LEN=%04d\n", mnames[command_2_index(cmsg->Command, cmsg->Subcommand)], ((unsigned short *) msg)[1], ((unsigned short *) msg)[3], ((unsigned short *) msg)[0]); cdb = protocol_message_2_pars(cdb, cmsg, 1); if (unlikely(cmsg != g_cmsg)) kfree(cmsg); return cdb; }
void capi_ctr_handle_message(struct capi_ctr *ctr, u16 appl, struct sk_buff *skb) { struct capi20_appl *ap; int showctl = 0; u8 cmd, subcmd; _cdebbuf *cdb; if (ctr->state != CAPI_CTR_RUNNING) { cdb = capi_message2str(skb->data); if (cdb) { printk(KERN_INFO "kcapi: controller [%03d] not active, got: %s", ctr->cnr, cdb->buf); cdebbuf_free(cdb); } else printk(KERN_INFO "kcapi: controller [%03d] not active, cannot trace\n", ctr->cnr); goto error; } cm
static _cdebbuf *bufprint(_cdebbuf *cdb, char *fmt,...) { va_list f; size_t n,r; if (!cdb) return NULL; va_start(f, fmt); r = cdb->size - cdb->pos; n = vsnprintf(cdb->p, r, fmt, f); va_end(f); if (n >= r) { size_t ns = 2 * cdb->size; u_char *nb; while ((ns - cdb->pos) <= n) ns *= 2; nb = kmalloc(ns, GFP_ATOMIC); if (!nb) { cdebbuf_free(cdb); return NULL; } memcpy(nb, cdb->buf, cdb->pos); kfree(cdb->buf); nb[cdb->pos] = 0; cdb->buf = nb; cdb->p = cdb->buf + cdb->pos; cdb->size = ns; va_start(f, fmt); r = cdb->size - cdb->pos; n = vsnprintf(cdb->p, r, fmt, f); va_end(f); } cdb->p += n; cdb->pos += n; return cdb; }