📄 test-sctp_t.c
字号:
printf("%s\n", err_string(error));}char *prim_string(ulong prim){ switch ( prim ) { case T_CONN_REQ: return("T_CONN_REQ"); case T_CONN_RES: return("T_CONN_RES"); case T_DISCON_REQ: return("T_DISCON_REQ"); case T_DATA_REQ: return("T_DATA_REQ"); case T_EXDATA_REQ: return("T_EXDATA_REQ"); case T_OPTDATA_REQ: return("T_OPTDATA_REQ"); case T_INFO_REQ: return("T_INFO_REQ"); case T_BIND_REQ: return("T_BIND_REQ"); case T_UNBIND_REQ: return("T_UNBIND_REQ"); case T_UNITDATA_REQ: return("T_UNITDATA_REQ"); case T_OPTMGMT_REQ: return("T_OPTMGMT_REQ"); case T_ORDREL_REQ: return("T_ORDREL_REQ"); case T_CONN_IND: return("T_CONN_IND"); case T_CONN_CON: return("T_CONN_CON"); case T_DISCON_IND: return("T_DISCON_IND"); case T_DATA_IND: return("T_DATA_IND"); case T_EXDATA_IND: return("T_EXDATA_IND"); case T_OPTDATA_IND: return("T_OPTDATA_IND"); case T_INFO_ACK: return("T_INFO_ACK"); case T_BIND_ACK: return("T_BIND_ACK"); case T_ERROR_ACK: return("T_ERROR_ACK"); case T_OK_ACK: return("T_OK_ACK"); case T_UNITDATA_IND: return("T_UNITDATA_IND"); case T_UDERROR_IND: return("T_UDERROR_IND"); case T_OPTMGMT_ACK: return("T_OPTMGMT_ACK"); case T_ORDREL_IND: return("T_ORDREL_IND"); case T_ADDR_REQ: return("T_ADDR_REQ"); case T_ADDR_ACK: return("T_ADDR_ACK"); case FAILURE: return("(nothing)"); default: return("(unexpected"); }}void print_prim(ulong prim){ printf("%s", prim_string(prim));}void print_state(ulong state){ switch ( state ) { case TS_UNBND: printf("TS_UNBND"); break; case TS_WACK_BREQ: printf("TS_WACK_BREQ"); break; case TS_WACK_UREQ: printf("TS_WACK_UREQ"); break; case TS_IDLE: printf("TS_IDLE"); break; case TS_WACK_OPTREQ: printf("TS_WACK_OPTREQ"); break; case TS_WACK_CREQ: printf("TS_WACK_CREQ"); break; case TS_WCON_CREQ: printf("TS_WCON_CREQ"); break; case TS_WRES_CIND: printf("TS_WRES_CIND"); break; case TS_WACK_CRES: printf("TS_WACK_CRES"); break; case TS_DATA_XFER: printf("TS_DATA_XFER"); break; case TS_WIND_ORDREL: printf("TS_WIND_ORDREL"); break; case TS_WREQ_ORDREL: printf("TS_WRES_ORDREL"); break; case TS_WACK_DREQ6: printf("TS_WACK_DREQ6"); break; case TS_WACK_DREQ7: printf("TS_WACK_DREQ7"); break; case TS_WACK_DREQ9: printf("TS_WACK_DREQ9"); break; case TS_WACK_DREQ10: printf("TS_WACK_DREQ10"); break; case TS_WACK_DREQ11: printf("TS_WACK_DREQ11"); break; default: printf("(unknown [%lu])", state); break; } printf("\n");}void print_addr(char *add_ptr, size_t add_len){ sctp_addr_t *a = (sctp_addr_t *)add_ptr; size_t anum = add_len >= sizeof(a->port) ? (add_len - sizeof(a->port))/sizeof(a->addr[0]) : 0; if ( add_len ) { int i; if ( add_len != sizeof(a->port)+anum*sizeof(a->addr[0]) ) printf("Aaarrg! add_len = %d, anum = %d, ", add_len, anum); printf("[%d]", ntohs(a->port)); for ( i = 0; i < anum; i++ ) { printf("%s%d.%d.%d.%d", i?",":"", (a->addr[i]>> 0) & 0xff, (a->addr[i]>> 8) & 0xff, (a->addr[i]>>16) & 0xff, (a->addr[i]>>24) & 0xff); } } else printf("(no address)"); printf("\n");}void print_opt(char *opt_ptr, size_t opt_len){ struct t_opthdr *oh = (struct t_opthdr *)opt_ptr; size_t opt_rem = opt_len; if ( opt_len ) { while ( opt_rem && opt_rem > sizeof(*oh) && oh->len <= opt_rem ) { char result[128] = "(failure)"; long val = *((t_scalar_t *)(oh+1)); printf("\n\t"); switch ( oh->level ) { case T_INET_IP: switch ( oh->name ) { case T_IP_OPTIONS: printf("T_IP_OPTIONS = "); sprintf(result,"%s", "(not impl)"); break; case T_IP_TOS: printf("T_IP_TOS = "); sprintf(result,"0x%lx", val); break; case T_IP_TTL: printf("T_IP_TTL = "); sprintf(result,"%ld", val); break; case T_IP_REUSEADDR: printf("T_IP_REUSEADDR = "); sprintf(result,"%s", val == T_YES ? "T_YES" : "T_NO"); break; case T_IP_DONTROUTE: printf("T_IP_DONTROUTE = "); sprintf(result,"%s", val == T_YES ? "T_YES" : "T_NO"); break; case T_IP_BROADCAST: printf("T_IP_BROADCAST = "); sprintf(result,"%s", val == T_YES ? "T_YES" : "T_NO"); break; default: printf("(bad option name %lu)",oh->name); break; } break; case T_INET_SCTP: switch ( oh->name ) { case T_SCTP_NODELAY: printf("T_SCTP_NODELAY = "); sprintf(result,"%s", val == T_YES ? "T_YES" : "T_NO"); break; case T_SCTP_CORK: printf("T_SCTP_CORK = "); sprintf(result,"%s", val == T_YES ? "T_YES" : "T_NO"); break; case T_SCTP_PPI: printf("T_SCTP_PPI = "); sprintf(result,"%ld", val); break; case T_SCTP_SID: printf("T_SCTP_SID = "); sprintf(result,"%ld", val); break; case T_SCTP_SSN: printf("T_SCTP_SSN = "); sprintf(result,"%ld", val); break; case T_SCTP_TSN: printf("T_SCTP_TSN = "); sprintf(result,"%lu", (ulong)val); break; case T_SCTP_RECVOPT: printf("T_SCTP_RECVOPT = "); sprintf(result,"%s", val == T_YES ? "T_YES" : "T_NO"); break; case T_SCTP_COOKIE_LIFE: printf("T_SCTP_COOKIE_LIFE = "); sprintf(result,"%ld", val); break; case T_SCTP_SACK_DELAY: printf("T_SCTP_SACK_DELAY = "); sprintf(result,"%ld", val); break; case T_SCTP_PATH_MAX_RETRANS: printf("T_SCTP_PATH_MAX_RETRANS = "); sprintf(result,"%ld", val); break; case T_SCTP_ASSOC_MAX_RETRANS: printf("T_SCTP_ASSOC_MAX_RETRANS = "); sprintf(result,"%ld", val); break; case T_SCTP_MAX_INIT_RETRIES: printf("T_SCTP_MAX_INIT_RETRIES = "); sprintf(result,"%ld", val); break; case T_SCTP_HEARTBEAT_ITVL: printf("T_SCTP_HEARTBEAT_ITVL = "); sprintf(result,"%ld", val); break; case T_SCTP_RTO_INITIAL: printf("T_SCTP_RTO_INITIAL = "); sprintf(result,"%ld", val); break; case T_SCTP_RTO_MIN: printf("T_SCTP_RTO_MIN = "); sprintf(result,"%ld", val); break; case T_SCTP_RTO_MAX: printf("T_SCTP_RTO_MAX = "); sprintf(result,"%ld", val); break; case T_SCTP_OSTREAMS: printf("T_SCTP_OSTREAMS = "); sprintf(result,"%ld", val); break; case T_SCTP_ISTREAMS: printf("T_SCTP_ISTREAMS = "); sprintf(result,"%ld", val); break; case T_SCTP_COOKIE_INC: printf("T_SCTP_COOKIE_INC = "); sprintf(result,"%ld", val); break; case T_SCTP_THROTTLE_ITVL: printf("T_SCTP_THROTTLE_ITVL = "); sprintf(result,"%ld", val); break; case T_SCTP_MAC_TYPE: printf("T_SCTP_MAC_TYPE = "); switch ( val ) { default: case SCTP_HMAC_NONE: sprintf(result, "NONE"); break; case SCTP_HMAC_SHA_1: sprintf(result, "SHA_1"); break; case SCTP_HMAC_MD5: sprintf(result, "MD5"); break; } break; case T_SCTP_HB: printf("T_SCTP_HB = "); sprintf(result,"%s","(undone)"); break; case T_SCTP_RTO: printf("T_SCTP_RTO = "); sprintf(result,"%s","(undone)"); break; case T_SCTP_MAXSEG: printf("T_SCTP_MAXSEG = "); sprintf(result,"%ld", val); break; case T_SCTP_STATUS: printf("T_SCTP_STATUS = "); sprintf(result,"%s", "(undone)"); break; case T_SCTP_DEBUG: printf("T_SCTP_DEBUG = "); if ( !val ) sprintf(result, "(none)"); else { char *where = result; if ( val & SCTP_OPTION_DROPPING ) where += sprintf(where, " DROPPING"); if ( val & SCTP_OPTION_BREAK ) where += sprintf(where, " BREAK"); if ( val & SCTP_OPTION_DBREAK ) where += sprintf(where, " DBREAK"); if ( val & SCTP_OPTION_RANDOM ) where += sprintf(where, " RANDOM"); } break; default: printf("(bad option name %lu)",oh->name); break; } break; default: printf("(bad option level %lu)",oh->level); break; } printf("%s", result); opt_rem -= oh->len; oh = (struct t_opthdr *)(((char *)oh)+oh->len); } if ( opt_rem ) printf("\n\tBadly formatted options."); } else printf("(no opt)"); printf("\n");}void print_size(ulong size){ switch ( size ) { case -1UL: printf("UNLIMITED\n"); break; case -2UL: printf("UNDEFINED\n"); break; default: printf("%lu\n", size); break; }}void print_msg(int fd){ if ( ctrl.len > 0 ) { switch ( show ) { case 0: return; case 2: printf("%d-", fd); print_prim(cmd.tpi.type); printf(":\n"); switch ( cmd.tpi.type ) { case T_INFO_REQ: break; case T_INFO_ACK: printf(" TSDU_size = "); print_size(cmd.tpi.info_ack.TSDU_size); printf(" ETSDU_size = "); print_size(cmd.tpi.info_ack.ETSDU_size); printf(" CDATA_size = "); print_size(cmd.tpi.info_ack.CDATA_size); printf(" DDATA_size = "); print_size(cmd.tpi.info_ack.DDATA_size); printf(" ADDR_size = "); print_size(cmd.tpi.info_ack.ADDR_size); printf(" OPT_size = "); print_size(cmd.tpi.info_ack.OPT_size); printf(" TIDU_size = "); print_size(cmd.tpi.info_ack.TIDU_size); printf(" SERV_type = "); switch ( cmd.tpi.info_ack.SERV_type ) { case T_COTS: printf("T_COTS\n"); break; case T_COTS_ORD: printf("T_COTS_ORD\n"); break; case T_CLTS: printf("T_CLTS\n"); break; default: printf("(unknown)\n"); break; } printf(" CURRENT_state = "); print_state(cmd.tpi.info_ack.CURRENT_state); printf(" PROVIDER_flag = "); if ( cmd.tpi.info_ack.PROVIDER_flag & T_SNDZERO ) printf("T_SNDZERO\n"); if ( cmd.tpi.info_ack.PROVIDER_flag & XPG4_1 ) printf(" XPG4_1\n"); break; case T_OPTMGMT_REQ: printf(" MGMT_flags = "); switch ( cmd.tpi.optmgmt_req.MGMT_flags ) { case T_NEGOTIATE: printf("T_NEGOTIATE\n"); break; case T_CHECK: printf("T_CHECK\n"); break; case T_CURRENT: printf("T_CURRENT\n"); break; case T_DEFAULT: printf("T_DEFAULT\n"); break; default: } printf(" OPT = "); print_opt(cmd.cbuf + cmd.tpi.optmgmt_req.OPT_offset, cmd.tpi.optmgmt_req.OPT_length); break; case T_OPTMGMT_ACK: printf(" MGMT_flags = "); switch ( cmd.tpi.optmgmt_ack.MGMT_flags ) { case T_NEGOTIATE: printf("T_NEGOTIATE\n"); break; case T_CHECK: printf("T_CHECK\n"); break; case T_CURRENT: printf("T_CURRENT\n"); break; case T_DEFAULT: printf("T_DEFAULT\n"); break; default: } printf(" OPT = "); print_opt(cmd.cbuf + cmd.tpi.optmgmt_ack.OPT_offset, cmd.tpi.optmgmt_ack.OPT_length); break; case T_BIND_REQ: printf(" ADDR = "); print_addr(cmd.cbuf + cmd.tpi.bind_req.ADDR_offset, cmd.tpi.bind_req.ADDR_length); printf(" CONIND_number = %lu\n", cmd.tpi.bind_req.CONIND_number); break; case T_BIND_ACK: printf(" ADDR = "); print_addr(cmd.cbuf + cmd.tpi.bind_ack.ADDR_offset, cmd.tpi.bind_ack.ADDR_length); printf(" CONIND_number = %lu\n", cmd.tpi.bind_ack.CONIND_number); break; case T_ADDR_REQ: break; case T_ADDR_ACK: printf(" LOCADDR = "); print_addr(cmd.cbuf + cmd.tpi.addr_ack.LOCADDR_offset, cmd.tpi.addr_ack.LOCADDR_length); printf(" REMADDR = "); print_addr(cmd.cbuf + cmd.tpi.addr_ack.REMADDR_offset, cmd.tpi.addr_ack.REMADDR_length); break; case T_UNBIND_REQ: break; case T_ERROR_ACK: printf(" ERROR_prim = "); print_prim(cmd.tpi.error_ack.ERROR_prim); printf("\n"); printf(" TLI_error = "); print_error(cmd.tpi.error_ack.TLI_error); printf(" UNIX_error = %lu (%s)\n", cmd.tpi.error_ack.UNIX_error, strerror(cmd.tpi.error_ack.UNIX_error)); break; case T_OK_ACK: printf(" CORRECT_prim = "); print_prim(cmd.tpi.ok_ack.CORRECT_prim); printf("\n"); break; case T_CONN_REQ: printf(" DEST = "); print_addr(cmd.cbuf + cmd.tpi.conn_req.DEST_offset, cmd.tpi.conn_req.DEST_length); printf(" OPT = "); print_opt (cmd.cbuf + cmd.tpi.conn_req.OPT_offset, cmd.tpi.conn_req.OPT_length); break; case T_CONN_IND: printf(" SRC = "); print_addr(cmd.cbuf + cmd.tpi.conn_ind.SRC_offset, cmd.tpi.conn_ind.SRC_length); printf(" OPT = "); print_opt (cmd.cbuf + cmd.tpi.conn_ind.OPT_offset, cmd.tpi.conn_ind.OPT_length); printf(" SEQ_number = %lx\n", cmd.tpi.conn_ind.SEQ_number); seq[fd] = cmd.tpi.conn_ind.SEQ_number; break; case T_CONN_RES: printf(" ACCEPTOR_id = %d\n", fdi.fildes); printf(" OPT = "); print_opt (cmd.cbuf + cmd.tpi.conn_res.OPT_offset, cmd.tpi.conn_res.OPT_length); printf(" SEQ_number = %lx\n", cmd.tpi.conn_res.SEQ_number); break; case T_CONN_CON: printf(" RES = "); print_addr(cmd.cbuf + cmd.tpi.conn_con.RES_offset, cmd.tpi.conn_con.RES_length); printf(" OPT = "); print_opt (cmd.cbuf + cmd.tpi.conn_con.OPT_offset, cmd.tpi.conn_con.OPT_length); break; case T_DATA_REQ: printf(" MORE_flag = %lu\n", cmd.tpi.data_req.MORE_flag); printf(" DATA = %s\n", dbuf); break; case T_DATA_IND: printf(" MORE_flag = %lu\n", cmd.tpi.data_ind.MORE_flag);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -