📄 test-sctp_n.c
字号:
addr_string(char *add_ptr, size_t add_len){ static char buf[128]; size_t len = 0; struct sockaddr_in *a = (struct sockaddr_in *) add_ptr; size_t anum = add_len / sizeof(*a); if (add_len > 0) { int i; if (add_len != anum * sizeof(*a)) len += snprintf(buf + len, sizeof(buf) - len, "Aaarrg! add_len = %lu, anum = %lu, ", (ulong) add_len, (ulong) anum); len += snprintf(buf + len, sizeof(buf) - len, "[%d]", ntohs(a[0].sin_port)); for (i = 0; i < anum; i++) { uint32_t addr = a[i].sin_addr.s_addr; len += snprintf(buf + len, sizeof(buf) - len, "%s%d.%d.%d.%d", i ? "," : "", (addr >> 0) & 0xff, (addr >> 8) & 0xff, (addr >> 16) & 0xff, (addr >> 24) & 0xff); } } else len += snprintf(buf + len, sizeof(buf) - len, "(no address)"); /* len += snprintf(buf + len, sizeof(buf) - len, "\0"); */ return buf;}void print_string(int child, const char *string);voidprint_addrs(int child, char *add_ptr, size_t add_len){ struct sockaddr_in *sin; if (verbose < 3 || !show) return; if (add_len == 0) print_string(child, "(no address)"); for (sin = (typeof(sin)) add_ptr; add_len >= sizeof(*sin); sin++, add_len -= sizeof(*sin)) { char buf[128]; snprintf(buf, sizeof(buf), "%d.%d.%d.%d:%d", (sin->sin_addr.s_addr >> 0) & 0xff, (sin->sin_addr.s_addr >> 8) & 0xff, (sin->sin_addr.s_addr >> 16) & 0xff, (sin->sin_addr.s_addr >> 24) & 0xff, ntohs(sin->sin_port)); print_string(child, buf); }}#endif /* SCTP_VERSION_2 */char *prot_string(char *pro_ptr, size_t pro_len){ static char buf[128]; size_t len = 0; int i; buf[0] = 0; for (i = 0; i < pro_len; i++) { len += snprintf(buf + len, sizeof(buf) - len, "%u ", (uint) (unsigned char) pro_ptr[i]); } return (buf);}void print_string(int child, const char *string);voidprint_prots(int child, char *pro_ptr, size_t pro_len){ unsigned char *prot; if (verbose < 3 || !show) return; for (prot = (typeof(prot)) pro_ptr; pro_len > 0; prot++, pro_len--) { char buf[32]; snprintf(buf, sizeof(buf), "<%u>", (unsigned int) *prot); print_string(child, buf); }}#if 0char *status_string(struct t_opthdr *oh){ switch (oh->status) { case 0: return (NULL); case T_SUCCESS: return ("T_SUCCESS"); case T_FAILURE: return ("T_FAILURE"); case T_PARTSUCCESS: return ("T_PARTSUCCESS"); case T_READONLY: return ("T_READONLY"); case T_NOTSUPPORT: return ("T_NOTSUPPORT"); default: { static char buf[32]; snprintf(buf, sizeof(buf), "(unknown status %ld)", (long) oh->status); return buf; } }}#ifndef T_ALLLEVELS#define T_ALLLEVELS -1#endifchar *level_string(struct t_opthdr *oh){ switch (oh->level) { case T_ALLLEVELS: return ("T_ALLLEVELS"); case XTI_GENERIC: return ("XTI_GENERIC"); case T_INET_IP: return ("T_INET_IP"); case T_INET_UDP: return ("T_INET_UDP"); case T_INET_TCP: return ("T_INET_TCP"); case T_INET_SCTP: return ("T_INET_SCTP"); default: { static char buf[32]; snprintf(buf, sizeof(buf), "(unknown level %ld)", (long) oh->level); return buf; } }}char *name_string(struct t_opthdr *oh){ if (oh->name == T_ALLOPT) return ("T_ALLOPT"); switch (oh->level) { case XTI_GENERIC: switch (oh->name) { case XTI_DEBUG: return ("XTI_DEBUG"); case XTI_LINGER: return ("XTI_LINGER"); case XTI_RCVBUF: return ("XTI_RCVBUF"); case XTI_RCVLOWAT: return ("XTI_RCVLOWAT"); case XTI_SNDBUF: return ("XTI_SNDBUF"); case XTI_SNDLOWAT: return ("XTI_SNDLOWAT"); } break; case T_INET_IP: switch (oh->name) { case T_IP_OPTIONS: return ("T_IP_OPTIONS"); case T_IP_TOS: return ("T_IP_TOS"); case T_IP_TTL: return ("T_IP_TTL"); case T_IP_REUSEADDR: return ("T_IP_REUSEADDR"); case T_IP_DONTROUTE: return ("T_IP_DONTROUTE"); case T_IP_BROADCAST: return ("T_IP_BROADCAST"); case T_IP_ADDR: return ("T_IP_ADDR"); } break; case T_INET_UDP: switch (oh->name) { case T_UDP_CHECKSUM: return ("T_UDP_CHECKSUM"); } break; case T_INET_TCP: switch (oh->name) { case T_TCP_NODELAY: return ("T_TCP_NODELAY"); case T_TCP_MAXSEG: return ("T_TCP_MAXSEG"); case T_TCP_KEEPALIVE: return ("T_TCP_KEEPALIVE"); case T_TCP_CORK: return ("T_TCP_CORK"); case T_TCP_KEEPIDLE: return ("T_TCP_KEEPIDLE"); case T_TCP_KEEPINTVL: return ("T_TCP_KEEPINTVL"); case T_TCP_KEEPCNT: return ("T_TCP_KEEPCNT"); case T_TCP_SYNCNT: return ("T_TCP_SYNCNT"); case T_TCP_LINGER2: return ("T_TCP_LINGER2"); case T_TCP_DEFER_ACCEPT: return ("T_TCP_DEFER_ACCEPT"); case T_TCP_WINDOW_CLAMP: return ("T_TCP_WINDOW_CLAMP"); case T_TCP_INFO: return ("T_TCP_INFO"); case T_TCP_QUICKACK: return ("T_TCP_QUICKACK"); } break; case T_INET_SCTP: switch (oh->name) { case T_SCTP_NODELAY: return ("T_SCTP_NODELAY"); case T_SCTP_CORK: return ("T_SCTP_CORK"); case T_SCTP_PPI: return ("T_SCTP_PPI"); case T_SCTP_SID: return ("T_SCTP_SID"); case T_SCTP_SSN: return ("T_SCTP_SSN"); case T_SCTP_TSN: return ("T_SCTP_TSN"); case T_SCTP_RECVOPT: return ("T_SCTP_RECVOPT"); case T_SCTP_COOKIE_LIFE: return ("T_SCTP_COOKIE_LIFE"); case T_SCTP_SACK_DELAY: return ("T_SCTP_SACK_DELAY"); case T_SCTP_PATH_MAX_RETRANS: return ("T_SCTP_PATH_MAX_RETRANS"); case T_SCTP_ASSOC_MAX_RETRANS: return ("T_SCTP_ASSOC_MAX_RETRANS"); case T_SCTP_MAX_INIT_RETRIES: return ("T_SCTP_MAX_INIT_RETRIES"); case T_SCTP_HEARTBEAT_ITVL: return ("T_SCTP_HEARTBEAT_ITVL"); case T_SCTP_RTO_INITIAL: return ("T_SCTP_RTO_INITIAL"); case T_SCTP_RTO_MIN: return ("T_SCTP_RTO_MIN"); case T_SCTP_RTO_MAX: return ("T_SCTP_RTO_MAX"); case T_SCTP_OSTREAMS: return ("T_SCTP_OSTREAMS"); case T_SCTP_ISTREAMS: return ("T_SCTP_ISTREAMS"); case T_SCTP_COOKIE_INC: return ("T_SCTP_COOKIE_INC"); case T_SCTP_THROTTLE_ITVL: return ("T_SCTP_THROTTLE_ITVL"); case T_SCTP_MAC_TYPE: return ("T_SCTP_MAC_TYPE"); case T_SCTP_CKSUM_TYPE: return ("T_SCTP_CKSUM_TYPE"); case T_SCTP_ECN: return ("T_SCTP_ECN"); case T_SCTP_ALI: return ("T_SCTP_ALI"); case T_SCTP_ADD: return ("T_SCTP_ADD"); case T_SCTP_SET: return ("T_SCTP_SET"); case T_SCTP_ADD_IP: return ("T_SCTP_ADD_IP"); case T_SCTP_DEL_IP: return ("T_SCTP_DEL_IP"); case T_SCTP_SET_IP: return ("T_SCTP_SET_IP"); case T_SCTP_PR: return ("T_SCTP_PR"); case T_SCTP_LIFETIME: return ("T_SCTP_LIFETIME"); case T_SCTP_DISPOSITION: return ("T_SCTP_DISPOSITION"); case T_SCTP_MAX_BURST: return ("T_SCTP_MAX_BURST"); case T_SCTP_HB: return ("T_SCTP_HB"); case T_SCTP_RTO: return ("T_SCTP_RTO"); case T_SCTP_MAXSEG: return ("T_SCTP_MAXSEG"); case T_SCTP_STATUS: return ("T_SCTP_STATUS"); case T_SCTP_DEBUG: return ("T_SCTP_DEBUG"); } break; } { static char buf[32]; snprintf(buf, sizeof(buf), "(unknown name %ld)", (long) oh->name); return buf; }}char *yesno_string(struct t_opthdr *oh){ switch (*((t_uscalar_t *) T_OPT_DATA(oh))) { case T_YES: return ("T_YES"); case T_NO: return ("T_NO"); default: return ("(invalid)"); }}char *number_string(struct t_opthdr *oh){ static char buf[32]; snprintf(buf, 32, "%d", *((t_scalar_t *) T_OPT_DATA(oh))); return (buf);}char *value_string(int child, struct t_opthdr *oh){ static char buf[64] = "(invalid)"; if (oh->len == sizeof(*oh)) return (NULL); switch (oh->level) { case XTI_GENERIC: switch (oh->name) { case XTI_DEBUG: break; case XTI_LINGER: break; case XTI_RCVBUF: break; case XTI_RCVLOWAT: break; case XTI_SNDBUF: break; case XTI_SNDLOWAT: break; } break; case T_INET_IP: switch (oh->name) { case T_IP_OPTIONS: break; case T_IP_TOS: if (oh->len == sizeof(*oh) + sizeof(unsigned char)) snprintf(buf, sizeof(buf), "0x%02x", *((unsigned char *) T_OPT_DATA(oh))); return buf; case T_IP_TTL: if (oh->len == sizeof(*oh) + sizeof(unsigned char)) snprintf(buf, sizeof(buf), "0x%02x", *((unsigned char *) T_OPT_DATA(oh))); return buf; case T_IP_REUSEADDR: return yesno_string(oh); case T_IP_DONTROUTE: return yesno_string(oh); case T_IP_BROADCAST: return yesno_string(oh); case T_IP_ADDR: if (oh->len == sizeof(*oh) + sizeof(uint32_t)) { uint32_t addr = *((uint32_t *) T_OPT_DATA(oh)); snprintf(buf, sizeof(buf), "%d.%d.%d.%d", (addr >> 0) & 0x00ff, (addr >> 8) & 0x00ff, (addr >> 16) & 0x00ff, (addr >> 24) & 0x00ff); } return buf; } break; case T_INET_UDP: switch (oh->name) { case T_UDP_CHECKSUM: return yesno_string(oh); } break; case T_INET_TCP: switch (oh->name) { case T_TCP_NODELAY: return yesno_string(oh); case T_TCP_MAXSEG: if (oh->len == sizeof(*oh) + sizeof(t_uscalar_t)) snprintf(buf, sizeof(buf), "%lu", (ulong) *((t_uscalar_t *) T_OPT_DATA(oh))); return buf; case T_TCP_KEEPALIVE: break; case T_TCP_CORK: return yesno_string(oh); case T_TCP_KEEPIDLE: break; case T_TCP_KEEPINTVL: break; case T_TCP_KEEPCNT: break; case T_TCP_SYNCNT: break; case T_TCP_LINGER2: break; case T_TCP_DEFER_ACCEPT: break; case T_TCP_WINDOW_CLAMP: break; case T_TCP_INFO: break; case T_TCP_QUICKACK: break; } break; case T_INET_SCTP: switch (oh->name) { case T_SCTP_NODELAY: return yesno_string(oh); case T_SCTP_CORK: return yesno_string(oh); case T_SCTP_PPI: return number_string(oh);; case T_SCTP_SID:#if 1 sid[child] = *((t_uscalar_t *) T_OPT_DATA(oh));#endif return number_string(oh);; case T_SCTP_SSN: case T_SCTP_TSN: return number_string(oh);; case T_SCTP_RECVOPT: return yesno_string(oh); case T_SCTP_COOKIE_LIFE: case T_SCTP_SACK_DELAY: case T_SCTP_PATH_MAX_RETRANS: case T_SCTP_ASSOC_MAX_RETRANS: case T_SCTP_MAX_INIT_RETRIES: case T_SCTP_HEARTBEAT_ITVL: case T_SCTP_RTO_INITIAL: case T_SCTP_RTO_MIN: case T_SCTP_RTO_MAX: case T_SCTP_OSTREAMS: case T_SCTP_ISTREAMS: case T_SCTP_COOKIE_INC: case T_SCTP_THROTTLE_ITVL: return number_string(oh);; case T_SCTP_MAC_TYPE: break; case T_SCTP_CKSUM_TYPE: break; case T_SCTP_ECN: break; case T_SCTP_ALI: break; case T_SCTP_ADD: break; case T_SCTP_SET: break; case T_SCTP_ADD_IP: break; case T_SCTP_DEL_IP: break; case T_SCTP_SET_IP: break; case T_SCTP_PR: break; case T_SCTP_LIFETIME: case T_SCTP_DISPOSITION: case T_SCTP_MAX_BURST: case T_SCTP_HB: case T_SCTP_RTO: case T_SCTP_MAXSEG: return number_string(oh); case T_SCTP_STATUS: break; case T_SCTP_DEBUG: break; } break; } return ("(unknown value)");}#endif#if 0voidparse_options(int fd, char *opt_ptr, size_t opt_len){ struct t_opthdr *oh; for (oh = _T_OPT_FIRSTHDR_OFS(opt_ptr, opt_len, 0); oh; oh = _T_OPT_NEXTHDR_OFS(opt_ptr, opt_len, oh, 0)) { if (oh->len == sizeof(*oh)) continue; switch (oh->level) { case T_INET_SCTP: switch (oh->name) { case T_SCTP_PPI: ppi[fd] = *((t_uscalar_t *) T_OPT_DATA(oh)); continue; case T_SCTP_SID: sid[fd] = *((t_uscalar_t *) T_OPT_DATA(oh)); continue; case T_SCTP_SSN: ssn[fd] = *((t_uscalar_t *) T_OPT_DATA(oh)); continue; case T_SCTP_TSN: tsn[fd] = *((t_uscalar_t *) T_OPT_DATA(oh)); continue; } } }}#endifconst char *mgmtflag_string(np_ulong flag){ switch (flag) { case 0: return ("(none)"); case DEFAULT_RC_SEL: return ("DEFAULT_RC_SEL"); default: return ("(unknown flags)"); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -