📄 capi.c
字号:
hex_dump(level, frm, len); } frm->ptr += len; frm->len -= len; len = CAPI_U8(frm); if (len > 0) { p_indent(level, frm); printf("Calling party subaddress:\n"); hex_dump(level, frm, len); } frm->ptr += len; frm->len -= len; }}static void cmd_info(int level, uint8_t subcmd, struct frame *frm){ uint8_t len; uint16_t info; cmd_common(level, subcmd, frm); switch (subcmd) { case 0x80: len = CAPI_U8(frm); if (len > 0) { p_indent(level, frm); printf("Called party number:\n"); hex_dump(level, frm, len); } frm->ptr += len; frm->len -= len; len = CAPI_U8(frm); if (len > 0) { p_indent(level, frm); printf("Additional info:\n"); hex_dump(level, frm, len); } break; case 0x82: info = CAPI_U16(frm); p_indent(level, frm); printf("Info number: %d\n", info); len = CAPI_U8(frm); if (len > 0) { p_indent(level, frm); printf("Info element:\n"); hex_dump(level, frm, len); } break; }}static void cmd_interoperability(int level, uint8_t subcmd, struct frame *frm){ uint16_t sel, func, info; uint16_t nconn, datablkcnt, datablklen; uint32_t ctr, value, major, minor; info = (subcmd == 0x81) ? CAPI_U16(frm) : 0; sel = CAPI_U16(frm); CAPI_U8(frm); if (subcmd != 0x83) { func = CAPI_U16(frm); CAPI_U8(frm); } else func = 0; p_indent(level, frm); printf("Selector: 0x%04x (%s)\n", sel, interopsel2str(sel)); switch (sel) { case 0x0001: p_indent(level, frm); printf("Function: %d (%s)\n", func, func2str(func)); switch (subcmd) { case 0x80: switch (func) { case 0: nconn = CAPI_U16(frm); p_indent(level + 1, frm); printf("maxLogicalConnections: %d\n", nconn); datablkcnt = CAPI_U16(frm); p_indent(level + 1, frm); printf("maxBDataBlocks: %d\n", datablkcnt); datablklen = CAPI_U16(frm); p_indent(level + 1, frm); printf("maxBDataLen: %d\n", datablklen); break; case 2: case 3: case 4: case 5: ctr = CAPI_U32(frm); p_indent(level + 1, frm); printf("Controller: %d\n", ctr); break; default: raw_dump(level + 1, frm); break; } break; case 0x81: switch (func) { case 0: case 1: info = CAPI_U16(frm); p_indent(level + 1, frm); printf("Info: 0x%04x (%s)\n", info, info2str(info)); break; case 2: info = CAPI_U16(frm); p_indent(level + 1, frm); printf("Info: 0x%04x (%s)\n", info, info2str(info)); CAPI_U8(frm); profile(level + 1, frm); break; case 3: info = CAPI_U16(frm); p_indent(level + 1, frm); printf("Info: 0x%04x (%s)\n", info, info2str(info)); ctr = CAPI_U32(frm); p_indent(level + 1, frm); printf("Controller: %d\n", ctr); CAPI_U8(frm); p_indent(level + 1, frm); printf("Identification: \"%s\"\n", (char *) frm->ptr); break; case 4: value = CAPI_U32(frm); p_indent(level + 1, frm); printf("Return value: 0x%04x\n", value); ctr = CAPI_U32(frm); p_indent(level + 1, frm); printf("Controller: %d\n", ctr); p_indent(level + 1, frm); major = CAPI_U32(frm); minor = CAPI_U32(frm); printf("CAPI: %d.%d\n", major, minor); major = CAPI_U32(frm); minor = CAPI_U32(frm); p_indent(level + 1, frm); printf("Manufacture: %u.%01x%01x-%02u (%d.%d)\n", (major & 0xf0) >> 4, (major & 0x0f) << 4, (minor & 0xf0) >> 4, minor & 0x0f, major, minor); break; case 5: value = CAPI_U32(frm); p_indent(level + 1, frm); printf("Return value: 0x%04x\n", value); ctr = CAPI_U32(frm); p_indent(level + 1, frm); printf("Controller: %d\n", ctr); CAPI_U8(frm); p_indent(level + 1, frm); printf("Serial number: %.7s\n", (char *) frm->ptr); break; default: raw_dump(level + 1, frm); break; } break; default: raw_dump(level, frm); break; } break; default: p_indent(level, frm); printf("Function: %d\n", func); if (subcmd == 0x81) { p_indent(level, frm); printf("Info: 0x%04x (%s)\n", info, info2str(info)); } raw_dump(level + 1, frm); break; }}static void cmd_facility(int level, uint8_t subcmd, struct frame *frm){ uint16_t sel; cmd_common(level, subcmd, frm); sel = CAPI_U16(frm); CAPI_U8(frm); p_indent(level, frm); printf("Selector: 0x%04x (%s)\n", sel, facilitysel2str(sel)); raw_dump(level, frm);}static void cmd_connect_b3(int level, uint8_t subcmd, struct frame *frm){ uint16_t reject; uint8_t len; cmd_common(level, subcmd, frm); if (subcmd == 0x81) return; if (subcmd == 0x83) { reject = CAPI_U16(frm); p_indent(level, frm); printf("Reject: 0x%04x (%s)\n", reject, info2str(reject)); } len = CAPI_U8(frm); if (len > 0) { p_indent(level, frm); printf("NCPI:\n"); hex_dump(level, frm, len); }}static void cmd_connect_b3_active(int level, uint8_t subcmd, struct frame *frm){ uint8_t len; cmd_common(level, subcmd, frm); if (subcmd == 0x82) { len = CAPI_U8(frm); if (len > 0) { p_indent(level, frm); printf("NCPI:\n"); hex_dump(level, frm, len); } }}static void cmd_disconnect_b3(int level, uint8_t subcmd, struct frame *frm){ uint16_t reason; uint8_t len; cmd_common(level, subcmd, frm); if (subcmd == 0x82) { reason = CAPI_U16(frm); p_indent(level, frm); printf("Reason: 0x%04x (%s)\n", reason, info2str(reason)); } if (subcmd == 0x80 || subcmd == 0x82) { len = CAPI_U8(frm); if (len > 0) { p_indent(level, frm); printf("NCPI:\n"); hex_dump(level, frm, len); } }}static void cmd_data_b3(int level, uint8_t subcmd, struct frame *frm){ uint32_t data; uint64_t data64; uint16_t length, handle, flags, info; cmd_common(level, 0x00, frm); if (subcmd == 0x81 || subcmd == 0x83) { handle = CAPI_U16(frm); p_indent(level, frm); printf("Data handle: 0x%04x\n", handle); if (subcmd == 0x81) { info = CAPI_U16(frm); p_indent(level, frm); printf("Info: 0x%04x (%s)\n", info, info2str(info)); } } else { data = CAPI_U32(frm); length = CAPI_U16(frm); p_indent(level, frm); printf("Data length: 0x%04x (%d bytes)\n", length, length); handle = CAPI_U16(frm); p_indent(level, frm); printf("Data handle: 0x%04x\n", handle); flags = CAPI_U16(frm); p_indent(level, frm); printf("Flags: 0x%04x\n", flags); if (data == 0) data64 = get_u64(frm); raw_dump(level, frm); }}static void cmd_reset_b3(int level, uint8_t subcmd, struct frame *frm){ uint8_t len; cmd_common(level, subcmd, frm); if (subcmd == 0x80 || subcmd == 0x82) { len = CAPI_U8(frm); if (len > 0) { p_indent(level, frm); printf("NCPI:\n"); hex_dump(level, frm, len); } }}static void cmd_manufacturer(int level, uint8_t subcmd, struct frame *frm){ uint32_t ctr, class, func; uint16_t len; unsigned char *id; ctr = CAPI_U32(frm); p_indent(level, frm); printf("Controller: %d\n", ctr); id = (unsigned char *) frm->ptr; p_indent(level, frm); if (isprint(id[0]) && isprint(id[1]) && isprint(id[2]) && isprint(id[3])) printf("Manufacturer: %.4s", id); else printf("Manufacturer: 0x%02x 0x%02x 0x%02x 0x%02x", id[0], id[1], id[2], id[3]); frm->ptr += 4; frm->len -= 4; if (!strncmp(id, "AVM!", 4)) { class = CAPI_U32(frm); func = CAPI_U32(frm); len = CAPI_U8(frm); if (len == 0xff) len = CAPI_U16(frm); printf(" [class %d func %d len %d]\n", class, func, len); } else printf("\n"); raw_dump(level, frm);}void capi_dump(int level, struct frame *frm){ uint16_t len, appl, msgnum; uint8_t cmd, subcmd; len = CAPI_U16(frm) - 8; appl = CAPI_U16(frm); cmd = CAPI_U8(frm); subcmd = CAPI_U8(frm); msgnum = CAPI_U16(frm); p_indent(level, frm); printf("CAPI_%s_%s: appl %d msgnum %d len %d\n", cmd2str(cmd), subcmd2str(subcmd), appl, msgnum, len); switch (cmd) { case 0x01: cmd_alert(level + 1, subcmd, frm); break; case 0x02: cmd_connect(level + 1, subcmd, frm); break; case 0x03: cmd_connect_active(level + 1, subcmd, frm); break; case 0x04: cmd_disconnect(level + 1, subcmd, frm); break; case 0x05: cmd_listen(level + 1, subcmd, frm); break; case 0x08: cmd_info(level + 1, subcmd, frm); break; case 0x20: cmd_interoperability(level + 1, subcmd, frm); break; case 0x80: cmd_facility(level + 1, subcmd, frm); break; case 0x82: cmd_connect_b3(level + 1, subcmd, frm); break; case 0x83: case 0x88: cmd_connect_b3_active(level + 1, subcmd, frm); break; case 0x84: cmd_disconnect_b3(level + 1, subcmd, frm); break; case 0x86: cmd_data_b3(level + 1, subcmd, frm); break; case 0x87: cmd_reset_b3(level + 1, subcmd, frm); break; case 0xff: cmd_manufacturer(level + 1, subcmd, frm); break; default: raw_dump(level, frm); frm->ptr += len; frm->len -= len; break; }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -